Auswerteproblem von FTS unter SQLite

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Auswerteproblem von FTS unter SQLite

Beitrag von NicTheQuick »

Ich gehe mal davon aus, dass das in Wirklichkeit aneinander gereihte Longs sind:

Code: Alles auswählen

DataSection
	blob_start:
		Data.a $03, $00, $00, $00, $02, $00, $00, $00, $01, $00, $00, $00, $03, $00, $00, $00
		Data.a $02, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00
		Data.a $01, $00, $00, $00, $02, $00, $00, $00, $02, $00, $00, $00, $00, $00, $00, $00
		Data.a $01, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
		Data.a $00, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00
	blob_end:
EndDataSection

; Der Zeiger *blob zeigt auf die Daten, die du ausgelesen hast (simuliert durch die Datasection)
*blob = ?blob_start

For i = 0 To 19
	Debug PeekL(*blob + i * SizeOf(Long))
Next
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Auswerteproblem von FTS unter SQLite

Beitrag von MenschMarkus »

Ja, da war ich auch gerade dran. Da die Größe von 80 Byte ja fest liegt hatte ich das mit einer For Schleife durchgeführt

Code: Alles auswählen

Define i.i
For i = 0 to 79 STEP 4
    Debug PeekL(*f1 + i)
next
Das hat dann auch funktioniert. Du warst einfach schneller /:->

Danke dennoch mhs

Edit: Sieh an, NicTheQuick hat es auf die gleiche weise gelöst.
Danke NicTheQuick
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
HeX0R
Beiträge: 3056
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Auswerteproblem von FTS unter SQLite

Beitrag von HeX0R »

Ich würde das so machen:

Code: Alles auswählen

Structure _LONG_ARRAY_
	LONG.l[0]
EndStructure

DataSection
	blob_start:
	Data.a $03, $00, $00, $00, $02, $00, $00, $00, $01, $00, $00, $00, $03, $00, $00, $00
	Data.a $02, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00
	Data.a $01, $00, $00, $00, $02, $00, $00, $00, $02, $00, $00, $00, $00, $00, $00, $00
	Data.a $01, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
	Data.a $00, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00
	blob_end:
EndDataSection

; Der Zeiger *blob zeigt auf die Daten, die du ausgelesen hast (simuliert durch die Datasection)
*blob._LONG_ARRAY_ = ?blob_start
For i = 0 To 19
	Debug *blob\LONG[i]
Next
Sieht erst mal merkwürdig aus, macht es aber sehr viel angenehmer als das "rumpeeken", weil man auch auf alle Felder sofort und jederzeit zugreifen kann.
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Auswerteproblem von FTS unter SQLite

Beitrag von MenschMarkus »

@HeXOR

jep funzt top :allright:

aber nur der Vollständigkeit halber eine kleine Ergänzung

Code: Alles auswählen

Structure _LONG_ARRAY_
   LONG.l[0]
EndStructure

DataSection
   blob_start:
   Data.a $03, $00, $00, $00, $02, $00, $00, $00, $01, $00, $00, $00, $03, $00, $00, $00
   Data.a $02, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00
   Data.a $01, $00, $00, $00, $02, $00, $00, $00, $02, $00, $00, $00, $00, $00, $00, $00
   Data.a $01, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00
   Data.a $00, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00, $01, $00, $00, $00
   blob_end:
EndDataSection

; Der Zeiger *blob zeigt auf die Daten, die du ausgelesen hast (simuliert durch die Datasection)
*blob._LONG_ARRAY_ = AllocateMemory(80)     ;Hier 80, da bekannt, ansonsten wie oben beschrieben ermitteln und via Variable übergeben.
                                            ;Wichtig für GetDatabaseBlob(), sonst Speicherzugriffsfehler
*blob._LONG_ARRAY_ = ?blob_start
For i = 0 To 19
   Debug *blob\LONG[i]
Next
FreeMemory(*blob)
Tks HeXOR
Wissen schadet nur dem, der es nicht hat !
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Auswerteproblem von FTS unter SQLite

Beitrag von NicTheQuick »

Das ist nicht vollständiger, das ist falsch. Du allozierst Speicher, speicherst den Pointer dazu in der *blob-Variable, und überschreibst den Pointer dann direkt wieder mit dem Pointer in die Datasection. Die Folge ist, dass du nicht mehr an den zuvor allozierten Speicher herankommst und ihn auch nicht mehr mit 'FreeMemory'() freigeben kannst. Das sieht man übrigens auch deutlich an der Fehlermeldung:
[16:43:57] [ERROR] Trying to free or to reallocate a non-allocated memory block
MenschMarkus
Beiträge: 227
Registriert: 30.04.2009 21:21
Computerausstattung: i5-2300 (2.8 Ghz) Win10 -64bit / PB 5.73 LTS

Re: Auswerteproblem von FTS unter SQLite

Beitrag von MenschMarkus »

@NicTheQuick

In Verbindun mit der DataSection hast Du recht. Ich hatte aber explizit dazu geschreiben, dass das für GeDatabaseBlob() nowendig ist.

Hier noch einmal in meinem Kontext

Code: Alles auswählen

UseSQLiteDatabase()

Structure _blob_
  blob.l[0]
EndStructure

CreateFile(0,"fts_test.sql")
CloseFile(0)
OpenDatabase(0,"fts_test.sql","","",#PB_Database_SQLite)
DatabaseUpdate(0,"CREATE VIRTUAL TABLE data USING fts4(names,places)")
DatabaseUpdate(0,"INSERT INTO data VALUES ('transaction default models default','non transaction reads')")
DatabaseUpdate(0,"INSERT INTO data VALUES ('the default transaction','these semantics present')")
DatabaseUpdate(0,"INSERT INTO data VALUES ('single request','default data')")
query.s = "SELECT matchinfo(data) FROM data WHERE data MATCH 'default transaction " + Chr(34) + "these semantics" + Chr(34) + "'"
DatabaseQuery(0,query)
NextDatabaseRow(0)
size.l = DatabaseColumnSize(0,0)
*f1._blob_ = AllocateMemory(size)
GetDatabaseBlob(0,0,*f1._blob_,size)
For i = 0 To 19
  Debug *f1\blob[i]
Next
FreeMemory(*f1)
CloseDatabase(0)
End
Lässt Du jetzt die Speicherreservierung weg, kommt die erwähnte Fehlermeldung

Also, das war richtiger Inhalte in falschem Kontext. Sorry für die Vewirrung
Wissen schadet nur dem, der es nicht hat !
Antworten