瀏覽代碼

* Patch from Ludo Brands to fix 24497

git-svn-id: trunk@24629 -
michael 12 年之前
父節點
當前提交
7951c24a85
共有 2 個文件被更改,包括 189 次插入159 次删除
  1. 42 27
      packages/postgres/src/dllistdyn.pp
  2. 147 132
      packages/postgres/src/postgres3dyn.pp

+ 42 - 27
packages/postgres/src/dllistdyn.pp

@@ -38,6 +38,7 @@ Procedure InitialiseDllist(libpath:string);
 Procedure ReleaseDllist;
 
 var DllistLibraryHandle : TLibHandle;
+var libpgCriticalSection: TRTLCriticalSection;
 
 implementation
 
@@ -46,40 +47,50 @@ var RefCount : integer;
 Procedure InitialiseDllist(libpath:string);
 
 begin
-  inc(RefCount);
-  if RefCount = 1 then
-    begin
-    DllistLibraryHandle := loadlibrary(libpath);
-    if DllistLibraryHandle = nilhandle then
+  EnterCriticalsection(libpgCriticalSection);
+  try
+    inc(RefCount);
+    if RefCount = 1 then
       begin
-      RefCount := 0;
-      Raise EInOutError.Create('Can not load PosgreSQL client. Is it installed? ('+libpath+')');
+      DllistLibraryHandle := loadlibrary(libpath);
+      if DllistLibraryHandle = nilhandle then
+        begin
+        RefCount := 0;
+        Raise EInOutError.Create('Can not load PosgreSQL client. Is it installed? ('+libpath+')');
+        end;
+
+      pointer(DLNewList) := GetProcedureAddress(DllistLibraryHandle,'DLNewList');
+      pointer(DLFreeList) := GetProcedureAddress(DllistLibraryHandle,'DLFreeList');
+      pointer( DLNewElem) := GetProcedureAddress(DllistLibraryHandle,' DLNewElem');
+      pointer(DLFreeElem) := GetProcedureAddress(DllistLibraryHandle,'DLFreeElem');
+      pointer( DLGetHead) := GetProcedureAddress(DllistLibraryHandle,' DLGetHead');
+      pointer( DLGetTail) := GetProcedureAddress(DllistLibraryHandle,' DLGetTail');
+      pointer( DLRemTail) := GetProcedureAddress(DllistLibraryHandle,' DLRemTail');
+      pointer( DLGetPred) := GetProcedureAddress(DllistLibraryHandle,' DLGetPred');
+      pointer( DLGetSucc) := GetProcedureAddress(DllistLibraryHandle,' DLGetSucc');
+      pointer(DLRemove) := GetProcedureAddress(DllistLibraryHandle,'DLRemove');
+      pointer(DLAddHead) := GetProcedureAddress(DllistLibraryHandle,'DLAddHead');
+      pointer(DLAddTail) := GetProcedureAddress(DllistLibraryHandle,'DLAddTail');
+      pointer( DLRemHead) := GetProcedureAddress(DllistLibraryHandle,' DLRemHead');
       end;
-
-    pointer(DLNewList) := GetProcedureAddress(DllistLibraryHandle,'DLNewList');
-    pointer(DLFreeList) := GetProcedureAddress(DllistLibraryHandle,'DLFreeList');
-    pointer( DLNewElem) := GetProcedureAddress(DllistLibraryHandle,' DLNewElem');
-    pointer(DLFreeElem) := GetProcedureAddress(DllistLibraryHandle,'DLFreeElem');
-    pointer( DLGetHead) := GetProcedureAddress(DllistLibraryHandle,' DLGetHead');
-    pointer( DLGetTail) := GetProcedureAddress(DllistLibraryHandle,' DLGetTail');
-    pointer( DLRemTail) := GetProcedureAddress(DllistLibraryHandle,' DLRemTail');
-    pointer( DLGetPred) := GetProcedureAddress(DllistLibraryHandle,' DLGetPred');
-    pointer( DLGetSucc) := GetProcedureAddress(DllistLibraryHandle,' DLGetSucc');
-    pointer(DLRemove) := GetProcedureAddress(DllistLibraryHandle,'DLRemove');
-    pointer(DLAddHead) := GetProcedureAddress(DllistLibraryHandle,'DLAddHead');
-    pointer(DLAddTail) := GetProcedureAddress(DllistLibraryHandle,'DLAddTail');
-    pointer( DLRemHead) := GetProcedureAddress(DllistLibraryHandle,' DLRemHead');
-    end;
+  finally
+    LeaveCriticalsection(libpgCriticalSection);
+  end;
 end;
 
 Procedure ReleaseDllist;
 
 begin
-  if RefCount > 0 then dec(RefCount);
-  if RefCount = 0 then
-    begin
-    if not UnloadLibrary(DllistLibraryHandle) then inc(RefCount);
-    end;
+  EnterCriticalsection(libpgCriticalSection);
+  try
+    if RefCount > 0 then dec(RefCount);
+    if RefCount = 0 then
+      begin
+      if not UnloadLibrary(DllistLibraryHandle) then inc(RefCount);
+      end;
+  finally
+    LeaveCriticalsection(libpgCriticalSection);
+  end;
 end;
 
 // This function is also defined in Dllist!
@@ -89,4 +100,8 @@ begin
 end;
 
 
+initialization
+  InitCriticalSection(libpgCriticalSection);
+finalization
+  DoneCriticalsection(libpgCriticalSection);
 end.

+ 147 - 132
packages/postgres/src/postgres3dyn.pp

@@ -239,152 +239,167 @@ var
 procedure InitialisePostgres3;
 
 begin
-  if (RefCount<>0) then
-      // pretend to load whatever is already loaded, so we do not get a library name conflict.
-    inc(Refcount)
-  else
-    InitialisePostgres3(pqlib)
+  EnterCriticalsection(libpgCriticalSection);
+  try
+    if (RefCount<>0) then
+        // pretend to load whatever is already loaded, so we do not get a library name conflict.
+      inc(Refcount)
+    else
+      InitialisePostgres3(pqlib)
+  finally
+    LeaveCriticalsection(libpgCriticalSection);
+  end;
 end;
 
 
 function InitialisePostgres3(Const libpath : ansistring) : Integer;
 
 begin
-  inc(RefCount);
-  Result:=Refcount;
-  if RefCount = 1 then
-    begin
-    Postgres3LibraryHandle := loadlibrary(libpath);
-    if Postgres3LibraryHandle = nilhandle then
+  EnterCriticalsection(libpgCriticalSection);
+  try
+    inc(RefCount);
+    Result:=Refcount;
+    if RefCount = 1 then
       begin
-      RefCount := 0;
-      Raise EInOutError.CreateFmt(SErrLoadFailed,[libpath]);
-      end;
+      Postgres3LibraryHandle := loadlibrary(libpath);
+      if Postgres3LibraryHandle = nilhandle then
+        begin
+        RefCount := 0;
+        Raise EInOutError.CreateFmt(SErrLoadFailed,[libpath]);
+        end;
 
-    Postgres3LoadedLibrary:=libpath;
-    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(PQserverVersion) := GetProcedureAddress(Postgres3LibraryHandle,'PQserverVersion');
-    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(PQdescribePrepared) := GetProcedureAddress(Postgres3LibraryHandle,'PQdescribePrepared');
-    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');
+      Postgres3LoadedLibrary:=libpath;
+      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(PQserverVersion) := GetProcedureAddress(Postgres3LibraryHandle,'PQserverVersion');
+      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(PQdescribePrepared) := GetProcedureAddress(Postgres3LibraryHandle,'PQdescribePrepared');
+      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(libpath);
-    end
-  else
-    if (libpath<>pqlib) and (Postgres3LoadedLibrary<>libpath) then
-      begin
-      Dec(RefCount);
-      Raise EInOUtError.CreateFmt(SErrAlreadyLoaded,[Postgres3LoadedLibrary]);
-      end;
+      InitialiseDllist(libpath);
+      end
+    else
+      if (libpath<>pqlib) and (Postgres3LoadedLibrary<>libpath) then
+        begin
+        Dec(RefCount);
+        Raise EInOUtError.CreateFmt(SErrAlreadyLoaded,[Postgres3LoadedLibrary]);
+        end;
+  finally
+    LeaveCriticalsection(libpgCriticalSection);
+  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;
+  EnterCriticalsection(libpgCriticalSection);
+  try
+    if RefCount > 0 then dec(RefCount);
+    if RefCount = 0 then
+      begin
+      if not UnloadLibrary(Postgres3LibraryHandle) then inc(RefCount);
+      ReleaseDllist;
+      end;
+  finally
+    LeaveCriticalsection(libpgCriticalSection);
+  end;
 end;
 
 // This function is also defined in postgres3!