| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 | {  Contains the Postgres protocol 3 functions calls  Call InitialisePostgres3 before using any of the calls, and call ReleasePostgres3  when finished.}unit postgres3dyn;{$mode objfpc}{$H+}interfaceuses  dynlibs, SysUtils, dllistdyn;{$IFDEF Unix}  const    pqlib = 'libpq.so';{$ENDIF}{$IFDEF Win32}  const    pqlib = 'libpq.dll';{$ENDIF}{$PACKRECORDS C}{$i postgres3types.inc}var{ ----------------* Exported functions of libpq* ----------------}{ ===   in fe-connect.c ===  }{ make a new client connection to the backend  }{ Asynchronous (non-blocking)  }(* Const before type ignored *)  PQconnectStart : function (conninfo:Pchar):PPGconn;cdecl;  PQconnectPoll : function (conn:PPGconn):PostgresPollingStatusType;cdecl;{ Synchronous (blocking)  }(* Const before type ignored *)  PQconnectdb : function (conninfo:Pchar):PPGconn;cdecl;  PQsetdbLogin : function (pghost:Pchar; pgport:Pchar; pgoptions:Pchar; pgtty:Pchar; dbName:Pchar;login:Pchar; pwd:Pchar):PPGconn;cdecl;{ was #define dname(params) para_def_expr }{ argument types are unknown }{ return type might be wrong }{ close the current connection and free the PGconn data structure  }  PQfinish : procedure (conn:PPGconn);cdecl;{ get info about connection options known to PQconnectdb  }  PQconndefaults : function : PPQconninfoOption;cdecl;{ free the data structure returned by PQconndefaults()  }  PQconninfoFree : procedure (connOptions:PPQconninfoOption);cdecl;{* close the current connection and restablish a new one with the same* parameters}{ Asynchronous (non-blocking)  }  PQresetStart : function (conn:PPGconn):longint;cdecl;  PQresetPoll : function (conn:PPGconn):PostgresPollingStatusType;cdecl;{ Synchronous (blocking)  }  PQreset : procedure (conn:PPGconn);cdecl;{ issue a cancel request  }  PQrequestCancel : function (conn:PPGconn):longint;cdecl;{ Accessor functions for PGconn objects  }  PQdb : function (conn:PPGconn):Pchar;cdecl;  PQuser : function (conn:PPGconn):Pchar;cdecl;  PQpass : function (conn:PPGconn):Pchar;cdecl;  PQhost : function (conn:PPGconn):Pchar;cdecl;  PQport : function (conn:PPGconn):Pchar;cdecl;  PQtty : function (conn:PPGconn):Pchar;cdecl;  PQoptions : function (conn:PPGconn):Pchar;cdecl;  PQstatus : function (conn:PPGconn):TConnStatusType;cdecl;  PQtransactionStatus : function (conn:PPGconn):PGTransactionStatusType;cdecl;  PQparameterStatus : function (conn:PPGconn; paramName:Pchar):Pchar;cdecl;  PQprotocolVersion : function (conn:PPGconn):longint;cdecl;  PQerrorMessage : function (conn:PPGconn):Pchar;cdecl;  PQsocket : function (conn:PPGconn):longint;cdecl;  PQbackendPID : function (conn:PPGconn):longint;cdecl;  PQclientEncoding : function (conn:PPGconn):longint;cdecl;  PQsetClientEncoding : function (conn:PPGconn; encoding:Pchar):longint;cdecl;{$ifdef USE_SSL}{ Get the SSL structure associated with a connection  }  PQgetssl : function (conn:PPGconn):PSSL;cdecl;{$endif}{ Set verbosity for PQerrorMessage and PQresultErrorMessage  }  PQsetErrorVerbosity : function (conn:PPGconn; verbosity:PGVerbosity):PGVerbosity;cdecl;{ Enable/disable tracing  }  PQtrace : procedure (conn:PPGconn; debug_port:PFILE);cdecl;  PQuntrace : procedure (conn:PPGconn);cdecl;{ Override default notice handling routines  }  PQsetNoticeReceiver : function (conn:PPGconn; proc:PQnoticeReceiver; arg:pointer):PQnoticeReceiver;cdecl;  PQsetNoticeProcessor : function (conn:PPGconn; proc:PQnoticeProcessor; arg:pointer):PQnoticeProcessor;cdecl;{ === in fe-exec.c ===  }{ Simple synchronous query  }  PQexec : function (conn:PPGconn; query:Pchar):PPGresult;cdecl;  PQexecParams : function (conn:PPGconn; command:Pchar; nParams:longint; paramTypes:POid; paramValues:PPchar;paramLengths:Plongint; paramFormats:Plongint; resultFormat:longint):PPGresult;cdecl;  PQexecPrepared : function (conn:PPGconn; stmtName:Pchar; nParams:longint; paramValues:PPchar; paramLengths:Plongint;paramFormats:Plongint; resultFormat:longint):PPGresult;cdecl;  PQPrepare : function (conn:PPGconn; stmtName:Pchar; query:Pchar; nParams:longint; paramTypes:POid):PPGresult;cdecl;{ Interface for multiple-result or asynchronous queries  }  PQsendQuery : function (conn:PPGconn; query:Pchar):longint;cdecl;  PQsendQueryParams : function (conn:PPGconn; command:Pchar; nParams:longint; paramTypes:POid; paramValues:PPchar;paramLengths:Plongint; paramFormats:Plongint; resultFormat:longint):longint;cdecl;  PQsendQueryPrepared : function (conn:PPGconn; stmtName:Pchar; nParams:longint; paramValues:PPchar; paramLengths:Plongint;paramFormats:Plongint; resultFormat:longint):longint;cdecl;  PQgetResult : function (conn:PPGconn):PPGresult;cdecl;{ Routines for managing an asynchronous query  }  PQisBusy : function (conn:PPGconn):longint;cdecl;  PQconsumeInput : function (conn:PPGconn):longint;cdecl;{ LISTEN/NOTIFY support  }  PQnotifies : function (conn:PPGconn):PPGnotify;cdecl;{ Routines for copy in/out  }  PQputCopyData : function (conn:PPGconn; buffer:Pchar; nbytes:longint):longint;cdecl;  PQputCopyEnd : function (conn:PPGconn; errormsg:Pchar):longint;cdecl;  PQgetCopyData : function (conn:PPGconn; buffer:PPchar; async:longint):longint;cdecl;{ Deprecated routines for copy in/out  }  PQgetline : function (conn:PPGconn; _string:Pchar; length:longint):longint;cdecl;  PQputline : function (conn:PPGconn; _string:Pchar):longint;cdecl;  PQgetlineAsync : function (conn:PPGconn; buffer:Pchar; bufsize:longint):longint;cdecl;  PQputnbytes : function (conn:PPGconn; buffer:Pchar; nbytes:longint):longint;cdecl;  PQendcopy : function (conn:PPGconn):longint;cdecl;{ Set blocking/nonblocking connection to the backend  }  PQsetnonblocking : function (conn:PPGconn; arg:longint):longint;cdecl;  PQisnonblocking : function (conn:PPGconn):longint;cdecl;{ Force the write buffer to be written (or at least try)  }  PQflush : function (conn:PPGconn):longint;cdecl;{* "Fast path" interface --- not really recommended for application* use}  PQfn : function (conn:PPGconn; fnid:longint; result_buf:Plongint; result_len:Plongint; result_is_int:longint;args:PPQArgBlock; nargs:longint):PPGresult;cdecl;{ Accessor functions for PGresult objects  }  PQresultStatus : function (res:PPGresult):TExecStatusType;cdecl;  PQresStatus : function (status:TExecStatusType):Pchar;cdecl;  PQresultErrorMessage : function (res:PPGresult):Pchar;cdecl;  PQresultErrorField : function (res:PPGresult; fieldcode:longint):Pchar;cdecl;  PQntuples : function (res:PPGresult):longint;cdecl;  PQnfields : function (res:PPGresult):longint;cdecl;  PQbinaryTuples : function (res:PPGresult):longint;cdecl;  PQfname : function (res:PPGresult; field_num:longint):Pchar;cdecl;  PQfnumber : function (res:PPGresult; field_name:Pchar):longint;cdecl;  PQftable : function (res:PPGresult; field_num:longint):Oid;cdecl;  PQftablecol : function (res:PPGresult; field_num:longint):longint;cdecl;  PQfformat : function (res:PPGresult; field_num:longint):longint;cdecl;  PQftype : function (res:PPGresult; field_num:longint):Oid;cdecl;  PQfsize : function (res:PPGresult; field_num:longint):longint;cdecl;  PQfmod : function (res:PPGresult; field_num:longint):longint;cdecl;  PQcmdStatus : function (res:PPGresult):Pchar;cdecl;  PQoidStatus : function (res:PPGresult):Pchar;cdecl;{ old and ugly  }  PQoidValue : function (res:PPGresult):Oid;cdecl;{ new and improved  }  PQcmdTuples : function (res:PPGresult):Pchar;cdecl;  PQgetvalue : function (res:PPGresult; tup_num:longint; field_num:longint):Pchar;cdecl;  PQgetlength : function (res:PPGresult; tup_num:longint; field_num:longint):longint;cdecl;  PQgetisnull : function (res:PPGresult; tup_num:longint; field_num:longint):longint;cdecl;{ Delete a PGresult  }  PQclear : procedure (res:PPGresult);cdecl;{ For freeing other alloc'd results, such as PGnotify structs  }  PQfreemem : procedure (ptr:pointer);cdecl;{ Exists for backward compatibility.  bjm 2003-03-24  }{ was #define dname(params) para_def_expr }{ argument types are unknown }{ return type might be wrong }//  function PQfreeNotify(ptr : longint) : longint;{* 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.}  PQmakeEmptyPGresult : function (conn:PPGconn; status:TExecStatusType):PPGresult;cdecl;{ Quoting strings before inclusion in queries.  }  PQescapeString : function (till:Pchar; from:Pchar; length:size_t):size_t;cdecl;  PQescapeBytea : function (bintext:Pbyte; binlen:size_t; bytealen:Psize_t):Pbyte;cdecl;  PQunescapeBytea : function (strtext:Pbyte; retbuflen:Psize_t):Pbyte;cdecl;{ === in fe-print.c ===  }{ output stream  }  PQprint : procedure (fout:PFILE; res:PPGresult; ps:PPQprintOpt);cdecl;{ option structure  }{* really old printing routines}{ where to send the output  }{ pad the fields with spaces  }{ field separator  }{ display headers?  }  PQdisplayTuples : procedure (res:PPGresult; fp:PFILE; fillAlign:longint; fieldSep:Pchar; printHeader:longint;quiet:longint);cdecl;(* Const before type ignored *){ output stream  }{ print attribute names  }{ delimiter bars  }  PQprintTuples : procedure (res:PPGresult; fout:PFILE; printAttName:longint; terseOutput:longint; width:longint);cdecl;{ width of column, if 0, use variable* width  }{ === in fe-lobj.c ===  }{ Large-object access routines  }  lo_open : function (conn:PPGconn; lobjId:Oid; mode:longint):longint;cdecl;  lo_close : function (conn:PPGconn; fd:longint):longint;cdecl;  lo_read : function (conn:PPGconn; fd:longint; buf:Pchar; len:size_t):longint;cdecl;  lo_write : function (conn:PPGconn; fd:longint; buf:Pchar; len:size_t):longint;cdecl;  lo_lseek : function (conn:PPGconn; fd:longint; offset:longint; whence:longint):longint;cdecl;  lo_creat : function (conn:PPGconn; mode:longint):Oid;cdecl;  lo_tell : function (conn:PPGconn; fd:longint):longint;cdecl;  lo_unlink : function (conn:PPGconn; lobjId:Oid):longint;cdecl;  lo_import : function (conn:PPGconn; filename:Pchar):Oid;cdecl;  lo_export : function (conn:PPGconn; lobjId:Oid; filename:Pchar):longint;cdecl;{ === in fe-misc.c ===  }{ Determine length of multibyte encoded char at *s  }  PQmblen : function (s:Pbyte; encoding:longint):longint;cdecl;{ Get encoding id from environment variable PGCLIENTENCODING  }  PQenv2encoding: function :longint;cdecl;Procedure InitialisePostgres3;Procedure ReleasePostgres3;var Postgres3LibraryHandle : TLibHandle;implementationvar RefCount : integer;Procedure InitialisePostgres3;begin  inc(RefCount);  if RefCount = 1 then    begin    Postgres3LibraryHandle := loadlibrary(pqlib);    if Postgres3LibraryHandle = nilhandle then      begin      RefCount := 0;      Raise EInOutError.Create('Can not load PosgreSQL client. Is it installed? ('+pqlib+')');      end;    pointer(PQconnectStart) := GetProcedureAddress(Postgres3LibraryHandle,'PQconnectStart');    pointer(PQconnectPoll) := GetProcedureAddress(Postgres3LibraryHandle,'PQconnectPoll');    pointer(PQconnectdb) := GetProcedureAddress(Postgres3LibraryHandle,'PQconnectdb');    pointer(PQsetdbLogin) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetdbLogin');    pointer(PQfinish) := GetProcedureAddress(Postgres3LibraryHandle,'PQfinish');    pointer(PQconndefaults) := GetProcedureAddress(Postgres3LibraryHandle,'PQconndefaults');    pointer(PQconninfoFree) := GetProcedureAddress(Postgres3LibraryHandle,'PQconninfoFree');    pointer(PQresetStart) := GetProcedureAddress(Postgres3LibraryHandle,'PQresetStart');    pointer(PQresetPoll) := GetProcedureAddress(Postgres3LibraryHandle,'PQresetPoll');    pointer(PQreset) := GetProcedureAddress(Postgres3LibraryHandle,'PQreset');    pointer(PQrequestCancel) := GetProcedureAddress(Postgres3LibraryHandle,'PQrequestCancel');    pointer(PQdb) := GetProcedureAddress(Postgres3LibraryHandle,'PQdb');    pointer(PQuser) := GetProcedureAddress(Postgres3LibraryHandle,'PQuser');    pointer(PQpass) := GetProcedureAddress(Postgres3LibraryHandle,'PQpass');    pointer(PQhost) := GetProcedureAddress(Postgres3LibraryHandle,'PQhost');    pointer(PQport) := GetProcedureAddress(Postgres3LibraryHandle,'PQport');    pointer(PQtty) := GetProcedureAddress(Postgres3LibraryHandle,'PQtty');    pointer(PQoptions) := GetProcedureAddress(Postgres3LibraryHandle,'PQoptions');    pointer(PQstatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQstatus');    pointer(PQtransactionStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQtransactionStatus');    pointer(PQparameterStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQparameterStatus');    pointer(PQprotocolVersion) := GetProcedureAddress(Postgres3LibraryHandle,'PQprotocolVersion');    pointer(PQerrorMessage) := GetProcedureAddress(Postgres3LibraryHandle,'PQerrorMessage');    pointer(PQsocket) := GetProcedureAddress(Postgres3LibraryHandle,'PQsocket');    pointer(PQbackendPID) := GetProcedureAddress(Postgres3LibraryHandle,'PQbackendPID');    pointer(PQclientEncoding) := GetProcedureAddress(Postgres3LibraryHandle,'PQclientEncoding');    pointer(PQsetClientEncoding) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetClientEncoding');{$ifdef USE_SSL}    pointer(PQgetssl) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetssl');{$endif}    pointer(PQsetErrorVerbosity) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetErrorVerbosity');    pointer(PQtrace) := GetProcedureAddress(Postgres3LibraryHandle,'PQtrace');    pointer(PQuntrace) := GetProcedureAddress(Postgres3LibraryHandle,'PQuntrace');    pointer(PQsetNoticeReceiver) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetNoticeReceiver');    pointer(PQsetNoticeProcessor) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetNoticeProcessor');    pointer(PQexec) := GetProcedureAddress(Postgres3LibraryHandle,'PQexec');    pointer(PQexecParams) := GetProcedureAddress(Postgres3LibraryHandle,'PQexecParams');    pointer(PQexecPrepared) := GetProcedureAddress(Postgres3LibraryHandle,'PQexecPrepared');    pointer(PQPrepare) := GetProcedureAddress(Postgres3LibraryHandle,'PQPrepare');    pointer(PQsendQuery) := GetProcedureAddress(Postgres3LibraryHandle,'PQsendQuery');    pointer(PQsendQueryParams) := GetProcedureAddress(Postgres3LibraryHandle,'PQsendQueryParams');    pointer(PQsendQueryPrepared) := GetProcedureAddress(Postgres3LibraryHandle,'PQsendQueryPrepared');    pointer(PQgetResult) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetResult');    pointer(PQisBusy) := GetProcedureAddress(Postgres3LibraryHandle,'PQisBusy');    pointer(PQconsumeInput) := GetProcedureAddress(Postgres3LibraryHandle,'PQconsumeInput');    pointer(PQnotifies) := GetProcedureAddress(Postgres3LibraryHandle,'PQnotifies');    pointer(PQputCopyData) := GetProcedureAddress(Postgres3LibraryHandle,'PQputCopyData');    pointer(PQputCopyEnd) := GetProcedureAddress(Postgres3LibraryHandle,'PQputCopyEnd');    pointer(PQgetCopyData) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetCopyData');    pointer(PQgetline) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetline');    pointer(PQputline) := GetProcedureAddress(Postgres3LibraryHandle,'PQputline');    pointer(PQgetlineAsync) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetlineAsync');    pointer(PQputnbytes) := GetProcedureAddress(Postgres3LibraryHandle,'PQputnbytes');    pointer(PQendcopy) := GetProcedureAddress(Postgres3LibraryHandle,'PQendcopy');    pointer(PQsetnonblocking) := GetProcedureAddress(Postgres3LibraryHandle,'PQsetnonblocking');    pointer(PQisnonblocking) := GetProcedureAddress(Postgres3LibraryHandle,'PQisnonblocking');    pointer(PQflush) := GetProcedureAddress(Postgres3LibraryHandle,'PQflush');    pointer(PQfn) := GetProcedureAddress(Postgres3LibraryHandle,'PQfn');    pointer(PQresultStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQresultStatus');    pointer(PQresStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQresStatus');    pointer(PQresultErrorMessage) := GetProcedureAddress(Postgres3LibraryHandle,'PQresultErrorMessage');    pointer(PQresultErrorField) := GetProcedureAddress(Postgres3LibraryHandle,'PQresultErrorField');    pointer(PQntuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQntuples');    pointer(PQnfields) := GetProcedureAddress(Postgres3LibraryHandle,'PQnfields');    pointer(PQbinaryTuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQbinaryTuples');    pointer(PQfname) := GetProcedureAddress(Postgres3LibraryHandle,'PQfname');    pointer(PQfnumber) := GetProcedureAddress(Postgres3LibraryHandle,'PQfnumber');    pointer(PQftable) := GetProcedureAddress(Postgres3LibraryHandle,'PQftable');    pointer(PQftablecol) := GetProcedureAddress(Postgres3LibraryHandle,'PQftablecol');    pointer(PQfformat) := GetProcedureAddress(Postgres3LibraryHandle,'PQfformat');    pointer(PQftype) := GetProcedureAddress(Postgres3LibraryHandle,'PQftype');    pointer(PQfsize) := GetProcedureAddress(Postgres3LibraryHandle,'PQfsize');    pointer(PQfmod) := GetProcedureAddress(Postgres3LibraryHandle,'PQfmod');    pointer(PQcmdStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQcmdStatus');    pointer(PQoidStatus) := GetProcedureAddress(Postgres3LibraryHandle,'PQoidStatus');    pointer(PQoidValue) := GetProcedureAddress(Postgres3LibraryHandle,'PQoidValue');    pointer(PQcmdTuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQcmdTuples');    pointer(PQgetvalue) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetvalue');    pointer(PQgetlength) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetlength');    pointer(PQgetisnull) := GetProcedureAddress(Postgres3LibraryHandle,'PQgetisnull');    pointer(PQclear) := GetProcedureAddress(Postgres3LibraryHandle,'PQclear');    pointer(PQfreemem) := GetProcedureAddress(Postgres3LibraryHandle,'PQfreemem');    pointer(PQmakeEmptyPGresult) := GetProcedureAddress(Postgres3LibraryHandle,'PQmakeEmptyPGresult');    pointer(PQescapeString) := GetProcedureAddress(Postgres3LibraryHandle,'PQescapeString');    pointer(PQescapeBytea) := GetProcedureAddress(Postgres3LibraryHandle,'PQescapeBytea');    pointer(PQunescapeBytea) := GetProcedureAddress(Postgres3LibraryHandle,'PQunescapeBytea');    pointer(PQprint) := GetProcedureAddress(Postgres3LibraryHandle,'PQprint');    pointer(PQdisplayTuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQdisplayTuples');    pointer(PQprintTuples) := GetProcedureAddress(Postgres3LibraryHandle,'PQprintTuples');    pointer(lo_open) := GetProcedureAddress(Postgres3LibraryHandle,'lo_open');    pointer(lo_close) := GetProcedureAddress(Postgres3LibraryHandle,'lo_close');    pointer(lo_read) := GetProcedureAddress(Postgres3LibraryHandle,'lo_read');    pointer(lo_write) := GetProcedureAddress(Postgres3LibraryHandle,'lo_write');    pointer(lo_lseek) := GetProcedureAddress(Postgres3LibraryHandle,'lo_lseek');    pointer(lo_creat) := GetProcedureAddress(Postgres3LibraryHandle,'lo_creat');    pointer(lo_tell) := GetProcedureAddress(Postgres3LibraryHandle,'lo_tell');    pointer(lo_unlink) := GetProcedureAddress(Postgres3LibraryHandle,'lo_unlink');    pointer(lo_import) := GetProcedureAddress(Postgres3LibraryHandle,'lo_import');    pointer(lo_export) := GetProcedureAddress(Postgres3LibraryHandle,'lo_export');    pointer(PQmblen) := GetProcedureAddress(Postgres3LibraryHandle,'PQmblen');    pointer(PQenv2encoding) := GetProcedureAddress(Postgres3LibraryHandle,'PQenv2encoding');    InitialiseDllist;    end;end;Procedure ReleasePostgres3;begin  if RefCount > 0 then dec(RefCount);  if RefCount = 0 then    begin    if not UnloadLibrary(Postgres3LibraryHandle) then inc(RefCount);    ReleaseDllist;    end;end;// This function is also defined in postgres3!function PQsetdb(M_PGHOST,M_PGPORT,M_PGOPT,M_PGTTY,M_DBNAME : pchar) : ppgconn;begin   PQsetdb:=PQsetdbLogin(M_PGHOST,M_PGPORT,M_PGOPT,M_PGTTY,M_DBNAME,'','');end;end.
 |