SQLite3 unter PB

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Hallo Lukaso,

sorry, dass ich mich nicht früher gemeldet habe. Dein Beitrag ist mir durch
die Lappen gegangen. :oops:

> Ich glaube ich habe dass Problem, dass die Recordsets nicht
> Freigegeben werden.
> [...]
> Hättest du ne ahnung an was das liegen könnte?

nee, leider nicht. Kannst Du mir einen kleinen Beispielcode zuschicken,
anhand dessen ich das ausprobieren kann?

Danke & Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

@kiffi

Wie kann ich denn mit der lib auch auf ne db im web zugreifen oder ist das überhaupt mit der lib möglich?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

nicolaus hat geschrieben:Wie kann ich denn mit der lib auch auf ne db im web zugreifen oder ist das überhaupt mit der lib möglich?
sorry für die späte Antwort!

Also, ich kann es nicht mit 100%iger Sicherheit sagen, aber ich denke, dass
es generell nicht möglich ist, auf eine im Web liegende SQLite-Db
zuzugreifen. Ich lasse mich da aber auch gerne eines besseren belehren.

Wenn Du Windows-Webspace hast, könnte man überlegen, auf Deinem
Space ein CGI zu basteln, welches die dortige DB konnektieren kann und die
Daten dann via XML (HTML, Text oder sonst ein anderes Format) an den
Client streamt.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Hallo kiffi,

ich habe ein neues Problem. Das alte Problem hat sich gelöst, nur leider hab ich irgendwie vergessen, zu schreiben (habe meine verwaltung neu gschrieben, dabei hat sich das von selbst gelöst). Aber jetzt habe ich ein neues Problem, auch mit der Speicherbelegung. Ich habe für die Verwaltung meiner Playlisten Proceduren. Damals lag mein Speicherverbrauch bei 500 Liederwechsel bei 100MB. Ein liederwechel führt ~3 Datenbankabfragen aus. Jetz liegt mein Speicherverbrauch bei 50000 liederwechsel bei 40MB. Ich denke, dass liegt an dem "Deftype. s_RecordSet RS". Ich muss für jede Procedure diesen Befehl ausführen. Ist es möglich dies Irgendwie global festzulegen? Hab noch nie DefType benutzt.

Danke Lukas :allright:
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Ich denke, dass liegt an dem "Deftype. s_RecordSet RS". Ich muss für
> jede Procedure diesen Befehl ausführen.

:-)

[c]Deftype.s_RecordSet RS[/c] ist das selbe, als ob Du [c]RS.s_RecordSet[/c]
schreibst. Es ist lediglich eine Festlegung, von welchem Typ die Variable
RS ist. Wenn Du [c]sDummy.s[/c] schreibst, dann ist die Variable [c]sDummy[/c] vom
Typ String. Und so wie oben geschrieben, ist die Variable RS vom Typ
s_RecordSet.

> Ist es möglich dies Irgendwie global festzulegen?

[c]Global RS.s_RecordSet[/c]

> Hab noch nie DefType benutzt.

schau Dir mal an, was die PB-Hilfe zum Thema DefType schreibt.

Dennoch kann das nicht der Grund für den Speicherverbrauch sein.

Kleiner Tipp: Falls noch nicht geschehen, solltest Du nach der Verwendung
von RS den angeforderten Speicherbereich mittels [c]SQLite3_ReleaseRecordset(@RS)[/c]
wieder freigeben.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Stimmt, an dem Recordset lags nicht. ReleaseRecordset mache ich nach jedem aufruf. Allerdings steigt der verbrauch trotzdem.

Code: Alles auswählen

Procedure Playlist_GetElementPos(dbHandle, Id)
  
  DefType.RecordSet RS
  
  If SQLite3_GetRecordset("Select * From Elements WHERE Id = " + Str(Id), dbHandle, @RS)
     
    If RS\Handle
    
      If SQLite3_GetRecordsetValueByName("Position", @RS)
       
        ProcedureReturn Val(RS\sValue)
        
      EndIf
      
      SQLite3_ReleaseRecordset(@RS)
      
    Else
      
      ProcedureReturn #False
      
    EndIf
    
  Else
    
    ProcedureReturn #False
    
  EndIf
  
EndProcedure
Die o.g. Procedure führ ich bei mir 50000 durch, und der Speicherverbraucht steigt dabei auf 40MB, mache ich etwas falsch?

MFG Lukas
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> mache ich etwas falsch?

sieht nicht so aus...

Ich werde mir morgen die Lib noch mal etwas genauer anschauen und mich
dann hier melden.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ich denke mal, wenn die Procedur nach dem ersten ProcedureReturn verlassen wird, dieses: SQLite3_ReleaseRecordset(@RS) nie ausgeführt wird
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Ich denke mal, wenn die Procedur nach dem ersten ProcedureReturn
> verlassen wird, dieses: SQLite3_ReleaseRecordset(@RS) nie
> ausgeführt wird

Aargh! Gut ausgepasst, Thomas! :allright: Hatte ich übersehen.

@Lukaso:

Probier mal das:

Code: Alles auswählen

Procedure Playlist_GetElementPos(dbHandle, Id)
 
  DefType.RecordSet RS

  RetVal = #False
 
  If SQLite3_GetRecordset("Select * From Elements WHERE Id = " + Str(Id), dbHandle, @RS)
     
    If RS\Handle
   
      If SQLite3_GetRecordsetValueByName("Position", @RS)
       
        RetVal = Val(RS\sValue)
       
      EndIf
     
      SQLite3_ReleaseRecordset(@RS)
     
    EndIf
   
  EndIf
 
  ProcedureReturn RetVal

EndProcedure
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Danke an euch beide, jetzt hab ich schicke 6,5MB nach 50000 Liederwechsel.

Man lernt nie aus :D

Lukas
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Antworten