2001 hat Phil Ide die Idee PostgreSQL 7.3.1 libpq.DLL (PostgreSQL Access Library) API "direkt", statt ODBC, mit Xbase++ zu nutzten.
die Version von 2004 findet man bei Pablo Botella http://www.xbwin.com -> Newsgroup -> xfree.idep.resources -> 17.11.2008 -> XbPgSql
die ursprünglichen Version hat Pablo, mittels ot4xb, für PostgreSQL 8.3 weiter entwickelt.
http://www.xbwin.com -> Newsgroup -> xfree.resources -> 12.06.2008 -> libpq4xb
libpq4xb.prg ist nur der "Wrapper" welcher die libpq.DLL API Aufrufe bereit stellt. es ersetzt nur die
Code: Alles auswählen
DLLFUNCTION PQ*** USING STDCALL FROM libpq.dll
die API Calls sind primär für die "Connection" verantwortlich welche sich von der API nicht(?) geändert hat. eine 32bit libpq.dll Version 7 funktioniert genau so die V8.x oder v9.x
p.s. es gehören zu libpq.dll auch noch folgende 32bit DLLs welche man in das Xbase++ EXE Verzeichnis kopiert werden sollte.
Code: Alles auswählen
libpq.dll
libeay32.dll
libiconv.dll
libintl.dll
libxml2.dll
libxslt.dll
ssleay32.dll
seine Version als FinalPg.RAR veröffentlicht.
p.s. Frage von Hectors Version bitte direkt an Hector senden
---
für die Datenbank / Table Aktionen ist eine SQL-Query notwendig wie die CLASS PGSql von Phil Ide einsetzt.
zur "Auswertung" einer Antwort vom PostgreSQL Server hat Phil eine CLASS PGResult ( in PGSql.PRG ) entworfen.
die CLASS PGResult enthält Methoden zum "navigieren" in den "Tuples" von einem "ResultSet" wie man es z.b. für ein Browse ( myPGSQLBrowse.prg ) benötigt.
die CLASS PGResult wird von der CLASS PGSql "genutzt" und beide nutzen die API "Wrapper" Function (Phil oder Pablo)
sowohl Edgar, Hector und meine Version nutzen den API Wrapper von Pablo und die beiden Classen von Phil.
der Unterschied liegt nun den Browse Class Versionen wobei ich mich auf > 100000 "Tuples" konzentriert habe.
! Note : ein SELECT für eine SQL-Query ohne LIMIT kann zu (unerwünscht) grossen ResultSet führen was ein "navigieren"
in den "Tuples" sehr langsam machen kann wenn man z.b. die Method
Code: Alles auswählen
oResult:GoBottom()
auch führt ein hoher OFFSET in einer SQL-Query, bei einer grossen Table, zu einer deutlichen verlangsamung ...
wer Xbase++ v2.x mit PostgreSQL einsetzt sollte es mal mit einer grossen Table ausprobieren wie lange es dauert die zu öffnen
als Gegenprobe mit pgAdmin3.EXE -> Table auswählen -> Button in der Toolbar zum Anzeigen ( ohne LIMIT ).
dann "GoBottom" ( Strg-PgDn ) wie lange bis er die grosse Table aufbaut.
---
gegenüber DBF Dateien wird man feststellen das ein "GoBottom" zum "navigieren" bei grossen SQL-Table sehr langsam werden kann.
in der PostgreSQL v9.x Version habe ich nun die Function row_number() entdeckt welches ein "navigieren" mittels MOVE und OFFSET erheblich beschleunigen.
Code: Alles auswählen
cVar1 := "BEGIN WORK;"
IF SP_nVersion() < 9 // PostgreSQL Version
cVar2 := "DECLARE MyCursor CURSOR FOR SELECT " + cField +;
" FROM " + cTable + ;
IF( EMPTY( cWhere ), "", " WHERE " + cWhere ) + ;
" ORDER BY " + cOrder
ELSE
cVar2 := "DECLARE MyCursor CURSOR FOR SELECT " + cField +;
", row_number() OVER (ORDER BY " + cOrder + ")"+;
" FROM " + cTable + ;
IF( EMPTY( cWhere ), "", " WHERE " + cWhere ) + ;
" ORDER BY " + cOrder
ENDIF
cVar3 := "MOVE FORWARD " + cOffset + " IN MyCursor"
cVar4 := "FETCH FORWARD " + cLimit + " FROM MyCursor"
cVar5 := "CLOSE MyCursor;"
cVar6 := "COMMIT WORK;"
p.s.
wie ich feststellen durfte scheint Alaska in der aktuellen Xbase++ v2.x bei der ISAM Emulation der vertikale Scrollbar in einem XbpBrowse() nicht funktioniert.
es funktioniert aber jetzt in der aktuellen Version wenn man "native" einen SQL-String direkt abschickt ... Alaska hat also dazugelernt
---
ich habe das ganze nun in PGU.EXE eingebaut was so etwas wie DBU darstellen soll ( MODI STRUCT )
in PGU.EXE nutzen ich ein "native" Listview (DXE.LIB) statt eines TBrowse oder Xbpbrowse.
es wird dabei eine MultiCellgroup (Bestandteil von XbpBrowse) mit Listview "simuliert" wobei XbpBrowse ja kein Windows Control ist
ebenfalls ist eine incrementelle Suche, auf den aktiven "Index", möglich. ein klick auf den "Header" ändert "on-fly" die Order ( Sortierung )
PGU.EXE hat eine DBF Import Schnittstelle, welche auch die ISAM Trigger von pgDBE unterstützt, jedoch werden keine zusätzlichen "__Index" Columne angelegt !!!
( was IMHO einfach Quatsch ist weil man einen IndexKey() Ausdruck auch "on-Fly" in ein SQL-String einbauen kann ... )
PGU.EXE kann auch Memo Type "C"*** sowie "V" für XbpBitmap() in Memo gespeichert ( mit FIELD->Bitmap := oBitmap:setBuffer() )
***ich "hörte" das eine Memo Type "C" nun ein anderes Format für FTS ( Fast Text Search ) verwendet was PGU.EXE z.Z. nicht unterstützt )
ich habe für die "Begrenzung" einen "Assisten" eingebaut um einen SQL-String zu erzeugen. er war mal für DBF gedacht ...
PGU.EXE findet man hier http://www.xbaseforum.de/viewtopic.php?f=16&t=6322