Subject Re: PostgreSQL
From Osvaldo Ramirez
Date Tue, 06 May 2008 16:37:26 -0600
Newsgroups xfree.public
Attachment(s) test.prglibpq4xb.prg


Well guys,

It is a pleasure a to upload the first program that connect to
PostgreSQL - API,

So, it is the begin and We will upload more samples codes and documents
about how to access via API or ODBC, remeber all this is based on my own
experience.

This example use the lib ot4xb.lib from www.xbwin.com
where you can download the updates files.

Enjoy it

----------------------------------------------------------------

Estiamdos

Es un placer poner el primer ejemplo para accesar PostgreSQL via API,

Poco a poco iremos poniendo ejemplos de para accesar PostgreSQL ya sea
usando el API o via ODBC. Recuerden esto es basado en mi propia experiencia.

Este ejemplo usa la libreria ot4xb de www.xbwin.com, solo hay que bajar
la mas actual.

Espero que disfruten esto:

Osvaldo Ramirez






#include "ot4xb.ch"
#include "libpq4xb.ch"


function main()
* Begin
  local conn := pqSetDbLogin("localhost","5432",NIL,NIL,"database","postgres",NIL)
  local result,query,n,nRows

  if ( PQstatus(conn) != ConnStatusType.Ok )
     ? cPrintf( "Connection to database failed: %s", PQerrorMessage(conn) )
  else
     query := "SELECT cliente_name ) FROM information_schema.tables " +;
              "WHERE table_schema = 'public'"
     result := pqExec(conn,query)
     nRows  := pqntuples( result )
     ? "TABLES: "
     for n := 1 to nRows
        ?? iif( n > 1 , ", " , "")
        ?? pqGetValue(result,n-1,0)
     next
     pqClear(result) ; result := NIL
     PQfinish(conn)
  end
  inkey(0)
return NIL

#include "ot4xb.ch"
#include "libpq4xb.ch"

init proc load_the_libpq_dll()
* Begin
  local e
  if nLoadLibrary("libpq.dll") == 0
     e := Error():New()
     e:severity  := 3
     e:subsystem := "libpq4xb"
     e:description := "Unable to load libpq.dll"
     Eval( ErrorBlock() , e )
  end
return

BEGIN STRUCTURE pgNotify
   MEMBER LPSTR     relname STRZ_READ cRelName
   MEMBER int       be_pid
   MEMBER LPSTR     extra
   MEMBER POINTER32 pNext LINK oNext
END STRUCTURE

BEGIN STRUCTURE pqPrintOpt
   MEMBER BYTEBOOL  header
   MEMBER BYTEBOOL  align
   MEMBER BYTEBOOL  standard
   MEMBER BYTEBOOL  html3
   MEMBER BYTEBOOL  expanded
   MEMBER BYTEBOOL  pager
   GWSTALIGNNEXTMEMBER(8)
   MEMBER LPSTR     fieldSep DYNSZ cFieldSep
   MEMBER LPSTR     tableOpt DYNSZ cTableOpt
   MEMBER LPSTR     caption  DYNSZ cCaption
   MEMBER POINTER32 fieldName
   DYNAMIC METHOD SetFieldNames BLOCK {|s,a| _xfree(s:fieldName), s:fieldName := iif(a == NIL,0,Array2ppMarshall(a)) }
   DYNAMIC METHOD GetFieldNames BLOCK {|s| ppMarshall2Array(s:fieldName) }
END STRUCTURE

BEGIN STRUCTURE pqConnInfoOption
   MEMBER LPSTR keyword   STRZ_READ cKeyword
   MEMBER LPSTR envvar    STRZ_READ cEnvVar
   MEMBER LPSTR compiled  STRZ_READ cCompiled
   MEMBER LPSTR val       STRZ_READ cVal
   MEMBER LPSTR label     STRZ_READ cLabel
   MEMBER LPSTR dispchar  STRZ_READ cDispChar
   MEMBER int   dispsize
END STRUCTURE

BEGIN STRUCTURE pqArgBlock_internal_union
   MEMBER POINTER32 ptr  ; GWSTBACK ; MEMBER int  integer
END STRUCTURE
BEGIN STRUCTURE pqArgBlock
   MEMBER int len
   MEMBER int isint ; GWSTBACK ; MEMBER BOOL lIsInt
   MEMBER POINTER32 ptr  ; GWSTBACK
   MEMBER int integer ; GWSTBACK
   MEMBER @ pqArgBlock_internal_union u
END STRUCTURE

function PQsetdb(host,port,opt,tty,dbname) ; return PQsetdbLogin(host,port,opt,tty,dbname, 0 , 0 )

DLL libpq XIMPORT HANDLE     PQconnectStart(LPSTR conninfo)
DLL libpq XIMPORT int        PQconnectPoll(HANDLE conn)
DLL libpq XIMPORT HANDLE     PQconnectdb(LPSTR conninfo)
DLL libpq XIMPORT HANDLE     PQsetdbLogin(LPSTR host,LPSTR port,LPSTR opt,LPSTR tty,LPSTR db,LPSTR login,LPSTR pwd)
DLL libpq XIMPORT void       PQfinish(HANDLE conn)
DLL libpq XIMPORT POINTER32  PQconndefaults()
DLL libpq XIMPORT void       PQconninfoFree(POINTER32 connOptions)
DLL libpq XIMPORT int        PQresetStart(HANDLE conn)
DLL libpq XIMPORT int        PQresetPoll(HANDLE conn)
DLL libpq XIMPORT void       PQreset(HANDLE conn)
DLL libpq XIMPORT HANDLE     PQgetCancel(HANDLE conn)
DLL libpq XIMPORT void       PQfreeCancel(HANDLE cancel)
DLL libpq XIMPORT int        PQcancel(HANDLE cancel, LPSTR errbuf, int errbufsize) ;
                             DEFAULT errbufsize := iif(Valtype(errbuf)=="C",Len(errbuf),0)
DLL libpq XIMPORT int        PQrequestCancel(HANDLE conn)
DLL libpq XIMPORT ZSTRING    PQdb(HANDLE conn)
DLL libpq XIMPORT ZSTRING    PQuser(HANDLE conn)
DLL libpq XIMPORT ZSTRING    PQpass(HANDLE conn)
DLL libpq XIMPORT ZSTRING    PQhost(HANDLE conn)
DLL libpq XIMPORT ZSTRING    PQport(HANDLE conn)
DLL libpq XIMPORT ZSTRING    PQtty(HANDLE conn)
DLL libpq XIMPORT ZSTRING    PQoptions(HANDLE conn)
DLL libpq XIMPORT int        PQstatus(HANDLE conn)
DLL libpq XIMPORT int        PQtransactionStatus(HANDLE conn)
DLL libpq XIMPORT ZSTRING    PQparameterStatus(HANDLE conn,LPSTR paramName)
DLL libpq XIMPORT int        PQprotocolVersion(HANDLE conn)
DLL libpq XIMPORT int        PQserverVersion(HANDLE conn)
DLL libpq XIMPORT ZSTRING    PQerrorMessage(HANDLE conn)
DLL libpq XIMPORT int        PQsocket(HANDLE conn)
DLL libpq XIMPORT int        PQbackendPID(HANDLE conn)
DLL libpq XIMPORT int        PQconnectionNeedsPassword(HANDLE conn)
DLL libpq XIMPORT int        PQconnectionUsedPassword(HANDLE conn)
DLL libpq XIMPORT int        PQclientEncoding(HANDLE conn)
DLL libpq XIMPORT int        PQsetClientEncoding(HANDLE conn,LPSTR encoding)
DLL libpq XIMPORT POINTER32  PQgetssl(HANDLE conn)
DLL libpq XIMPORT void       PQinitSSL(int do_init)
DLL libpq XIMPORT int        PQsetErrorVerbosity(HANDLE conn,int verbosity)
DLL libpq XIMPORT void       PQtrace(HANDLE conn, POINTER32 debug_port)
DLL libpq XIMPORT void       PQuntrace(HANDLE conn)
DLL libpq XIMPORT DWORD      PQsetNoticeReceiver(HANDLE conn,DWORD pProc, POINTER32 pArg)
DLL libpq XIMPORT DWORD      PQsetNoticeProcessor(HANDLE conn, DWORD pProc,POINTER32 pArg)
DLL libpq XIMPORT DWORD      PQregisterThreadLock(DWORD pNewhandler)
DLL libpq XIMPORT HANDLE     PQexec(HANDLE conn, LPSTR cQuery)
DLL libpq XIMPORT HANDLE     PQexecParams(HANDLE conn,LPSTR command, int nParams, LPLONG paramTypes,;
                                          POINTER32 pValues, LPLONG pLen, LPLONG pFormats,int resultFormat)
DLL libpq XIMPORT  HANDLE    PQprepare(HANDLE conn, LPSTR cStmtName,LPSTR query, int nParams,LPLONG paramTypes)
DLL libpq XIMPORT  HANDLE    PQexecPrepared(HANDLE conn,LPSTR cStmtName,int nParams, POINTER32 pValues,;
                                            LPLONG pLen, LPLONG pFormats,int resultFormat)
DLL libpq XIMPORT  int       PQsendQuery(HANDLE conn, LPSTR query)
DLL libpq XIMPORT  int       PQsendQueryParams( HANDLE conn,LPSTR command, int nParams,LPLONG paramTypes,;
                                                POINTER32 pValues, LPLONG pLen, LPLONG pFormats,int resultFormat)
DLL libpq XIMPORT  int       PQsendPrepare(HANDLE conn, LPSTR pStmtName, LPSTR query, int nParams,LPLONG paramTypes)
DLL libpq XIMPORT  int       PQsendQueryPrepared(HANDLE conn,LPSTR stmtName,int nParams, POINTER32 pValues,;
                                                 LPLONG pLen, LPLONG pFormats, int resultFormat)
DLL libpq XIMPORT  HANDLE    PQgetResult(HANDLE conn)
DLL libpq XIMPORT  int       PQisBusy(HANDLE conn)
DLL libpq XIMPORT  int       PQconsumeInput(HANDLE conn)
DLL libpq XIMPORT  POINTER32 PQnotifies(HANDLE conn)
DLL libpq XIMPORT  int       PQputCopyData(HANDLE conn,LPSTR buffer, int nBytes) ;
                             DEFAULT nBytes := iif(Valtype(buffer)=="C",Len(buffer),0)
DLL libpq XIMPORT  int       PQputCopyEnd(HANDLE conn,LPSTR errormsg)
DLL libpq XIMPORT  int       PQgetCopyData(HANDLE conn,POINTER32 ppBuffer, BOOL async)
DLL libpq XIMPORT  int       PQsetnonblocking(HANDLE conn, int arg)
DLL libpq XIMPORT  BOOL      PQisnonblocking(HANDLE conn)
DLL libpq XIMPORT  BOOL      PQisthreadsafe()
DLL libpq XIMPORT  BOOL      PQflush(HANDLE conn)
DLL libpq XIMPORT  int       PQresultStatus(HANDLE result)
DLL libpq XIMPORT  ZSTRING   PQresStatus(int status)
DLL libpq XIMPORT  ZSTRING   PQresultErrorMessage(HANDLE result )
DLL libpq XIMPORT  ZSTRING   PQresultErrorField(HANDLE result, int fieldcode)
DLL libpq XIMPORT  int       PQntuples(HANDLE result)
DLL libpq XIMPORT  int       PQnfields(HANDLE result)
DLL libpq XIMPORT  int       PQbinaryTuples(HANDLE result)
DLL libpq XIMPORT  ZSTRING   PQfname(HANDLE result,int field_num)
DLL libpq XIMPORT  int       PQfnumber(HANDLE result, LPSTR field_name)
DLL libpq XIMPORT  int       PQftable(HANDLE result, int field_num)
DLL libpq XIMPORT  int       PQftablecol(HANDLE result, int field_num)
DLL libpq XIMPORT  int       PQfformat(HANDLE result, int field_num)
DLL libpq XIMPORT  int       PQftype(HANDLE result, int field_num)
DLL libpq XIMPORT  int       PQfsize(HANDLE result, int field_num)
DLL libpq XIMPORT  int       PQfmod(HANDLE result, int field_num)
DLL libpq XIMPORT  ZSTRING   PQcmdStatus(HANDLE result)
DLL libpq XIMPORT  INT       PQoidValue(HANDLE result)
DLL libpq XIMPORT  ZSTRING   PQcmdTuples(HANDLE result)
DLL libpq XIMPORT  ZSTRING   PQgetvalue(HANDLE result, int tup_num, int field_num)
DLL libpq XIMPORT  int       PQgetlength(HANDLE result, int tup_num, int field_num)
DLL libpq XIMPORT  int       PQgetisnull(HANDLE result, int tup_num, int field_num)
DLL libpq XIMPORT  int       PQnparams(HANDLE result)
DLL libpq XIMPORT  int       PQparamtype(HANDLE result, int param_num)
DLL libpq XIMPORT  HANDLE    PQdescribePrepared(HANDLE conn, LPSTR stmt)
DLL libpq XIMPORT  HANDLE    PQdescribePortal(HANDLE conn,LPSTR portal)
DLL libpq XIMPORT  int       PQsendDescribePrepared(HANDLE conn,LPSTR stmt)
DLL libpq XIMPORT  int       PQsendDescribePortal(HANDLE conn,LPSTR portal)
DLL libpq XIMPORT  void      PQclear(HANDLE pgResult)
DLL libpq XIMPORT  void      PQfreemem(POINTER32 ptr)
DLL libpq XIMPORT  void      PQfreeNotify(POINTER32 ptr) SYMBOL PQfreemem
DLL libpq XIMPORT  HANDLE    PQmakeEmptyPGresult(HANDLE conn, int status)
DLL libpq XIMPORT  int       PQescapeStringConn(HANDLE conn, LPSTR pTo,LPSTR pFrom,int nLen,LPLONG pError)

DLL libpq XIMPORT  LPBYTE    PQescapeByteaConn(HANDLE conn,LPSTR pFrom, DWORD cbFrom,LPDWORD cbResult)

function cPqEscapeByteA(conn,cFrom)
* Begin
  local cbResult := 0
  local pStr     := 0
  local cStr
  if ( Valtype( cFrom ) $ "CM" )
     pStr := PQescapeByteaConn(conn,cFrom,Len(cFrom),@cbResult)
     if( pStr != 0 )
        cStr := PeekStr(pStr,0,cbResult) ; PQfreemem( pStr )
        return cStr
     end
  end
return NIL

DLL libpq XIMPORT  LPBYTE    PQunescapeBytea(LPSTR pText, LPDWORD cbResult)

function cPqUnescapeByteA(cText)
* Begin
  local cbResult := 0
  local pStr     := 0
  local cStr
  if ( Valtype( cText ) $ "CM" )
     pStr := PQunescapeBytea(cText,@cbResult)
     if( pStr != 0 )
        cStr := PeekStr(pStr,0,cbResult) ; PQfreemem( pStr )
        return cStr
     end
  end
return NIL

DLL libpq XIMPORT  int       lo_open(HANDLE conn, int nObjOid, int mode)
DLL libpq XIMPORT  int       lo_close(HANDLE conn, int fd)
DLL libpq XIMPORT  int       lo_read(HANDLE conn, int fd, LPSTR buf, DWORD nLen)
DLL libpq XIMPORT  int       lo_write(HANDLE conn, int fd,LPSTR buf, DWORD nLen)
DLL libpq XIMPORT  int       lo_lseek(HANDLE conn, int fd, int offset, int whence)
DLL libpq XIMPORT  int       lo_creat(HANDLE conn, int mode)
DLL libpq XIMPORT  int       lo_create(HANDLE conn,int nObjOid)
DLL libpq XIMPORT  int       lo_tell(HANDLE conn, int fd)
DLL libpq XIMPORT  int       lo_truncate(HANDLE conn, int fd,DWORD len)
DLL libpq XIMPORT  int       lo_unlink(HANDLE conn, int nObjOid)
DLL libpq XIMPORT  int       lo_import(HANDLE conn, LPSTR filename)
DLL libpq XIMPORT  int       lo_export(HANDLE conn,int nObjOid, LPSTR filename)
DLL libpq XIMPORT  int       PQmblen(LPSTR s, int encoding)
DLL libpq XIMPORT  int       PQdsplen(LPSTR s, int encoding)
DLL libpq XIMPORT  int       PQenv2encoding()

DLL libpq XIMPORT  LPSTR     PQencryptPassword(LPSTR passwd,LPSTR user)
function cPQencryptPassword(cPwd,cUser)
* Begin
  local pStr := PQencryptPassword(cPwd,cUser)
  local cStr
  if ( pStr != 0 )
     cStr := PeekStr(pStr,0,-1); PQfreemem( pStr )
     return cStr
  end
return NIL

DLL libpq XIMPORT  int       pg_char_to_encoding(LPSTR name)
DLL libpq XIMPORT  ZSTRING   pg_encoding_to_char(int encoding)
DLL libpq XIMPORT  int       pg_valid_server_encoding_id(int encoding)

//-------------------------------------------------------------------------------------------------------------------------
// Deprecated routines for copy in/out
// DLL libpq XIMPORT  int PQgetline(HANDLE conn,LPSTR string, int len)
// DLL libpq XIMPORT  int PQputline(HANDLE conn,LPSTR string)
// DLL libpq XIMPORT  int PQgetlineAsync(HANDLE conn,LPSTR buffer, int bufsize);
// DEFAULT bufsize := iif(Valtype(buffer)=="C",Len(buffer),0)
// DLL libpq XIMPORT  int PQputnbytes(HANDLE conn,LPSTR buffer, int nbytes)
// DEFAULT nbytes := iif(Valtype(buffer)=="C",Len(buffer),0)
// DLL libpq XIMPORT  int PQendcopy(HANDLE conn)
//-------------------------------------------------------------------------------------------------------------------------
// "Fast path" interface --- not really recommended for application use
// DLL libpq XIMPORT  PGresult *PQfn( HANDLE conn,int fnid, LPLONG result_buf, LPLONG result_len,;
//                                    BOOL result_is_int, POINTER32 args, int nargs)
//-------------------------------------------------------------------------------------------------------------------------
// PQoidStatus is deprecated in favor of PQoidValue. It is not thread-safe.
// DLL libpq XIMPORT  ZSTRING   PQoidStatus(HANDLE result) // NOT THREAD SAFE
//-------------------------------------------------------------------------------------------------------------------------
// These forms are deprecated
// DLL libpq XIMPORT  DWORD     PQescapeString(LPSTR pTo,LPSTR pFrom, int nLen)
// DLL libpq XIMPORT  LPBYTE    PQescapeBytea(LPSTR pFrom, DWORD cbFrom,LPDWORD pcbTo)
//-------------------------------------------------------------------------------------------------------------------------
// The contents of FILE structure vary on single/multi thread and debug on/off compilation
// DLL libpq XIMPORT  void      PQprint(POINTER32 pFILE_out,HANDLE result,POINTER32 ps)
//  really old printing routines
// DLL libpq XIMPORT  void      PQdisplayTuples(HANDLE result,POINTER32 pFILE,BOOL nFillAlign,;
//                                              LPSTR cFieldSep, BOOL bPrintHeader,BOOL bQuiet)
// DLL libpq XIMPORT  void      PQprintTuples(HANDLE result,POINTER32 pFILE, BOOL bPrintAttName,;
//                                            int terseOutput, int width)
//-------------------------------------------------------------------------------------------------------------------------


Donate funds to the ot4xb project.