From: . <@babolo.ru>
To: pgsql-interfaces@postgresql.org
Subject: sqlbang
Date: Sun, 7 Apr 2002 06:31:43 +0400 (MSD)
Message-ID: <200204070231.GAA09020@aaz.links.ru> (raw)
Sorry I don't know if this is right list.
I use scripts of such a kind (I say "SQLbang")
#!/usr/local/bin/psql -qQ
\a \t \pset fieldsep ' '
\set router '\'' :1 '\''
SELECT ispdb_sfbsdr_allow(network(inet),niface)
FROM ispdb_sfbsdr_riaddr, nets
WHERE nrouter = :router
AND int_type = index_int_type('int')
AND network(inet) <<= network(net)
AND nets.control
Parameters after sqlbang's name goes to :1, :2 so on.
This is patch:
inline patch 1: doc/src/sgml/ref/psql-ref.sgml, src/bin/psql/help.c, src/bin/psql/mainloop.c and 1 more (+71/-19 lines) download inline-1.patch--- doc/src/sgml/ref/psql-ref.sgml Sun Apr 1 23:17:30 2001+++ doc/src/sgml/ref/psql-ref.sgml Thu Apr 26 05:46:20 2001@@ -1406,6 +1406,22 @@
<varlistentry>
+ <term>-Q <replaceable class="parameter">filename</replaceable></term>+ <listitem>+ <para>+ Use the file <replaceable class="parameter">filename</replaceable>+ as the source of queries instead of reading queries interactively.+ After the file is processed, <application>psql</application> terminates.+ This in many ways similar to the <literal>-f</literal> flag,+ but for use in <quote>sqlbang</quote> scripts.+ First script's psrameters will be assigned to+ <literal>:1</literal> .. <literal>:9</literal> variables.+ </para>+ </listitem>+ </varlistentry>+++ <varlistentry>
<term>-R, --record-separator <replaceable class="parameter">separator</replaceable></term>
<listitem>
<para>
--- src/bin/psql/help.c Thu Oct 25 09:49:54 2001+++ src/bin/psql/help.c Sun Mar 17 02:56:34 2002@@ -112,6 +112,7 @@
puts(_(" -P VAR[=ARG] Set printing option 'VAR' to 'ARG' (see \\pset command)"));
puts(_(" -q Run quietly (no messages, only query output)"));
+ puts(_(" -Q Like -f, for scripts, arguments :1 .. :9"));
puts(_(" -R STRING Set record separator (default: newline) (-P recordsep=)"));
puts(_(" -s Single step mode (confirm each query)"));
puts(_(" -S Single line mode (end of line terminates SQL command)"));
--- src/bin/psql/mainloop.c Sun Apr 1 23:17:32 2001+++ src/bin/psql/mainloop.c Thu Apr 26 05:51:46 2001@@ -53,7 +53,7 @@
const char *var;
volatile unsigned int bslash_count = 0;
- int i,+ int i,j,
prevlen,
thislen;
@@ -91,7 +91,7 @@
/* main loop to get queries and execute them */
- while (1)+ for(j = 0;;j++)
{
#ifndef WIN32
@@ -189,6 +189,11 @@
line = gets_fromFile(source);
}
+ if (!j && line && line[0] == '#' && line[1] == '!')+ {+ free(line);+ continue;+ }
/* Setting this will not have effect until next line. */
die_on_error = GetVariableBool(pset.vars, "ON_ERROR_STOP");
--- src/bin/psql/startup.c.orig Mon Nov 5 20:46:31 2001+++ src/bin/psql/startup.c Sun Mar 17 03:28:01 2002@@ -237,7 +237,7 @@
*/
/*
- * process file given by -f+ * process file given by -f or -Q
*/
if (options.action == ACT_FILE && strcmp(options.action_string, "-") != 0)
{
@@ -369,19 +369,19 @@
extern char *optarg;
extern int optind;
int c;
- bool used_old_u_option = false;+ bool used_old_u_option = false, sqlbang = false;
memset(options, 0, sizeof *options);
#ifdef HAVE_GETOPT_LONG
- while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:h:Hlno:p:P:qR:sStT:uU:v:VWxX?", long_options, &optindex)) != -1)+ while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:h:Hlno:p:P:qQ:R:sStT:uU:v:VWxX?", long_options, &optindex)) != -1)
#else /* not HAVE_GETOPT_LONG */
/*
* Be sure to leave the '-' in here, so we can catch accidental long
* options.
*/
- while ((c = getopt(argc, argv, "aAc:d:eEf:F:h:Hlno:p:P:qR:sStT:uU:v:VWxX?-")) != -1)+ while ((c = getopt(argc, argv, "aAc:d:eEf:F:h:Hlno:p:P:qQ:R:sStT:uU:v:VWxX?-")) != -1)
#endif /* not HAVE_GETOPT_LONG */
{
switch (c)
@@ -464,6 +464,12 @@
case 'q':
SetVariableBool(pset.vars, "QUIET");
break;
+ case 'Q':+ SetVariableBool(pset.vars, "ON_ERROR_STOP");+ options->action = ACT_FILE;+ options->action_string = optarg;+ sqlbang = true;+ break;
case 'R':
pset.popt.topt.recordSep = xstrdup(optarg);
break;
@@ -563,21 +569,45 @@
}
}
- /*- * if we still have arguments, use it as the database name and- * username- */- while (argc - optind >= 1)+ if (sqlbang)
{
- if (!options->dbname)- options->dbname = argv[optind];- else if (!options->username)- options->username = argv[optind];- else if (!QUIET())- fprintf(stderr, gettext("%s: warning: extra option %s ignored\n"),- pset.progname, argv[optind]);+ char optname[] = "1";+ while (argc - optind >= 1)+ {+ if (optname[0] <= '9')+ {+ if (!SetVariable(pset.vars, optname, argv[optind]))+ {+ fprintf(stderr, "%s: could not set variable %s\n",+ pset.progname, optname);+ exit(EXIT_FAILURE);+ }+ }+ else if (!QUIET())+ fprintf(stderr, "%s: warning: extra option %s ignored\n",+ pset.progname, argv[optind]);+ optname[0]++;+ optind++;+ }+ }+ else+ {+ /*+ * if we still have arguments, use it as the database name and+ * username+ */+ while (argc - optind >= 1)+ {+ if (!options->dbname)+ options->dbname = argv[optind];+ else if (!options->username)+ options->username = argv[optind];+ else if (!QUIET())+ fprintf(stderr, gettext("%s: warning: extra option %s ignored\n"),+ pset.progname, argv[optind]);- optind++;+ optind++;+ }
}
if (used_old_u_option && !QUIET())
I propose to include this feature.
Sorry for bad English.
--
@BABOLO http://links.ru/
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-interfaces@postgresql.org
Cc: @babolo.ru
Subject: Re: sqlbang
In-Reply-To: <200204070231.GAA09020@aaz.links.ru>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox