Simple Container [Include]

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: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Simple Container [Include]

Beitrag von Kiffi »

Hallo Alex,

sorry, zuerst quengel ich und dann lass ich nix von mir hören. :oops:
cxAlex hat geschrieben:Die neue Version von SC dauert noch ein bisschen
mir würde genügen, wenn die alte Version irgendwo downloadbar wäre. ;-)

Dann kann ich auch testen.

Danke & Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Simple Container [Include]

Beitrag von PMV »

Selbst wenn ich wollte, könnte ich es nicht testen -> link tot (was fürn zufall :lol: )
http://forums.purebasic.com/german/view ... e9835ed5d2

Aber du solltest dabei schreiben, das deine Funktion nur für einfache
Datentypen geeignet ist, sobald Strings, Listen usw. dabei sind ... wird
ein einfaches CopyMemory() nicht mehr ausreichen.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

Sry, hab nicht gemerkt das der alte Link nicht mehr funktioniert :P
Das ist jetzt nicht so toll, da ich meine Backup - Festplatte grade nicht griffbereit habe, und die aktuelle Version ist (noch) nicht so weit das ich sie uploaden möchte. Hat jemand die letzte Version auf der Platte und kann sie schnell hier bereitstellen (http://www.file-upload.net), sonst würde die aktuelle Version in ca. 1,2 Tagen Releasefertig sein? Danke.

Jop, der Source funzt derzeit nur für einfache Datentypen & Strukturen ohne Strings. LinkedLists mit String - Datentyp sind auch einfach möglich, poste ich die Tage mal ein Beispiel.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

So, hier erst mal ein temporärer Download, in den nächsten paar Tagen werde ich mit allem auf einen Freehoster umziehen:

Neu in dieser Version sind 3 neue Packer zusätzlich zur zLib: LZMA, bZip2, aPLib (danke an luis)
Sicheres löschen von Einträgen aus der Datei (überschreiben mit Zufallsdaten) und schnellerer Zugriff bei sehr großen Archiven ist nun auch möglich.
Der Cache wurde weiter verbessert, Performance erhöht und ein paar kleine Bugfixes und vielleicht ein paar kleine Features die ich grade vergessen hab 8)
Das ganze Trum herum ist natürlich viel zu viel Aufwand für ein Statisches Archiv, wie gesagt das ganze ist für sehr aktive Container gedacht, Cachefiles ... .

Das ganze sollte gut dokumentiert sein, einfach mal ansehen.

Und speziell @Kiffi, jetzt kannst du endlich das speichern von Listen testen :wink:

ACHTUNG: Damit der Source unter x86 korrekt läuft muss in der Datei SArray.pbi in den Procedure - Parametern Index.q in Index.i geändert werden!

Gruß, Alex
Zuletzt geändert von cxAlex am 14.09.2010 11:33, insgesamt 2-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Simple Container [Include]

Beitrag von Kiffi »

cxAlex hat geschrieben:Und speziell @Kiffi, jetzt kannst du endlich das speichern von Listen testen :wink:
Fein! :allright:

Bevor ich's teste, wollte ich meinen 'alten' Code noch einmal ausprobieren.
Leider gibt es hier einen Fehler bei SC_AddEntry().

Code: Alles auswählen

IncludePath "D:\develop\PureBasic\SimpleContainer\"
XIncludeFile "sc.pbi"

Define SC
Define Test.s

; Öffnen / Erstellen
SC = SC_Open("D:\develop\PureBasic\SimpleContainer\testcontainer.sc")

If SC
  ; Wert schreiben
  Test.s="Usambaraveilchen"
  SC_AddEntry(SC, "huhu", @Test, Len(Test))
  SC_Close(SC)
EndIf 

; Öffnen
SC = SC_Open("D:\develop\PureBasic\SimpleContainer\testcontainer.sc")
If SC
  ; Wert auslesen
  If SC_GetEntry(SC, "huhu")
    Debug PeekS(SC_GetMem(SC), SC_GetMemSize(SC))
  EndIf     
  SC_Close(SC)
EndIf
der Fehler tritt auf in der SArray.pbi:

Code: Alles auswählen

Procedure SArray_Get(*SArray.SArray, Index.q)
  Protected *SArrayEntry.SArray_Data, *cur.SArray_Holder = *SArray
  Repeat
    *SArrayEntry = @*cur\Entry[Index%#LevelSize] ; <--- Structure array index out of bounds
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

Sry für den dummen Fehler :P

einfach die Index.q durch Index.i ersetzen dann sollte es gehen.
kommt davon wenn man nicht genug x86 testet :oops:


Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

So, neuer Space ist da :D

Hier der permanente Dowload - Link, der Fehler mit den Quad - Indexes ist behoben:

http://cxalex.bplaced.net/public/Simple-Conainer.zip

Gibts schon Ergebnisse bezüglich des Listen-speicherns, oder sonst irgendwelche Vorschläge, Kritik, Wünsche ... ?

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Simple Container [Include]

Beitrag von Kiffi »

cxAlex hat geschrieben:Gibts schon Ergebnisse bezüglich des Listen-speicherns
jau! Getestet und für gut befunden :allright:
cxAlex hat geschrieben:oder sonst irgendwelche Vorschläge, Kritik, Wünsche ... ?
na, wenn Du schon so explizit fragst ;-)

Wie PMV schon anmerkte, können nur 'einfache' Listen gespeichert werden.
Das Sahnehäubchen wäre jetzt natürlich, wenn man eine Art 'Universalprozedur' hätte,
mit der man beliebige Listen speichern könnte (also auch strukturierte). Ich bin
mir nicht sicher, ob das überhaupt in PB verwirklicht werden kann, aber mir scheint
dass Du Dich schon gut in dieses Thema eingearbeitet hast, kannst Du sicherlich
eine Aussage treffen, ob das so funktionieren kann.

Und: Es wäre klasse, wenn Du uns für die neuen Features (beispielsweise die Packroutinen)
ein paar Sample-Snippets zur Verfügung stellen könntest.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

öhm ... also eigentlich sollten auch Strukturierte Listen funktionieren, solange sie keine Strings, Maps und Sublisten enthalten. Statische Strings ins Strukturen sind kein Problem. Es würde sicher funktionieren auch dynamische Strukturen zu speichern, nur müsste man für jede Struktur eine eigene Speicher-Routine schreiben, ob das universell machbar ist weis ich nicht, jedenfalls wäre mich jetzt kein Weg bekannt :|

Die Packroutinen sind schnell erklärt, einfach per optionalem Parameter wählen, default ist zLib:

Frei aus deinem Beispiel:

Code: Alles auswählen

SC_AddEntry(SC, "huhu", @Test, Len(Test))
SC_AddEntry(SC, "huhu", @Test, Len(Test), #SC_zLib)
SC_AddEntry(SC, "huhu", @Test, Len(Test), #SC_bZip2, 9)
SC_AddEntry(SC, "huhu", @Test, Len(Test), #SC_aPLib)
SC_AddEntry(SC, "huhu", @Test, Len(Test), #SC_LZMA, 9, #LZMA_DICT_4M)
Mehr muss man nicht tun, packen & entpacken mit je dem richtigen Packer übernimmt SC.
Der nächste optionale Parameter bestimmt die Kompressionsstärke (immer 0-9, 0 = keine Kompression, Default = 7).
Der letzte optionale Parameter ist nur für LZMA relevant und bestimmt die Wörtbuchgröße, zwischen 4K und 256M, der Defaultwert passt aber für die meisten Fälle.

Das sichere Löschen ist auch einfach ein zusätzlicher Parameter bei DeleteEntry() und die meisten anderen neuen Features (schnellerer Zugriff bei vielen Einträgen, Cachesystem) arbeiten im Hintergrund, da ist kein manuelles Zutun nötig.

Und in der Datei SC_Test.pbi sind Demo Pack- und Entpack-Routinen für Dateien enthalten die auch ein bisschen die XtraData() - Befehle demonstrieren.

Um das Callback zu Demonstrieren müsste ich fast mal eine kleine Demoanwendung stricken, mal sehen ob ich dafür zeit finde. Irgendwann heute ist mir die Idee gekommen SC als Storage - System für einen FTP - Server zu verwenden, dafür müsste es sich ganz gut eignen, dann würden sich die ganzen Caching & Performance Einbauten auch mal auszahlen 8)

Derzeit baue ich ein Log-System ein das ich auch extra posten werde, dann gibts eine neue Version.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Simple Container [Include]

Beitrag von Kiffi »

Hallo Alex,

Danke für die nachgereichten Infos! :allright:
cxAlex hat geschrieben:ob das universell machbar ist weis ich nicht, jedenfalls wäre mich jetzt kein Weg bekannt :|
mh, da reichen meine Kenntnisse auch nicht aus. Bei Gelegenheit stelle ich mal
ne Anfrage im 'Allgemein'-Forum.

Hier mal ein kleines Beispiel mit speziell auf die entsprechende LinkedList
angepasste Speicher-/Ladeprozeduren:

Code: Alles auswählen

IncludePath "D:\develop\PureBasic\SimpleContainer\" ; Pfad anpassen!
XIncludeFile "sc.pbi"

EnableExplicit

Structure sTelefon
  Nummer.s
  Typ.s
EndStructure

Structure sPerson
  Vorname.s
  Nachname.s
  List Telefon.sTelefon()
EndStructure

NewList Person.sPerson()

Procedure AddPerson(List Person.sPerson(), Vorname.s, Nachname.s, TelefonTyp1.s, TelefonNummer1.s, TelefonTyp2.s, TelefonNummer2.s)
  AddElement(Person())
  Person()\Vorname  = Vorname
  Person()\Nachname = Nachname
  AddElement(Person()\Telefon())
  Person()\Telefon()\Typ    = TelefonTyp1
  Person()\Telefon()\Nummer = TelefonNummer1
  AddElement(Person()\Telefon())
  Person()\Telefon()\Typ    = TelefonTyp2
  Person()\Telefon()\Nummer = TelefonNummer2
EndProcedure

Procedure SC_SavePersonen(SC, List Person.sPerson())
  
  Protected PersonID.s
  Protected TelefonID.s
  
  ForEach Person()
    
    PersonID = Str(ListIndex(Person()))
    
    SC_AddEntry(SC, "PersonID"       + PersonID, @PersonID,          Len(PersonID))
    SC_AddEntry(SC, "PersonVorname"  + PersonID, @Person()\Vorname,  Len(Person()\Vorname))
    SC_AddEntry(SC, "PersonNachname" + PersonID, @Person()\Nachname, Len(Person()\Nachname))
    
    ForEach Person()\Telefon()
      
      TelefonID = Str(ListIndex(Person()\Telefon()))
      
      SC_AddEntry(SC, "Person" + PersonID + "TelefonID"     + TelefonID, @TelefonID,                 Len(TelefonID))
      SC_AddEntry(SC, "Person" + PersonID + "TelefonTyp"    + TelefonID, @Person()\Telefon()\Typ,    Len(Person()\Telefon()\Typ))
      SC_AddEntry(SC, "Person" + PersonID + "TelefonNummer" + TelefonID, @Person()\Telefon()\Nummer, Len(Person()\Telefon()\Nummer))
      
    Next
    
  Next
  
EndProcedure

Procedure SC_LoadPersonen(SC, List Person.sPerson())
  
  Protected PersonCounter 
  Protected TelefonCounter
  
  Repeat
    
    If SC_GetEntry(SC, "PersonID" + Str(PersonCounter))
      
      AddElement(Person())
      
      SC_GetEntry(SC, "PersonVorname" + Str(PersonCounter))
      Person()\Vorname = PeekS(SC_GetMem(SC), SC_GetMemSize(SC))
      
      SC_GetEntry(SC, "PersonNachname" + Str(PersonCounter))
      Person()\Nachname = PeekS(SC_GetMem(SC), SC_GetMemSize(SC))
      
      TelefonCounter = 0
      
      Repeat
      
        If SC_GetEntry(SC, "Person" + Str(PersonCounter) + "TelefonID" + Str(TelefonCounter))  
          
          AddElement(Person()\Telefon())
          
          SC_GetEntry(SC, "Person" + Str(PersonCounter) + "TelefonTyp" + Str(TelefonCounter))
          Person()\Telefon()\Typ = PeekS(SC_GetMem(SC), SC_GetMemSize(SC))
          
          SC_GetEntry(SC, "Person" + Str(PersonCounter) + "TelefonNummer" + Str(TelefonCounter))
          Person()\Telefon()\Nummer = PeekS(SC_GetMem(SC), SC_GetMemSize(SC))
          
          TelefonCounter + 1
          
        Else
          
          Break 
          
        EndIf
        
      ForEver
      
      PersonCounter + 1
      
    Else
      
      Break
      
    EndIf
    
  ForEver
  
EndProcedure

Define SC

DeleteFile("D:\develop\PureBasic\SimpleContainer\testcontainer.sc")

; ################
; # Erstellen und speichern
; ################

SC = SC_Open("D:\develop\PureBasic\SimpleContainer\testcontainer.sc")  ; Pfad anpassen!

If SC
  
  AddPerson(Person(), "Clark", "Kent",   "Festnetz", "1111", "Mobil", "2222")
  AddPerson(Person(), "Bruce", "Wayne",  "Festnetz", "3333", "Mobil", "4444")
  AddPerson(Person(), "Peter", "Parker", "Festnetz", "5555", "Mobil", "6666")
  
  SC_SavePersonen(SC, Person())
  
  SC_Close(SC)
  
EndIf 

; ################
; # Laden und anzeigen
; ################

SC = SC_Open("D:\develop\PureBasic\SimpleContainer\testcontainer.sc")  ; Pfad anpassen!

If SC
  
  ClearList(Person())
  
  SC_LoadPersonen(SC, Person())
  
  ForEach Person()
    Debug "Name: " + Person()\Vorname + " " + Person()\Nachname
    ForEach Person()\Telefon()
      Debug "Telefon: " + Person()\Telefon()\Nummer + " (" + Person()\Telefon()\Typ + ")"
    Next
    Debug "-----------------"
  Next
  
  SC_Close(SC)
  
EndIf
Grüße ... Kiffi
a²+b²=mc²
Antworten