Seite 1 von 2

PB4.60RC1 Probleme mit SQlite Wrapper

Verfasst: 13.09.2011 07:08
von dige
Verwendet jemand einen eigenen Wrapper für SQlite und läuft dieser
noch mit der obigen Version?

Folgender Code funktionierte bis PB4.60B3

Code: Alles auswählen

Global sqlite3_open.l
Global sqlite3_libversion.l

#SQLITE3_OK          =   0   ; Successful Result
#SQLITE3_ERROR       =   1   ; SQL error Or missing database

Procedure.l SQLite3_Init()
  Protected LibNr.l
  LibNr_SQlite3 = OpenLibrary(#PB_Any, "sqlite3.dll")
  If LibNr_SQlite3
    sqlite3_open        = GetFunction(LibNr_SQlite3, "sqlite3_open")
    sqlite3_libversion  = GetFunction(LibNr_SQlite3, "sqlite3_libversion")
    ProcedureReturn #TRUE
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure.s SQLite3_GetVersion()
  Protected Result
 
  If sqlite3_libversion
    Result = CallFunctionFast(sqlite3_libversion)
  EndIf
 
  If Result
    ProcedureReturn PeekS(Result)
  Else
    ProcedureReturn "0.0.0"
  EndIf
EndProcedure

Procedure.b SQLite3_OpenDatabase(sDataBase.s)
  If CallCFunctionFast(sqlite3_open, @sDataBase, @lDataBaseHandle) = #SQLITE3_OK ; <-- IMA
    Debug sDataBase
    ProcedureReturn #SQLITE3_OK
  EndIf
EndProcedure

SQLite3_Init()
Debug SQLite3_OpenDatabase(":memory:" )
Debug SQLite3_GetVersion()
Das ändern auf CallFunctionFast() bringt auch nix.
Irgendwas muss sich mit RC1 bzgl. der FunctionCalls geändert haben...

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Verfasst: 13.09.2011 09:18
von Kiffi
dige hat geschrieben:Verwendet jemand einen eigenen Wrapper für SQlite
zur eigentlichen Problematik kann ich nicht viel sagen, aber:
Wieso benutzt Du eigentlich den Wrapper? Benötigst Du dort
Funktionalitäten, die die PB Database-Lib nicht bietet?

Grüße ... Kiffi

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Verfasst: 13.09.2011 11:58
von dige
Mmmh, mit der PB Database Lib kann man nicht asynchron arbeiten,
da ein SELECT keinen eigenen Speicherbereich bekommt.
Ausserdem passt mir das While NextDatabaseRow() Prinzip nicht.
Ich möchte die Inhalte via Array auslesen können...

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Verfasst: 13.09.2011 16:59
von Kiffi
dige hat geschrieben:Mmmh, mit der PB Database Lib kann man nicht asynchron arbeiten,
da ein SELECT keinen eigenen Speicherbereich bekommt.
Ausserdem passt mir das While NextDatabaseRow() Prinzip nicht.
Ich möchte die Inhalte via Array auslesen können...
ok, das sind nachvollziehbare Argumente. Naja, vielleicht melden sich F&f
ja im englischen Forum. Da sind ja offensichtlich Änderungen bei den
Call*-Funktionen vorgenommen worden.

Grüße ... Kiffi

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Verfasst: 13.09.2011 17:41
von bobobo
asynchron heisst hier was ?

diese nickeligkeiten von pb was sqlite angeht kann man ein wenig umgehen
wenn man den sqliteodbc-treiber von http://www.ch-werner.de/sqliteodbc/
benutzt.

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Verfasst: 13.09.2011 19:19
von Christian+
Nun was das Problem an dem CallFunctionFast() ist habe ich auch keine Idee aber du könntest einfach PrototypeC verwenden oder denn damit würde es gehen und dann kann dir das Problem mit CallFunctionFast() egal sein weil du es nicht mehr brauchst.

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Verfasst: 14.09.2011 09:53
von dige
Hatte ich auch schon getestet. Mit PrototypeC ist der
Result = 0 und mit Prototype crasht es:

Code: Alles auswählen

PrototypeC.l Proto_Sqlite_OpenDataBase(*sDataBase)

Global sqlite3_open.Proto_Sqlite_OpenDataBase

Procedure Main()
  LibNr_SQlite3 = OpenLibrary(#PB_Any, "sqlite3.dll")
  If LibNr_SQlite3
    sqlite3_open.Proto_Sqlite_OpenDataBase = GetFunction(LibNr_SQlite3, "sqlite3_open")
  EndIf
    
  sDatabase.s = ":memory:"
  Result = sqlite3_open (@sDatabase)
  ProcedureReturn Result
EndProcedure

Debug Main()

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Verfasst: 14.09.2011 10:12
von Christian+
Also dein ursprüngliches Beispiel konnte ich ohne Probleme anpassen.

Code: Alles auswählen

PrototypeC.i sqlite3_open(sDataBase.p-utf8, *lDataBaseHandle)
PrototypeC.i sqlite3_libversion()

Global sqlite3_open.sqlite3_open
Global sqlite3_libversion.sqlite3_libversion

#SQLITE3_OK          =   0   ; Successful Result
#SQLITE3_ERROR       =   1   ; SQL error Or missing database

Procedure.l SQLite3_Init()
  LibNr_SQlite3 = OpenLibrary(#PB_Any, "sqlite3.dll")
  If LibNr_SQlite3
    sqlite3_open        = GetFunction(LibNr_SQlite3, "sqlite3_open")
    sqlite3_libversion  = GetFunction(LibNr_SQlite3, "sqlite3_libversion")
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure.s SQLite3_GetVersion()
  Protected Result
  If sqlite3_libversion
    Result = sqlite3_libversion()
  EndIf
  If Result
    ProcedureReturn PeekS(Result, -1, #PB_UTF8)
  Else
    ProcedureReturn "0.0.0"
  EndIf
EndProcedure

Procedure.b SQLite3_OpenDatabase(sDataBase.s)
  If sqlite3_open(sDataBase, @lDataBaseHandle) = #SQLITE3_OK ; <-- IMA
    Debug sDataBase
    ProcedureReturn #SQLITE3_OK
  EndIf
EndProcedure

SQLite3_Init()
Debug SQLite3_OpenDatabase(":memory:" )
Debug SQLite3_GetVersion()

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Verfasst: 14.09.2011 10:57
von dige
Hallo Christian+, vielen Dank für Deine Umsetzung. Ich habe alle anderen
Funktionen ergänzt. Im Beispiel funktioniert auch alles, nur innerhalb
meines eigentlichen Programmes erhalte ich bei:

Code: Alles auswählen

Result = sqlite3_get_table (lDataBaseHandle, sSQLQuery, @lResultsPtr, @Rows, @Cols, @ReturnValue)
einen ungültigen Speicherzugriff. :-(

Code: Alles auswählen

PrototypeC.i sqlite3_open(sDataBase.p-utf8, *lDataBaseHandle)
PrototypeC.i sqlite3_libversion()
PrototypeC.i sqlite3_get_table (lDataBaseHandle, sSQLQuery.p-utf8, *lResultsPtr, *Rows, *Cols, *ReturnValue)
PrototypeC.i sqlite3_exec (lDataBaseHandle, sSQLQuery.p-utf8, pCallback, Arg, *ReturnValue)
PrototypeC.i sqlite3_free_table (lResultsPtr)
PrototypeC.i sqlite3_close(lDataBaseHandle)
PrototypeC.i sqlite3_errmsg(*ReturnValue)

Global sqlite3_open.sqlite3_open
Global sqlite3_libversion.sqlite3_libversion
Global sqlite3_exec.sqlite3_exec
Global sqlite3_close.sqlite3_close
Global sqlite3_errmsg.sqlite3_errmsg
Global sqlite3_get_table.sqlite3_get_table
Global sqlite3_free_table.sqlite3_free_table

Global lDataBaseHandle

#SQLITE3_OK          =   0   ; Successful Result
#SQLITE3_ERROR       =   1   ; SQL error Or missing database

Procedure.l SQLite3_Init()
  LibNr_SQlite3 = OpenLibrary(#PB_Any, "sqlite3.dll")
  If LibNr_SQlite3
    sqlite3_open        = GetFunction(LibNr_SQlite3, "sqlite3_open")
    sqlite3_libversion  = GetFunction(LibNr_SQlite3, "sqlite3_libversion")
    sqlite3_exec        = GetFunction(LibNr_SQlite3, "sqlite3_exec")
    sqlite3_close       = GetFunction(LibNr_SQlite3, "sqlite3_close")
    sqlite3_errmsg      = GetFunction(LibNr_SQlite3, "sqlite3_errmsg")
    sqlite3_get_table   = GetFunction(LibNr_SQlite3, "sqlite3_get_table")
    sqlite3_free_table  = GetFunction(LibNr_SQlite3, "sqlite3_free_table")
    ProcedureReturn #TRUE
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure.b SQLite3_OpenDatabase(sDataBase.s)
  If sqlite3_open(sDataBase, @lDataBaseHandle) = #SQLITE3_OK ; <-- IMA
    Debug sDataBase
    ProcedureReturn #SQLITE3_OK
  EndIf
EndProcedure

SQLite3_Init()
Debug SQLite3_OpenDatabase(":memory:" )
Debug SQLite3_GetVersion()

Debug sqlite3_exec (lDataBaseHandle, "CREATE TABLE TEST (ID INTEGER)", #Null, #Null, @ReturnValue)
Debug ReturnValue
If ReturnValue : Debug PeekS(ReturnValue) : EndIf

Debug sqlite3_exec (lDataBaseHandle, "INSERT INTO TEST (ID) VALUES(1)", #Null, #Null, @ReturnValue)
Debug sqlite3_exec (lDataBaseHandle, "INSERT INTO TEST (ID) VALUES(2)", #Null, #Null, @ReturnValue)
Debug sqlite3_exec (lDataBaseHandle, "INSERT INTO TEST (ID) VALUES(3)", #Null, #Null, @ReturnValue)


Debug sqlite3_get_table (lDataBaseHandle, "SELECT * FROM TEST", @lResultsPtr, @Rows, @Cols, @ReturnValue)
Debug ReturnValue
If ReturnValue : Debug PeekS(ReturnValue) : EndIf
Debug Rows
Debug Cols
Debug PeekS(lResultsPtr)

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Verfasst: 14.09.2011 11:12
von dige
Erledigt. Mit Änderung des Strukturtypes auf .p-ascii gehts :D