pg.ddx.io  pgsql-interfaces@postgresql.org mailing list archive  
help / color / mirror / Atom feed
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/

view thread (5+ messages)  latest in thread

Message-ID: <200204070231.GAA09020@aaz.links.ru>
Permalink:  ../200204070231.GAA09020@aaz.links.ru/
Also on:    postgresql.org/message-id/200204070231.GAA09020@aaz.links.ru

 ·  · 

reply

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