-when connection loss is detected.
-to the database occurs.
-parameter, a prior request is canceled.
-the idle loop to be entered.
-The OID of the large object created.
+ period and a result number.
+ The handle of the connection on which to execute the command.
+ The SQL command to execute.
+ command.
+
+
+
+
+
+
+ pg_result
+
+
+
+ pg_result
+ get information about a command result
+
+
+
+
+pg_result
resultHandle resultOption
+
+
+
+
+
Description
+
+ pg_result returns information about a command
+ result created by a prior pg_exec .
+
+
+ You can keep a command result around for as long as you need it,
+ but when you are done with it, be sure to free it by executing
+ pg_result -clear . Otherwise, you have a
+ memory leak, and
pgtcl> will eventually start
+ complaining that you have created too many command result objects.
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of the command result.
+
+
+
+
+
+
+ One of the following options, specifying which piece of result
+ information to return:
+
+
+
+ -status
+
+ The status of the result.
+
+
+
+
+
+ -error
+
+ The error message, if the status indicates an error,
+ otherwise an empty string.
+
+
+
+
+
+ -conn
+
+ The connection that produced the result.
+
+
+
+
+
+ -oid
+
+ If the command was an INSERT , the OID of
+ the inserted row, otherwise 0.
+
+
+
+
+
+ -numTuples
+
+ The number of rows (tuples) returned by the query.
+
+
+
+
+
+ -cmdTuples
+
+ The number of rows (tuples) affected by the command.
+
+
+
+
+
+ -numAttrs
+
+ The number of columns (attributes) in each row.
+
+
+
+
+
+
+ Assign the results to an array, using subscripts of the form
+ (rowNumber, columnName) .
+
+
+
+
+
+
-assignbyidx arrayName> appendstr>
+
+ Assign the results to an array using the values of the
+ first column and the names of the remaining column as keys.
+ If
appendstr> is given then it is appended to
+ each key. In short, all but the first column of each row
+ are stored into the array, using subscripts of the form
+ (firstColumnValue, columnNameAppendStr) .
+
+
+
+
+
+
+ Returns the columns of the indicated row in a list. Row
+ numbers start at zero.
+
+
+
+
+
+
-tupleArray rowNumber> arrayName>
+
+ Stores the columns of the row in array
+
arrayName , indexed by column names.
+ Row numbers start at zero.
+
+
+
+
+
+ -attributes
+
+ Returns a list of the names of the columns in the result.
+
+
+
+
+
+ -lAttributes
+
+ Returns a list of sublists, {name typeOid
+ typeSize} for each column.
+
+
+
+
+
+ -clear
+
+ Clear the command result object.
+
+
+
+
+
+
+
+
+
+
+
+
Return Value
+
+ The result depends on the selected option, as described above.
+
+
+
+
+
+
+
+ pg_select
+
+
+
+ pg_select
+ loop over the result of a query
+
+
+
+
+pg_select
conn commandString arrayVar procedure
+
+
+
+
+
Description
+
+ pg_select submits a query
+ (SELECT statement) to the
+
PostgreSQL server and executes a given
+ chunk of code for each row in the result. The
+
commandString must be a
+ SELECT statement; anything else returns an
+ error. The
arrayVar variable is an array
+ name used in the loop. For each row,
+
arrayVar is filled in with the row values,
+ using the column names as the array indices. Then the
+
+
+ In addition to the column values, the following special entries are
+ made in the array:
+
+
+
+ .headers>
+
+ A list of the column names returned by the query.
+
+
+
+
+
+ .numcols>
+
+ The number of columns returned by the query.
+
+
+
+
+
+ .tupno>
+
+ The current row number, starting at zero and incrementing for
+ each iteration of the loop body.
+
+
+
+
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of the connection on which to execute the query.
+
+
+
+
+
+
+ The SQL query to execute.
+
+
+
+
+
+
+ An array variable for returned rows.
+
+
+
+
+
+
+ The procedure to run for each returned row.
+
+
+
+
+
+
+
+
Return Value
+ None
+
+
+
+
+
Examples
+
+ This examples assumes that the table table1> has
+ columns control> and name> (and
+ perhaps others):
+pg_select $pgconn "SELECT * FROM table1;" array {
+ puts [format "%5d %s" $array(control) $array(name)]
+}
+
+
+
+
+
+
+
+
+ pg_execute
+
+
+
+ pg_execute
+ send a query and optionally loop over the results
+
+
+
+
+pg_execute
-array arrayVar -oid oidVar conn commandString procedure
+
+
+
+
+
Description
+
+ pg_execute submits a command to the
+
+
+ If the command is not a SELECT statement, the
+ number of rows affected by the command is returned. If the command
+ is an INSERT statement and a single row is
+ inserted, the OID of the inserted row is stored in the variable
+
oidVar> if the optional -oid
+ argument is supplied.
+
+
+ If the command is a SELECT statement, then, for
+ each row in the result, the row values are stored in the
+
arrayVar variable, if supplied, using the
+ column names as the array indices, else in variables named by the
+ column names, and then the optional
+
procedure is executed if supplied.
+ (Omitting the
procedure probably makes sense
+ only if the query will return a single row.) The number of rows
+ selected is returned.
+
+
+ The
procedure can use the Tcl commands
+ break , continue , and
+ return with the expected behavior. Note that if
+ return , then pg_execute
+ does not return the number of affected rows.
+
+
+ pg_execute is a newer function which provides
+ a superset of the features of pg_select and
+ can replace pg_exec in many cases where access
+ to the result handle is not needed.
+
+
+ For server-handled errors, pg_execute will
+ throw a Tcl error and return a two-element list. The first element
+ is an error code, such as PGRES_FATAL_ERROR , and
+ the second element is the server error text. For more serious
+ errors, such as failure to communicate with the server,
+ pg_execute will throw a Tcl error and return
+ just the error message text.
+
+
+
+
+
Arguments
+
+
+
+
+ Specifies the name of an array variable where result rows are
+ stored, indexed by the column names. This is ignored if
+
commandString> is not a SELECT>
+ statement.
+
+
+
+
+
+
+ Specifies the name of a variable into which the OID from an
+ INSERT statement will be stored.
+
+
+
+
+
+
+ The handle of the connection on which to execute the command.
+
+
+
+
+
+
+ The SQL command to execute.
+
+
+
+
+
+
+ Optional procedure to execute for each result row of a
+ SELECT statement.
+
+
+
+
+
+
+
+
Return Value
+
+ The number of rows affected or returned by the command.
+
+
+
+
+
Examples
+
+ In the following examples, error checking with
+ catch has been omitted for clarity.
+
+
+ Insert a row and save the OID in result_oid>:
+pg_execute -oid result_oid $pgconn "INSERT INTO mytable VALUES (1);"
+
+
+
+ Print the columns item> and value> from each
+ row:
+pg_execute -array d $pgconn "SELECT item, value FROM mytable;" {
+ puts "Item=$d(item) Value=$d(value)"
+}
+
+
+
+ Find the maximum and minimum values and store them in
+ $s(max)> and $s(min)>:
+pg_execute -array s $pgconn "SELECT max(value) AS max, min(value) AS min FROM mytable;"
+
+
+
+ Find the maximum and minimum values and store them in
+ $max> and $min>:
+pg_execute $pgconn "SELECT max(value) AS max, min(value) AS min FROM mytable;"
+
+
+
+
+
+
+
+
+ pg_listen
+
+
+
+ pg_listen
+ set or change a callback for asynchronous notification messages
+
+
+
+
+pg_listen
conn notifyName callbackCommand
+
+
+
+
+
Description
+
+ pg_listen creates, changes, or cancels a
+ request to listen for asynchronous notification messages from the
+
PostgreSQL server. With a
+
callbackCommand> parameter, the request is
+ established, or the command string of an already existing request
+ is replaced. With no
callbackCommand> parameter, a
+ prior request is canceled.
+
+
+ After a pg_listen request is established, the
+ specified command string is executed whenever a notification
+ message bearing the given name arrives from the server. This
+ occurs when any
PostgreSQL client
+ application issues a
+ pgtcl>> command referencing that name. The command string is
+ executed from the Tcl idle loop. That is the normal idle state of
+ an application written with Tk. In non-Tk Tcl shells, you can
+ execute update or vwait
+ to cause the idle loop to be entered.
+
+
+ You should not invoke the SQL statements LISTEN
+ or UNLISTEN directly when using
+ takes care of issuing those statements for you. But if you want to
+ send a notification message yourself, invoke the SQL
+ NOTIFY statement using
+ pg_exec .
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of the connection on which to listen for notifications.
+
+
+
+
+
+
+ The name of the notification condition to start or stop
+ listening to.
+
+
+
+
+
+
+ If present, provides the command string to execute when a
+ matching notification arrives.
+
+
+
+
+
+
+
+
Return Value
+
+ None
+
+
+
+
+
+
+
+ pg_on_connection_loss
+
+
+
+ pg_on_connection_loss
+ set or change a callback for unexpected connection loss
+
+
+
+
+pg_on_connection_loss
conn callbackCommand
+
+
+
+
+
Description
+
+ pg_on_connection_loss creates, changes, or
+ cancels a request to execute a callback command if an unexpected
+ loss of connection to the database occurs. With a
+
callbackCommand> parameter, the request is
+ established, or the command string of an already existing request
+ is replaced. With no
callbackCommand> parameter, a
+ prior request is canceled.
+
+
+ The callback command string is executed from the Tcl idle loop.
+ That is the normal idle state of an application written with Tk.
+ In non-Tk Tcl shells, you can execute update
+ or vwait to cause the idle loop to be entered.
+
+
+
+
+
Arguments
+
+
+
+
+ The handle to watch for connection losses.
+
+
+
+
+
+
+ If present, provides the command string to execute when
+ connection loss is detected.
+
+
+
+
+
+
+
+
Return Value
+
+ None
+
+
+
+
+
+
+
+ pg_lo_creat
+
+
+
+ pg_lo_creat
+ create a large object
+
+
+
+
+
+
+
+
+
Description
+
+ pg_lo_creat creates a large object.
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of a database connection in which to create the large
+ object.
+
+
+
+
+
+
+ The access mode for the large object. It can be any or'ing
+ together of INV_READ> and INV_WRITE>. The
+ or
operator is | . For
+ example:
[pg_lo_creat $conn "INV_READ|INV_WRITE"]
-
-
-
-
-
-
-
-
-
-pg_lo_open
-PGTCL - Large Objects
-
-
-pg_lo_open
-
-open a large object
-
-
-
-
-1997-12-24
-
-
-pg_lo_open conn objOid mode
-
-
-
-
-1997-12-24
-
-
Inputs
-
-
-
-
- conn
-
-
-
Specifies a valid database connection.
-
-
-
-
-
- objOid
-
-
-
Specifies a valid large object OID.
-
-
-
-
-
- mode
-
-
-
Specifies the access mode for the large object
-
-
-
-
-
-
-
-1997-12-24
-
-
Outputs
-
-
-
-
- fd
-
-
-A file descriptor for use in later pg_lo* routines.
-
-
-
-
-
-
-
-
-
-1997-12-24
-
-
Description
-
-
pg_lo_open open an Inversion Large Object.
-
-
-
-
Usage
-
-Mode can be either r>, w>, or rw>.
-
-
-
-
-
-
-
-
-pg_lo_close
-PGTCL - Large Objects
-
-
-pg_lo_close
-
-close a large object
-
-
-
-
-1997-12-24
-
-
-pg_lo_close conn fd
-
-
-
-
-1997-12-24
-
-
Inputs
-
-
-
-
- conn
-
-
-
Specifies a valid database connection.
-
-
-
-
-
- fd
-
-
-A file descriptor for use in later pg_lo* routines.
-
-
-
-
-
-
-
-
-1997-12-24
-
-
Outputs
-
-
-
-
-
-
-1997-12-24
-
-
Description
-
-
pg_lo_close closes an Inversion Large Object.
-
-
-
-
Usage
-
-
-
-
-
-
-
-
-
-pg_lo_read
-PGTCL - Large Objects
-
-
-pg_lo_read
-
-read a large object
-
-
-
-
-1997-12-24
-
-
-pg_lo_read conn fd bufVar len
-
-
-
-
-1997-12-24
-
-
Inputs
-
-
-
-
- conn
-
-
-
Specifies a valid database connection.
-
-
-
-
-
- fd
-
-
-File descriptor for the large object from pg_lo_open.
-
-
-
-
-
- bufVar
-
-
-
Specifies a valid buffer variable to contain the large object segment.
-
-
-
-
-
- len
-
-
-
Specifies the maximum allowable size of the large object segment.
-
-
-
-
-
-
-
-1997-12-24
-
-
Outputs
-
-
-
-
-
-
-1997-12-24
-
-
Description
-
-at most len bytes from a large object into a variable
- named bufVar .
-
-
-
-
Usage
-
-bufVar must be a valid variable name.
-
-
-
-
-
-
-
-
-pg_lo_write
-PGTCL - Large Objects
-
-
-pg_lo_write
-
-write a large object
-
-
-
-
-1997-12-24
-
-
-pg_lo_write conn fd buf len
-
-
-
-
-1997-12-24
-
-
Inputs
-
-
-
-
- conn
-
-
-
Specifies a valid database connection.
-
-
-
-
-
- fd
-
-
-File descriptor for the large object from pg_lo_open.
-
-
-
-
-
- buf
-
-
-
Specifies a valid string variable to write to the large object.
-
-
-
-
-
- len
-
-
-
Specifies the maximum size of the string to write.
-
-
-
-
-
-
-
-1997-12-24
-
-
Outputs
-
-
-
-
-
-
-1997-12-24
-
-
Description
-
-at most len bytes to a large object from a variable
- buf .
-
-
-
-
Usage
-
-buf must be
-the actual string to write, not a variable name.
-
-
-
-
-
-
-
-
-pg_lo_lseek
-PGTCL - Large Objects
-
-
-pg_lo_lseek
-
-seek to a position in a large object
-
-
-
-
-1997-12-24
-
-
-pg_lo_lseek conn fd offset whence
-
-
-
-
-1997-12-24
-
-
Inputs
-
-
-
-
- conn
-
-
-
Specifies a valid database connection.
-
-
-
-
-
- fd
-
-
-File descriptor for the large object from pg_lo_open.
-
-
-
-
-
- offset
-
-
-
Specifies a zero-based offset in bytes.
-
-
-
-
-
- whence
-
-
-
whence can be SEEK_CUR>, SEEK_END>, or SEEK_SET>
-
-
-
-
-
-
-
-1997-12-24
-
-
Outputs
-
-
-
-
-
-
-1997-12-24
-
-
Description
-
-to offset bytes from the beginning of the large object.
-
-
-
-
Usage
-
-whence
-can be SEEK_CUR , SEEK_END>, or SEEK_SET .
-
-
-
-
-
-
-
-
-pg_lo_tell
-PGTCL - Large Objects
-
-
-pg_lo_tell
-
-return the current seek position of a large object
-
-
-
-
-1997-12-24
-
-
-pg_lo_tell conn fd
-
-
-
-
-1997-12-24
-
-
Inputs
-
-
-
-
- conn
-
-
-
Specifies a valid database connection.
-
-
-
-
-
- fd
-
-
-File descriptor for the large object from pg_lo_open.
-
-
-
-
-
-
-
-
-1997-12-24
-
-
Outputs
-
-
-
-
- offset
-
-
-
A zero-based offset in bytes suitable for input to pg_lo_lseek .
-
-
-
-
-
-
-
-
-
-1997-12-24
-
-
Description
-
-
pg_lo_tell returns the current
-to offset in bytes from the beginning of the large object.
-
-
-
-
Usage
-
-
-
-
-
-
-
-
-
-pg_lo_unlink
-PGTCL - Large Objects
-
-
-pg_lo_unlink
-
-delete a large object
-
-
-
-
-1997-12-24
-
-
-pg_lo_unlink conn lobjId
-
-
-
-
-1997-12-24
-
-
Inputs
-
-
-
-
- conn
-
-
-
Specifies a valid database connection.
-
-
-
-
-
- lobjId
-
-
-Identifier for a large object.
-
- XXX Is this the same as
objOid in other calls?? - thomas 1998-01-11
-
-
-
-
-
-
-
-
-
-1997-12-24
-
-
Outputs
-
-None
-
-
-
-
-
-
-1997-12-24
-
-
Description
-
-
pg_lo_unlink deletes the specified large object.
-
-
-
-
Usage
-
-
-
-
-
-
-
-
-
-pg_lo_import
-PGTCL - Large Objects
-
-
-pg_lo_import
-
-import a large object from a file
-
-
-
-
-1997-12-24
-
-
-pg_lo_import conn filename
-
-
-
-
-1997-12-24
-
-
Inputs
-
-
-
-
- conn
-
-
-
Specifies a valid database connection.
-
-
-
-
-
- filename
-
-
-Unix file name.
-
-
-
-
-
-
-
-
-1997-12-24
-
-
Outputs
-
-None
-
- XXX Does this return a lobjId? Is that the same as the objOid in other calls? thomas - 1998-01-11
-
-
-
-
-
-
-
-1997-12-24
-
-
Description
-
-
pg_lo_import reads the specified file and places the contents into a large object.
-
-
-
-
Usage
-
- pg_lo_import must be called within a BEGIN/END transaction block.
-
-
-
-
-
-
-
-
-pg_lo_export
-PGTCL - Large Objects
-
-
-pg_lo_export
-
-export a large object to a file
-
-
-
-
-1997-12-24
-
-
-pg_lo_export conn lobjId filename
-
-
-
-
-1997-12-24
-
-
Inputs
-
-
-
-
- conn
-
-
-
Specifies a valid database connection.
-
-
-
-
-
- lobjId
-
-
-Large object identifier.
-
- XXX Is this the same as the objOid in other calls?? thomas - 1998-01-11
-
-
-
-
-
-
- filename
-
-
-Unix file name.
-
-
-
-
-
-
-
-
-1997-12-24
-
-
Outputs
-
-None
-
- XXX Does this return a lobjId? Is that the same as the objOid in other calls? thomas - 1998-01-11
-
-
-
-
-
-
-
-1997-12-24
-
-
Description
-
-
pg_lo_export writes the specified large object into a Unix file.
-
-
-
-
Usage
-
- pg_lo_export must be called within a BEGIN/END transaction block.
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
Return Value
+
+ The OID of the large object created.
+
+
+
+
+
+
+
+ pg_lo_open
+
+
+
+ pg_lo_open
+ open a large object
+
+
+
+
+pg_lo_open
conn loid mode
+
+
+
+
+
Description
+
+ pg_lo_open opens a large object.
+
+
+
+
+
Arguments
+
+
+
+
+
+ The handle of a database connection in which the large object to
+ be opened exists.
+
+
+
+
+
+
+ The OID of the large object.
+
+
+
+
+
+
+ Specifies the access mode for the large object. Mode can be
+ either r>, w>, or rw>.
+
+
+
+
+
+
+
+
Return Value
+
+ A descriptor for use in later large-object commands.
+
+
+
+
+
+
+
+ pg_lo_close
+
+
+
+ pg_lo_close
+ close a large object
+
+
+
+
+pg_lo_close
conn descriptor
+
+
+
+
+
Description
+
+ pg_lo_close closes a large object.
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of a database connection in which the large object
+ exists.
+
+
+
+
+
+
+ A descriptor for the large object from
+ pg_lo_open .
+
+
+
+
+
+
+
+
Return Value
+
+ None
+
+
+
+
+
+
+
+ pg_lo_read
+
+
+
+ pg_lo_read
+ read from a large object
+
+
+
+
+pg_lo_read
conn descriptor bufVar len
+
+
+
+
+
Description
+
+ pg_lo_read reads at most
+
len bytes from a large object into a
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of a database connection in which the large object
+ exists.
+
+
+
+
+
+
+ A descriptor for the large object from
+ pg_lo_open .
+
+
+
+
+
+
+ The name of a buffer variable to contain the large object
+ segment.
+
+
+
+
+
+
+ The maximum number of bytes to read.
+
+
+
+
+
+
+
+
Return Value
+
+ None
+
+
+
+
+
+
+
+ pg_lo_write
+
+
+
+ pg_lo_write
+ write to a large object
+
+
+
+
+pg_lo_write
conn descriptor buf len
+
+
+
+
+
Description
+
+ pg_lo_write writes at most
+
len bytes from a variable
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of a database connection in which the large object
+ exists.
+
+
+
+
+
+
+ A descriptor for the large object from
+ pg_lo_open .
+
+
+
+
+
+
+ The string to write to the large object (not a variable name).
+
+
+
+
+
+
+ The maximum number of bytes to write.
+
+
+
+
+
+
+
+
Return Value
+
+ None
+
+
+
+
+
+
+
+ pg_lo_lseek
+
+
+
+ pg_lo_lseek
+ seek to a position of a large object
+
+
+
+
+pg_lo_lseek
conn descriptor offset whence
+
+
+
+
+
Description
+
+ pg_lo_lseek moves the current read/write
+ position to
offset bytes from the position
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of a database connection in which the large object
+ exists.
+
+
+
+
+
+
+ A descriptor for the large object from
+ pg_lo_open .
+
+
+
+
+
+
+ The new seek position in bytes.
+
+
+
+
+
+
+ Specified from where to calculate the new seek position:
+ SEEK_CUR> (from current position),
+ SEEK_END> (from end), or SEEK_SET> (from
+ start).
+
+
+
+
+
+
+
+
Return Value
+
+ None
+
+
+
+
+
+
+
+ pg_lo_tell
+
+
+
+ pg_lo_tell
+ return the current seek position of a large object
+
+
+
+
+pg_lo_tell
conn descriptor
+
+
+
+
+
Description
+
+ pg_lo_tell returns the current read/write
+ position in bytes from the beginning of the large object.
+
+
+
+
+
Arguments
+
+
+
+
+
+ The handle of a database connection in which the large object
+ exists.
+
+
+
+
+
+
+ A descriptor for the large object from
+ pg_lo_open .
+
+
+
+
+
+
+
+
Return Value
+
+ A zero-based offset in bytes suitable for input to
+ pg_lo_lseek .
+
+
+
+
+
+
+
+ pg_lo_unlink
+
+
+
+ pg_lo_unlink
+ delete a large object
+
+
+
+
+
+
+
+
+
Description
+
+ pg_lo_unlink deletes the specified large
+ object.
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of a database connection in which the large object
+ exists.
+
+
+
+
+
+
+ The OID of the large object.
+
+
+
+
+
+
+
+
Return Value
+
+ None
+
+
+
+
+
+
+
+ pg_lo_import
+
+
+
+ pg_lo_import
+ import a large object from a file
+
+
+
+
+pg_lo_import
conn filename
+
+
+
+
+
Description
+
+ pg_lo_import reads the specified file and
+ places the contents into a new large object.
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of a database connection in which to create the large
+ object.
+
+
+
+
+
+
+ Specified the file from which to import the data.
+
+
+
+
+
+
+
+
Return Value
+
+ The OID of the large object created.
+
+
+
+
+
Notes
+
+ pg_lo_import must be called within a
+ BEGIN>/COMMIT> transaction block.
+
+
+
+
+
+
+
+ pg_lo_export
+
+
+
+ pg_lo_export
+ export a large object to a file
+
+
+
+
+pg_lo_export
conn loid filename
+
+
+
+
+
Description
+
+ pg_lo_export writes the specified large object
+ into a file.
+
+
+
+
+
Arguments
+
+
+
+
+ The handle of a database connection in which the large object
+ exists.
+
+
+
+
+
+
+ The OID of the large object.
+
+
+
+
+
+
+ Specifies the file into which the data is to be exported.
+
+
+
+
+
+
+
+
Return Value
+ None
+
+
+
+
+
Notes
+
+ pg_lo_export must be called within a
+ BEGIN>/COMMIT> transaction block.
+
+
+
+
+
+
+
+
+
Example Program
+
+ shows a small example of how to use
+
+
+
+
+# getDBs :
+# get the names of all the databases at a given host and port number
+# with the defaults being the localhost and port 5432
+# return them in alphabetical order
+proc getDBs { {host "localhost"} {port "5432"} } {
+ # datnames is the list to be result
+ set conn [pg_connect template1 -host $host -port $port]
+ set res [pg_exec $conn "SELECT datname FROM pg_database ORDER BY datname;"]
+ set ntups [pg_result $res -numTuples]
+ for {set i 0} {$i < $ntups} {incr i} {
+ lappend datnames [pg_result $res -getTuple $i]
+ }
+ pg_result $res -clear
+ pg_disconnect $conn
+ return $datnames
+}
+
+
+
+
+
-
-
Introduction
-
application programmer's interface to
PostgreSQL .
libpq is a set
- of library routine s that allow client programs to pass queries to the
+ of library function s that allow client programs to pass queries to the
PostgreSQL backend server and to receive the
results of these queries.
libpq is also the
underlying engine for several other
PostgreSQL
application interfaces, including
libpq++ (C++),
- <
filename>libpgtcl> (Tcl), Perl , and
- <
filename>ecpg>. So some aspects of libpq>'s behavior will be
+ <
application>libpgtcl> (Tcl), Perl , and
+ <
application>ECPG>. So some aspects of libpq>'s behavior will be
important to you if you use one of those packages.
- Three short programs are included at the end of this section to show how
- to write programs that use libpq . There are several
- complete examples of libpq applications in the
- following directories:
-
-
- src/test/examples
- src/bin/psql
-
+ Three short programs are included at the end of this chapter () to show how
+ to write programs that use
libpq . There are also several
+ complete examples of
libpq applications in the
+ directory src/test/examples in the source code distribution.
- Frontend programs that use libpq > must include the
+
Client programs that use libpq > must include the
header file libpq-fe.h and must link with the
- <filename>libpq> library.
+ <application>libpq> library.
-
Database Connection Functions
- The following routine s deal with making a connection to a
-
PostgreSQL backend server.
The
+ The following function s deal with making a connection to a
+
PostgreSQL backend server.
An
application program can have several backend connections open at
one time. (One reason to do that is to access more than one
database.) Each connection is represented by a
- PGconn> object which is obtained from
+ PGconn> object which is obtained from the function
PQconnectdb> or PQsetdbLogin>. Note that
these functions will always return a non-null object pointer,
unless perhaps there is too little memory even to allocate the
should be called to check whether a connection was successfully
made before queries are sent via the connection object.
-
+
+
+ PQconnectdb
- PQconnectdb
Makes a new connection to the database server.
-
-PGconn *PQconnectdb(const char *conninfo)
-
+
+PGconn *PQconnectdb(const char *conninfo);
+
+
- This routine opens a new database connection using the parameters taken
+ This function opens a new database connection using the parameters taken
from the string conninfo . Unlike PQsetdbLogin> below,
the parameter set can be extended without changing the function signature,
- so use either of this routine or the nonblocking analogues PQconnectStart>
- and PQconnectPoll is preferred for application programming. The passed string
- can be empty to use all default parameters, or it can contain one or more
- parameter settings separated by whitespace.
+ so use either of this function or the nonblocking analogues PQconnectStart>
+ and PQconnectPoll is preferred for new application programming.
+ The passed string
+ can be empty to use all default parameters, or it can contain one or more
+ parameter settings separated by whitespace.
Each parameter setting is in the form keyword = value .
(To write an empty value or a value containing
spaces, surround it with single quotes, e.g.,
keyword = 'a value' .
Single quotes and backslashes within the value must be escaped with a
- backslash, e.g., \' or \\ .)
- Spaces around the equal sign are optional. The currently recognized
- parameter keywords are:
+ backslash, i.e., \' and \\ .)
+ Spaces around the equal sign are optional.
+
+
+ The currently recognized parameter key words are:
hostaddr
- IP address of host to connect to. This should be in standard
- IPv4 address format, e.g. 172.28.40.9>. If your machine
- supports IPv6, you can also use those addresses. If a nonzero-length
- string is specified, TCP/IP communication is used.
+ IP address of host to connect to. This should be in the
+ standard IPv4 address format, e.g., 172.28.40.9>. If
+ your machine supports IPv6, you can also use those addresses. If
+ a nonzero-length string is specified, TCP/IP communication is
+ used.
- Using hostaddr> instead of host allows the application to avoid a host
+ Using hostaddr> instead of host> allows the application to avoid a host
name look-up, which may be important in applications with time
constraints. However, Kerberos authentication requires the host
- name. The following therefore applies: If host is specified without
+ name. The following therefore applies: If host> is specified without
hostaddr>, a host name lookup is forced. If hostaddr> is specified without
- host , the value for hostaddr> gives the remote address; if Kerberos is
- used, this causes a reverse name query. If both host and hostaddr> are
+ host> , the value for hostaddr> gives the remote address; if Kerberos is
+ used, this causes a reverse name query. If both host> and hostaddr> are
specified, the value for hostaddr> gives the remote address; the value
- for host is ignored, unless Kerberos is used, in which case that value
+ for host> is ignored, unless Kerberos is used, in which case that value
is used for Kerberos authentication. Note that authentication is likely
to fail if
libpq is passed a host name that is not the name of the
machine at hostaddr>.
connect_timeout
- Time space in seconds given to connect routine . Zero or not set means infinite.
+ Time space in seconds given to connection function . Zero or not set means infinite.
options
- Trace/debug options to be sent to the server.
+ Configuration options to be sent to the server.
tty
- A file or
tty for optional debug output from the backend.
+ A file or
TTY for optional debug output from the server.
requiressl
-
Set to 1 to require SSL connection to the server .
-
L ibpq> will then refuse to connect if the server does not
+
If set to 1, an SSL connection to the server is required .
+
l ibpq> will then refuse to connect if the server does not
accept an
SSL connection.
- Set to 0 (default) to negotiat e with server.
+
If set to 0 (default), libpq> will negotiate the connection typ e with server.
This option is only available if
PostgreSQL> is compiled with SSL support.
Service name to use for additional parameters. It specifies a service
- name in pg_service.conf that holds additional connection parameters.
+ name in pg_service.conf that holds additional connection parameters.
This allows applications to specify only a service name so connection parameters
can be centrally maintained. See
PREFIX>/share/pg_service.conf.sample> for
environment variable (see )
is checked. If the environment variable is not set either,
then hardwired defaults are used.
- The return value is a pointer to an abstract struct
- representing the connection to the backend.
+
+
+ PQsetdbLogin
- PQsetdbLogin
Makes a new connection to the database server.
PGconn *PQsetdbLogin(const char *pghost,
const char *pgtty,
const char *dbName,
const char *login,
- const char *pwd)
+ const char *pwd);
+
This is the predecessor of PQconnectdb with a fixed number
of parameters but the same functionality.
+
+
+ PQsetdb
- PQsetdb Makes a new connection to the database server.
+ Makes a new connection to the database server.
PGconn *PQsetdb(char *pghost,
char *pgport,
char *pgoptions,
char *pgtty,
- char *dbName)
+ char *dbName);
+
+
This is a macro that calls PQsetdbLogin with null pointers
for the
login> and pwd> parameters. It is provided primarily
for backward compatibility with old programs.
+
-
+
+ PQconnectStart
+ PQconnectPoll
+
- PQconnectStart ,
- PQconnectPoll
Make a connection to the database server in a nonblocking manner.
-PGconn *PQconnectStart(const char *conninfo)
+PGconn *PQconnectStart(const char *conninfo);
-PostgresPollingStatusType PQconnectPoll(PGconn *conn)
+PostgresPollingStatusType PQconnectPoll(PGconn *conn);
- These two routines are used to open a connection to a database server such
+
+ These two functions are used to open a connection to a database server such
that your application's thread of execution is not blocked on remote I/O
whilst doing so.
- To begin, call conn= PQconnectStart("connection_info_string>").
- If
conn is
NULL , then
libpq> has been unable to allocate a new PGconn>
+ To begin a nonblocking connection request, call conn = PQconnectStart("connection_info_string>").
+ If
conn is
null , then
libpq> has been unable to allocate a new PGconn>
structure. Otherwise, a valid PGconn> pointer is returned (though not yet
representing a valid connection to the database). On return from
- PQconnectStart , call status=PQstatus(conn) . If status equals
+ PQconnectStart , call status = PQstatus(conn) . If status equals
CONNECTION_BAD , PQconnectStart has failed.
proceed with the connection sequence. Loop thus: Consider a connection
inactive
by default. If PQconnectPoll last returned PGRES_POLLING_ACTIVE>,
consider it active
instead. If PQconnectPoll(conn) last returned
- PGRES_POLLING_READING , perform a select()> for reading on PQsocket(conn) . If
+ PGRES_POLLING_READING , perform a select()> for reading on the socket determined using PQsocket(conn) . If
it last returned PGRES_POLLING_WRITING , perform a select()> for writing on
- PQsocket(conn) . If you have yet to call PQconnectPoll , i.e. after the call
+ that same socket. If you have yet to call PQconnectPoll , i.e., after the call
to PQconnectStart , behave as if it last returned PGRES_POLLING_WRITING . If
- the select()> shows that the socket is ready, consider it active
. If it has
+ select()> shows that the socket is ready, consider it active
. If it has
been decided that this connection is active
, call PQconnectPoll(conn)
again. If this call returns PGRES_POLLING_FAILED , the connection procedure
has failed. If this call returns PGRES_POLLING_OK , the connection has been
At any time during connection, the status of the connection may be
- checked, by calling PQstatus>. If this i s CONNECTION_BAD>, then the
- connection procedure has failed; if this i s CONNECTION_OK>, then the
- connection is ready. Either of these states should b e equally detectable
- from the return value of PQconnectPoll>, as above. Other states may be
- shown during (and only during) an asynchronous connection procedure. These
- indicate the current stage of the connection procedure, and may be useful
- to provide feedback to the user for example. These statuses may includ e:
+ checked, by calling PQstatus>. If this give s CONNECTION_BAD>, then the
+ connection procedure has failed; if it give s CONNECTION_OK>, then the
+ connection is ready. Both of these states ar e equally detectable
+ from the return value of PQconnectPoll>, described above. Other states may also occur
+ during (and only during) an asynchronous connection procedure. These
+ indicate the current stage of the connection procedure and may be useful
+ to provide feedback to the user for example. These statuses ar e:
- Note that if PQconnectStart returns a non-NULL pointer, you must call
+ Note that if PQconnectStart returns a non-null pointer, you must call
PQfinish when you are finished with it, in order to dispose of
the structure and any associated memory blocks. This must be done even if a
call to PQconnectStart or PQconnectPoll failed.
PQconnectPoll will currently block if
-
libpq> is compiled with USE_SSL
- defined. This restriction may be removed in the future.
+
libpq> is compiled with SSL support. This restriction may be removed in the future.
- T hese functions leave the socket in a nonblocking state as if
+ Finally, t hese functions leave the socket in a nonblocking state as if
PQsetnonblocking had been called.
-
+
+
+
+ PQconndefaults
- PQconndefaults Returns the default connection options.
+ Returns the default connection options.
-PQconninfoOption *PQconndefaults(void)
+PQconninfoOption *PQconndefaults(void);
-struct PQconninfoOption
+typedef struct
{
char *keyword; /* The keyword of the option */
char *envvar; /* Fallback environment variable name */
"*" Password field - hide value
"D" Debug option - don't show by default */
int dispsize; /* Field size in characters for dialog */
-}
+} PQconninfoOption;
+
+
+ converts an escaped string representation of binary data into binary
+ data --- the reverse of PQescapeBytea .
Returns a connection options array. This may
be used to determine all possible PQconnectdb options and their
current default values. The return value points to an array of
- PQconninfoOption struct>s, which ends with an entry having a NULL
- keyword pointer. Note that the default values (val fields)
+ PQconninfoOption structures, which ends with an entry having a null
+ key-word pointer. Note that the current default values (val fields)
will depend on environment variables and other context.
Callers must treat the connection options data as read-only.
was not thread-safe, so the behavior has been changed.
+
+
+ PQfinish
- PQfinish
- Close the connection to the backend. Also frees
+ Closes the connection to the server. Also frees
memory used by the PGconn object.
-void PQfinish(PGconn *conn)
+void PQfinish(PGconn *conn);
- Note that even if the backend connection attempt fails (as
+
+
+ Note that even if the server connection attempt fails (as
indicated by PQstatus ), the application should call PQfinish
to free the memory used by the PGconn object.
The PGconn> pointer should not be used after PQfinish has been called.
+
+
+ PQreset
- PQreset
- Reset the communication port with the backend.
+ Resets the communication channel to the server.
-void PQreset(PGconn *conn)
+void PQreset(PGconn *conn);
+
+
This function will close the connection
- to the backend and attempt to reestablish a new
+ to the server and attempt to reestablish a new
connection to the same server, using all the same
parameters previously used. This may be useful for
error recovery if a working connection is lost.
+
+
+ PQresetStart
+ PQresetPoll
- PQresetStart
- PQresetPoll
- Reset the communication port with the backend, in a nonblocking manner.
+ Reset the communication channel to the server, in a nonblocking manner.
int PQresetStart(PGconn *conn);
PostgresPollingStatusType PQresetPoll(PGconn *conn);
- These functions will close the connection to the backend and attempt to
+
+
+ These functions will close the connection to the server and attempt to
reestablish a new connection to the same server, using all the same
parameters previously used. This may be useful for error recovery if a
working connection is lost. They differ from PQreset (above) in that they
restrictions as PQconnectStart> and PQconnectPoll>.
- C all PQresetStart . If it returns 0, the reset has failed. If it returns 1,
+ To initiate a connection reset, c all PQresetStart . If it returns 0, the reset has failed. If it returns 1,
poll the reset using PQresetPoll in exactly the same way as you would
create the connection using PQconnectPoll .
+
- itemized list>
+ variable list>
at the contents of PGconn . Avoid directly referencing the fields of the
PGconn> structure because they are subject to change in the future.
(Beginning in
PostgreSQL release 6.4, the
-definition of struct PGconn> is not even provided in libpq-fe.h .
+definition of the struct behind PGconn> is not even provided in libpq-fe.h .
If you have old code that accesses PGconn fields directly, you can keep using it
by including libpq-int.h too, but you are encouraged to fix the code
soon.)
-
+
+
+PQdb
-PQdb
Returns the database name of the connection.
-char *PQdb(const PGconn *conn)
+char *PQdb(const PGconn *conn);
+
+
PQdb> and the next several functions return the values established
at connection. These values are fixed for the life of the PGconn>
object.
+
+
+PQuser
-PQuser
Returns the user name of the connection.
-char *PQuser(const PGconn *conn)
+char *PQuser(const PGconn *conn);
+
+
+PQpass
-PQpass
Returns the password of the connection.
-char *PQpass(const PGconn *conn)
+char *PQpass(const PGconn *conn);
+
+
+PQhost
-PQhost
Returns the server host name of the connection.
-char *PQhost(const PGconn *conn)
+char *PQhost(const PGconn *conn);
+
+
+PQport
-PQport
Returns the port of the connection.
-char *PQport(const PGconn *conn)
+char *PQport(const PGconn *conn);
+
+
+PQtty
-PQtty
- Returns the debug
tty of the connection.
+ Returns the debug
TTY of the connection.
-char *PQtty(const PGconn *conn)
+char *PQtty(const PGconn *conn);
+
+
+PQoptions
-PQoptions
- Returns the backend options used in the connection.
+ Returns the configuration options passed in the connection request.
-char *PQoptions(const PGconn *conn)
+char *PQoptions(const PGconn *conn);
+
+
+PQstatus
-PQstatus
Returns the status of the connection.
-ConnStatusType PQstatus(const PGconn *conn)
+ConnStatusType PQstatus(const PGconn *conn);
The status can be one of a number of values.
However, only two of these are
- seen outside of an asynchronous connection procedure -
- CONNECTION_OK or
+ seen outside of an asynchronous connection procedure:
+ CONNECTION_OK and
CONNECTION_BAD . A good
connection to the database has the status CONNECTION_OK .
A failed connection
that might be seen.
+
+
+ PQerrorMessage
- PQerrorMessage
Returns the error message most recently generated by
an operation on the connection.
-
+
char *PQerrorMessage(const PGconn* conn);
-
+
- Nearly all
libpq> functions will set
+ Nearly all
libpq> functions will set a message for
PQerrorMessage if they fail.
- Note that by
libpq convention, a non
- empty
- PQerrorMessage will
+ Note that by
libpq convention, a nonempty
+ PQerrorMessage result will
include a trailing newline.
+
+
+ PQsocket
- PQbackendPID
- Returns the process
ID of the backend server
- handling this connection.
-
+ Obtains the file descriptor number of the connection socket to
+ the server. A valid descriptor will be greater than or equal
+ to 0; a result of -1 indicates that no server connection is
+ currently open.
+
+int PQsocket(const PGconn *conn);
+
+
+
+
+
+
+ PQbackendPID
+
+ Returns the process
ID of the backend server process
+ handling this connection.
+
int PQbackendPID(const PGconn *conn);
-
+
+
+
The backend
PID is useful for debugging
purposes and for comparison to NOTIFY
messages (which include the
PID of the
- notifying backend
). Note that the PID
- belongs to a process executing on the database server host, not
- the local host!
+ notifying backend process). Note that the
+
PID belongs to a process executing on the
+ database server host, not the local host!
+
+
+ PQgetssl
- PQgetssl
- Returns the SSL structure used in the connection, or NULL
+ Returns the SSL structure used in the connection, or null
if SSL is not in use.
-
+
SSL *PQgetssl(const PGconn *conn);
-
+
+
+
This structure can be used to verify encryption levels, check
- server certificate and more. Refer to the SSL documentation
+ server certificate
s, and more. Refer to the OpenSSL> documentation
for information about this structure.
- You must define <literal>USE_SSLl> in order to get the
+ You must define <symbol>USE_SSLl> in order to get the
prototype for this function. Doing this will also
automatically include
ssl.h from
OpenSSL .
+
- itemized list>
+ variable list>
-
Main Routines
-
+
Main Functions
+
+
+
+PQexec
-PQexec
- Submit a command to the server
- and wait for the result.
+ Submits a command to the server
+ and waits for the result.
PGresult *PQexec(PGconn *conn,
- const char *query );
+ const char *command );
- Returns a PGresult pointer or possibly a NULL pointer.
- A non-NULL pointer will generally be returned except in
+
+
+ Returns a PGresult pointer or possibly a null pointer.
+ A non-null pointer will generally be returned except in
out-of-memory conditions or serious errors such as inability
- to send the command to the backend .
- If a NULL is returned, it
+ to send the command to the server .
+ If a null pointer is returned, it
should be treated like a PGRES_FATAL_ERROR result. Use
PQerrorMessage to get more information about the error.
-
+
+
The PGresult structure encapsulates the result
-returned by the backend .
-<filename>libpq> application programmers should be careful to
+returned by the server .
+<application>libpq> application programmers should be careful to
maintain the PGresult abstraction. Use the accessor functions below to get
at the contents of PGresult . Avoid directly referencing the fields of the
PGresult structure because they are subject to change in the future.
(Beginning in
PostgreSQL 6.4, the
-definition of struct PGresult> is not even provided in libpq-fe.h>. If you
+definition of struct> behind PGresult> is not even provided in libpq-fe.h>. If you
have old code that accesses PGresult fields directly, you can keep using it
by including libpq-int.h too, but you are encouraged to fix the code
soon.)
-
+
+
+PQresultStatus
-PQresultStatus
Returns the result status of the command.
-ExecStatusType PQresultStatus(const PGresult *res)
+ExecStatusType PQresultStatus(const PGresult *res);
+
+
PQresultStatus can return one of the following values:
-
-
-
PGRES_EMPTY_QUERY -- The string sent to the backend was empty.
-
-
-
PGRES_COMMAND_OK -- Successful completion of a command returning no data
-
-
-
PGRES_TUPLES_OK -- The query successfully executed
-
-
-
PGRES_COPY_OUT -- Copy Out (from server) data transfer started
-
-
-
PGRES_COPY_IN -- Copy In (to server) data transfer started
-
-
-
PGRES_BAD_RESPONSE -- The server's response was not understood
-
-
-
-
-
-
+
+
+ PGRES_EMPTY_QUERY
+
+
The string sent to the server was empty.
+
+
+
+
+ PGRES_COMMAND_OK
+
+
Successful completion of a command returning no data.
+
+
+
+
+ PGRES_TUPLES_OK
+
+
The query successfully executed.
+
+
+
+
+ PGRES_COPY_OUT
+
+
Copy Out (from server) data transfer started.
+
+
+
+
+ PGRES_COPY_IN
+
+
Copy In (to server) data transfer started.
+
+
+
+
+ PGRES_BAD_RESPONSE
+
+
The server's response was not understood.
+
+
+
+
+ PGRES_NONFATAL_ERROR
+
+
A nonfatal error occurred.
+
+
+
+
+ PGRES_FATAL_ERROR
+
+
A fatal error occurred.
+
+
+
If the result status is PGRES_TUPLES_OK , then the
-routine s described below can be used to retrieve the rows returned by
+function s described below can be used to retrieve the rows returned by
the query. Note that a SELECT command that happens
to retrieve zero rows still shows PGRES_TUPLES_OK .
PGRES_COMMAND_OK is for commands that can never
return rows (INSERT , UPDATE ,
etc.). A response of PGRES_EMPTY_QUERY often
-indicat es a bug in the client software.
+expos es a bug in the client software.
+
+
+PQresStatus
-PQresStatus
Converts the enumerated type returned by PQresultStatus> into
a string constant describing the status code.
+
+
+PQresultErrorMessage
-PQresultErrorMessage
-returns the error message associated with the query, or an empty string
+Returns the error message associated with the command, or an empty string
if there was no error.
char *PQresultErrorMessage(const PGresult *res);
+
+
Immediately following a PQexec or PQgetResult
call, PQerrorMessage (on the connection) will return the same
string as PQresultErrorMessage (on the result). However, a
when you want to know the status from the latest operation on the connection.
+
+
+PQclear
-PQclear
- Frees the storage associated with the PGresult .
- Every query result should be freed via PQclear when
+ Frees the storage associated with a PGresult .
+ Every command result should be freed via PQclear when
it is no longer needed.
void PQclear(PQresult *res);
+
+
You can keep a PGresult object around for as long as you
- need it; it does not go away when you issue a new query ,
+ need it; it does not go away when you issue a new command ,
nor even if you close the connection. To get rid of it,
you must call PQclear . Failure to do this will
- result in memory leaks in the frontend application.
+ result in memory leaks in your client application.
+
+
+PQmakeEmptyPGresult
-PQmakeEmptyPGresult
Constructs an empty PGresult object with the given status.
PGresult* PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);
-This is
libpq>'s internal routine to allocate and initialize an empty
+
+
+This is
libpq>'s internal function to allocate and initialize an empty
PGresult object. It is exported because some applications find it
useful to generate result objects (particularly objects with error
-status) themselves. If
conn is not
NULL and status indicates an error,
-the connection's current error message is copied into the PGresult.
+status) themselves. If
conn is not
null and status> indicates an error,
+the current error message of the specified connection is copied into the PGresult .
Note that PQclear should eventually be called on the object, just
as with a
PGresult returned by
libpq itself.
-
+
+
-
Escaping strings for inclusion in SQL querie s
+
Escaping Strings for Inclusion in SQL Command s
-PQescapeString
- Escapes a string for use within an SQL query.
+PQescapeString escapes a string for use within an SQL commmand.
size_t PQescapeString (char *to, const char *from, size_t length);
-If you want to include strings that have been received
+
+
+If you want to use strings that have been received
from a source that is not trustworthy (for example, because a random user
-entered them), you cannot directly include them in SQL
-queries for security reasons. Instead, you have to quote special
-characters that are otherwise interpreted by the SQL parser.
+entered them), you should not directly include them in SQL
+commands for security reasons. Instead, you have to escape certain
+characters that are otherwise interpreted specially by the SQL parser.
+PQescapeString> performs this operation.
-PQescapeString> performs this operation. The
-
from> points to the first character of the string that
+The
+
parameter from> points to the first character of the string that
is to be escaped, and the
length> parameter counts the
-number of characters in this string (a terminating zero byte is
-neither necessary nor counted
). to> shall point to a
+number of characters in this string. (A terminating zero byte is
+neither necessary nor counted
.) to> shall point to a
buffer that is able to hold at least one more character than twice
the value of
length>, otherwise the behavior is
undefined. A call to PQescapeString> writes an escaped
-
Escaping binary strings for inclusion in SQL querie s
+
Escaping Binary Strings for Inclusion in SQL Command s
+
+
+
+ PQescapeBytea
+
- PQescapeBytea
- Escapes a binary string (bytea type) for use within an SQL query.
-
- unsigned char *PQescapeBytea(const unsigned char *from ,
- size_t from_length,
- size_t *to_length);
- >
-
-
Certain ASCII characters must >
- be escaped (but all characters may be escaped)
- when used as part of a bytea
- string literal in an
SQL statement. In general, to
- escape a character, it is converted into the three digit octal number
-
equal to the decimal ASCII value, and preceded by
- two backslashes. The single quote (') and backslash (\) characters have
- special alternate escape sequences. See the &cite-user;
- for more information. PQescapeBytea
- performs this operation, escaping only the minimally
- required character s.
+ Escapes binary data for use within an SQL command with the type bytea .
+
+unsigned char *PQescapeBytea(const unsigned char *from,
+ size_t from_length ,
+ size_t *to_length);
+
+>
+
+ Certain byte values must be escaped (but all
+ byte values may be escaped) when used as part
+ of a
bytea literal in an
SQL
+ statement. In general, to escape a byte, it is converted into the
+ three digit octal number equal to the octet value, and preceded by
+ two backslashes. The single quote ('>) and backslash
+ (\>) characters have special alternative escape
+ sequences. See the &cite-user; for more
+ information. PQescapeBytea performs this
+ operation, escaping only the minimally required byte s.
The
from parameter points to the first
- character of the string that is to be escaped, and the
+ byte of the string that is to be escaped, and the
from_length parameter reflects the number of
- characters in this binary string (a terminating zero byte is
- neither necessary nor counted
). The
to_length
- parameter shall point to a buffer suitable to hold the resultant
+ bytes in this binary string. (A terminating zero byte is
+ neither necessary nor counted
.) The
to_length
+ parameter points to a variable that will hold the resultant
escaped string length. The result string length includes the terminating
zero byte of the result.
PQescapeBytea> returns an escaped version of the
-
from parameter binary string, to a
- caller-provided buffer. The return string has all special
- characters replaced so that they can be properly processed by the
-
PostgreSQL> string literal parser, and the
- bytea input function. A terminating zero byte is also
- added. The single quotes that must surround
-
PostgreSQL> string literals are not part of the
- result string.
+
from parameter binary string in memory allocated with
malloc()>.
+ The return string has all special characters replaced
+ so that they can be properly processed by the PostgreSQL string literal
+ parser, and the bytea input function. A terminating zero
+ byte is also added. The single quotes that must surround
+ PostgreSQL string literals are not part of the result string.
+
+
+
+ PQunescapeBytea
+
- PQunescapeBytea
Converts an escaped string representation of binary data into binary
- data - the reverse of PQescapeBytea .
-
- unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length);
-
+ data --- the reverse of PQescapeBytea .
+
+unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length);
+
+
The
from parameter points to an escaped string
- such as might be returned by PQgetvalue of a
- BYTEA column. PQunescapeBytea converts
- this string representation into its binary representation, filling the supplied buffer.
- It returns a pointer to the buffer which is NULL on error, and the size
- of the buffer in
to_length . The pointer may
- subsequently be used as an argument to the function
- free(3) .
+ such as might be returned by PQgetvalue when applied to a
+ bytea column. PQunescapeBytea converts
+ this string representation into its binary representation.
+ It returns a pointer to a buffer allocated with malloc() , or null on error, and puts the size
+ of the buffer in
to_length .
+
+
+
-
Retrieving SELECT Result Information
+
Retrieving Query Result Information
-
+
+
+PQntuples
-PQntuples
- Returns the number of tuples (rows)
+ Returns the number of rows (tuples)
in the query result.
int PQntuples(const PGresult *res);
+
+
+PQnfields
-PQnfields
- Returns the number of fields
- (columns) in each row of the query result.
+ Returns the number of columns (fields)
+ in each row of the query result.
int PQnfields(const PGresult *res);
+
-
+
+PQfname
-PQfname
- Returns the field (column) name associated with the given field index.
- Field indices start at 0.
+ Returns the column name associated with the given column number.
+ Column numbers start at 0.
char *PQfname(const PGresult *res,
- int field_index );
+ int column_number );
+
+
+PQfnumber
-PQfnumber
- Returns the field (column) index
- associated with the given field name.
+ Returns the column number
+ associated with the given column name.
int PQfnumber(const PGresult *res,
- const char *field _name);
+ const char *column _name);
- -1 is returned if the given name does not match any field .
+ -1 is returned if the given name does not match any column .
+
+
+PQftype
-PQftype
- Returns the field type associated with the
- given field index. The integer returned is an
- internal coding of the type. Field indices start
+ Returns the column data type associated with the
+ given column number. The integer returned is the
+ internal OID number of the type. Column numbers start
at 0.
Oid PQftype(const PGresult *res,
- int field_index );
+ int column_number );
+
+
You can query the system table pg_type to obtain
the name and properties of the various data types. The
OID s
-of the built-in data types are defined in src/include/catalog/pg_type.h
+of the built-in data types are defined in the file src/include/catalog/pg_type.h
in the source tree.
+
+
+PQfmod
-PQfmod
- Returns the type-specific modification data of the field
- associated with the given field index.
- Field indices start at 0.
+ Returns the type-specific modification data of the column
+ associated with the given column number.
+ Column numbers start at 0.
int PQfmod(const PGresult *res,
- int field_index );
+ int column_number );
+
+
+PQfsize
-PQfsize
- Returns the size in bytes of the field
- associated with the given field index.
- Field indices start at 0.
+ Returns the size in bytes of the column
+ associated with the given column number.
+ Column numbers start at 0.
int PQfsize(const PGresult *res,
- int field_index );
+ int column_number );
- PQfsize> returns the space allocated for this field in a database
- tuple, in other words the size of the server's binary representation
- of the data type. -1 is returned if the field is variable size.
+ PQfsize> returns the space allocated for this column in a database
+ row, in other words the size of the server's binary representation
+ of the data type. -1 is returned if the column has a variable size.
+
+
+
+PQbinaryTuples
-PQbinaryTuples
- Returns 1 if the PGresult> contains binary tuple data,
- 0 if it contains ASCII data.
+ Returns 1 if the PGresult> contains binary row data
+ and 0 if it contains text data.
int PQbinaryTuples(const PGresult *res);
-Currently, binary tuple data can only be returned by a query that
+
+
+Currently, binary row data can only be returned by a query that
extracts data from a binary cursor.
-
+
+
-
Retrieving SELECT Result Values
+
Retrieving Query Result Values
-
+
+
+PQgetvalue
-PQgetvalue
- Returns a single field (column) value of one tuple (row)
+ Returns a single column value of one row
of a PGresult .
- Tuple and field indices start at 0.
+ Row and colums indices start at 0.
char* PQgetvalue(const PGresult *res,
- int tup_num ,
- int field_num );
+ int row_number ,
+ int column_number );
+
+
For most queries, the value returned by PQgetvalue
is a null-terminated character string representation
-of the attribute value. But if PQbinaryTuples() i s 1,
+of the column value. But if PQbinaryTuples return s 1,
the value returned by PQgetvalue is the binary
representation of the
type in the internal format of the backend server
-(but not including the size word, if the field is variable-length).
+(but not including the size word, if the column is variable-length).
It is then the programmer's responsibility to cast and
-convert the data to the correct C type. The pointer
+convert the data to the correct C type.
+
+
+The pointer
returned by PQgetvalue points to storage that is
-part of the PGresult structure. One should not modify it ,
+part of the PGresult structure. One should not modify the data it points to ,
and one must explicitly
-copy the value into other storage if it is to
+copy the data into other storage if it is to
be used past the lifetime of the PGresult structure itself.
+
+
+PQgetisnull
-PQgetisnull
- Tests a field for a NULL entry.
- Tuple and field indices start at 0.
+ Tests a column for a null value.
+ Row and column numbers start at 0.
int PQgetisnull(const PGresult *res,
- int tup_num ,
- int field_num );
+ int row_number ,
+ int column_number );
- This function returns 1 if the field contains a NULL, 0 if
+
+
+ This function returns 1 if the column is null and 0 if
it contains a non-null value. (Note that PQgetvalue
- will return an empty string, not a null pointer, for a NULL
- field .)
+ will return an empty string, not a null pointer, for a null
+ column .)
+
+
+PQgetlength
-PQgetlength
- Returns the length of a field (attribute) value in bytes.
- Tuple and field indices start at 0.
+ Returns the length of a column value in bytes.
+ Row and column numbers start at 0.
int PQgetlength(const PGresult *res,
- int tup_num ,
- int field_num );
+ int row_number ,
+ int column_number );
-This is the actual data length for the particular data value, that is the
+
+
+This is the actual data length for the particular data value, that is, the
size of the object pointed to by PQgetvalue . Note that for character-represented
values, this size has little to do with the binary size reported by PQfsize .
+
+
+PQprint
-PQprint
- Prints out all the tuples and, optionally, the
- attribute names to the specified output stream.
-
+ Prints out all the rows and, optionally, the
+ column names to the specified output stream.
+
void PQprint(FILE* fout, /* output stream */
const PGresult *res,
const PQprintOpt *po);
-struct {
+typedef struct {
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 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 */
+ char *tableOpt; /* attributes for HTML table element */
+ char *caption; /* HTML table caption */
+ char **fieldName; /* null- terminated array of replacement field names */
} PQprintOpt;
-
+
+
+
This function was formerly used by
psql
to print query results, but this is no longer the case and this
function is no longer actively supported.
-
+
+
-
Retrieving Non-SELECT Result Information
+
Retrieving Result Information for Other Commands
-
+
+
+PQcmdStatus
-PQcmdStatus
Returns the command status string from the SQL command that
generated the PGresult .
+
+
+PQcmdTuples
-PQcmdTuples
Returns the number of rows affected by the SQL command.
char * PQcmdTuples(PGresult *res);
+
+
If the
SQL command that generated the
- PGresult was INSERT ,
- UPDATE , DELETE ,
- MOVE , or FETCH this
- returns a string containing the number of rows affected. If the
- command was anything else, it returns the empty string.
+ PGresult was INSERT>, UPDATE>, or DELETE , this returns a
+ string containing the number of rows affected. If the
+ command was anything else, it returns the empty string.
+
+
+PQoidValue
-PQoidValue
- Returns the object ID of the inserted row, if the
-
SQL command was an
INSERT
- that inserted exactly one row into a table that has OIDs.
- Otherwise, returns InvalidOid .
+ Returns the OID of the inserted row, if the
+
SQL command was an
INSERT
+ that inserted exactly one row into a table that has OIDs.
+ Otherwise, returns InvalidOid .
Oid PQoidValue(const PGresult *res);
+
+
The type Oid and the constant
- InvalidOid will be defined if you include th e
-
libpq header file. They will both be
- some integer type.
+ InvalidOid will be defined if you includ e
+ the
libpq header file. They will
+ both be some integer type.
+
+
+PQoidStatus
-PQoidStatus
- Returns a string with the object ID
- of the inserted row, if the
SQL command
- was an INSERT . (The string will be
- 0> if the INSERT did not
- insert exactly one row, or if the target table does not have
- OIDs.) If the command was not an INSERT ,
- returns an empty string.
+ Returns a string with the OID of the inserted row, if the
+ INSERT . (The string will be
+ 0> if the INSERT did not
+ insert exactly one row, or if the target table does not have
+ OIDs.) If the command was not an INSERT ,
+ returns an empty string.
char * PQoidStatus(const PGresult *res);
+
+
This function is deprecated in favor of PQoidValue
and is not thread-safe.
-
+
+
-
Asynchronous Query Processing
+
Asynchronous Command Processing
The PQexec function is adequate for submitting commands in
-simple synchronous
-applications. It has a couple of major deficiencies however :
+normal, synchronous
+applications. It has a couple of deficiencies, however, that can be of importance to some users :
-Since control is buried inside PQexec , it is hard for the frontend
-to decide it would like to try to cancel the ongoing command. (It can be
-done from a signal handler, but not otherwise.)
+Since the execution of the client application is suspended while it
+waits for the result, it is hard for the application to decide that it
+would like to try to cancel the ongoing command. (It can be done from
+a signal handler, but not otherwise.)
Older programs that used this functionality as well as
PQputline and PQputnbytes
-could block waiting to send data to the backend . To
+could block waiting to send data to the server . To
address that issue, the function PQsetnonblocking
was added.
-
Old applications can neglect to use PQsetnonblocking
-and get the older potentially blocking behavior. Newer programs can use
+and get the old potentially blocking behavior. Newer programs can use
PQsetnonblocking to achieve a completely nonblocking
-connection to the backend .
+connection to the server .
-
+
+
+ PQsetnonblocking
- PQsetnonblocking Sets the nonblocking status of the
- connection.
+ Sets the nonblocking status of the connection.
-int PQsetnonblocking(PGconn *conn, int arg)
+int PQsetnonblocking(PGconn *conn, int arg);
- Sets the state of the connection to nonblocking if
arg is 1,
+
+
+ Sets the state of the connection to nonblocking if
arg is 1 and
blocking if
arg is 0. Returns 0 if OK, -1 if error.
In the nonblocking state, calls to
PQputline , PQputnbytes ,
- PQsendQuery and PQendcopy
+ PQsendQuery , and PQendcopy
will not block but instead return an error if they need to be called
again.
When a database connection has been set to nonblocking mode and
PQexec is called, it will temporarily set the state
- of the connection to blocking until the PQexec
+ of the connection to blocking until the PQexec call
completes.
More of
libpq is expected to be made safe for
- PQsetnonblocking functionality in the near future.
+ the nonblocking mode in the future.
+
+
+PQisnonblocking
-PQisnonblocking
Returns the blocking status of the database connection.
-int PQisnonblocking(const PGconn *conn)
+int PQisnonblocking(const PGconn *conn);
- Returns 1 if the connection is set to nonblocking mode,
+
+
+ Returns 1 if the connection is set to nonblocking mode and
0 if blocking.
+
+
+PQsendQuery
-PQsendQuery
- Submit a command to the server without
+ Submits a command to the server without
waiting for the result(s). 1 is returned if the command was
- successfully dispatched, 0 if not (in which case, use
+ successfully dispatched and 0 if not (in which case, use
PQerrorMessage> to get more information about the failure).
int PQsendQuery(PGconn *conn,
- const char *query );
+ const char *command );
+
+
After successfully calling PQsendQuery , call
PQgetResult one or more
times to obtain the results. PQsendQuery may not be called
- again (on the same connection) until PQgetResult has returned NULL ,
+ again (on the same connection) until PQgetResult has returned a null pointer ,
indicating that the command is done.
+
+
+PQgetResult
-PQgetResult
- Wait for the next result from a prior PQsendQuery ,
- and return it. NULL is returned when the query is complete
+ Waits for the next result from a prior PQsendQuery ,
+ and return it. A null pointer is returned when the command is complete
and there will be no more results.
PGresult *PQgetResult(PGconn *conn);
- PQgetResult must be called repeatedly until it returns NULL,
+
+
+ PQgetResult must be called repeatedly until it returns a null pointer,
indicating that the command is done. (If called when no command is
- active, PQgetResult will just return NULL at once.)
- Each non-NULL result from PQgetResult should be processed using
+ active, PQgetResult will just return a null pointer at once.)
+ Each non-null result from PQgetResult should be processed using
the same PGresult> accessor functions previously described.
Don't forget to free each result object with PQclear when done with it.
- Note that PQgetResult will block only if a query is active and the
+ Note that PQgetResult will block only if a command is active and the
necessary response data has not yet been read by PQconsumeInput .
-
-itemized list>
+
+variable list>
solves one of PQexec 's problems:
If a command string contains multiple
SQL commands, the results of those
commands can be obtained individually. (This allows a simple form of
-overlapped processing, by the way: the frontend can be handling the
-results of one query while the backend is still working on later
+overlapped processing, by the way: the client can be handling the
+results of one command while the server is still working on later
queries in the same command string.) However, calling PQgetResult will
-still cause the frontend to block until the backend completes the
+still cause the client to block until the server completes the
next
SQL command. This can be avoided by proper use of three more
functions:
-
+
+
+PQconsumeInput
-PQconsumeInput
- If input is available from the backend, consume it.
+ If input is available from the server, consume it.
int PQconsumeInput(PGconn *conn);
+
+
PQconsumeInput normally returns 1 indicating no error
,
but returns 0 if there was some kind of trouble (in which case
-PQerrorMessage is set ). Note that the result does not say
+PQerrorMessage can be used ). Note that the result does not say
whether any input data was actually collected. After calling
PQconsumeInput , the application may check
PQisBusy and/or PQnotifies to see if
PQconsumeInput may be called even if the application is not
prepared to deal with a result or notification just yet. The
-routine will read available data and save it in a buffer, thereby
+function will read available data and save it in a buffer, thereby
causing a select() read-ready indication to go away. The
application can thus use PQconsumeInput to clear the
select() condition immediately, and then examine the results at leisure.
+
+
+PQisBusy
-PQisBusy
-Returns 1 if a query is busy, that is, PQgetResult would block
+Returns 1 if a command is busy, that is, PQgetResult would block
waiting for input. A 0 return indicates that PQgetResult can
be called with assurance of not blocking.
int PQisBusy(PGconn *conn);
-PQisBusy will not itself attempt to read data from the backend;
+
+
+PQisBusy will not itself attempt to read data from the server;
therefore PQconsumeInput must be invoked first, or the busy
state will never end.
+
+
+PQflush
-PQflush Attempt to flush any data queued to the backend ,
+Attempts to flush any data queued to the server ,
returns 0 if successful (or if the send queue is empty) or EOF if it failed for
some reason.
int PQflush(PGconn *conn);
+
+
PQflush needs to be called on a nonblocking connection
before calling select() to determine if a response has
arrived. If 0 is returned it ensures that there is no data queued to the
-backend that has not actually been sent. Only applications that have used
+server that has not actually been sent. Only applications that have used
PQsetnonblocking have a need for this.
-
-
-PQsocket
- Obtain the file descriptor number for the backend connection socket.
- A valid descriptor will be >= 0; a result of -1 indicates that
- no backend connection is currently open.
-
-int PQsocket(const PGconn *conn);
-
-PQsocket should be used to obtain the backend socket descriptor
-in preparation for executing select() . This allows an
-application using a blocking connection to wait for either backend responses or
-other conditions.
-If the result of select() indicates that data can be read from
-the backend socket, then PQconsumeInput should be called to read the
-data; after which, PQisBusy , PQgetResult ,
-and/or PQnotifies can be used to process the response.
-
-Nonblocking connections (that have used PQsetnonblocking )
-should not use select() until PQflush
-has returned 0 indicating that there is no buffered data waiting to be sent
-to the backend.
-
-
-
-
+
+
-A typical frontend using these functions will have a main loop that uses
-select to wait for all the conditions that it must
-respond to. One of the conditions will be input available from the backend ,
-which in select 's terms i s readable data on the file
+A typical application using these functions will have a main loop that uses
+select() to wait for all the conditions that it must
+respond to. One of the conditions will be input available from the server ,
+which in terms of select() mean s readable data on the file
descriptor identified by PQsocket .
When the main loop detects input ready, it should call
PQconsumeInput to read the input. It can then call
PQisBusy , followed by PQgetResult
if PQisBusy returns false (0). It can also call
-PQnotifies to detect NOTIFY
-messages (see ).
+PQnotifies to detect NOTIFY> messages (see ).
-A frontend that uses PQsendQuery /PQgetResult
-can also attempt to cancel a command that is still being processed by the backend.
+Nonblocking connections (that have used PQsetnonblocking )
+should not use select() until PQflush
+has returned 0 indicating that there is no buffered data waiting to be sent
+to the server.
-
+A client that uses PQsendQuery /PQgetResult
+can also attempt to cancel a command that is still being processed by the server.
+
+
+
+PQrequestCancel
-PQrequestCancel
- Request that
PostgreSQL abandon
+ Requests that the server abandon
processing of the current command.
int PQrequestCancel(PGconn *conn);
+
+
The return value is 1 if the cancel request was successfully
-dispatched, 0 if not. (If not, PQerrorMessage tells why not.)
+dispatched and 0 if not. (If not, PQerrorMessage tells why not.)
Successful dispatch is no guarantee that the request will have any
effect, however. Regardless of the return value of PQrequestCancel ,
the application must continue with the normal result-reading
sequence using PQgetResult . If the cancellation
is effective, the current command will terminate early and return
an error result. If the cancellation fails (say, because the
-backend was already done processing the command), then there will
+server was already done processing the command), then there will
be no visible result at all.
-
-
-
-Note that if the current command is part of a transaction, cancellation
+Note that if the current command is part of a transaction block , cancellation
will abort the whole transaction.
So, it is also possible to use it in conjunction with plain
PQexec , if the decision to cancel can be made in a signal
handler. For example,
psql invokes
-PQrequestCancel from a SIGINT> signal handler, thus allowing
-interactive cancellation of queries that it issues through PQexec .
-Note that PQrequestCancel will have no effect if the connection
-is not currently open or the backend is not currently processing a command.
+PQrequestCancel from a SIGINT> signal handler, thus allowing
+interactive cancellation of commands that it issues through PQexec .
+
+
+
+
PostgreSQL provides a fast-path interface to send
-function calls to the backend . This is a trapdoor into system internals and
+function calls to the server . This is a trapdoor into system internals and
can be a potential security hole. Most users will not need this feature.
+
-
-
-PQfn
- Request execution of a backend function via the fast-path interface.
+The function PQfn requests execution of a server
+function via the fast-path interface:
PGresult* PQfn(PGconn* conn,
int fnid,
int result_is_int,
const PQArgBlock *args,
int nargs);
-
- The
fnid> argument is the object identifier of the function to be
- executed.
-
result_buf is the buffer in which
- to place the return value. The caller must have allocated
- sufficient space to store the return value (there is no check!).
- The actual result length will be returned in the integer pointed
- to by
result_len . If a 4-byte integer result is expected, set
-
result_is_int to 1; otherwise set it to 0. (Setting
result_is_int to 1
- tells
libpq> to byte-swap the value if necessary, so that it is
- delivered as a proper int value for the client machine. When
-
result_is_int> is 0, the byte string sent by the backend is returned
- unmodified.)
-
args> and nargs> specify the arguments to be passed to the function.
-
+
typedef struct {
int len;
int isint;
} u;
} PQArgBlock;
- PQfn always returns a valid PGresult* . The result status
+
+
+ The
fnid> argument is the OID of the function to be
+ executed.
+
result_buf is the buffer in which
+ to place the return value. The caller must have allocated
+ sufficient space to store the return value. (There is no check!)
+ The actual result length will be returned in the integer pointed
+ to by
result_len . If a 4-byte integer result is expected, set
+
result_is_int to 1, otherwise set it to 0. (Setting
result_is_int to 1
+ tells
libpq> to byte-swap the value if necessary, so that it is
+ delivered as a proper int value for the client machine. When
+
result_is_int> is 0, the byte string sent by the server is returned
+ unmodified.)
+
args> and nargs> specify the arguments to be passed to the function.
+
+
+ PQfn always returns a valid PGresult pointer. The result status
should be checked before the result is used. The
caller is responsible for freeing the PGresult with
PQclear when it is no longer needed.
-
-
-
-
PostgreSQL support s asynchronous notification via the
-LISTEN and NOTIFY commands. A backend registers its interest in a particular
+
PostgreSQL offer s asynchronous notification via the
+LISTEN and NOTIFY commands. A server-side session registers its interest in a particular
notification condition with the LISTEN command (and can stop listening
-with the UNLISTEN command). All backend s listening on a
-particular condition will be notified asynchronously when a NOTIFY of that
-condition name is executed by any backend . No additional information is
+with the UNLISTEN command). All session s listening on a
+particular condition will be notified asynchronously when a NOTIFY command with that
+condition name is executed by any session . No additional information is
passed from the notifier to the listener. Thus, typically, any actual data
-that needs to be communicated is transferred through a database relation .
-Commonly the condition name is the same as the associated relation , but it is
-not necessary for there to be any associated relation .
+that needs to be communicated is transferred through a database table .
+Commonly, the condition name is the same as the associated table , but it is
+not necessary for there to be any associated table .
-libpq applications submit LISTEN and UNLISTEN
-commands as ordinary SQL command. Subsequently, arrival of NOTIFY
-messages can be detected by calling PQnotifies .
+
libpq applications submit
LISTEN and
UNLISTEN
+commands as ordinary SQL command. The arrival of NOTIFY
+messages can subsequently be detected by calling PQnotifies .
+
-
-
-PQnotifies
- R eturns the next notification from a list of unhandled
- notification messages received from the backend. Returns NULL if
+The function PQnotifies
+ r eturns the next notification from a list of unhandled
+ notification messages received from the server. It returns a null pointer if
there are no pending notifications. Once a notification is
returned from PQnotifies>, it is considered handled and will be
removed from the list of notifications.
PGnotify* PQnotifies(PGconn *conn);
typedef struct pgNotify {
- char *relname; /* name of relation containing data */
- int be_pid; /* process id of backend */
+ char *relname; /* notification name */
+ int be_pid; /* process ID of server process */
} PGnotify;
After processing a PGnotify object returned by PQnotifies ,
be sure to free it with free() to avoid a memory leak.
+
In
PostgreSQL 6.4 and later,
- the be_pid is that of the notifying backend,
- whereas in earlier versions it was always the
PID of your own backend.
+ the be_pid is that of the notifying backend process ,
+ whereas in earlier versions it was always the
PID of your own backend
process .
-
-
-
-The second sample program gives an example of the use
+ gives a sample program that illustrates the use
of asynchronous notification.
-PQnotifies() does not actually read backend data ; it just
+PQnotifies() does not actually read data from the server ; it just
returns messages previously absorbed by another
libpq
function. In prior releases of
libpq , the only way
-to ensure timely receipt of NOTIFYcommand> messages was to constantly submit querie s,
+to ensure timely receipt of NOTIFY> messages was to constantly submit command s,
even empty ones, and then check PQnotifies() after each
PQexec() . While this still works, it is
deprecated as a waste of processing power.
+
-A better way to check for NOTIFYcommand >
-messages when you have no useful queries to mak e is to call
+A better way to check for NOTIFY>
+messages when you have no useful commands to execut e is to call
PQconsumeInput() , then check
PQnotifies() .
-You can use select() to wait for backend data to
-arrive, thereby using no
CPU power unless there is something
+You can use select() to wait for data to
+arrive
from the server , thereby using no
CPU power unless there is something
to do. (See PQsocket() to obtain the file descriptor
number to use with select() .)
-Note that this will work OK whether you submit querie s with
+Note that this will work OK whether you submit command s with
PQsendQuery /PQgetResult or simply
use PQexec . You should, however, remember to
check PQnotifies() after each
PQgetResult or PQexec , to see
-if any notifications came in during the processing of the query .
+if any notifications came in during the processing of the command .
-
Functions Associated with the COPY Command
+
Functions Associated with the COPY Command
- The
COPY command in
PostgreSQL has options to read from
- or write to the network connection used by <filename>libpq>.
+ The
COPY command in
PostgreSQL has options to read from
+ or write to the network connection used by <application>libpq>.
Therefore, functions are necessary to access this network
connection directly so applications may take advantage of this capability.
- These functions should be executed only after obtaining a PGRES_COPY_OUT
- or PGRES_COPY_IN result object from PQexec
- or PQgetResult .
+ These functions should be executed only after obtaining a result
+ status of PGRES_COPY_OUT or
+ PGRES_COPY_IN from PQexec or
+ PQgetResult .
-
+
+
+PQgetline
-PQgetline
Reads a newline-terminated line of characters
- (transmitted by the backend server) into a buffer
- string of size length .
+ (transmitted by the server) into a buffer
+ string of size
length> .
int PQgetline(PGconn *conn,
- char *string ,
- int length)
+ char *buffer ,
+ int length);
-Like fgets , this routine copies up to length-1 characters
-into string. It is like gets , however, in that it converts
+
+
+This function copies up to
length>-1 characters
+into the buffer and converts
the terminating newline into a zero byte.
PQgetline returns EOF at the end of input, 0 if the
entire line has been read, and 1 if the buffer is full but the
terminating newline has not yet been read.
-Notic e that the application must check to see if a
+Note that the application must check to see if a
new line consists of the two characters \. ,
-which indicates that the backend server has finished sending
-the results of the copy command.
+which indicates that the server has finished sending
+the results of the COPY command.
If the application might
-receive lines that are more than length -1 characters long,
-care is needed to be sure one recognizes the \. line correctly
+receive lines that are more than
length> -1 characters long,
+care is needed to be sure it recognizes the \. line correctly
(and does not, for example, mistake the end of a long data line
for a terminator line).
-The code in
-
-src/bin/psql/copy.c
-
-contains example routines that correctly handle the copy protocol.
+The code in the file
+src/bin/psql/copy.c
+contains example functions that correctly handle the COPY protocol.
+
+
+PQgetlineAsync
-PQgetlineAsync
Reads a newline-terminated line of characters
- (transmitted by the backend server) into a buffer
+ (transmitted by the server) into a buffer
without blocking.
int PQgetlineAsync(PGconn *conn,
char *buffer,
- int bufsize)
+ int length);
-This routine is similar to PQgetline , but it can be used
+
+
+This function is similar to PQgetline , but it can be used
by applications
-that must read COPY data asynchronously, that is without blocking.
-Having issued the COPY command and gotten a PGRES_COPY_OUT
+that must read COPY data asynchronously, that is, without blocking.
+Having issued the COPY command and gotten a PGRES_COPY_OUT
response, the
application should call PQconsumeInput and
PQgetlineAsync until the
-end-of-data signal is detected. Unlike PQgetline , this routine takes
+end-of-data signal is detected.
+
+Unlike PQgetline , this function takes
responsibility for detecting end-of-data.
On each call, PQgetlineAsync will return data if a complete newline-
terminated data line is available in
libpq>'s input buffer, or if the
incoming data line is too long to fit in the buffer offered by the caller.
Otherwise, no data is returned until the rest of the line arrives.
-
-The routine returns -1 if the end-of-copy-data marker has been recognized,
+The function returns -1 if the end-of-copy-data marker has been recognized,
or 0 if no data is available, or a positive number giving the number of
bytes of data returned. If -1 is returned, the caller must next call
PQendcopy , and then return to normal processing.
+
The data returned will not extend beyond a newline character. If possible
a whole line will be returned at one time. But if the buffer offered by
-the caller is too small to hold a line sent by the backend , then a partial
+the caller is too small to hold a line sent by the server , then a partial
data line will be returned. This can be detected by testing whether the
last returned byte is \n or not.
The returned string is not null-terminated. (If you want to add a
-terminating null, be sure to pass a
bufsize one smaller than the room
+terminating null, be sure to pass a
length one smaller than the room
actually available.)
+
+
+PQputline
-PQputline
-Sends a null-terminated string to the backend server.
-Returns 0 if OK, EOF if unable to send the string.
+Sends a null-terminated string to the server.
+Returns 0 if OK and EOF if unable to send the string.
int PQputline(PGconn *conn,
const char *string);
+
+
Note the application must explicitly send the two
characters \. on a final line to indicate to
-the backend that it has finished sending its data.
+the server that it has finished sending its data.
+
+
+PQputnbytes
-PQputnbytes
-Sends a non-null-terminated string to the backend server.
-Returns 0 if OK, EOF if unable to send the string.
+Sends a non-null-terminated string to the server.
+Returns 0 if OK and EOF if unable to send the string.
int PQputnbytes(PGconn *conn,
const char *buffer,
int nbytes);
+
+
This is exactly like PQputline , except that the data buffer need
not be null-terminated since the number of bytes to send is
specified directly.
+
+
+PQendcopy
-PQendcopy
- Synchronizes with the backend. This function waits until
- the backend has finished the copy. It should
+ Synchronizes with the server.
+
+int PQendcopy(PGconn *conn);
+
+ This function waits until
+ the server has finished the copying. It should
either be issued when the last string has been
- sent to the backend using PQputline or when the
- last string has been received from the backend
- using PGgetline . It must be issued or the backend
- may get out of sync
with the frontend . Upon
- return from this function, the backend is ready to
+ sent to the server using PQputline or when the
+ last string has been received from the server
+ using PGgetline . It must be issued or the server
+ may get out of sync
with the client . Upon
+ return from this function, the server is ready to
receive the next SQL command.
The return value is 0 on successful completion,
nonzero otherwise.
-
-int PQendcopy(PGconn *conn);
-
-
-
-As an example:
-
-PQexec(conn, "CREATE TABLE foo (a int4, b char(16), d double precision)");
-PQexec(conn, "COPY foo FROM STDIN");
-PQputline(conn, "3\thello world\t4.5\n");
-PQputline(conn,"4\tgoodbye world\t7.11\n");
-...
-PQputline(conn,"\\.\n");
-PQendcopy(conn);
-
-
-
-
a PGRES_COPY_OUT result by executing PQgetline
repeatedly, followed by PQendcopy after the terminator line is seen.
It should then return to the PQgetResult loop until
-PQgetResult returns NULL . Similarly a PGRES_COPY_IN
+PQgetResult returns a null pointer . Similarly a PGRES_COPY_IN
result is processed by a series of PQputline calls followed by
PQendcopy , then return to the PQgetResult loop.
This arrangement will ensure that
-a
copy in or copy out command embedded in a series of
SQL commands
+a
COPY command embedded in a series of
SQL commands
will be executed correctly.
+
-Older applications are likely to submit a copy in or copy out
+Older applications are likely to submit a COPY
via PQexec and assume that the transaction is done after
PQendcopy .
-This will work correctly only if the copy in/out is the only
+This will work correctly only if the COPY is the only
SQL command in the command string.
+
+
+
+
+An example:
+
+PQexec(conn, "CREATE TABLE foo (a integer, b varchar(16), d double precision);");
+PQexec(conn, "COPY foo FROM STDIN;");
+PQputline(conn, "3\thello world\t4.5\n");
+PQputline(conn, "4\tgoodbye world\t7.11\n");
+...
+PQputline(conn, "\\.\n");
+PQendcopy(conn);
+
+
+
Tracing Functions
-
+
+
+PQtrace
-PQtrace
- Enable tracing of the frontend/backend communication to a debugging file stream.
+ Enables tracing of the client/server communication to a debugging file stream.
void PQtrace(PGconn *conn
- FILE *debug_port)
+ FILE *stream);
+
+
+PQuntrace
-PQuntrace
- Disable tracing started by PQtrace .
+ Disables tracing started by PQtrace .
-void PQuntrace(PGconn *conn)
+void PQuntrace(PGconn *conn);
-itemizedlist >
-para >
+varlistentry >
+variablelist >
+
Notice Processing
-
-
-PQsetNoticeProcessor
+The function PQsetNoticeProcessor
-
Control reporting of notice and warning messages generated by libpq> .
+controls the reporting of notice and warning messages generated by the server .
typedef void (*PQnoticeProcessor) (void *arg, const char *message);
void *arg);
-
-
-
-By default,
libpq prints notice
-messages from the backend on stderr ,
-as well as a few error messages that it generates by itself .
+By default,
libpq prints notice
messages
+from the server, as well as a few error messages that it generates by
+itself, on stderr .
This behavior can be overridden by supplying a callback function that
-does something else with the messages. The callback function is passed
-the text of the error message (which includes a trailing newline), plus
+does something else with the messages, a so-called notice processor.
+The callback function is passed
+the text of the message (which includes a trailing newline), plus
a void pointer that is the same one passed to
PQsetNoticeProcessor .
(This pointer can be used to access application-specific state if needed.)
The return value is the pointer to the previous notice processor.
-If you supply a callback function pointer of NULL , no action is taken,
+If you supply a null callback function pointer , no action is taken,
but the current pointer is returned.
could be called as long as either the PGconn> object or PGresult> objects
made from it exist. At creation of a PGresult>, the PGconn>'s current
notice processor pointer is copied into the PGresult> for possible use by
-routine s like PQgetvalue .
+function s like PQgetvalue .
PQconnectdb>, PQsetdbLogin> and
PQsetdb> if no value is directly specified by the calling
code. These are useful to avoid hard-coding database connection
-information into simple client applications.
+information into simple client applications, for example .
PGPORT sets the default TCP port number or Unix-domain
socket file extension for communicating with the
PGUSER
-sets the user name used to connect to the database and for authentication .
+sets the user name used to connect to the database.
PGPASSWORD
-sets the password used if the backend demands password
-authentication. This functionality is deprecated for security
-reasons; consider migrating to use the
-$HOME/.pgpass>
-file.
+sets the password used if the server demands password
+authentication. This environment variable is deprecated for security
+reasons; consider migrating to use the $HOME/.pgpass>
+file (see ).
PGREALM sets the Kerberos realm to use with
PostgreSQL , if it is different from the local realm.
-If PGREALM is set, <productname>PostgreSQL
+If PGREALM is set, <application>libpq
applications will attempt authentication with servers for this realm and use
separate ticket files to avoid conflicts with local
ticket files. This environment variable is only
-used if Kerberos authentication is selected by the backend .
+used if Kerberos authentication is selected by the server .
PGOPTIONS sets additional run-time options for
-PGTTY sets the file or tty on which debugging
-messages from the backend server are displayed.
+
PGTTY sets the file or
TTY> on which debugging
+messages from the server are displayed.
-The following environment variables can be used to specify user-level default
-behavior for every
PostgreSQL session
:
+The following environment variables can be used to specify default
+behavior for every
PostgreSQL session
.
PGDATESTYLE
sets the default style of date/time representation.
+(Equivalent to SET datestyle TO ... .)
PGTZ
sets the default time zone.
+(Equivalent to SET timezone TO ... .)
PGCLIENTENCODING
-sets the default client encoding.
+sets the default client character set encoding.
+(Equivalent to SET client_encoding TO ... .)
-
-
-
-The following environment variables can be used to specify default internal
-behavior for every
PostgreSQL session:
-
-
PGGEQO
-sets the default mode for the genetic optimizer.
+sets the default mode for the genetic query optimizer.
+(Equivalent to SET geqo TO ... .)
-
-Refer to the
SET SQL command
+Refer to the
SQL command
SET
for information on correct values for these environment variables.
-files">
-
Files
+pgpass">
+
The Password File
-files">
+pgpass">
-
- .pgpass
+
-The .pgpass file in a user's home directory is a
-file that can contain passwords to be used if the connection requires
-a password. This file should have the format:
+
+The file .pgpass in a user's home directory is a file
+that can contain passwords to be used if the connection requires a
+password (and no password has been specified otherwise).
+This file should have lines of the following format:
hostname :port :database :username :password
-Any of these may be a literal name, or * , which
+Each of these fields may be a literal name or * , which
matches anything. The first matching entry will be used, so put more-specific
-entries first. When an entry contains : or
+entries first. When an entry contain : or
\ , it must be escaped with \ .
-<filename>libpq> is thread-safe as of
+<application>libpq> is thread-safe as of
PostgreSQL 7.0, so long as no two threads
attempt to manipulate the same PGconn> object at the same
-time. In particular, you cannot issue concurrent querie s from different
+time. In particular, you cannot issue concurrent command s from different
threads through the same connection object. (If you need to run
-concurrent querie s, start up multiple connections.)
+concurrent command s, start up multiple connections.)
-<filename>Libpq clients using the crypt
-encryp tion method rely on the crypt() operating
-system function, which is often not thread-safe. It is better to use
-MD5 encryption, which is thread-safe on all
+<application>libpq applications that use the crypt
+authentica tion method rely on the crypt() operating
+system function, which is often not thread-safe. It is better to use the
+md5 method, which is thread-safe on all
platforms.
-
Building L ibpq Programs
+
Building l ibpq Programs
To build (i.e., compile and link) your
libpq programs you need to
-lpq so that the
libpq library gets pulled
in, as well as the option
-Ldirectory to
- point
it to the directory where the
libpq library resides. (Again, the
+ point
the compiler to the directory where the
libpq library resides. (Again, the
compiler will search some directories by default.) For maximum
portability, put the -L option before the
-lpq option. For example:
/usr/bin/ld: cannot find -lpq
- This means you forgot the -L or did not specify
- the right path .
+ This means you forgot the -L option o r did not specify
+ the right directory .