Seite 2 von 2

Re: Auswerteproblem von FTS unter SQLite

Verfasst: 15.07.2016 11:35
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

Re: Auswerteproblem von FTS unter SQLite

Verfasst: 15.07.2016 11:46
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

Re: Auswerteproblem von FTS unter SQLite

Verfasst: 15.07.2016 15:50
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.

Re: Auswerteproblem von FTS unter SQLite

Verfasst: 15.07.2016 16:22
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

Re: Auswerteproblem von FTS unter SQLite

Verfasst: 15.07.2016 16:44
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

Re: Auswerteproblem von FTS unter SQLite

Verfasst: 15.07.2016 17:05
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