Fixed psql double quoting of SQL ids
Fixed libpq printing functions
This commit is contained in:
parent
4842ef8624
commit
9ceb5d8a7b
|
@ -494,7 +494,7 @@ soon.)
|
|||
<function>PQdb</function>
|
||||
Returns the database name of the connection.
|
||||
<synopsis>
|
||||
const char *PQdb(const PGconn *conn)
|
||||
char *PQdb(const PGconn *conn)
|
||||
</synopsis>
|
||||
PQdb and the next several functions return the values established
|
||||
at connection. These values are fixed for the life of the PGconn
|
||||
|
@ -507,7 +507,7 @@ object.
|
|||
<function>PQuser</function>
|
||||
Returns the user name of the connection.
|
||||
<synopsis>
|
||||
const char *PQuser(const PGconn *conn)
|
||||
char *PQuser(const PGconn *conn)
|
||||
</synopsis>
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -517,7 +517,7 @@ const char *PQuser(const PGconn *conn)
|
|||
<function>PQpass</function>
|
||||
Returns the password of the connection.
|
||||
<synopsis>
|
||||
const char *PQpass(const PGconn *conn)
|
||||
char *PQpass(const PGconn *conn)
|
||||
</synopsis>
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -527,7 +527,7 @@ const char *PQpass(const PGconn *conn)
|
|||
<function>PQhost</function>
|
||||
Returns the server host name of the connection.
|
||||
<synopsis>
|
||||
const char *PQhost(const PGconn *conn)
|
||||
char *PQhost(const PGconn *conn)
|
||||
</synopsis>
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -537,7 +537,7 @@ const char *PQhost(const PGconn *conn)
|
|||
<function>PQport</function>
|
||||
Returns the port of the connection.
|
||||
<synopsis>
|
||||
const char *PQport(const PGconn *conn)
|
||||
char *PQport(const PGconn *conn)
|
||||
</synopsis>
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -547,7 +547,7 @@ const char *PQport(const PGconn *conn)
|
|||
<function>PQtty</function>
|
||||
Returns the debug tty of the connection.
|
||||
<synopsis>
|
||||
const char *PQtty(const PGconn *conn)
|
||||
char *PQtty(const PGconn *conn)
|
||||
</synopsis>
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -557,7 +557,7 @@ const char *PQtty(const PGconn *conn)
|
|||
<function>PQoptions</function>
|
||||
Returns the backend options used in the connection.
|
||||
<synopsis>
|
||||
const char *PQoptions(const PGconn *conn)
|
||||
char *PQoptions(const PGconn *conn)
|
||||
</synopsis>
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -602,7 +602,7 @@ ConnStatusType PQstatus(const PGconn *conn)
|
|||
Returns the error message most recently generated by
|
||||
an operation on the connection.
|
||||
<synopsis>
|
||||
const char *PQerrorMessage(const PGconn* conn);
|
||||
char *PQerrorMessage(const PGconn* conn);
|
||||
</synopsis>
|
||||
</para>
|
||||
|
||||
|
@ -790,7 +790,7 @@ exposes a bug in the client software.
|
|||
Converts the enumerated type returned by PQresultStatus into
|
||||
a string constant describing the status code.
|
||||
<synopsis>
|
||||
const char *PQresStatus(ExecStatusType status);
|
||||
char *PQresStatus(ExecStatusType status);
|
||||
</synopsis>
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -801,7 +801,7 @@ const char *PQresStatus(ExecStatusType status);
|
|||
returns the error message associated with the query, or an empty string
|
||||
if there was no error.
|
||||
<synopsis>
|
||||
const char *PQresultErrorMessage(const PGresult *res);
|
||||
char *PQresultErrorMessage(const PGresult *res);
|
||||
</synopsis>
|
||||
Immediately following a <function>PQexec</function> or <function>PQgetResult</function>
|
||||
call, <function>PQerrorMessage</function> (on the connection) will return the same
|
||||
|
@ -855,7 +855,7 @@ extracts data from a <acronym>BINARY</acronym> cursor.
|
|||
Returns the field (attribute) name associated with the given field index.
|
||||
Field indices start at 0.
|
||||
<synopsis>
|
||||
const char *PQfname(const PGresult *res,
|
||||
char *PQfname(const PGresult *res,
|
||||
int field_index);
|
||||
</synopsis>
|
||||
</para>
|
||||
|
@ -931,9 +931,9 @@ int PQfmod(const PGresult *res,
|
|||
of a PGresult.
|
||||
Tuple and field indices start at 0.
|
||||
<synopsis>
|
||||
const char* PQgetvalue(const PGresult *res,
|
||||
int tup_num,
|
||||
int field_num);
|
||||
char* PQgetvalue(const PGresult *res,
|
||||
int tup_num,
|
||||
int field_num);
|
||||
</synopsis>
|
||||
For most queries, the value returned by <function>PQgetvalue</function>
|
||||
is a null-terminated <acronym>ASCII</acronym> string representation
|
||||
|
@ -991,7 +991,7 @@ int PQgetisnull(const PGresult *res,
|
|||
Returns the command status string from the SQL command that
|
||||
generated the PGresult.
|
||||
<synopsis>
|
||||
const char * PQcmdStatus(const PGresult *res);
|
||||
char * PQcmdStatus(const PGresult *res);
|
||||
</synopsis>
|
||||
</para>
|
||||
</listitem>
|
||||
|
@ -1001,7 +1001,7 @@ const char * PQcmdStatus(const PGresult *res);
|
|||
<function>PQcmdTuples</function>
|
||||
Returns the number of rows affected by the SQL command.
|
||||
<synopsis>
|
||||
const char * PQcmdTuples(const PGresult *res);
|
||||
char * PQcmdTuples(const PGresult *res);
|
||||
</synopsis>
|
||||
If the <acronym>SQL</acronym> command that generated the
|
||||
PGresult was INSERT, UPDATE or DELETE, this returns a
|
||||
|
@ -1032,7 +1032,7 @@ Oid PQoidValue(const PGresult *res);
|
|||
inserted, if the <acronym>SQL</acronym> command was an INSERT.
|
||||
Otherwise, returns an empty string.
|
||||
<synopsis>
|
||||
const char * PQoidStatus(const PGresult *res);
|
||||
char * PQoidStatus(const PGresult *res);
|
||||
</synopsis>
|
||||
The function is deprecated in favor of <function>PQoidValue</function>
|
||||
and is not thread-safe.
|
||||
|
@ -1050,25 +1050,25 @@ void PQprint(FILE* fout, /* output stream */
|
|||
const PQprintOpt *po);
|
||||
|
||||
struct {
|
||||
int header; /* print output field headings and row count */
|
||||
int align; /* fill align the fields */
|
||||
int standard; /* old brain dead format */
|
||||
int html3; /* output html tables */
|
||||
int expanded; /* expand tables */
|
||||
int pager; /* use pager for output if needed */
|
||||
pqbool header; /* print output field headings and row count */
|
||||
pqbool align; /* fill align the fields */
|
||||
pqbool standard; /* old brain dead format */
|
||||
pqbool html3; /* output html tables */
|
||||
pqbool expanded; /* expand tables */
|
||||
pqbool pager; /* use pager for output if needed */
|
||||
char *fieldSep; /* field separator */
|
||||
char *tableOpt; /* insert to HTML <table ...> */
|
||||
char *caption; /* HTML <caption> */
|
||||
char **fieldName; /* null terminated array of replacement field names */
|
||||
} PQprintOpt;
|
||||
</synopsis>
|
||||
|
||||
This function was formerly used by <application>psql</application>
|
||||
to print query results, but this is no longer the case and this
|
||||
function is no longer supported.
|
||||
function is no longer actively supported.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
<function>PQclear</function>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<!--
|
||||
$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.22 2000/01/29 16:58:27 petere Exp $
|
||||
$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.23 2000/02/07 23:10:03 petere Exp $
|
||||
Postgres documentation
|
||||
-->
|
||||
|
||||
|
@ -64,8 +64,8 @@ Postgres documentation
|
|||
|
||||
<para>
|
||||
<application>psql</application> is a regular <productname>PostgreSQL</productname>
|
||||
client application. In order to connect to a database you need to determine
|
||||
name of you target database, the hostname and port number of the server
|
||||
client application. In order to connect to a database you need to know the
|
||||
name of your target database, the hostname and port number of the server
|
||||
and what user name you want to connect as. <application>psql</application> can be
|
||||
told about those parameters via command line options, namely <option>-d</option>,
|
||||
<option>-h</option>, <option>-p</option>, and <option>-U</option> respectively.
|
||||
|
@ -119,7 +119,7 @@ testdb=>
|
|||
Ordinarily, input lines are sent to the backend when a query-terminating
|
||||
semicolon is reached. An end of line does not terminate a query! Thus queries
|
||||
can be spread over serveral lines for clarity. If the query was sent and without
|
||||
error the query results are displayed on the screen.
|
||||
error, the query results are displayed on the screen.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
@ -155,31 +155,35 @@ testdb=>
|
|||
</para>
|
||||
|
||||
<para>
|
||||
To include whitespace into an argument you must quote it with either single
|
||||
or double quotes. Anything contained in single quotes (except for a
|
||||
backslash-escaped single quote itself) is taken literally as the argument.
|
||||
Anything contained in double quotes is furthermore subject to C-like
|
||||
substitutions for <literal>\n</literal> (new line), <literal>\t</literal> (tab),
|
||||
<literal>\</literal><replaceable>digits</replaceable>,
|
||||
To include whitespace into an argument you must quote it with a single
|
||||
quote. To include a single quote into such an argument, preceed it by
|
||||
a backslash. Anything contained in single quotes is furthermore subject to
|
||||
C-like substitutions for <literal>\n</literal> (new line), <literal>\t</literal>
|
||||
(tab), <literal>\</literal><replaceable>digits</replaceable>,
|
||||
<literal>\0</literal><replaceable>digits</replaceable>, and
|
||||
<literal>\0x</literal><replaceable>digits</replaceable>
|
||||
(the character with the given decimal, octal, or hexadecimal code).
|
||||
</para>
|
||||
|
||||
<para>
|
||||
If an unquoted argument begins with a dollar sign (<literal>$</literal>),
|
||||
If an unquoted argument begins with a colon (<literal>:</literal>),
|
||||
it is taken as a variable and the value of the variable is taken as the
|
||||
argument instead. Inside double quotes, variable values can be substituted
|
||||
by enclosing the name in a <literal>${...}</literal> sequence. See also under
|
||||
<quote><xref linkend="APP-PSQL-variables" endterm="APP-PSQL-variables-title"></quote>.
|
||||
argument instead.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Arguments that are quoted in <quote>back-ticks</quote> (<literal>`</literal>)
|
||||
are taken as a command line
|
||||
that is passed to the shell. The output of the command (with a trailing
|
||||
newline removed) is taken as the argument value. Back-ticks are subject to
|
||||
the same substitution rules as double-quotes.
|
||||
Arguments that are quoted in <quote>backticks</quote> (<literal>`</literal>)
|
||||
are taken as a command line that is passed to the shell. The output of the
|
||||
command (with a trailing newline removed) is taken as the argument value.
|
||||
The above escape sequences also apply in backticks.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Some commands take the name of an <acronym>SQL</acronym> identifier (such as
|
||||
a table name) as argument. These arguments follow the syntax rules of
|
||||
<acronym>SQL</acronym> regarding double quotes: an identifier without
|
||||
double quotes is coerced to lower-case. For all other commands
|
||||
double quotes are not special and will become part of the argument.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
@ -189,7 +193,7 @@ testdb=>
|
|||
(two backslashes) marks the end of arguments and continues parsing
|
||||
<acronym>SQL</acronym> queries, if any. That way <acronym>SQL</acronym> and
|
||||
<application>psql</application> commands can be freely mixed on a line.
|
||||
In any case, the arguments of a meta-command cannot continue beyond the end
|
||||
But in any case, the arguments of a meta-command cannot continue beyond the end
|
||||
of the line.
|
||||
</para>
|
||||
|
||||
|
@ -246,7 +250,7 @@ testdb=>
|
|||
|
||||
<para>
|
||||
If the connection attempt failed (wrong username, access denied, etc.) the
|
||||
previous connection will be kept, if and only if <application>psql</application> is
|
||||
previous connection will be kept if and only if <application>psql</application> is
|
||||
in interactive mode. When executing a non-interactive script, processing
|
||||
will immediately stop with an error. This distinction was chosen as a user
|
||||
convenience against typos on the one hand, and a safety mechanism that
|
||||
|
@ -286,7 +290,7 @@ testdb=>
|
|||
<para>
|
||||
This operation is not as efficient as the <acronym>SQL</acronym>
|
||||
<command>COPY</command> command because all data must pass through the
|
||||
client/server IP or socket connection. For large amounts of data this other
|
||||
client/server IP or socket connection. For large amounts of data the other
|
||||
technique may be preferable.
|
||||
</para>
|
||||
</tip>
|
||||
|
@ -510,12 +514,15 @@ testdb=>
|
|||
<term><literal>\echo</literal> <replaceable class="parameter">text</replaceable> [ ... ]</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Prints the arguments to the standard output. This can be useful to
|
||||
Prints the arguments to the standard output, separated by one space and
|
||||
followed by a newline. This can be useful to
|
||||
intersperse information in the output of scripts. For example:
|
||||
<programlisting>
|
||||
=> <userinput>\echo `date`</userinput>
|
||||
Tue Oct 26 21:40:57 CEST 1999
|
||||
</programlisting>
|
||||
If the first argument is an unquoted <literal>-n</literal> the the trailing
|
||||
newline is not written.
|
||||
</para>
|
||||
|
||||
<tip>
|
||||
|
@ -602,7 +609,7 @@ Tue Oct 26 21:40:57 CEST 1999
|
|||
<note>
|
||||
<para>
|
||||
If you want to see the lines on the screen as they are read you must set
|
||||
the variable <envar>echo</envar>.
|
||||
the variable <envar>ECHO</envar> to <literal>full</literal>.
|
||||
</para>
|
||||
</note>
|
||||
</listitem>
|
||||
|
@ -658,7 +665,7 @@ Tue Oct 26 21:40:57 CEST 1999
|
|||
Stores the file into a <productname>PostgreSQL</productname> <quote>large object</quote>.
|
||||
Optionally, it associates the given comment with the object. Example:
|
||||
<programlisting>
|
||||
foo=> <userinput>\lo_import '/home/me/pictures/photo.xcf' 'a picture of me'</userinput>
|
||||
foo=> <userinput>\lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'</userinput>
|
||||
lo_import 152801
|
||||
</programlisting>
|
||||
The response indicates that the large object received object id 152801
|
||||
|
@ -1006,12 +1013,13 @@ lo_import 152801
|
|||
|
||||
|
||||
<varlistentry>
|
||||
<term><literal>\set</literal> [ <replaceable class="parameter">name</replaceable> [ <replaceable class="parameter">value</replaceable> ]]</term>
|
||||
<term><literal>\set</literal> [ <replaceable class="parameter">name</replaceable> [ <replaceable class="parameter">value</replaceable> [ ... ]]]</term>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
Sets the internal variable <replaceable class="parameter">name</replaceable>
|
||||
to <replaceable class="parameter">value</replaceable>. If no second argument
|
||||
to <replaceable class="parameter">value</replaceable> or, if more than one
|
||||
value is given, to the concatenation of all of them. If no second argument
|
||||
is given, the variable is just set with not value. To unset a variable, use
|
||||
the <command>\unset</command> command.
|
||||
</para>
|
||||
|
@ -1145,9 +1153,7 @@ Access permissions for database "test"
|
|||
<para>
|
||||
Escapes to a separate Unix shell or executes the Unix command
|
||||
<replaceable class="parameter">command</replaceable>. The arguments
|
||||
are not further interpreted, the shell will see them as is. If you wish
|
||||
to capture the output of a shell command and/or use <application>psql</application>'s
|
||||
variable substitution features, use the backticks (<literal>`</literal>).
|
||||
are not further interpreted, the shell will see them as is.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
@ -1200,7 +1206,7 @@ Access permissions for database "test"
|
|||
<para>
|
||||
Specifies that <application>psql</application>
|
||||
is to execute one query string, <replaceable class="parameter">query</replaceable>,
|
||||
and then exit. This is useful for shell scripts.
|
||||
and then exit. This is useful in shell scripts.
|
||||
</para>
|
||||
<para>
|
||||
<replaceable class="parameter">query</replaceable> must be either a query string
|
||||
|
@ -1208,8 +1214,8 @@ Access permissions for database "test"
|
|||
specific features), or it is a single backslash command. Thus
|
||||
you cannot mix <acronym>SQL</acronym> and <application>psql</application>
|
||||
meta-commands. To achieve this you could pipe the string into
|
||||
<application>psql</application> and finish it with a a <literal>\q</literal>,
|
||||
like so: <literal>echo "select * from foo; \q" | psql</literal>.
|
||||
<application>psql</application>, like so:
|
||||
<literal>echo "\x \\ select * from foo;" | psql</literal>.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
@ -1260,6 +1266,16 @@ Access permissions for database "test"
|
|||
After the file is processed, <application>psql</application> terminates.
|
||||
This in many ways equivalent to the internal command <command>\i</command>.
|
||||
</para>
|
||||
<para>
|
||||
Using this option is subtly different from writing
|
||||
<literal>psql < <replaceable class="parameter">filename</replaceable></literal>.
|
||||
In general, both will do what you expect, but using <literal>-f</literal>
|
||||
enables some nice features such as error messages with line numbers.
|
||||
There is also a slight chance that using this option will reduce
|
||||
the startup overhead. On the other hand, the variant using the shell's
|
||||
input redirection is (in theory) guaranteed to yield exactly the same
|
||||
output that you would have gotten had you entered everything by hand.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
|
@ -1311,16 +1327,6 @@ Access permissions for database "test"
|
|||
</varlistentry>
|
||||
|
||||
|
||||
<varlistentry>
|
||||
<term>-n, --no-readline</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Do not use readline for line editing and do not use the history.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
|
||||
<varlistentry>
|
||||
<term>-o, --output <replaceable class="parameter">filename</replaceable></term>
|
||||
<listitem>
|
||||
|
@ -1372,6 +1378,17 @@ Access permissions for database "test"
|
|||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
|
||||
<varlistentry>
|
||||
<term>-R, --record-separator <replaceable class="parameter">separator</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Use <replaceable class="parameter">separator</replaceable> as the record separator.
|
||||
This is equivalent to the <command>\pset recordsep</command> command.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
|
||||
<varlistentry>
|
||||
<term>-s, --single-step</term>
|
||||
|
@ -1492,7 +1509,7 @@ Access permissions for database "test"
|
|||
<para>
|
||||
As of version 7.0, <application>psql</application> automatically issues a
|
||||
password prompt whenever the backend requests password authentication.
|
||||
Because this is currently based on a <quote>hack</quote> the automatic
|
||||
Because this is currently based on a <quote>hack</quote>, the automatic
|
||||
recognition might mysteriously fail, hence this option to force a prompt.
|
||||
If no password prompt is issued and the backend requires password authentication
|
||||
the connection attempt will fail.
|
||||
|
@ -1539,46 +1556,39 @@ Access permissions for database "test"
|
|||
|
||||
<para>
|
||||
<application>psql</application> provides variable substitution features
|
||||
similar to common Unix command shells. Variables are simply name/value
|
||||
similar to common Unix command shells. This feature is new and not very
|
||||
sophisticated, yet, but there are plans to expand it in the future.
|
||||
Variables are simply name/value
|
||||
pairs, where the value can be any string of any length. To set variables,
|
||||
use the <application>psql</application> meta-command <command>\set</command>:
|
||||
<programlisting>
|
||||
testdb=> <userinput>\set foo bar</userinput>
|
||||
</programlisting>
|
||||
sets the variable <quote>foo</quote> to the value <quote>bar</quote>. To retrieve
|
||||
the content of the variable, precede the name with a dollar-sign and use it
|
||||
the content of the variable, precede the name with a colon and use it
|
||||
as the argument of any slash command:
|
||||
<programlisting>
|
||||
testdb=> <userinput>\echo $foo</userinput>
|
||||
testdb=> <userinput>\echo :foo</userinput>
|
||||
bar
|
||||
</programlisting>
|
||||
Alternatively, the value can also be interpolated into a double-quoted (or backtick-quoted)
|
||||
string, like so:
|
||||
<programlisting>
|
||||
testdb=> <userinput>\echo "foo is now ${foo}."</userinput>
|
||||
foo is now bar.
|
||||
</programlisting>
|
||||
(The curly braces are required.) No variable substitution
|
||||
will be performed in single-quoted strings or in any of the backslash commands
|
||||
that have special parsing rules (e.g., <command>\copy</command>).
|
||||
</para>
|
||||
|
||||
<note>
|
||||
<para>
|
||||
The arguments of <command>\set</command> are subject to the same substitution
|
||||
rules as with other commands. Thus you can construct interesting references
|
||||
such as <literal>\set "${foo}bar" 'something'</literal> and get <quote>soft
|
||||
such as <literal>\set :foo 'something'</literal> and get <quote>soft
|
||||
links</quote> or <quote>variable variables</quote> of <productname>Perl</productname>
|
||||
or <productname><acronym>PHP</acronym></productname> fame, respectively.
|
||||
Unfortunately (or fortunately?), there is not way to do anything useful
|
||||
with these constructs. (<literal>\echo ${${foo}}</literal> doesn't work.) On the
|
||||
other hand, <literal>\set bar $foo</literal> is a perfectly valid way to copy
|
||||
with these constructs. On the
|
||||
other hand, <literal>\set bar :foo</literal> is a perfectly valid way to copy
|
||||
a variable.
|
||||
</para>
|
||||
</note>
|
||||
|
||||
<para>
|
||||
If you call <command>\set</command> without an argument, the variable is simply
|
||||
If you call <command>\set</command> without a second argument, the variable is simply
|
||||
set, but has no value. To unset (or delete) a variable, use the command
|
||||
<command>\unset</command>.
|
||||
</para>
|
||||
|
@ -1830,7 +1840,7 @@ foo is now bar.
|
|||
<para>
|
||||
An additional useful feature of <application>psql</application> variables
|
||||
is that you can substitute (<quote>interpolate</quote>) them into
|
||||
regular <acronym>SQL</acronym> statements. The syntax for this is to prepend
|
||||
regular <acronym>SQL</acronym> statements. The syntax for this is again to prepend
|
||||
the variable name with a colon (<literal>:</literal>).
|
||||
<programlisting>
|
||||
testdb=> <userinput>\set foo 'my_table'</userinput>
|
||||
|
@ -1850,8 +1860,7 @@ testdb=> <userinput>SELECT * FROM :foo;</userinput>
|
|||
Another possible use of this mechanism is to copy the contents of a file
|
||||
into a field. First load the file into a variable and then proceed as above.
|
||||
<programlisting>
|
||||
testdb=> <userinput>\set content `cat my_file.txt`</userinput>
|
||||
testdb=> <userinput>\set content "'${content}'"</userinput>
|
||||
testdb=> <userinput>\set content '\'' `cat my_file.txt` '\''</userinput>
|
||||
testdb=> <userinput>INSERT INTO my_table VALUES (:content);</userinput>
|
||||
</programlisting>
|
||||
One possible problem with this approach is that <filename>my_file.txt</filename>
|
||||
|
@ -1877,11 +1886,12 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
|
|||
|
||||
<para>
|
||||
Since colons may legally appear in queries, the following rule applies: If the variable
|
||||
is not set, the character sequence <quote>colon-name</quote> is not changed. In any
|
||||
is not set, the character sequence <quote>colon name</quote> is not changed. In any
|
||||
case you can escape a colon with a backslash to protect it from interpretation.
|
||||
(The colon syntax for variables is standard <acronym>SQL</acronym> for embedded
|
||||
query languages, such as <application>ecpg</application>. The colon syntax for
|
||||
array slices and type casts are <productname>PostgreSQL</productname> extensions.)
|
||||
array slices and type casts are <productname>PostgreSQL</productname> extensions,
|
||||
hence the conflict.)
|
||||
</para>
|
||||
|
||||
</refsect2>
|
||||
|
@ -1975,7 +1985,7 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
|
|||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><literal>%$</literal><replaceable class="parameter">name</replaceable><literal>$</literal></term>
|
||||
<term><literal>%:</literal><replaceable class="parameter">name</replaceable><literal>:</literal></term>
|
||||
<listitem><para>
|
||||
The value of the <application>psql</application>, <quote>magic</quote>, or environment
|
||||
variable <replaceable class="parameter">name</replaceable>. See the section
|
||||
|
@ -2032,13 +2042,22 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
|
|||
|
||||
<para>
|
||||
<application>psql</application> supports the readline and history libraries for
|
||||
convenienent line editing and retrieval. The command history is stored in a file
|
||||
convenient line editing and retrieval. The command history is stored in a file
|
||||
named <filename>.psql_history</filename> in your home directory and is reloaded when
|
||||
<application>psql</application> starts up.
|
||||
Tab-completion is also supported, although
|
||||
the completion logic makes no claim to be an <acronym>SQL</acronym> parser.
|
||||
When available, <application>psql</application> is automatically built to use these
|
||||
features.
|
||||
features. If for some reason you do not like the tab completion, you can turn if off
|
||||
by putting this in a file named <filename>.inputrc</filename> in your
|
||||
home directory:
|
||||
<programlisting>
|
||||
$if psql
|
||||
set disable-completion on
|
||||
$endif
|
||||
</programlisting>
|
||||
(This is not a <application>psql</application> but a <application>readline</application>
|
||||
feature. Read its documentation for further details.)
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
@ -2053,7 +2072,7 @@ testdb=> <userinput>\set content `sed -e "s/'/\\\\\\'/g" < my_file.txt`</userinp
|
|||
you have the library and header files installed in an obscure place you
|
||||
must tell <filename>configure</filename> about them, for example:
|
||||
<programlisting>
|
||||
$ ./configure --with-includes=/opt/gnu/include --with-libraries=/opt/gnu/lib ...
|
||||
$ ./configure --with-includes=/opt/gnu/include --with-libs=/opt/gnu/lib ...
|
||||
</programlisting>
|
||||
Then you have to recompile <application>psql</application> (not necessarily
|
||||
the entire code tree).
|
||||
|
@ -2105,7 +2124,7 @@ testdb=> <userinput>\d my_table</userinput>
|
|||
At this point you decide to change the prompt to something more
|
||||
interesting:
|
||||
<programlisting>
|
||||
testdb=> <userinput>\set prompt1 '%n@%m %~%R%# '</userinput>
|
||||
testdb=> <userinput>\set PROMPT1 '%n@%m %~%R%# '</userinput>
|
||||
peter@localhost testdb=>
|
||||
</programlisting>
|
||||
Let's assume you have filled the table with data and want to take a look at it:
|
||||
|
@ -2221,14 +2240,6 @@ Field separator is "oo".
|
|||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
The number of options for a backslash command is limited, probably to 16.
|
||||
You can easily change this in the source code, and perhaps I will get around
|
||||
to fixing this one day. Not that there is any command
|
||||
that actually uses that many options though.
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
</refsect2>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.11 2000/01/29 16:58:48 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.12 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#include <c.h>
|
||||
#include "common.h"
|
||||
|
@ -24,6 +24,7 @@
|
|||
#include <unistd.h> /* for write() */
|
||||
#else
|
||||
#include <io.h> /* for _write() */
|
||||
#include <win32.h>
|
||||
#endif
|
||||
|
||||
#include <libpq-fe.h>
|
||||
|
@ -37,18 +38,10 @@
|
|||
#include "prompt.h"
|
||||
#include "print.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#define popen(x,y) _popen(x,y)
|
||||
#define pclose(x) _pclose(x)
|
||||
#define write(a,b,c) _write(a,b,c)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* xstrdup()
|
||||
*
|
||||
/*
|
||||
* "Safe" wrapper around strdup()
|
||||
* (Using this also avoids writing #ifdef HAVE_STRDUP in every file :)
|
||||
*/
|
||||
char *
|
||||
xstrdup(const char *string)
|
||||
|
@ -57,7 +50,8 @@ xstrdup(const char *string)
|
|||
|
||||
if (!string)
|
||||
{
|
||||
fprintf(stderr, "%s: xstrdup: cannot duplicate null pointer\n", pset.progname);
|
||||
fprintf(stderr, "%s: xstrdup: cannot duplicate null pointer (internal error)\n",
|
||||
pset.progname);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
tmp = strdup(string);
|
||||
|
@ -133,7 +127,7 @@ setQFout(const char *fname)
|
|||
|
||||
/*
|
||||
* Error reporting for scripts. Errors should look like
|
||||
* filename:lineno: message
|
||||
* psql:filename:lineno: message
|
||||
*
|
||||
*/
|
||||
void
|
||||
|
@ -152,8 +146,11 @@ psql_error(const char *fmt, ...)
|
|||
va_end(ap);
|
||||
}
|
||||
|
||||
/* for backend NOTICES */
|
||||
|
||||
|
||||
/*
|
||||
* for backend NOTICES
|
||||
*/
|
||||
void
|
||||
NoticeProcessor(void * arg, const char * message)
|
||||
{
|
||||
|
@ -184,7 +181,6 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
|
|||
#ifdef HAVE_TERMIOS_H
|
||||
struct termios t_orig,
|
||||
t;
|
||||
|
||||
#endif
|
||||
|
||||
destination = (char *) malloc(maxlen + 2);
|
||||
|
@ -240,8 +236,8 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
|
|||
* Before we start a query, we enable a SIGINT signal catcher that sends a
|
||||
* cancel request to the backend. Note that sending the cancel directly from
|
||||
* the signal handler is safe because PQrequestCancel() is written to make it
|
||||
* so. We have to be very careful what else we do in the signal handler. This
|
||||
* includes using write() for output.
|
||||
* so. We use write() to print to stdout because it's better to use simple
|
||||
* facilities in a signal handler.
|
||||
*/
|
||||
|
||||
static PGconn *cancelConn;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#
|
||||
# Copyright 2000 by PostgreSQL Global Development Group
|
||||
#
|
||||
# $Header: /cvsroot/pgsql/src/bin/psql/create_help.pl,v 1.3 2000/01/29 16:58:48 petere Exp $
|
||||
# $Header: /cvsroot/pgsql/src/bin/psql/create_help.pl,v 1.4 2000/02/07 23:10:06 petere Exp $
|
||||
#################################################################
|
||||
|
||||
#
|
||||
|
@ -56,6 +56,8 @@ struct _helpStruct
|
|||
static struct _helpStruct QL_HELP[] = {
|
||||
";
|
||||
|
||||
$count = 0;
|
||||
|
||||
foreach $file (sort readdir DIR) {
|
||||
my ($cmdname, $cmddesc, $cmdsynopsis);
|
||||
$file =~ /\.sgml$/ || next;
|
||||
|
@ -84,6 +86,7 @@ foreach $file (sort readdir DIR) {
|
|||
$cmdsynopsis =~ s/\"/\\"/g;
|
||||
|
||||
print OUT " { \"$cmdname\",\n \"$cmddesc\",\n \"$cmdsynopsis\" },\n\n";
|
||||
$count++;
|
||||
}
|
||||
else {
|
||||
print STDERR "$0: parsing file '$file' failed at or near line $. (N='$cmdname' D='$cmddesc')\n";
|
||||
|
@ -94,6 +97,10 @@ print OUT "
|
|||
{ NULL, NULL, NULL } /* End of list marker */
|
||||
};
|
||||
|
||||
|
||||
#define QL_HELP_COUNT $count
|
||||
|
||||
|
||||
#endif /* $define */
|
||||
";
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.15 2000/01/29 16:58:48 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.16 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#include <c.h>
|
||||
#include "describe.h"
|
||||
|
@ -56,7 +56,7 @@ describeAggregates(const char *name)
|
|||
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND a.aggname ~* '");
|
||||
strcat(buf, " AND a.aggname ~* '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ describeAggregates(const char *name)
|
|||
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND a.aggname ~* '");
|
||||
strcat(buf, " AND a.aggname ~* '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -125,7 +125,7 @@ describeFunctions(const char *name, bool verbose)
|
|||
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND p.proname ~* '");
|
||||
strcat(buf, " AND p.proname ~* '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -169,7 +169,7 @@ describeTypes(const char *name, bool verbose)
|
|||
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND t.typname ~* '");
|
||||
strcat(buf, " AND t.typname ~* '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "' ");
|
||||
}
|
||||
|
@ -215,7 +215,7 @@ describeOperators(const char *name)
|
|||
" o.oprright = t2.oid\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND o.oprname ~ '");
|
||||
strcat(buf, " AND o.oprname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -233,7 +233,7 @@ describeOperators(const char *name)
|
|||
" o.oprright = t1.oid\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, "AND o.oprname ~ '");
|
||||
strcat(buf, "AND o.oprname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -251,7 +251,7 @@ describeOperators(const char *name)
|
|||
" o.oprleft = t1.oid\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, "AND o.oprname ~ '");
|
||||
strcat(buf, "AND o.oprname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -346,7 +346,7 @@ permissionsList(const char *name)
|
|||
" relname !~ '^pg_'\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(descbuf, " AND relname ~ '");
|
||||
strcat(descbuf, " AND relname ~ '^");
|
||||
strncat(descbuf, name, REGEXP_CUTOFF);
|
||||
strcat(descbuf, "'\n");
|
||||
}
|
||||
|
@ -391,7 +391,7 @@ objectDescription(const char *object)
|
|||
"WHERE a.oid = d.objoid\n");
|
||||
if (object)
|
||||
{
|
||||
strcat(descbuf, " AND a.aggname ~* '");
|
||||
strcat(descbuf, " AND a.aggname ~* '^");
|
||||
strncat(descbuf, object, REGEXP_CUTOFF);
|
||||
strcat(descbuf, "'\n");
|
||||
}
|
||||
|
@ -403,7 +403,7 @@ objectDescription(const char *object)
|
|||
"WHERE p.oid = d.objoid AND (p.pronargs = 0 or oidvectortypes(p.proargtypes) != '')\n");
|
||||
if (object)
|
||||
{
|
||||
strcat(descbuf, " AND p.proname ~* '");
|
||||
strcat(descbuf, " AND p.proname ~* '^");
|
||||
strncat(descbuf, object, REGEXP_CUTOFF);
|
||||
strcat(descbuf, "'\n");
|
||||
}
|
||||
|
@ -416,7 +416,7 @@ objectDescription(const char *object)
|
|||
"WHERE RegprocToOid(o.oprcode) = d.objoid\n");
|
||||
if (object)
|
||||
{
|
||||
strcat(descbuf, " AND o.oprname ~ '");
|
||||
strcat(descbuf, " AND o.oprname ~ '^");
|
||||
strncat(descbuf, object, REGEXP_CUTOFF);
|
||||
strcat(descbuf, "'\n");
|
||||
}
|
||||
|
@ -428,7 +428,7 @@ objectDescription(const char *object)
|
|||
"WHERE t.oid = d.objoid\n");
|
||||
if (object)
|
||||
{
|
||||
strcat(descbuf, " AND t.typname ~* '");
|
||||
strcat(descbuf, " AND t.typname ~* '^");
|
||||
strncat(descbuf, object, REGEXP_CUTOFF);
|
||||
strcat(descbuf, "'\n");
|
||||
}
|
||||
|
@ -440,7 +440,7 @@ objectDescription(const char *object)
|
|||
"WHERE c.oid = d.objoid\n");
|
||||
if (object)
|
||||
{
|
||||
strcat(descbuf, " AND c.relname ~* '");
|
||||
strcat(descbuf, " AND c.relname ~* '^");
|
||||
strncat(descbuf, object, REGEXP_CUTOFF);
|
||||
strcat(descbuf, "'\n");
|
||||
}
|
||||
|
@ -452,7 +452,7 @@ objectDescription(const char *object)
|
|||
"WHERE r.oid = d.objoid AND r.rulename !~ '^_RET'\n");
|
||||
if (object)
|
||||
{
|
||||
strcat(descbuf, " AND r.rulename ~* '");
|
||||
strcat(descbuf, " AND r.rulename ~* '^");
|
||||
strncat(descbuf, object, REGEXP_CUTOFF);
|
||||
strcat(descbuf, "'\n");
|
||||
}
|
||||
|
@ -464,7 +464,7 @@ objectDescription(const char *object)
|
|||
"WHERE t.oid = d.objoid\n");
|
||||
if (object)
|
||||
{
|
||||
strcat(descbuf, " AND t.tgname ~* '");
|
||||
strcat(descbuf, " AND t.tgname ~* '^");
|
||||
strncat(descbuf, object, REGEXP_CUTOFF);
|
||||
strcat(descbuf, "'\n");
|
||||
}
|
||||
|
@ -504,7 +504,7 @@ xmalloc(size_t size)
|
|||
tmp = malloc(size);
|
||||
if (!tmp)
|
||||
{
|
||||
psql_error("out of memory");
|
||||
psql_error("out of memory\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
return tmp;
|
||||
|
@ -626,7 +626,7 @@ describeTableDetails(const char *name, bool desc)
|
|||
bool isarray = false;
|
||||
|
||||
/* Name */
|
||||
cells[i * cols + 0] = (char *)PQgetvalue(res, i, 0); /* don't free this afterwards */
|
||||
cells[i * cols + 0] = PQgetvalue(res, i, 0); /* don't free this afterwards */
|
||||
|
||||
/* Type */
|
||||
if (attype[0] == '_')
|
||||
|
@ -701,7 +701,7 @@ describeTableDetails(const char *name, bool desc)
|
|||
|
||||
/* Description */
|
||||
if (desc)
|
||||
cells[i * cols + cols-1] = (char*)PQgetvalue(res, i, 7);
|
||||
cells[i * cols + cols-1] = PQgetvalue(res, i, 7);
|
||||
}
|
||||
|
||||
/* Make title */
|
||||
|
@ -960,7 +960,7 @@ listTables(const char *infotype, const char *name, bool desc)
|
|||
strcat(buf, showSystem ? " AND c.relname ~ '^pg_'\n" : " AND c.relname !~ '^pg_'\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND c.relname ~ '");
|
||||
strcat(buf, " AND c.relname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -976,7 +976,7 @@ listTables(const char *infotype, const char *name, bool desc)
|
|||
strcat(buf, showSystem ? " AND c.relname ~ '^pg_'\n" : " AND c.relname !~ '^pg_'\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND c.relname ~ '");
|
||||
strcat(buf, " AND c.relname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -997,7 +997,7 @@ listTables(const char *infotype, const char *name, bool desc)
|
|||
strcat(buf, showSystem ? " AND c.relname ~ '^pg_'\n" : " AND c.relname !~ '^pg_'\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND c.relname ~ '");
|
||||
strcat(buf, " AND c.relname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -1013,7 +1013,7 @@ listTables(const char *infotype, const char *name, bool desc)
|
|||
strcat(buf, showSystem ? " AND c.relname ~ '^pg_'\n" : " AND c.relname !~ '^pg_'\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND c.relname ~ '");
|
||||
strcat(buf, " AND c.relname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -1049,7 +1049,7 @@ listTables(const char *infotype, const char *name, bool desc)
|
|||
strcat(buf, showSystem ? " AND c.relname ~ '^pg_'\n" : " AND c.relname !~ '^pg_'\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND c.relname ~ '");
|
||||
strcat(buf, " AND c.relname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -1079,7 +1079,7 @@ listTables(const char *infotype, const char *name, bool desc)
|
|||
strcat(buf, showSystem ? " AND c.relname ~ '^pg_'\n" : " AND c.relname !~ '^pg_'\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND c.relname ~ '");
|
||||
strcat(buf, " AND c.relname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -1098,7 +1098,7 @@ listTables(const char *infotype, const char *name, bool desc)
|
|||
"WHERE c.relowner = u.usesysid AND c.relkind = 's'\n");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND c.relname ~ '");
|
||||
strcat(buf, " AND c.relname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -1112,7 +1112,7 @@ listTables(const char *infotype, const char *name, bool desc)
|
|||
" AND not exists (select 1 from pg_user where usesysid = c.relowner)");
|
||||
if (name)
|
||||
{
|
||||
strcat(buf, " AND c.relname ~ '");
|
||||
strcat(buf, " AND c.relname ~ '^");
|
||||
strncat(buf, name, REGEXP_CUTOFF);
|
||||
strcat(buf, "'\n");
|
||||
}
|
||||
|
@ -1127,10 +1127,10 @@ listTables(const char *infotype, const char *name, bool desc)
|
|||
|
||||
if (PQntuples(res) == 0 && !QUIET())
|
||||
{
|
||||
if (name)
|
||||
fprintf(pset.queryFout, "No matching relations found.\n");
|
||||
else
|
||||
fprintf(pset.queryFout, "No relations found.\n");
|
||||
if (name)
|
||||
fprintf(pset.queryFout, "No matching relations found.\n");
|
||||
else
|
||||
fprintf(pset.queryFout, "No relations found.\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.15 2000/01/29 16:58:48 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.16 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#include <c.h>
|
||||
#include "help.h"
|
||||
|
@ -11,6 +11,7 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifndef WIN32
|
||||
#include <sys/ioctl.h> /* for ioctl() */
|
||||
|
@ -20,9 +21,7 @@
|
|||
#include <sys/types.h> /* (ditto) */
|
||||
#include <unistd.h> /* for getuid() */
|
||||
#else
|
||||
#define strcasecmp(x,y) stricmp(x,y)
|
||||
#define popen(x,y) _popen(x,y)
|
||||
#define pclose(x) _pclose(x)
|
||||
#include <win32.h>
|
||||
#endif
|
||||
|
||||
#include <pqsignal.h>
|
||||
|
@ -48,7 +47,6 @@ usage(void)
|
|||
|
||||
#ifndef WIN32
|
||||
struct passwd *pw = NULL;
|
||||
|
||||
#endif
|
||||
|
||||
/* Find default user, in case we need it. */
|
||||
|
@ -61,7 +59,7 @@ usage(void)
|
|||
user = pw->pw_name;
|
||||
else
|
||||
{
|
||||
perror("getpwuid()");
|
||||
psql_error("could not get current user name: %s", strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
#else
|
||||
|
@ -70,10 +68,11 @@ usage(void)
|
|||
}
|
||||
|
||||
/* If this " is the start of the string then it ought to end there to fit in 80 columns >> " */
|
||||
puts( "This is psql, the PostgreSQL interactive terminal.");
|
||||
puts( "\nUsage:");
|
||||
puts( " psql [options] [dbname [username]]");
|
||||
puts( "\nOptions:");
|
||||
puts( "This is psql, the PostgreSQL interactive terminal.\n");
|
||||
puts( "Usage:");
|
||||
puts( " psql [options] [dbname [username]]\n");
|
||||
puts( "Options:");
|
||||
/* puts( " -a Echo all input from script");*/
|
||||
puts( " -A Unaligned table output mode (-P format=unaligned)");
|
||||
puts( " -c <query> Run only single query (or slash command) and exit");
|
||||
|
||||
|
@ -83,7 +82,7 @@ usage(void)
|
|||
env = user;
|
||||
printf(" -d <dbname> Specify database name to connect to (default: %s)\n", env);
|
||||
|
||||
puts( " -e Echo all input in non-interactive mode");
|
||||
puts( " -e Echo queries sent to backend");
|
||||
puts( " -E Display queries that internal commands generate");
|
||||
puts( " -f <filename> Execute queries from file, then exit");
|
||||
puts( " -F <string> Set field separator (default: \"" DEFAULT_FIELD_SEP "\") (-P fieldsep=)");
|
||||
|
@ -99,7 +98,6 @@ usage(void)
|
|||
|
||||
puts( " -H HTML table output mode (-P format=html)");
|
||||
puts( " -l List available databases, then exit");
|
||||
puts( " -n Do not use readline or history");
|
||||
puts( " -o <filename> Send query output to filename (or |pipe)");
|
||||
|
||||
/* Display default port */
|
||||
|
@ -109,6 +107,7 @@ usage(void)
|
|||
|
||||
puts( " -P var[=arg] Set printing option 'var' to 'arg' (see \\pset command)");
|
||||
puts( " -q Run quietly (no messages, only query output)");
|
||||
puts( " -R <string> Set record separator (default: newline) (-P recordsep=)");
|
||||
puts( " -s Single step mode (confirm each query)");
|
||||
puts( " -S Single line mode (newline terminates query)");
|
||||
puts( " -t Don't print headings and row count (-P tuples_only)");
|
||||
|
@ -118,7 +117,7 @@ usage(void)
|
|||
env = getenv("PGUSER");
|
||||
if (!env)
|
||||
env = user;
|
||||
printf(" -U <username> Specifiy username, \"?\"=prompt (default user: %s)\n", env);
|
||||
printf(" -U <username> Specify database username (default: %s)\n", env);
|
||||
|
||||
puts( " -x Turn on expanded table output (-P expanded)");
|
||||
puts( " -v name=val Set psql variable 'name' to 'value'");
|
||||
|
@ -190,10 +189,9 @@ slashUsage(void)
|
|||
fout = stdout;
|
||||
|
||||
/* if you add/remove a line here, change the row test above */
|
||||
fprintf(fout, " \\? help\n");
|
||||
fprintf(fout, " \\c[onnect] [dbname|- [user|?]]\n"
|
||||
fprintf(fout, " \\c[onnect] [dbname|- [user]]\n"
|
||||
" connect to new database (currently '%s')\n", PQdb(pset.db));
|
||||
fprintf(fout, " \\copy ... perform SQL COPY with data stream to the client machine");
|
||||
fprintf(fout, " \\copy ... perform SQL COPY with data stream to the client machine\n");
|
||||
fprintf(fout, " \\copyright show PostgreSQL usage and distribution terms\n");
|
||||
fprintf(fout, " \\d <table> describe table (or view, index, sequence)\n");
|
||||
fprintf(fout, " \\d{i|s|t|v|S} list only indices/sequences/tables/views/system tables\n");
|
||||
|
@ -209,10 +207,11 @@ slashUsage(void)
|
|||
fprintf(fout, " \\i <fname> read and execute queries from filename\n");
|
||||
fprintf(fout, " \\l list all databases\n");
|
||||
fprintf(fout, " \\lo_export, \\lo_import, \\lo_list, \\lo_unlink\n"
|
||||
" large object operations\n");
|
||||
" large object operations\n");
|
||||
fprintf(fout, " \\o [fname] send all query results to <fname>, or |pipe\n");
|
||||
fprintf(fout, " \\p show the content of the current query buffer\n");
|
||||
fprintf(fout, " \\pset [opt] set table output options\n");
|
||||
fprintf(fout, " \\pset {format|border|expanded|fieldsep|recordsep|tuples_only|title|tableattr\n"
|
||||
" |pager} set table output options\n");
|
||||
fprintf(fout, " \\q quit psql\n");
|
||||
fprintf(fout, " \\qecho <text> write text to query output stream (see \\o)\n");
|
||||
fprintf(fout, " \\r reset (clear) the query buffer\n");
|
||||
|
@ -243,36 +242,24 @@ slashUsage(void)
|
|||
void
|
||||
helpSQL(const char *topic)
|
||||
{
|
||||
#define VALUE_OR_NULL(a) ((a) ? (a) : "")
|
||||
|
||||
if (!topic || strlen(topic) == 0)
|
||||
{
|
||||
char left_center_right; /* Which column we're displaying */
|
||||
int i; /* Index into QL_HELP[] */
|
||||
int i;
|
||||
int items_per_column = (QL_HELP_COUNT + 2)/3;
|
||||
|
||||
puts("Available help:");
|
||||
|
||||
left_center_right = 'L';/* Start with left column */
|
||||
i = 0;
|
||||
while (QL_HELP[i].cmd != NULL)
|
||||
for (i = 0; i < items_per_column; i++)
|
||||
{
|
||||
switch (left_center_right)
|
||||
{
|
||||
case 'L':
|
||||
printf(" %-25s", QL_HELP[i].cmd);
|
||||
left_center_right = 'C';
|
||||
break;
|
||||
case 'C':
|
||||
printf("%-25s", QL_HELP[i].cmd);
|
||||
left_center_right = 'R';
|
||||
break;
|
||||
case 'R':
|
||||
printf("%-25s\n", QL_HELP[i].cmd);
|
||||
left_center_right = 'L';
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
printf(" %-25s%-25s%-25s\n",
|
||||
VALUE_OR_NULL(QL_HELP[i].cmd),
|
||||
VALUE_OR_NULL(QL_HELP[i + items_per_column].cmd),
|
||||
VALUE_OR_NULL(QL_HELP[i + 2*items_per_column].cmd)
|
||||
);
|
||||
}
|
||||
if (left_center_right != 'L')
|
||||
puts("\n");
|
||||
putc('\n', stdout);
|
||||
}
|
||||
|
||||
else
|
||||
|
@ -286,8 +273,10 @@ helpSQL(const char *topic)
|
|||
strcmp(topic, "*") == 0)
|
||||
{
|
||||
help_found = true;
|
||||
printf("Command: %s\nDescription: %s\nSyntax:\n%s\n\n",
|
||||
QL_HELP[i].cmd, QL_HELP[i].help, QL_HELP[i].syntax);
|
||||
printf("Command: %s\n"
|
||||
"Description: %s\n"
|
||||
"Syntax:\n%s\n\n",
|
||||
QL_HELP[i].cmd, QL_HELP[i].help, QL_HELP[i].syntax);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -298,28 +287,28 @@ helpSQL(const char *topic)
|
|||
|
||||
|
||||
|
||||
|
||||
void
|
||||
print_copyright(void)
|
||||
{
|
||||
puts(
|
||||
"PostgreSQL Data Base Management System\n\n"
|
||||
"Portions Copyright (c) 1996-2000, PostgreSQL, Inc\n\n"
|
||||
"This software is based on Postgres95, formerly known as Postgres, which\n"
|
||||
"contains the following notice:\n\n"
|
||||
"Portions Copyright(c) 1994 - 7 Regents of the University of California\n\n"
|
||||
"Permission to use, copy, modify, and distribute this software and its\n"
|
||||
"documentation for any purpose, without fee, and without a written agreement\n"
|
||||
"is hereby granted, provided that the above copyright notice and this paragraph\n"
|
||||
"and the following two paragraphs appear in all copies.\n\n"
|
||||
"IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR\n"
|
||||
"DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST\n"
|
||||
"PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF\n"
|
||||
"THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\n"
|
||||
"DAMAGE.\n\n"
|
||||
"THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,\n"
|
||||
"BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n"
|
||||
"PARTICULAR PURPOSE.THE SOFTWARE PROVIDED HEREUNDER IS ON AN \"AS IS\" BASIS,\n"
|
||||
"AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,\n"
|
||||
"SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.");
|
||||
"PostgreSQL Data Base Management System\n\n"
|
||||
"Portions Copyright (c) 1996-2000, PostgreSQL, Inc\n\n"
|
||||
"This software is based on Postgres95, formerly known as Postgres, which\n"
|
||||
"contains the following notice:\n\n"
|
||||
"Portions Copyright(c) 1994 - 7 Regents of the University of California\n\n"
|
||||
"Permission to use, copy, modify, and distribute this software and its\n"
|
||||
"documentation for any purpose, without fee, and without a written agreement\n"
|
||||
"is hereby granted, provided that the above copyright notice and this paragraph\n"
|
||||
"and the following two paragraphs appear in all copies.\n\n"
|
||||
"IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR\n"
|
||||
"DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST\n"
|
||||
"PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF\n"
|
||||
"THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\n"
|
||||
"DAMAGE.\n\n"
|
||||
"THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,\n"
|
||||
"BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n"
|
||||
"PARTICULAR PURPOSE.THE SOFTWARE PROVIDED HEREUNDER IS ON AN \"AS IS\" BASIS,\n"
|
||||
"AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,\n"
|
||||
"SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
|
||||
);
|
||||
}
|
||||
|
|
|
@ -3,15 +3,18 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/input.c,v 1.8 2000/01/29 16:58:48 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/input.c,v 1.9 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#include <c.h>
|
||||
#include "input.h"
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <pqexpbuffer.h>
|
||||
|
||||
#include "settings.h"
|
||||
#include "tab-complete.h"
|
||||
#include "common.h"
|
||||
|
||||
/* Runtime options for turning off readline and history */
|
||||
/* (of course there is no runtime command for doing that :) */
|
||||
|
@ -32,7 +35,7 @@ static bool useHistory;
|
|||
* The result is malloced.
|
||||
*/
|
||||
char *
|
||||
gets_interactive(const char *prompt)
|
||||
gets_interactive(char *prompt)
|
||||
{
|
||||
char *s;
|
||||
#ifdef USE_HISTORY
|
||||
|
@ -42,7 +45,7 @@ gets_interactive(const char *prompt)
|
|||
|
||||
#ifdef USE_READLINE
|
||||
if (useReadline)
|
||||
s = readline((char *) prompt);
|
||||
s = readline(prompt);
|
||||
else
|
||||
{
|
||||
#endif
|
||||
|
@ -120,7 +123,6 @@ initializeInput(int flags)
|
|||
if (flags == 1)
|
||||
{
|
||||
useReadline = true;
|
||||
rl_readline_name = "psql";
|
||||
initialize_readline();
|
||||
}
|
||||
#endif
|
||||
|
@ -152,14 +154,14 @@ initializeInput(int flags)
|
|||
|
||||
|
||||
bool
|
||||
saveHistory(const char *fname)
|
||||
saveHistory(char *fname)
|
||||
{
|
||||
#ifdef USE_HISTORY
|
||||
if (useHistory)
|
||||
if (useHistory && fname)
|
||||
{
|
||||
if (write_history((char *) fname) != 0)
|
||||
if (write_history(fname) != 0)
|
||||
{
|
||||
perror(fname);
|
||||
psql_error("could not save history to %s: %s", fname, strerror(errno));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/input.h,v 1.6 2000/01/29 16:58:48 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/input.h,v 1.7 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#ifndef INPUT_H
|
||||
#define INPUT_H
|
||||
|
@ -37,11 +37,11 @@
|
|||
# endif
|
||||
#endif
|
||||
|
||||
char * gets_interactive(const char *prompt);
|
||||
char * gets_interactive(char *prompt);
|
||||
char * gets_fromFile(FILE *source);
|
||||
|
||||
void initializeInput(int flags);
|
||||
bool saveHistory(const char *fname);
|
||||
bool saveHistory(char *fname);
|
||||
void finishInput(void);
|
||||
|
||||
#endif /* INPUT_H */
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/large_obj.c,v 1.7 2000/01/29 16:58:48 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/large_obj.c,v 1.8 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#include <c.h>
|
||||
#include "large_obj.h"
|
||||
|
@ -113,7 +113,7 @@ do_lo_export(const char *loid_arg, const char *filename_arg)
|
|||
PQclear(res);
|
||||
}
|
||||
|
||||
status = lo_export(pset.db, atol(loid_arg), (char *) filename_arg);
|
||||
status = lo_export(pset.db, atol(loid_arg), filename_arg);
|
||||
if (status != 1)
|
||||
{ /* of course this status is documented
|
||||
* nowhere :( */
|
||||
|
@ -182,7 +182,7 @@ do_lo_import(const char *filename_arg, const char *comment_arg)
|
|||
PQclear(res);
|
||||
}
|
||||
|
||||
loid = lo_import(pset.db, (char *) filename_arg);
|
||||
loid = lo_import(pset.db, filename_arg);
|
||||
if (loid == InvalidOid)
|
||||
{
|
||||
fputs(PQerrorMessage(pset.db), stderr);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/mainloop.c,v 1.16 2000/01/24 19:34:17 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/mainloop.c,v 1.17 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#include <c.h>
|
||||
#include "mainloop.h"
|
||||
|
@ -47,10 +47,10 @@ MainLoop(FILE *source)
|
|||
bool xcomment; /* in extended comment */
|
||||
int paren_level;
|
||||
unsigned int query_start;
|
||||
int count_eof;
|
||||
int count_eof = 0;
|
||||
const char *var;
|
||||
bool was_bslash;
|
||||
unsigned int bslash_count;
|
||||
unsigned int bslash_count = 0;
|
||||
|
||||
int i,
|
||||
prevlen,
|
||||
|
@ -123,6 +123,8 @@ MainLoop(FILE *source)
|
|||
prompt_status = PROMPT_DOUBLEQUOTE;
|
||||
else if (xcomment)
|
||||
prompt_status = PROMPT_COMMENT;
|
||||
else if (paren_level)
|
||||
prompt_status = PROMPT_PAREN;
|
||||
else if (query_buf->len > 0)
|
||||
prompt_status = PROMPT_CONTINUE;
|
||||
else
|
||||
|
@ -251,7 +253,7 @@ MainLoop(FILE *source)
|
|||
}
|
||||
|
||||
/* start of quote */
|
||||
else if (line[i] == '\'' || line[i] == '"')
|
||||
else if (!was_bslash && (line[i] == '\'' || line[i] == '"'))
|
||||
in_quote = line[i];
|
||||
|
||||
/* in extended comment? */
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.9 2000/01/29 16:58:49 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.10 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#include <c.h>
|
||||
#include "print.h"
|
||||
|
@ -266,7 +266,9 @@ print_aligned_text(const char *title, const char * const * headers,
|
|||
for (i = 0; i < col_count; i++)
|
||||
{
|
||||
/* centered */
|
||||
fprintf(fout, "%-*s%s%-*s", (int) floor((widths[i] - strlen(headers[i])) / 2.0), "", headers[i], (int) ceil((widths[i] - strlen(headers[i])) / 2.0), "");
|
||||
fprintf(fout, "%-*s%s%-*s",
|
||||
(int) floor((widths[i] - strlen(headers[i])) / 2.0), "",
|
||||
headers[i], (int) ceil((widths[i] - strlen(headers[i])) / 2.0), "");
|
||||
|
||||
if (i < col_count - 1)
|
||||
{
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/prompt.c,v 1.7 2000/01/29 16:58:49 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/prompt.c,v 1.8 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#include <c.h>
|
||||
#include "prompt.h"
|
||||
|
@ -19,8 +19,8 @@
|
|||
#include "variables.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#define popen(x,y) _popen(x,y)
|
||||
#define pclose(x) _pclose(x)
|
||||
#include <io.h>
|
||||
#include <win32.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -53,14 +53,14 @@
|
|||
*
|
||||
* %`command` - The result of executing command in /bin/sh with trailing
|
||||
* newline stripped.
|
||||
* %$name$ - The value of the psql variable 'name'
|
||||
* %:name: - The value of the psql variable 'name'
|
||||
* (those will not be rescanned for more escape sequences!)
|
||||
*
|
||||
* If the application-wide prompts became NULL somehow, the returned string
|
||||
* will be empty (not NULL!).
|
||||
*--------------------------
|
||||
*/
|
||||
const char *
|
||||
char *
|
||||
get_prompt(promptStatus_t status)
|
||||
{
|
||||
#define MAX_PROMPT_SIZE 256
|
||||
|
@ -72,7 +72,7 @@ get_prompt(promptStatus_t status)
|
|||
|
||||
if (status == PROMPT_READY)
|
||||
prompt_string = GetVariable(pset.vars, "PROMPT1");
|
||||
else if (status == PROMPT_CONTINUE || status == PROMPT_SINGLEQUOTE || status == PROMPT_DOUBLEQUOTE || status == PROMPT_COMMENT)
|
||||
else if (status == PROMPT_CONTINUE || status == PROMPT_SINGLEQUOTE || status == PROMPT_DOUBLEQUOTE || status == PROMPT_COMMENT || status == PROMPT_PAREN)
|
||||
prompt_string = GetVariable(pset.vars, "PROMPT2");
|
||||
else if (status == PROMPT_COPY)
|
||||
prompt_string = GetVariable(pset.vars, "PROMPT3");
|
||||
|
@ -183,6 +183,9 @@ get_prompt(promptStatus_t status)
|
|||
case PROMPT_COMMENT:
|
||||
buf[0] = '*';
|
||||
break;
|
||||
case PROMPT_PAREN:
|
||||
buf[0] = '(';
|
||||
break;
|
||||
default:
|
||||
buf[0] = '\0';
|
||||
break;
|
||||
|
@ -226,14 +229,14 @@ get_prompt(promptStatus_t status)
|
|||
}
|
||||
|
||||
/* interpolate variable */
|
||||
case '$':
|
||||
case ':':
|
||||
{
|
||||
char *name;
|
||||
const char *val;
|
||||
int nameend;
|
||||
|
||||
name = strdup(p + 1);
|
||||
nameend = strcspn(name, "$");
|
||||
nameend = strcspn(name, ":");
|
||||
name[nameend] = '\0';
|
||||
val = GetVariable(pset.vars, name);
|
||||
if (val)
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/prompt.h,v 1.5 2000/01/29 16:58:49 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/prompt.h,v 1.6 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#ifndef PROMPT_H
|
||||
#define PROMPT_H
|
||||
|
@ -17,9 +17,10 @@ typedef enum _promptStatus
|
|||
PROMPT_COMMENT,
|
||||
PROMPT_SINGLEQUOTE,
|
||||
PROMPT_DOUBLEQUOTE,
|
||||
PROMPT_PAREN,
|
||||
PROMPT_COPY
|
||||
} promptStatus_t;
|
||||
|
||||
const char *get_prompt(promptStatus_t status);
|
||||
char *get_prompt(promptStatus_t status);
|
||||
|
||||
#endif /* PROMPT_H */
|
||||
|
|
|
@ -3,53 +3,48 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.21 2000/02/05 12:27:56 ishii Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.22 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#include <c.h>
|
||||
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#else /* WIN32 */
|
||||
#include <io.h>
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <win32.h>
|
||||
#endif /* WIN32 */
|
||||
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
|
||||
#include <libpq-fe.h>
|
||||
#include <pqsignal.h>
|
||||
#include <version.h>
|
||||
|
||||
#include "settings.h"
|
||||
#include "command.h"
|
||||
#include "help.h"
|
||||
#include "mainloop.h"
|
||||
#include "common.h"
|
||||
#include "input.h"
|
||||
#include "variables.h"
|
||||
#include "print.h"
|
||||
#include "describe.h"
|
||||
#include "help.h"
|
||||
#include "input.h"
|
||||
#include "mainloop.h"
|
||||
#include "print.h"
|
||||
#include "settings.h"
|
||||
#include "variables.h"
|
||||
|
||||
/*
|
||||
* Global psql options
|
||||
*/
|
||||
PsqlSettings pset;
|
||||
|
||||
static void
|
||||
process_psqlrc(void);
|
||||
|
||||
static void
|
||||
showVersion(void);
|
||||
|
||||
|
||||
/* Structures to pass information between the option parsing routine
|
||||
/*
|
||||
* Structures to pass information between the option parsing routine
|
||||
* and the main function
|
||||
*/
|
||||
enum _actions
|
||||
|
@ -75,15 +70,21 @@ struct adhoc_opts
|
|||
static void
|
||||
parse_options(int argc, char *argv[], struct adhoc_opts * options);
|
||||
|
||||
static void
|
||||
process_psqlrc(void);
|
||||
|
||||
static void
|
||||
showVersion(void);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* main()
|
||||
* main
|
||||
*
|
||||
*/
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
struct adhoc_opts options;
|
||||
int successResult;
|
||||
|
@ -92,8 +93,6 @@ main(int argc, char **argv)
|
|||
char *password = NULL;
|
||||
bool need_pass;
|
||||
|
||||
memset(&pset, 0, sizeof pset);
|
||||
|
||||
if (!strrchr(argv[0], SEP_CHAR))
|
||||
pset.progname = argv[0];
|
||||
else
|
||||
|
@ -104,21 +103,21 @@ main(int argc, char **argv)
|
|||
pset.encoding = PQenv2encoding();
|
||||
|
||||
pset.vars = CreateVariableSpace();
|
||||
if (!pset.vars)
|
||||
{
|
||||
fprintf(stderr, "%s: out of memory\n", pset.progname);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
pset.popt.topt.format = PRINT_ALIGNED;
|
||||
pset.queryFout = stdout;
|
||||
pset.popt.topt.fieldSep = xstrdup(DEFAULT_FIELD_SEP);
|
||||
pset.popt.topt.recordSep = xstrdup(DEFAULT_RECORD_SEP);
|
||||
pset.popt.topt.border = 1;
|
||||
pset.popt.topt.pager = true;
|
||||
|
||||
SetVariable(pset.vars, "PROMPT1", DEFAULT_PROMPT1);
|
||||
SetVariable(pset.vars, "PROMPT2", DEFAULT_PROMPT2);
|
||||
SetVariable(pset.vars, "PROMPT3", DEFAULT_PROMPT3);
|
||||
SetVariable(pset.vars, "VERSION", PG_VERSION_STR);
|
||||
|
||||
pset.notty = (!isatty(fileno(stdin)) || !isatty(fileno(stdout)));
|
||||
|
||||
/* This is obsolete and will be removed very soon. */
|
||||
/* This is obsolete and should be removed sometime. */
|
||||
#ifdef PSQL_ALWAYS_GET_PASSWORDS
|
||||
pset.getPassword = true;
|
||||
#else
|
||||
|
@ -127,11 +126,18 @@ main(int argc, char **argv)
|
|||
|
||||
parse_options(argc, argv, &options);
|
||||
|
||||
if (options.action == ACT_LIST_DB)
|
||||
options.dbname = "template1";
|
||||
if (!pset.popt.topt.fieldSep)
|
||||
pset.popt.topt.fieldSep = xstrdup(DEFAULT_FIELD_SEP);
|
||||
if (!pset.popt.topt.recordSep)
|
||||
pset.popt.topt.recordSep = xstrdup(DEFAULT_RECORD_SEP);
|
||||
|
||||
if (options.username)
|
||||
{
|
||||
/*
|
||||
* The \001 is a hack to support the deprecated -u option which issues
|
||||
* a username prompt. The recommended option is -U followed by the name
|
||||
* on the command line.
|
||||
*/
|
||||
if (strcmp(options.username, "\001") == 0)
|
||||
username = simple_prompt("Username: ", 100, true);
|
||||
else
|
||||
|
@ -145,7 +151,9 @@ main(int argc, char **argv)
|
|||
do
|
||||
{
|
||||
need_pass = false;
|
||||
pset.db = PQsetdbLogin(options.host, options.port, NULL, NULL, options.dbname, username, password);
|
||||
pset.db = PQsetdbLogin(options.host, options.port, NULL, NULL,
|
||||
options.action == ACT_LIST_DB ? "template1" : options.dbname,
|
||||
username, password);
|
||||
|
||||
if (PQstatus(pset.db) == CONNECTION_BAD &&
|
||||
strcmp(PQerrorMessage(pset.db), "fe_sendauth: no password supplied\n") == 0)
|
||||
|
@ -162,8 +170,7 @@ main(int argc, char **argv)
|
|||
|
||||
if (PQstatus(pset.db) == CONNECTION_BAD)
|
||||
{
|
||||
fprintf(stderr, "%s: %s",
|
||||
pset.progname, PQerrorMessage(pset.db));
|
||||
fprintf(stderr, "%s: %s", pset.progname, PQerrorMessage(pset.db));
|
||||
PQfinish(pset.db);
|
||||
exit(EXIT_BADCONN);
|
||||
}
|
||||
|
@ -188,44 +195,62 @@ main(int argc, char **argv)
|
|||
SetVariable(pset.vars, "HOST", PQhost(pset.db));
|
||||
SetVariable(pset.vars, "PORT", PQport(pset.db));
|
||||
|
||||
pset.issuper = test_superuser(PQuser(pset.db));
|
||||
/*
|
||||
* Now find something to do
|
||||
*/
|
||||
|
||||
if (!QUIET() && !pset.notty && !options.action)
|
||||
{
|
||||
printf("Welcome to %s, the PostgreSQL interactive terminal.\n\n"
|
||||
"Type: \\copyright for distribution terms\n"
|
||||
" \\h for help with SQL commands\n"
|
||||
" \\? for help on internal slash commands\n"
|
||||
" \\g or terminate with semicolon to execute query\n"
|
||||
" \\q to quit\n", pset.progname);
|
||||
}
|
||||
|
||||
/* Now find something to do */
|
||||
|
||||
/* process file given by -f */
|
||||
/*
|
||||
* process file given by -f
|
||||
*/
|
||||
if (options.action == ACT_FILE)
|
||||
successResult = process_file(options.action_string) ? 0 : 1;
|
||||
/* process slash command if one was given to -c */
|
||||
/*
|
||||
* process slash command if one was given to -c
|
||||
*/
|
||||
else if (options.action == ACT_SINGLE_SLASH)
|
||||
{
|
||||
if (GetVariable(pset.vars, "ECHO") && strcmp(GetVariable(pset.vars, "ECHO"), "full")==0)
|
||||
const char * value;
|
||||
|
||||
if ((value = GetVariable(pset.vars, "ECHO")) && strcmp(value, "full")==0)
|
||||
puts(options.action_string);
|
||||
successResult = HandleSlashCmds(options.action_string, NULL, NULL) != CMD_ERROR ? 0 : 1;
|
||||
}
|
||||
/* If the query given to -c was a normal one, send it */
|
||||
/*
|
||||
* If the query given to -c was a normal one, send it
|
||||
*/
|
||||
else if (options.action == ACT_SINGLE_QUERY)
|
||||
{
|
||||
if (GetVariable(pset.vars, "ECHO") && strcmp(GetVariable(pset.vars, "ECHO"), "full")==0)
|
||||
const char * value;
|
||||
|
||||
if ((value = GetVariable(pset.vars, "ECHO")) && strcmp(value, "full")==0)
|
||||
puts(options.action_string);
|
||||
successResult = SendQuery( options.action_string) ? 0 : 1;
|
||||
successResult = SendQuery(options.action_string) ? 0 : 1;
|
||||
}
|
||||
/* or otherwise enter interactive main loop */
|
||||
/*
|
||||
* or otherwise enter interactive main loop
|
||||
*/
|
||||
else
|
||||
{
|
||||
pset.issuper = test_superuser(PQuser(pset.db));
|
||||
if (!QUIET() && !pset.notty)
|
||||
{
|
||||
printf("Welcome to %s, the PostgreSQL interactive terminal.\n\n"
|
||||
"Type: \\copyright for distribution terms\n"
|
||||
" \\h for help with SQL commands\n"
|
||||
" \\? for help on internal slash commands\n"
|
||||
" \\g or terminate with semicolon to execute query\n"
|
||||
" \\q to quit\n\n", pset.progname);
|
||||
}
|
||||
|
||||
SetVariable(pset.vars, "PROMPT1", DEFAULT_PROMPT1);
|
||||
SetVariable(pset.vars, "PROMPT2", DEFAULT_PROMPT2);
|
||||
SetVariable(pset.vars, "PROMPT3", DEFAULT_PROMPT3);
|
||||
process_psqlrc();
|
||||
initializeInput(options.no_readline ? 0 : 1);
|
||||
if (!pset.notty)
|
||||
initializeInput(options.no_readline ? 0 : 1);
|
||||
successResult = MainLoop(stdin);
|
||||
finishInput();
|
||||
if (!pset.notty)
|
||||
finishInput();
|
||||
}
|
||||
|
||||
/* clean up */
|
||||
|
@ -253,7 +278,8 @@ static void
|
|||
parse_options(int argc, char *argv[], struct adhoc_opts * options)
|
||||
{
|
||||
#ifdef HAVE_GETOPT_LONG
|
||||
static struct option long_options[] = {
|
||||
static struct option long_options[] =
|
||||
{
|
||||
{"no-align", no_argument, NULL, 'A'},
|
||||
{"command", required_argument, NULL, 'c'},
|
||||
{"dbname", required_argument, NULL, 'd'},
|
||||
|
@ -269,6 +295,7 @@ parse_options(int argc, char *argv[], struct adhoc_opts * options)
|
|||
{"port", required_argument, NULL, 'p'},
|
||||
{"pset", required_argument, NULL, 'P'},
|
||||
{"quiet", no_argument, NULL, 'q'},
|
||||
{"record-separator", required_argument, NULL, 'R'},
|
||||
{"single-step", no_argument, NULL, 's'},
|
||||
{"single-line", no_argument, NULL, 'S'},
|
||||
{"tuples-only", no_argument, NULL, 't'},
|
||||
|
@ -283,7 +310,7 @@ parse_options(int argc, char *argv[], struct adhoc_opts * options)
|
|||
};
|
||||
|
||||
int optindex;
|
||||
#endif
|
||||
#endif /* HAVE_GETOPT_LONG */
|
||||
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
@ -293,15 +320,15 @@ parse_options(int argc, char *argv[], struct adhoc_opts * options)
|
|||
memset(options, 0, sizeof *options);
|
||||
|
||||
#ifdef HAVE_GETOPT_LONG
|
||||
while ((c = getopt_long(argc, argv, "Ac:d:eEf:F:lh:Hno:p:P:qsStT:uU:v:VWx?", long_options, &optindex)) != -1)
|
||||
#else
|
||||
while ((c = getopt_long(argc, argv, "Ac:d:eEf:F:lh:Hno:p:P:qRsStT:uU:v:VWx?", 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, "Ac:d:eEf:F:lh:Hno:p:P:qsStT:uU:v:VWx?-")) != -1)
|
||||
#endif
|
||||
while ((c = getopt(argc, argv, "Ac:d:eEf:F:lh:Hno:p:P:qRsStT:uU:v:VWx?-")) != -1)
|
||||
#endif /* not HAVE_GETOPT_LONG */
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
|
@ -329,7 +356,7 @@ parse_options(int argc, char *argv[], struct adhoc_opts * options)
|
|||
options->action_string = optarg;
|
||||
break;
|
||||
case 'F':
|
||||
pset.popt.topt.fieldSep = strdup(optarg);
|
||||
pset.popt.topt.fieldSep = xstrdup(optarg);
|
||||
break;
|
||||
case 'h':
|
||||
options->host = optarg;
|
||||
|
@ -377,6 +404,9 @@ parse_options(int argc, char *argv[], struct adhoc_opts * options)
|
|||
case 'q':
|
||||
SetVariable(pset.vars, "QUIET", "");
|
||||
break;
|
||||
case 'R':
|
||||
pset.popt.topt.recordSep = xstrdup(optarg);
|
||||
break;
|
||||
case 's':
|
||||
SetVariable(pset.vars, "SINGLESTEP", "");
|
||||
break;
|
||||
|
@ -507,7 +537,7 @@ process_psqlrc(void)
|
|||
|
||||
if (home)
|
||||
{
|
||||
psqlrc = (char *) malloc(strlen(home) + 20);
|
||||
psqlrc = malloc(strlen(home) + 20);
|
||||
if (!psqlrc)
|
||||
{
|
||||
fprintf(stderr, "%s: out of memory\n", pset.progname);
|
||||
|
@ -570,7 +600,7 @@ showVersion(void)
|
|||
#endif
|
||||
|
||||
puts("Portions Copyright (c) 1996-2000, PostgreSQL, Inc");
|
||||
puts("Portions Copyright (C) 1996 Regents of the University of California");
|
||||
puts("Portions Copyright (c) 1996 Regents of the University of California");
|
||||
puts("Read the file COPYRIGHT or use the command \\copyright to see the");
|
||||
puts("usage and distribution terms.");
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/stringutils.c,v 1.23 2000/01/29 16:58:49 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/stringutils.c,v 1.24 2000/02/07 23:10:06 petere Exp $
|
||||
*/
|
||||
#include <c.h>
|
||||
#include "stringutils.h"
|
||||
|
@ -12,19 +12,13 @@
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <postgres.h>
|
||||
#ifndef HAVE_STRDUP
|
||||
#include <strdup.h>
|
||||
#endif
|
||||
#include <libpq-fe.h>
|
||||
|
||||
|
||||
|
||||
static void
|
||||
unescape_quotes(char *source, char quote, char escape);
|
||||
static void unescape_quotes(char *source, int quote, int escape);
|
||||
|
||||
|
||||
/*
|
||||
|
@ -45,7 +39,7 @@ char *
|
|||
strtokx(const char *s,
|
||||
const char *delim,
|
||||
const char *quote,
|
||||
char escape,
|
||||
int escape,
|
||||
char *was_quoted,
|
||||
unsigned int *token_pos,
|
||||
int encoding)
|
||||
|
@ -60,6 +54,10 @@ strtokx(const char *s,
|
|||
char *start;
|
||||
char *cp = NULL;
|
||||
|
||||
#ifndef MULTIBYTE
|
||||
(void)encoding; /*not used*/
|
||||
#endif
|
||||
|
||||
if (s)
|
||||
{
|
||||
free(storage);
|
||||
|
@ -160,7 +158,7 @@ strtokx(const char *s,
|
|||
* Resolves escaped quotes. Used by strtokx above.
|
||||
*/
|
||||
static void
|
||||
unescape_quotes(char *source, char quote, char escape)
|
||||
unescape_quotes(char *source, int quote, int escape)
|
||||
{
|
||||
char *p;
|
||||
char *destination,
|
||||
|
@ -170,7 +168,7 @@ unescape_quotes(char *source, char quote, char escape)
|
|||
assert(source);
|
||||
#endif
|
||||
|
||||
destination = (char *) calloc(1, strlen(source) + 1);
|
||||
destination = calloc(1, strlen(source) + 1);
|
||||
if (!destination)
|
||||
{
|
||||
perror("calloc");
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/stringutils.h,v 1.13 2000/01/29 16:58:49 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/stringutils.h,v 1.14 2000/02/07 23:10:07 petere Exp $
|
||||
*/
|
||||
#ifndef STRINGUTILS_H
|
||||
#define STRINGUTILS_H
|
||||
|
@ -13,7 +13,7 @@
|
|||
extern char *strtokx(const char *s,
|
||||
const char *delim,
|
||||
const char *quote,
|
||||
char escape,
|
||||
int escape,
|
||||
char *was_quoted,
|
||||
unsigned int *token_pos,
|
||||
int encoding);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Copyright 2000 by PostgreSQL Global Development Group
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.c,v 1.9 2000/01/29 16:58:49 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/tab-complete.c,v 1.10 2000/02/07 23:10:07 petere Exp $
|
||||
*/
|
||||
|
||||
/*-----------
|
||||
|
@ -121,9 +121,7 @@ pgsql_thing_t words_after_create[] = {
|
|||
{ "TYPE", "SELECT typname FROM pg_type WHERE substr(typname,1,%d)='%s'" },
|
||||
{ "UNIQUE", NULL }, /* for CREATE UNIQUE INDEX ... */
|
||||
{ "USER", "SELECT usename FROM pg_user WHERE substr(usename,1,%d)='%s'" },
|
||||
{ "VIEW", NULL }, /* Telling a view from a table is not the easiest
|
||||
thing in the world, and the solutions I've seen
|
||||
don't really work, so I'll wait on this. */
|
||||
{ "VIEW", "SELECT viewname FROM pg_views WHERE substr(viewname,1,%d)='%s'" },
|
||||
{ NULL, NULL } /* end of list */
|
||||
};
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
* exceed INITIAL_EXPBUFFER_SIZE (currently 256 bytes).
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v 1.36 2000/01/26 05:58:45 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-auth.c,v 1.37 2000/02/07 23:10:08 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -474,6 +474,10 @@ int
|
|||
fe_sendauth(AuthRequest areq, PGconn *conn, const char *hostname,
|
||||
const char *password, char *PQerrormsg)
|
||||
{
|
||||
#if !defined(KRB4) && !defined(KRB5)
|
||||
(void)hostname; /*not used*/
|
||||
#endif
|
||||
|
||||
switch (areq)
|
||||
{
|
||||
case AUTH_REQ_OK:
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.117 2000/02/05 12:33:22 ishii Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.118 2000/02/07 23:10:09 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -2291,7 +2291,7 @@ conninfo_free()
|
|||
}
|
||||
|
||||
/* =========== accessor functions for PGconn ========= */
|
||||
const char *
|
||||
char *
|
||||
PQdb(const PGconn *conn)
|
||||
{
|
||||
if (!conn)
|
||||
|
@ -2299,7 +2299,7 @@ PQdb(const PGconn *conn)
|
|||
return conn->dbName;
|
||||
}
|
||||
|
||||
const char *
|
||||
char *
|
||||
PQuser(const PGconn *conn)
|
||||
{
|
||||
if (!conn)
|
||||
|
@ -2307,7 +2307,7 @@ PQuser(const PGconn *conn)
|
|||
return conn->pguser;
|
||||
}
|
||||
|
||||
const char *
|
||||
char *
|
||||
PQpass(const PGconn *conn)
|
||||
{
|
||||
if (!conn)
|
||||
|
@ -2315,7 +2315,7 @@ PQpass(const PGconn *conn)
|
|||
return conn->pgpass;
|
||||
}
|
||||
|
||||
const char *
|
||||
char *
|
||||
PQhost(const PGconn *conn)
|
||||
{
|
||||
if (!conn)
|
||||
|
@ -2323,7 +2323,7 @@ PQhost(const PGconn *conn)
|
|||
return conn->pghost;
|
||||
}
|
||||
|
||||
const char *
|
||||
char *
|
||||
PQport(const PGconn *conn)
|
||||
{
|
||||
if (!conn)
|
||||
|
@ -2331,7 +2331,7 @@ PQport(const PGconn *conn)
|
|||
return conn->pgport;
|
||||
}
|
||||
|
||||
const char *
|
||||
char *
|
||||
PQtty(const PGconn *conn)
|
||||
{
|
||||
if (!conn)
|
||||
|
@ -2339,7 +2339,7 @@ PQtty(const PGconn *conn)
|
|||
return conn->pgtty;
|
||||
}
|
||||
|
||||
const char *
|
||||
char *
|
||||
PQoptions(const PGconn *conn)
|
||||
{
|
||||
if (!conn)
|
||||
|
@ -2355,7 +2355,7 @@ PQstatus(const PGconn *conn)
|
|||
return conn->status;
|
||||
}
|
||||
|
||||
const char *
|
||||
char *
|
||||
PQerrorMessage(const PGconn *conn)
|
||||
{
|
||||
static char noConn[] = "PQerrorMessage: conn pointer is NULL\n";
|
||||
|
@ -2478,6 +2478,7 @@ PQsetNoticeProcessor(PGconn *conn, PQnoticeProcessor proc, void *arg)
|
|||
static void
|
||||
defaultNoticeProcessor(void *arg, const char *message)
|
||||
{
|
||||
(void)arg; /*not used*/
|
||||
/* Note: we expect the supplied string to end with a newline already. */
|
||||
fprintf(stderr, "%s", message);
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.89 2000/01/26 05:58:45 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.90 2000/02/07 23:10:10 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -27,7 +27,7 @@
|
|||
#endif
|
||||
|
||||
/* keep this in same order as ExecStatusType in libpq-fe.h */
|
||||
const char *const pgresStatus[] = {
|
||||
char * const pgresStatus[] = {
|
||||
"PGRES_EMPTY_QUERY",
|
||||
"PGRES_COMMAND_OK",
|
||||
"PGRES_TUPLES_OK",
|
||||
|
@ -1760,15 +1760,15 @@ PQresultStatus(const PGresult *res)
|
|||
return res->resultStatus;
|
||||
}
|
||||
|
||||
const char *
|
||||
char *
|
||||
PQresStatus(ExecStatusType status)
|
||||
{
|
||||
if ((int)status < 0 || (size_t)status >= sizeof pgresStatus / sizeof pgresStatus[0])
|
||||
if (status < 0 || status >= sizeof pgresStatus / sizeof pgresStatus[0])
|
||||
return "Invalid ExecStatusType code";
|
||||
return pgresStatus[status];
|
||||
}
|
||||
|
||||
const char *
|
||||
char *
|
||||
PQresultErrorMessage(const PGresult *res)
|
||||
{
|
||||
if (!res || !res->errMsg)
|
||||
|
@ -1862,7 +1862,7 @@ check_tuple_field_number(const char *routineName, const PGresult *res,
|
|||
/*
|
||||
returns NULL if the field_num is invalid
|
||||
*/
|
||||
const char *
|
||||
char *
|
||||
PQfname(const PGresult *res, int field_num)
|
||||
{
|
||||
if (!check_field_number("PQfname", res, field_num))
|
||||
|
@ -1947,8 +1947,8 @@ PQfmod(const PGresult *res, int field_num)
|
|||
return 0;
|
||||
}
|
||||
|
||||
const char *
|
||||
PQcmdStatus(const PGresult *res)
|
||||
char *
|
||||
PQcmdStatus(PGresult *res)
|
||||
{
|
||||
if (!res)
|
||||
return NULL;
|
||||
|
@ -1960,7 +1960,7 @@ PQcmdStatus(const PGresult *res)
|
|||
if the last command was an INSERT, return the oid string
|
||||
if not, return ""
|
||||
*/
|
||||
const char *
|
||||
char *
|
||||
PQoidStatus(const PGresult *res)
|
||||
{
|
||||
/*
|
||||
|
@ -2011,8 +2011,8 @@ PQoidValue(const PGresult *res)
|
|||
if the last command was an INSERT/UPDATE/DELETE, return number
|
||||
of inserted/affected tuples, if not, return ""
|
||||
*/
|
||||
const char *
|
||||
PQcmdTuples(const PGresult *res)
|
||||
char *
|
||||
PQcmdTuples(PGresult *res)
|
||||
{
|
||||
char noticeBuf[128];
|
||||
|
||||
|
@ -2023,7 +2023,7 @@ PQcmdTuples(const PGresult *res)
|
|||
strncmp(res->cmdStatus, "DELETE", 6) == 0 ||
|
||||
strncmp(res->cmdStatus, "UPDATE", 6) == 0)
|
||||
{
|
||||
const char *p = res->cmdStatus + 6;
|
||||
char *p = res->cmdStatus + 6;
|
||||
|
||||
if (*p == 0)
|
||||
{
|
||||
|
@ -2067,7 +2067,7 @@ PQcmdTuples(const PGresult *res)
|
|||
|
||||
if res is not binary, a null-terminated ASCII string is returned.
|
||||
*/
|
||||
const char *
|
||||
char *
|
||||
PQgetvalue(const PGresult *res, int tup_num, int field_num)
|
||||
{
|
||||
if (!check_tuple_field_number("PQgetvalue", res, tup_num, field_num))
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v 1.27 2000/01/26 05:58:45 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-lobj.c,v 1.28 2000/02/07 23:10:11 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -168,7 +168,7 @@ lo_read(PGconn *conn, int fd, char *buf, size_t len)
|
|||
*
|
||||
*/
|
||||
int
|
||||
lo_write(PGconn *conn, int fd, const char *buf, size_t len)
|
||||
lo_write(PGconn *conn, int fd, char *buf, size_t len)
|
||||
{
|
||||
PQArgBlock argv[2];
|
||||
PGresult *res;
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.38 2000/01/29 16:58:51 petere Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.39 2000/02/07 23:10:11 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -782,6 +782,8 @@ PQenv2encoding(void)
|
|||
int
|
||||
PQmblen(const unsigned char *s, int encoding)
|
||||
{
|
||||
(void)s;
|
||||
(void)encoding;
|
||||
return 1;
|
||||
}
|
||||
int
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
* didn't really belong there.
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-print.c,v 1.34 2000/02/05 12:33:22 ishii Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-print.c,v 1.35 2000/02/07 23:10:11 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -59,7 +59,7 @@ static char *do_header(FILE *fout, const PQprintOpt *po, const int nFields,
|
|||
static void output_row(FILE *fout, const PQprintOpt *po, const int nFields, char **fields,
|
||||
unsigned char *fieldNotNum, int *fieldMax, char *border,
|
||||
const int row_index);
|
||||
|
||||
static void fill(int length, int max, char filler, FILE *fp);
|
||||
|
||||
/*
|
||||
* PQprint()
|
||||
|
@ -440,7 +440,6 @@ do_header(FILE *fout, const PQprintOpt *po, const int nFields, int *fieldMax,
|
|||
fputs("<tr>", fout);
|
||||
else
|
||||
{
|
||||
int j; /* for loop index */
|
||||
int tot = 0;
|
||||
int n = 0;
|
||||
char *p = NULL;
|
||||
|
@ -557,7 +556,6 @@ output_row(FILE *fout, const PQprintOpt *po, const int nFields, char **fields,
|
|||
|
||||
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* really old printing routines
|
||||
*/
|
||||
|
@ -728,4 +726,17 @@ PQprintTuples(const PGresult *res,
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* simply send out max-length number of filler characters to fp */
|
||||
|
||||
static void
|
||||
fill(int length, int max, char filler, FILE *fp)
|
||||
{
|
||||
int count;
|
||||
|
||||
count = max - length;
|
||||
while (count-- >= 0)
|
||||
putc(filler, fp);
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: libpq-fe.h,v 1.59 2000/02/05 12:33:22 ishii Exp $
|
||||
* $Id: libpq-fe.h,v 1.60 2000/02/07 23:10:11 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -74,11 +74,6 @@ extern "C"
|
|||
PGRES_FATAL_ERROR
|
||||
} ExecStatusType;
|
||||
|
||||
/* String descriptions of the ExecStatusTypes.
|
||||
* NB: direct use of this array is now deprecated; call PQresStatus() instead.
|
||||
*/
|
||||
extern const char *const pgresStatus[];
|
||||
|
||||
/* PGconn encapsulates a connection to the backend.
|
||||
* The contents of this struct are not supposed to be known to applications.
|
||||
*/
|
||||
|
@ -115,16 +110,17 @@ extern "C"
|
|||
typedef void (*PQnoticeProcessor) (void *arg, const char *message);
|
||||
|
||||
/* Print options for PQprint() */
|
||||
typedef char pqbool;
|
||||
|
||||
typedef struct _PQprintOpt
|
||||
{
|
||||
int header; /* print output field headings and row
|
||||
pqbool header; /* print output field headings and row
|
||||
* count */
|
||||
int align; /* fill align the fields */
|
||||
int standard; /* old brain dead format */
|
||||
int html3; /* output html tables */
|
||||
int expanded; /* expand tables */
|
||||
int pager; /* use pager for output if needed */
|
||||
pqbool align; /* fill align the fields */
|
||||
pqbool standard; /* old brain dead format */
|
||||
pqbool html3; /* output html tables */
|
||||
pqbool expanded; /* expand tables */
|
||||
pqbool pager; /* use pager for output if needed */
|
||||
char *fieldSep; /* field separator */
|
||||
char *tableOpt; /* insert to HTML <table ...> */
|
||||
char *caption; /* HTML <caption> */
|
||||
|
@ -207,15 +203,15 @@ extern "C"
|
|||
extern int PQrequestCancel(PGconn *conn);
|
||||
|
||||
/* Accessor functions for PGconn objects */
|
||||
extern const char *PQdb(const PGconn *conn);
|
||||
extern const char *PQuser(const PGconn *conn);
|
||||
extern const char *PQpass(const PGconn *conn);
|
||||
extern const char *PQhost(const PGconn *conn);
|
||||
extern const char *PQport(const PGconn *conn);
|
||||
extern const char *PQtty(const PGconn *conn);
|
||||
extern const char *PQoptions(const PGconn *conn);
|
||||
extern char *PQdb(const PGconn *conn);
|
||||
extern char *PQuser(const PGconn *conn);
|
||||
extern char *PQpass(const PGconn *conn);
|
||||
extern char *PQhost(const PGconn *conn);
|
||||
extern char *PQport(const PGconn *conn);
|
||||
extern char *PQtty(const PGconn *conn);
|
||||
extern char *PQoptions(const PGconn *conn);
|
||||
extern ConnStatusType PQstatus(const PGconn *conn);
|
||||
extern const char *PQerrorMessage(const PGconn *conn);
|
||||
extern char *PQerrorMessage(const PGconn *conn);
|
||||
extern int PQsocket(const PGconn *conn);
|
||||
extern int PQbackendPID(const PGconn *conn);
|
||||
extern int PQclientEncoding(const PGconn *conn);
|
||||
|
@ -279,21 +275,21 @@ extern "C"
|
|||
|
||||
/* Accessor functions for PGresult objects */
|
||||
extern ExecStatusType PQresultStatus(const PGresult *res);
|
||||
extern const char *PQresStatus(ExecStatusType status);
|
||||
extern const char *PQresultErrorMessage(const PGresult *res);
|
||||
extern char *PQresStatus(ExecStatusType status);
|
||||
extern char *PQresultErrorMessage(const PGresult *res);
|
||||
extern int PQntuples(const PGresult *res);
|
||||
extern int PQnfields(const PGresult *res);
|
||||
extern int PQbinaryTuples(const PGresult *res);
|
||||
extern const char *PQfname(const PGresult *res, int field_num);
|
||||
extern char *PQfname(const PGresult *res, int field_num);
|
||||
extern int PQfnumber(const PGresult *res, const char *field_name);
|
||||
extern Oid PQftype(const PGresult *res, int field_num);
|
||||
extern int PQfsize(const PGresult *res, int field_num);
|
||||
extern int PQfmod(const PGresult *res, int field_num);
|
||||
extern const char *PQcmdStatus(const PGresult *res);
|
||||
extern const char *PQoidStatus(const PGresult *res); /* old and ugly */
|
||||
extern char *PQcmdStatus(PGresult *res);
|
||||
extern char *PQoidStatus(const PGresult *res); /* old and ugly */
|
||||
extern Oid PQoidValue(const PGresult *res); /* new and improved */
|
||||
extern const char *PQcmdTuples(const PGresult *res);
|
||||
extern const char *PQgetvalue(const PGresult *res, int tup_num, int field_num);
|
||||
extern char *PQcmdTuples(PGresult *res);
|
||||
extern char *PQgetvalue(const PGresult *res, int tup_num, int field_num);
|
||||
extern int PQgetlength(const PGresult *res, int tup_num, int field_num);
|
||||
extern int PQgetisnull(const PGresult *res, int tup_num, int field_num);
|
||||
|
||||
|
@ -313,7 +309,6 @@ extern "C"
|
|||
const PGresult *res,
|
||||
const PQprintOpt *ps); /* option structure */
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* really old printing routines
|
||||
*/
|
||||
|
@ -330,7 +325,7 @@ extern "C"
|
|||
int terseOutput, /* delimiter bars */
|
||||
int width); /* width of column, if
|
||||
* 0, use variable width */
|
||||
#endif
|
||||
|
||||
|
||||
/* === in fe-lobj.c === */
|
||||
|
||||
|
@ -338,7 +333,7 @@ extern "C"
|
|||
extern int lo_open(PGconn *conn, Oid lobjId, int mode);
|
||||
extern int lo_close(PGconn *conn, int fd);
|
||||
extern int lo_read(PGconn *conn, int fd, char *buf, size_t len);
|
||||
extern int lo_write(PGconn *conn, int fd, const char *buf, size_t len);
|
||||
extern int lo_write(PGconn *conn, int fd, char *buf, size_t len);
|
||||
extern int lo_lseek(PGconn *conn, int fd, int offset, int whence);
|
||||
extern Oid lo_creat(PGconn *conn, int mode);
|
||||
extern int lo_tell(PGconn *conn, int fd);
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: libpq-int.h,v 1.18 2000/01/26 05:58:46 momjian Exp $
|
||||
* $Id: libpq-int.h,v 1.19 2000/02/07 23:10:11 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -244,6 +244,11 @@ struct pg_conn
|
|||
int client_encoding; /* encoding id */
|
||||
};
|
||||
|
||||
/* String descriptions of the ExecStatusTypes.
|
||||
* direct use of this array is deprecated; call PQresStatus() instead.
|
||||
*/
|
||||
extern char *const pgresStatus[];
|
||||
|
||||
/* ----------------
|
||||
* Internal functions of libpq
|
||||
* Functions declared here need to be visible across files of libpq,
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/pqexpbuffer.c,v 1.4 2000/01/26 05:58:46 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/pqexpbuffer.c,v 1.5 2000/02/07 23:10:11 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -124,9 +124,9 @@ resetPQExpBuffer(PQExpBuffer str)
|
|||
* Returns 1 if OK, 0 if failed to enlarge buffer.
|
||||
*/
|
||||
int
|
||||
enlargePQExpBuffer(PQExpBuffer str, int needed)
|
||||
enlargePQExpBuffer(PQExpBuffer str, size_t needed)
|
||||
{
|
||||
int newlen;
|
||||
size_t newlen;
|
||||
char *newdata;
|
||||
|
||||
needed += str->len + 1; /* total space required now */
|
||||
|
@ -164,8 +164,8 @@ void
|
|||
printfPQExpBuffer(PQExpBuffer str, const char *fmt,...)
|
||||
{
|
||||
va_list args;
|
||||
int avail,
|
||||
nprinted;
|
||||
size_t avail;
|
||||
int nprinted;
|
||||
|
||||
resetPQExpBuffer(str);
|
||||
|
||||
|
@ -214,8 +214,8 @@ void
|
|||
appendPQExpBuffer(PQExpBuffer str, const char *fmt,...)
|
||||
{
|
||||
va_list args;
|
||||
int avail,
|
||||
nprinted;
|
||||
size_t avail;
|
||||
int nprinted;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
|
@ -286,7 +286,7 @@ appendPQExpBufferChar(PQExpBuffer str, char ch)
|
|||
* if necessary.
|
||||
*/
|
||||
void
|
||||
appendBinaryPQExpBuffer(PQExpBuffer str, const char *data, int datalen)
|
||||
appendBinaryPQExpBuffer(PQExpBuffer str, const char *data, size_t datalen)
|
||||
{
|
||||
/* Make more room if needed */
|
||||
if (! enlargePQExpBuffer(str, datalen))
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: pqexpbuffer.h,v 1.3 2000/01/26 05:58:46 momjian Exp $
|
||||
* $Id: pqexpbuffer.h,v 1.4 2000/02/07 23:10:11 petere Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -40,8 +40,8 @@
|
|||
typedef struct PQExpBufferData
|
||||
{
|
||||
char *data;
|
||||
int len;
|
||||
int maxlen;
|
||||
size_t len;
|
||||
size_t maxlen;
|
||||
} PQExpBufferData;
|
||||
|
||||
typedef PQExpBufferData *PQExpBuffer;
|
||||
|
@ -113,7 +113,7 @@ extern void resetPQExpBuffer(PQExpBuffer str);
|
|||
*
|
||||
* Returns 1 if OK, 0 if failed to enlarge buffer.
|
||||
*/
|
||||
extern int enlargePQExpBuffer(PQExpBuffer str, int needed);
|
||||
extern int enlargePQExpBuffer(PQExpBuffer str, size_t needed);
|
||||
|
||||
/*------------------------
|
||||
* printfPQExpBuffer
|
||||
|
@ -153,6 +153,6 @@ extern void appendPQExpBufferChar(PQExpBuffer str, char ch);
|
|||
* if necessary.
|
||||
*/
|
||||
extern void appendBinaryPQExpBuffer(PQExpBuffer str,
|
||||
const char *data, int datalen);
|
||||
const char *data, size_t datalen);
|
||||
|
||||
#endif /* PQEXPBUFFER_H */
|
||||
|
|
|
@ -11,9 +11,11 @@
|
|||
* Some compat functions
|
||||
*/
|
||||
#define open(a,b,c) _open(a,b,c)
|
||||
#define close(a) _close(a)
|
||||
#define read(a,b,c) _read(a,b,c)
|
||||
#define write(a,b,c) _write(a,b,c)
|
||||
|
||||
#define popen(a,b) _popen(a,b)
|
||||
#define pclose(a) _pclose(a)
|
||||
|
||||
/*
|
||||
* crypt not available (yet)
|
||||
|
|
Loading…
Reference in New Issue