factor/basis/db/postgresql/ffi/ffi.factor

369 lines
13 KiB
Factor

! Copyright (C) 2007, 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
! tested on debian linux with postgresql 8.1
USING: alien alien.c-types alien.libraries alien.syntax
combinators system ;
IN: db.postgresql.ffi
<< "postgresql" {
{ [ os windows? ] [ "libpq.dll" ] }
{ [ os macosx? ] [ "libpq.dylib" ] }
{ [ os unix? ] [ "libpq.so" ] }
} cond cdecl add-library >>
! ConnSatusType
CONSTANT: CONNECTION_OK 0x0
CONSTANT: CONNECTION_BAD 0x1
CONSTANT: CONNECTION_STARTED 0x2
CONSTANT: CONNECTION_MADE 0x3
CONSTANT: CONNECTION_AWAITING_RESPONSE 0x4
CONSTANT: CONNECTION_AUTH_OK 0x5
CONSTANT: CONNECTION_SETENV 0x6
CONSTANT: CONNECTION_SSL_STARTUP 0x7
CONSTANT: CONNECTION_NEEDED 0x8
! PostgresPollingStatusType
CONSTANT: PGRES_POLLING_FAILED 0x0
CONSTANT: PGRES_POLLING_READING 0x1
CONSTANT: PGRES_POLLING_WRITING 0x2
CONSTANT: PGRES_POLLING_OK 0x3
CONSTANT: PGRES_POLLING_ACTIVE 0x4
! ExecStatusType;
CONSTANT: PGRES_EMPTY_QUERY 0x0
CONSTANT: PGRES_COMMAND_OK 0x1
CONSTANT: PGRES_TUPLES_OK 0x2
CONSTANT: PGRES_COPY_OUT 0x3
CONSTANT: PGRES_COPY_IN 0x4
CONSTANT: PGRES_BAD_RESPONSE 0x5
CONSTANT: PGRES_NONFATAL_ERROR 0x6
CONSTANT: PGRES_FATAL_ERROR 0x7
! PGTransactionStatusType;
CONSTANT: PQTRANS_IDLE 0x0
CONSTANT: PQTRANS_ACTIVE 0x1
CONSTANT: PQTRANS_INTRANS 0x2
CONSTANT: PQTRANS_INERROR 0x3
CONSTANT: PQTRANS_UNKNOWN 0x4
! PGVerbosity;
CONSTANT: PQERRORS_TERSE 0x0
CONSTANT: PQERRORS_DEFAULT 0x1
CONSTANT: PQERRORS_VERBOSE 0x2
CONSTANT: InvalidOid 0
TYPEDEF: int ConnStatusType
TYPEDEF: int ExecStatusType
TYPEDEF: int PostgresPollingStatusType
TYPEDEF: int PGTransactionStatusType
TYPEDEF: int PGVerbosity
C-TYPE: PGconn
C-TYPE: PGresult
C-TYPE: PGcancel
TYPEDEF: uint Oid
TYPEDEF: char pqbool
C-TYPE: PQconninfoOption
C-TYPE: PGnotify
C-TYPE: PQArgBlock
C-TYPE: PQprintOpt
C-TYPE: SSL
C-TYPE: FILE
LIBRARY: postgresql
! Exported functions of libpq
! make a new client connection to the backend
! Asynchronous (non-blocking)
FUNCTION: PGconn* PQconnectStart ( c-string conninfo )
FUNCTION: PostgresPollingStatusType PQconnectPoll ( PGconn* conn )
! Synchronous (blocking)
FUNCTION: PGconn* PQconnectdb ( c-string conninfo )
FUNCTION: PGconn* PQsetdbLogin ( c-string pghost, c-string pgport,
c-string pgoptions, c-string pgtty,
c-string dbName,
c-string login, c-string pwd )
: PQsetdb ( M_PGHOST M_PGPORT M_PGOPT M_PGTTY M_DBNAME -- PGconn* )
f f PQsetdbLogin ;
! close the current connection and free the PGconn data structure
FUNCTION: void PQfinish ( PGconn* conn )
! get info about connection options known to PQconnectdb
FUNCTION: PQconninfoOption* PQconndefaults ( )
! free the data structure returned by PQconndefaults()
FUNCTION: void PQconninfoFree ( PQconninfoOption* connOptions )
! Asynchronous (non-blocking)
FUNCTION: int PQresetStart ( PGconn* conn )
FUNCTION: PostgresPollingStatusType PQresetPoll ( PGconn* conn )
! Synchronous (blocking)
FUNCTION: void PQreset ( PGconn* conn )
! request a cancel structure
FUNCTION: PGcancel* PQgetCancel ( PGconn* conn )
! free a cancel structure
FUNCTION: void PQfreeCancel ( PGcancel* cancel )
! issue a cancel request
FUNCTION: int PQrequestCancel ( PGconn* conn )
! Accessor functions for PGconn objects
FUNCTION: c-string PQdb ( PGconn* conn )
FUNCTION: c-string PQuser ( PGconn* conn )
FUNCTION: c-string PQpass ( PGconn* conn )
FUNCTION: c-string PQhost ( PGconn* conn )
FUNCTION: c-string PQport ( PGconn* conn )
FUNCTION: c-string PQtty ( PGconn* conn )
FUNCTION: c-string PQoptions ( PGconn* conn )
FUNCTION: ConnStatusType PQstatus ( PGconn* conn )
FUNCTION: PGTransactionStatusType PQtransactionStatus ( PGconn* conn )
FUNCTION: c-string PQparameterStatus ( PGconn* conn,
c-string paramName )
FUNCTION: int PQprotocolVersion ( PGconn* conn )
! FUNCTION: int PQServerVersion ( PGconn* conn )
FUNCTION: c-string PQerrorMessage ( PGconn* conn )
FUNCTION: int PQsocket ( PGconn* conn )
FUNCTION: int PQbackendPID ( PGconn* conn )
FUNCTION: int PQclientEncoding ( PGconn* conn )
FUNCTION: int PQsetClientEncoding ( PGconn* conn, c-string encoding )
! May not be compiled into libpq
! Get the SSL structure associated with a connection
FUNCTION: SSL* PQgetssl ( PGconn* conn )
! Tell libpq whether it needs to initialize OpenSSL
FUNCTION: void PQinitSSL ( int do_init )
! Set verbosity for PQerrorMessage and PQresultErrorMessage
FUNCTION: PGVerbosity PQsetErrorVerbosity ( PGconn* conn,
PGVerbosity verbosity )
! Enable/disable tracing
FUNCTION: void PQtrace ( PGconn* conn, FILE* debug_port )
FUNCTION: void PQuntrace ( PGconn* conn )
! BROKEN
! Function types for notice-handling callbacks
! typedef void (*PQnoticeReceiver) (void *arg, PGresult *res);
! typedef void (*PQnoticeProcessor) (void *arg, c-string message);
! ALIAS: void* PQnoticeReceiver
! ALIAS: void* PQnoticeProcessor
! Override default notice handling routines
! FUNCTION: PQnoticeReceiver PQsetNoticeReceiver ( PGconn* conn,
! PQnoticeReceiver proc,
! void* arg )
! FUNCTION: PQnoticeProcessor PQsetNoticeProcessor ( PGconn* conn,
! PQnoticeProcessor proc,
! void* arg )
! END BROKEN
! === in fe-exec.c ===
! Simple synchronous query
FUNCTION: PGresult* PQexec ( PGconn* conn, c-string query )
FUNCTION: PGresult* PQexecParams ( PGconn* conn,
c-string command,
int nParams,
Oid* paramTypes,
c-string* paramValues,
int* paramLengths,
int* paramFormats,
int resultFormat )
FUNCTION: PGresult* PQprepare ( PGconn* conn, c-string stmtName,
c-string query, int nParams,
Oid* paramTypes )
FUNCTION: PGresult* PQexecPrepared ( PGconn* conn,
c-string stmtName,
int nParams,
c-string* paramValues,
int* paramLengths,
int* paramFormats,
int resultFormat )
! Interface for multiple-result or asynchronous queries
FUNCTION: int PQsendQuery ( PGconn* conn, c-string query )
FUNCTION: int PQsendQueryParams ( PGconn* conn,
c-string command,
int nParams,
Oid* paramTypes,
c-string* paramValues,
int* paramLengths,
int* paramFormats,
int resultFormat )
FUNCTION: PGresult* PQsendPrepare ( PGconn* conn, c-string stmtName,
c-string query, int nParams,
Oid* paramTypes )
FUNCTION: int PQsendQueryPrepared ( PGconn* conn,
c-string stmtName,
int nParams,
c-string* paramValues,
int *paramLengths,
int *paramFormats,
int resultFormat )
FUNCTION: PGresult* PQgetResult ( PGconn* conn )
! Routines for managing an asynchronous query
FUNCTION: int PQisBusy ( PGconn* conn )
FUNCTION: int PQconsumeInput ( PGconn* conn )
! LISTEN/NOTIFY support
FUNCTION: PGnotify* PQnotifies ( PGconn* conn )
! Routines for copy in/out
FUNCTION: int PQputCopyData ( PGconn* conn, c-string buffer, int nbytes )
FUNCTION: int PQputCopyEnd ( PGconn* conn, c-string errormsg )
FUNCTION: int PQgetCopyData ( PGconn* conn, c-string* buffer, int async )
! Deprecated routines for copy in/out
FUNCTION: int PQgetline ( PGconn* conn, c-string string, int length )
FUNCTION: int PQputline ( PGconn* conn, c-string string )
FUNCTION: int PQgetlineAsync ( PGconn* conn, c-string buffer, int bufsize )
FUNCTION: int PQputnbytes ( PGconn* conn, c-string buffer, int nbytes )
FUNCTION: int PQendcopy ( PGconn* conn )
! Set blocking/nonblocking connection to the backend
FUNCTION: int PQsetnonblocking ( PGconn* conn, int arg )
FUNCTION: int PQisnonblocking ( PGconn* conn )
! Force the write buffer to be written (or at least try)
FUNCTION: int PQflush ( PGconn* conn )
!
! * "Fast path" interface --- not really recommended for application
! * use
!
FUNCTION: PGresult* PQfn ( PGconn* conn,
int fnid,
int* result_buf,
int* result_len,
int result_is_int,
PQArgBlock* args,
int nargs )
! Accessor functions for PGresult objects
FUNCTION: ExecStatusType PQresultStatus ( PGresult* res )
FUNCTION: c-string PQresStatus ( ExecStatusType status )
FUNCTION: c-string PQresultErrorMessage ( PGresult* res )
FUNCTION: c-string PQresultErrorField ( PGresult* res, int fieldcode )
FUNCTION: int PQntuples ( PGresult* res )
FUNCTION: int PQnfields ( PGresult* res )
FUNCTION: int PQbinaryTuples ( PGresult* res )
FUNCTION: c-string PQfname ( PGresult* res, int field_num )
FUNCTION: int PQfnumber ( PGresult* res, c-string field_name )
FUNCTION: Oid PQftable ( PGresult* res, int field_num )
FUNCTION: int PQftablecol ( PGresult* res, int field_num )
FUNCTION: int PQfformat ( PGresult* res, int field_num )
FUNCTION: Oid PQftype ( PGresult* res, int field_num )
FUNCTION: int PQfsize ( PGresult* res, int field_num )
FUNCTION: int PQfmod ( PGresult* res, int field_num )
FUNCTION: c-string PQcmdStatus ( PGresult* res )
FUNCTION: c-string PQoidStatus ( PGresult* res )
FUNCTION: Oid PQoidValue ( PGresult* res )
FUNCTION: c-string PQcmdTuples ( PGresult* res )
! FUNCTION: c-string PQgetvalue ( PGresult* res, int tup_num, int field_num )
FUNCTION: void* PQgetvalue ( PGresult* res, int tup_num, int field_num )
FUNCTION: int PQgetlength ( PGresult* res, int tup_num, int field_num )
FUNCTION: int PQgetisnull ( PGresult* res, int tup_num, int field_num )
! Delete a PGresult
FUNCTION: void PQclear ( PGresult* res )
! For freeing other alloc'd results, such as PGnotify structs
FUNCTION: void PQfreemem ( void* ptr )
! Exists for backward compatibility.
: PQfreeNotify ( ptr -- ) PQfreemem ;
!
! Make an empty PGresult with given status (some apps find this
! useful). If conn is not NULL and status indicates an error, the
! conn's errorMessage is copied.
!
FUNCTION: PGresult* PQmakeEmptyPGresult ( PGconn* conn, ExecStatusType status )
! Quoting strings before inclusion in queries.
FUNCTION: size_t PQescapeStringConn ( PGconn* conn,
c-string to, c-string from, size_t length,
int* error )
FUNCTION: c-string PQescapeByteaConn ( PGconn* conn,
c-string from, size_t length,
size_t* to_length )
FUNCTION: void* PQunescapeBytea ( c-string strtext, size_t* retbuflen )
! FUNCTION: c-string PQunescapeBytea ( c-string strtext, size_t* retbuflen )
! These forms are deprecated!
FUNCTION: size_t PQescapeString ( void* to, c-string from, size_t length )
FUNCTION: c-string PQescapeBytea ( c-string bintext, size_t binlen,
size_t* bytealen )
! === in fe-print.c ===
FUNCTION: void PQprint ( FILE* fout, PGresult* res, PQprintOpt* ps )
! really old printing routines
FUNCTION: void PQdisplayTuples ( PGresult* res,
FILE* fp,
int fillAlign,
c-string fieldSep,
int printHeader,
int quiet )
FUNCTION: void PQprintTuples ( PGresult* res,
FILE* fout,
int printAttName,
int terseOutput,
int width )
! === in fe-lobj.c ===
! Large-object access routines
FUNCTION: int lo_open ( PGconn* conn, Oid lobjId, int mode )
FUNCTION: int lo_close ( PGconn* conn, int fd )
FUNCTION: int lo_read ( PGconn* conn, int fd, c-string buf, size_t len )
FUNCTION: int lo_write ( PGconn* conn, int fd, c-string buf, size_t len )
FUNCTION: int lo_lseek ( PGconn* conn, int fd, int offset, int whence )
FUNCTION: Oid lo_creat ( PGconn* conn, int mode )
! FUNCTION: Oid lo_creat ( PGconn* conn, Oid lobjId )
FUNCTION: int lo_tell ( PGconn* conn, int fd )
FUNCTION: int lo_unlink ( PGconn* conn, Oid lobjId )
FUNCTION: Oid lo_import ( PGconn* conn, c-string filename )
FUNCTION: int lo_export ( PGconn* conn, Oid lobjId, c-string filename )
! === in fe-misc.c ===
! Determine length of multibyte encoded char at *s
FUNCTION: int PQmblen ( c-string s, int encoding )
! Determine display length of multibyte encoded char at *s
FUNCTION: int PQdsplen ( c-string s, int encoding )
! Get encoding id from environment variable PGCLIENTENCODING
FUNCTION: int PQenv2encoding ( )
! From git, include/catalog/pg_type.h
CONSTANT: BOOL-OID 16
CONSTANT: BYTEA-OID 17
CONSTANT: CHAR-OID 18
CONSTANT: NAME-OID 19
CONSTANT: INT8-OID 20
CONSTANT: INT2-OID 21
CONSTANT: INT4-OID 23
CONSTANT: TEXT-OID 23
CONSTANT: OID-OID 26
CONSTANT: FLOAT4-OID 700
CONSTANT: FLOAT8-OID 701
CONSTANT: VARCHAR-OID 1043
CONSTANT: DATE-OID 1082
CONSTANT: TIME-OID 1083
CONSTANT: TIMESTAMP-OID 1114
CONSTANT: TIMESTAMPTZ-OID 1184
CONSTANT: INTERVAL-OID 1186
CONSTANT: NUMERIC-OID 1700