1 ! Copyright (C) 2007, 2008 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 ! tested on debian linux with postgresql 8.1
4 USING: alien alien.syntax combinators system alien.libraries ;
8 { [ os winnt? ] [ "libpq.dll" ] }
9 { [ os macosx? ] [ "libpq.dylib" ] }
10 { [ os unix? ] [ "libpq.so" ] }
11 } cond "cdecl" add-library >>
14 CONSTANT: CONNECTION_OK HEX: 0
15 CONSTANT: CONNECTION_BAD HEX: 1
16 CONSTANT: CONNECTION_STARTED HEX: 2
17 CONSTANT: CONNECTION_MADE HEX: 3
18 CONSTANT: CONNECTION_AWAITING_RESPONSE HEX: 4
19 CONSTANT: CONNECTION_AUTH_OK HEX: 5
20 CONSTANT: CONNECTION_SETENV HEX: 6
21 CONSTANT: CONNECTION_SSL_STARTUP HEX: 7
22 CONSTANT: CONNECTION_NEEDED HEX: 8
24 ! PostgresPollingStatusType
25 CONSTANT: PGRES_POLLING_FAILED HEX: 0
26 CONSTANT: PGRES_POLLING_READING HEX: 1
27 CONSTANT: PGRES_POLLING_WRITING HEX: 2
28 CONSTANT: PGRES_POLLING_OK HEX: 3
29 CONSTANT: PGRES_POLLING_ACTIVE HEX: 4
32 CONSTANT: PGRES_EMPTY_QUERY HEX: 0
33 CONSTANT: PGRES_COMMAND_OK HEX: 1
34 CONSTANT: PGRES_TUPLES_OK HEX: 2
35 CONSTANT: PGRES_COPY_OUT HEX: 3
36 CONSTANT: PGRES_COPY_IN HEX: 4
37 CONSTANT: PGRES_BAD_RESPONSE HEX: 5
38 CONSTANT: PGRES_NONFATAL_ERROR HEX: 6
39 CONSTANT: PGRES_FATAL_ERROR HEX: 7
41 ! PGTransactionStatusType;
42 CONSTANT: PQTRANS_IDLE HEX: 0
43 CONSTANT: PQTRANS_ACTIVE HEX: 1
44 CONSTANT: PQTRANS_INTRANS HEX: 2
45 CONSTANT: PQTRANS_INERROR HEX: 3
46 CONSTANT: PQTRANS_UNKNOWN HEX: 4
49 CONSTANT: PQERRORS_TERSE HEX: 0
50 CONSTANT: PQERRORS_DEFAULT HEX: 1
51 CONSTANT: PQERRORS_VERBOSE HEX: 2
53 CONSTANT: InvalidOid 0
55 TYPEDEF: int ConnStatusType
56 TYPEDEF: int ExecStatusType
57 TYPEDEF: int PostgresPollingStatusType
58 TYPEDEF: int PGTransactionStatusType
59 TYPEDEF: int PGVerbosity
61 TYPEDEF: void* PGconn*
62 TYPEDEF: void* PGresult*
63 TYPEDEF: void* PGcancel*
67 TYPEDEF: void* PQconninfoOption*
68 TYPEDEF: void* PGnotify*
69 TYPEDEF: void* PQArgBlock*
70 TYPEDEF: void* PQprintOpt*
75 ! Exported functions of libpq
77 ! make a new client connection to the backend
78 ! Asynchronous (non-blocking)
79 FUNCTION: PGconn* PQconnectStart ( char* conninfo ) ;
80 FUNCTION: PostgresPollingStatusType PQconnectPoll ( PGconn* conn ) ;
82 ! Synchronous (blocking)
83 FUNCTION: PGconn* PQconnectdb ( char* conninfo ) ;
84 FUNCTION: PGconn* PQsetdbLogin ( char* pghost, char* pgport,
85 char* pgoptions, char* pgtty,
87 char* login, char* pwd ) ;
89 : PQsetdb ( M_PGHOST M_PGPORT M_PGOPT M_PGTTY M_DBNAME -- PGconn* )
92 ! close the current connection and free the PGconn data structure
93 FUNCTION: void PQfinish ( PGconn* conn ) ;
95 ! get info about connection options known to PQconnectdb
96 FUNCTION: PQconninfoOption* PQconndefaults ( ) ;
98 ! free the data structure returned by PQconndefaults()
99 FUNCTION: void PQconninfoFree ( PQconninfoOption* connOptions ) ;
101 ! Asynchronous (non-blocking)
102 FUNCTION: int PQresetStart ( PGconn* conn ) ;
103 FUNCTION: PostgresPollingStatusType PQresetPoll ( PGconn* conn ) ;
105 ! Synchronous (blocking)
106 FUNCTION: void PQreset ( PGconn* conn ) ;
108 ! request a cancel structure
109 FUNCTION: PGcancel* PQgetCancel ( PGconn* conn ) ;
111 ! free a cancel structure
112 FUNCTION: void PQfreeCancel ( PGcancel* cancel ) ;
114 ! issue a cancel request
115 FUNCTION: int PQrequestCancel ( PGconn* conn ) ;
117 ! Accessor functions for PGconn objects
118 FUNCTION: char* PQdb ( PGconn* conn ) ;
119 FUNCTION: char* PQuser ( PGconn* conn ) ;
120 FUNCTION: char* PQpass ( PGconn* conn ) ;
121 FUNCTION: char* PQhost ( PGconn* conn ) ;
122 FUNCTION: char* PQport ( PGconn* conn ) ;
123 FUNCTION: char* PQtty ( PGconn* conn ) ;
124 FUNCTION: char* PQoptions ( PGconn* conn ) ;
125 FUNCTION: ConnStatusType PQstatus ( PGconn* conn ) ;
126 FUNCTION: PGTransactionStatusType PQtransactionStatus ( PGconn* conn ) ;
127 FUNCTION: char* PQparameterStatus ( PGconn* conn,
129 FUNCTION: int PQprotocolVersion ( PGconn* conn ) ;
130 ! FUNCTION: int PQServerVersion ( PGconn* conn ) ;
131 FUNCTION: char* PQerrorMessage ( PGconn* conn ) ;
132 FUNCTION: int PQsocket ( PGconn* conn ) ;
133 FUNCTION: int PQbackendPID ( PGconn* conn ) ;
134 FUNCTION: int PQclientEncoding ( PGconn* conn ) ;
135 FUNCTION: int PQsetClientEncoding ( PGconn* conn, char* encoding ) ;
137 ! May not be compiled into libpq
138 ! Get the SSL structure associated with a connection
139 FUNCTION: SSL* PQgetssl ( PGconn* conn ) ;
141 ! Tell libpq whether it needs to initialize OpenSSL
142 FUNCTION: void PQinitSSL ( int do_init ) ;
144 ! Set verbosity for PQerrorMessage and PQresultErrorMessage
145 FUNCTION: PGVerbosity PQsetErrorVerbosity ( PGconn* conn,
146 PGVerbosity verbosity ) ;
148 ! Enable/disable tracing
149 FUNCTION: void PQtrace ( PGconn* conn, FILE* debug_port ) ;
150 FUNCTION: void PQuntrace ( PGconn* conn ) ;
153 ! Function types for notice-handling callbacks
154 ! typedef void (*PQnoticeReceiver) (void *arg, PGresult *res);
155 ! typedef void (*PQnoticeProcessor) (void *arg, char* message);
156 ! ALIAS: void* PQnoticeReceiver
157 ! ALIAS: void* PQnoticeProcessor
159 ! Override default notice handling routines
160 ! FUNCTION: PQnoticeReceiver PQsetNoticeReceiver ( PGconn* conn,
161 ! PQnoticeReceiver proc,
163 ! FUNCTION: PQnoticeProcessor PQsetNoticeProcessor ( PGconn* conn,
164 ! PQnoticeProcessor proc,
168 ! === in fe-exec.c ===
170 ! Simple synchronous query
171 FUNCTION: PGresult* PQexec ( PGconn* conn, char* query ) ;
172 FUNCTION: PGresult* PQexecParams ( PGconn* conn,
180 FUNCTION: PGresult* PQprepare ( PGconn* conn, char* stmtName,
181 char* query, int nParams,
183 FUNCTION: PGresult* PQexecPrepared ( PGconn* conn,
191 ! Interface for multiple-result or asynchronous queries
192 FUNCTION: int PQsendQuery ( PGconn* conn, char* query ) ;
193 FUNCTION: int PQsendQueryParams ( PGconn* conn,
201 FUNCTION: PGresult* PQsendPrepare ( PGconn* conn, char* stmtName,
202 char* query, int nParams,
204 FUNCTION: int PQsendQueryPrepared ( PGconn* conn,
211 FUNCTION: PGresult* PQgetResult ( PGconn* conn ) ;
213 ! Routines for managing an asynchronous query
214 FUNCTION: int PQisBusy ( PGconn* conn ) ;
215 FUNCTION: int PQconsumeInput ( PGconn* conn ) ;
217 ! LISTEN/NOTIFY support
218 FUNCTION: PGnotify* PQnotifies ( PGconn* conn ) ;
220 ! Routines for copy in/out
221 FUNCTION: int PQputCopyData ( PGconn* conn, char* buffer, int nbytes ) ;
222 FUNCTION: int PQputCopyEnd ( PGconn* conn, char* errormsg ) ;
223 FUNCTION: int PQgetCopyData ( PGconn* conn, char** buffer, int async ) ;
225 ! Deprecated routines for copy in/out
226 FUNCTION: int PQgetline ( PGconn* conn, char* string, int length ) ;
227 FUNCTION: int PQputline ( PGconn* conn, char* string ) ;
228 FUNCTION: int PQgetlineAsync ( PGconn* conn, char* buffer, int bufsize ) ;
229 FUNCTION: int PQputnbytes ( PGconn* conn, char* buffer, int nbytes ) ;
230 FUNCTION: int PQendcopy ( PGconn* conn ) ;
232 ! Set blocking/nonblocking connection to the backend
233 FUNCTION: int PQsetnonblocking ( PGconn* conn, int arg ) ;
234 FUNCTION: int PQisnonblocking ( PGconn* conn ) ;
236 ! Force the write buffer to be written (or at least try)
237 FUNCTION: int PQflush ( PGconn* conn ) ;
240 ! * "Fast path" interface --- not really recommended for application
243 FUNCTION: PGresult* PQfn ( PGconn* conn,
251 ! Accessor functions for PGresult objects
252 FUNCTION: ExecStatusType PQresultStatus ( PGresult* res ) ;
253 FUNCTION: char* PQresStatus ( ExecStatusType status ) ;
254 FUNCTION: char* PQresultErrorMessage ( PGresult* res ) ;
255 FUNCTION: char* PQresultErrorField ( PGresult* res, int fieldcode ) ;
256 FUNCTION: int PQntuples ( PGresult* res ) ;
257 FUNCTION: int PQnfields ( PGresult* res ) ;
258 FUNCTION: int PQbinaryTuples ( PGresult* res ) ;
259 FUNCTION: char* PQfname ( PGresult* res, int field_num ) ;
260 FUNCTION: int PQfnumber ( PGresult* res, char* field_name ) ;
261 FUNCTION: Oid PQftable ( PGresult* res, int field_num ) ;
262 FUNCTION: int PQftablecol ( PGresult* res, int field_num ) ;
263 FUNCTION: int PQfformat ( PGresult* res, int field_num ) ;
264 FUNCTION: Oid PQftype ( PGresult* res, int field_num ) ;
265 FUNCTION: int PQfsize ( PGresult* res, int field_num ) ;
266 FUNCTION: int PQfmod ( PGresult* res, int field_num ) ;
267 FUNCTION: char* PQcmdStatus ( PGresult* res ) ;
268 FUNCTION: char* PQoidStatus ( PGresult* res ) ;
269 FUNCTION: Oid PQoidValue ( PGresult* res ) ;
270 FUNCTION: char* PQcmdTuples ( PGresult* res ) ;
271 ! FUNCTION: char* PQgetvalue ( PGresult* res, int tup_num, int field_num ) ;
272 FUNCTION: void* PQgetvalue ( PGresult* res, int tup_num, int field_num ) ;
273 FUNCTION: int PQgetlength ( PGresult* res, int tup_num, int field_num ) ;
274 FUNCTION: int PQgetisnull ( PGresult* res, int tup_num, int field_num ) ;
277 FUNCTION: void PQclear ( PGresult* res ) ;
279 ! For freeing other alloc'd results, such as PGnotify structs
280 FUNCTION: void PQfreemem ( void* ptr ) ;
282 ! Exists for backward compatibility.
283 : PQfreeNotify ( ptr -- ) PQfreemem ;
286 ! Make an empty PGresult with given status (some apps find this
287 ! useful). If conn is not NULL and status indicates an error, the
288 ! conn's errorMessage is copied.
290 FUNCTION: PGresult* PQmakeEmptyPGresult ( PGconn* conn, ExecStatusType status ) ;
292 ! Quoting strings before inclusion in queries.
293 FUNCTION: size_t PQescapeStringConn ( PGconn* conn,
294 char* to, char* from, size_t length,
296 FUNCTION: uchar* PQescapeByteaConn ( PGconn* conn,
297 char* from, size_t length,
298 size_t* to_length ) ;
299 FUNCTION: void* PQunescapeBytea ( uchar* strtext, size_t* retbuflen ) ;
300 ! FUNCTION: uchar* PQunescapeBytea ( uchar* strtext, size_t* retbuflen ) ;
301 ! These forms are deprecated!
302 FUNCTION: size_t PQescapeString ( void* to, char* from, size_t length ) ;
303 FUNCTION: uchar* PQescapeBytea ( uchar* bintext, size_t binlen,
306 ! === in fe-print.c ===
308 FUNCTION: void PQprint ( FILE* fout, PGresult* res, PQprintOpt* ps ) ;
310 ! really old printing routines
311 FUNCTION: void PQdisplayTuples ( PGresult* res,
318 FUNCTION: void PQprintTuples ( PGresult* res,
323 ! === in fe-lobj.c ===
325 ! Large-object access routines
326 FUNCTION: int lo_open ( PGconn* conn, Oid lobjId, int mode ) ;
327 FUNCTION: int lo_close ( PGconn* conn, int fd ) ;
328 FUNCTION: int lo_read ( PGconn* conn, int fd, char* buf, size_t len ) ;
329 FUNCTION: int lo_write ( PGconn* conn, int fd, char* buf, size_t len ) ;
330 FUNCTION: int lo_lseek ( PGconn* conn, int fd, int offset, int whence ) ;
331 FUNCTION: Oid lo_creat ( PGconn* conn, int mode ) ;
332 ! FUNCTION: Oid lo_creat ( PGconn* conn, Oid lobjId ) ;
333 FUNCTION: int lo_tell ( PGconn* conn, int fd ) ;
334 FUNCTION: int lo_unlink ( PGconn* conn, Oid lobjId ) ;
335 FUNCTION: Oid lo_import ( PGconn* conn, char* filename ) ;
336 FUNCTION: int lo_export ( PGconn* conn, Oid lobjId, char* filename ) ;
338 ! === in fe-misc.c ===
340 ! Determine length of multibyte encoded char at *s
341 FUNCTION: int PQmblen ( uchar* s, int encoding ) ;
343 ! Determine display length of multibyte encoded char at *s
344 FUNCTION: int PQdsplen ( uchar* s, int encoding ) ;
346 ! Get encoding id from environment variable PGCLIENTENCODING
347 FUNCTION: int PQenv2encoding ( ) ;
349 ! From git, include/catalog/pg_type.h
350 CONSTANT: BOOL-OID 16
351 CONSTANT: BYTEA-OID 17
352 CONSTANT: CHAR-OID 18
353 CONSTANT: NAME-OID 19
354 CONSTANT: INT8-OID 20
355 CONSTANT: INT2-OID 21
356 CONSTANT: INT4-OID 23
357 CONSTANT: TEXT-OID 23
359 CONSTANT: FLOAT4-OID 700
360 CONSTANT: FLOAT8-OID 701
361 CONSTANT: VARCHAR-OID 1043
362 CONSTANT: DATE-OID 1082
363 CONSTANT: TIME-OID 1083
364 CONSTANT: TIMESTAMP-OID 1114
365 CONSTANT: TIMESTAMPTZ-OID 1184
366 CONSTANT: INTERVAL-OID 1186
367 CONSTANT: NUMERIC-OID 1700