PB4.60RC1 Probleme mit SQlite Wrapper

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
dige
Beiträge: 1247
Registriert: 08.09.2004 08:53

PB4.60RC1 Probleme mit SQlite Wrapper

Beitrag 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...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Beitrag 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
a²+b²=mc²
Benutzeravatar
dige
Beiträge: 1247
Registriert: 08.09.2004 08:53

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Beitrag 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...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Beitrag 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
a²+b²=mc²
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Beitrag 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.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Beitrag 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.
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
dige
Beiträge: 1247
Registriert: 08.09.2004 08:53

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Beitrag 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()
"Papa, ich laufe schneller - dann ist es nicht so weit."
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Beitrag 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()
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
dige
Beiträge: 1247
Registriert: 08.09.2004 08:53

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Beitrag 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)
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
dige
Beiträge: 1247
Registriert: 08.09.2004 08:53

Re: PB4.60RC1 Probleme mit SQlite Wrapper

Beitrag von dige »

Erledigt. Mit Änderung des Strukturtypes auf .p-ascii gehts :D
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten