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
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Simple Container [Include]

Beitrag von cxAlex »

Servus.

Nachdem ich letztens hier gefragt habe wie man ein Containerformat am besten aufbaut will ich hier mal mein Ergebnis vorstellen.

Kurz und bündig das ganze ist ein Simpler Container der Schreiben/Lesen und das löschen von beliebigen Speicher-Einträgen in einer Datei ermöglicht und strukturiert. Die Einträge sind über eine String-ID ansprechbar die derzeit fix auf 128 Zeichen limitiert ist, aber das war jetzt nur der Einfachheit halber und wird mit der nächsten Version geändert das beliebige IDs möglich sind.

Das Löschen von Einträgen wird so verwaltet das schlicht und einfach der Index - Eintrag der Datei gelöscht wird und der Platz in der Datei der von diesem Eintrag belegt wurde in einen Pool mit freien Speicherplätzen übergeben wird. Dieser Pool verwaltet sich selbst, fast kleine, aneinander grenzende Einträge zu größeren zusammen und stellt diesen Platz für später hinzukommende Einträge wieder zur Verfügung. Außerdem gibt es einen Shrink - Befehl der sämtliche Einträge bei Bedarf in der Datei neu anordnet und den Platzbedarf optimiert, d.H. kein ungenutzter Speicher mehr in der Datei.

Die Einträge können optional mit der zlib - Packerbibliothek komprimiert werden, um das Packen/Entpacken kümmert sich das Include.

Der komplette Unterbau der Bibliothek ist Block - Orientiert, eine sehr starke Weiterentwicklung meines ECF - Includes, dH. Simple Container - Dateien können optional verschlüsselt werden, verfügen über einen intelligenten Speichercache der die Zugriffszeit bei vielen Read -Zugriffen extrem steigern kann und können bis zu theoretisch ~8 Exabyte groß werden.

Den Einsatzzweck sehe ich in Richtung Offline-Cache usw.

In Planung sind noch ein paar Optimierungen am FreeSpaceController und ev. CRC Prüfungen für die einzelnen Einträge, sollte aber kein Problem sein das zu realisieren.

Einfach in die SC.pbi im unteren Download schauen, der Source und die Funktionen sollten gut dokumentiert und einfach zu verstehen sein.

Bei Fragen, Kritik usw. bitte einfach hier melden :D

Download:
http://files.cxalex.bplaced.net/secure. ... tainer.zip

Gruß, Alex
Zuletzt geändert von cxAlex am 28.09.2010 19:24, 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: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Simple Container [Include]

Beitrag von Kiffi »

cxAlex hat geschrieben:Nachdem ich letztens hier gefragt habe wie man ein Containerformat am besten aufbaut will ich hier mal mein Ergebnis vorstellen.
:allright:

Zum SC: Ich bekomme hier erstmal ein...
PB-Compiler hat geschrieben:'For' doesn't support quad variables.
... in einigen Includes. Habe ich insoweit 'gefixt' als das ich in
allen Schleifenvariablen den expliziten Typenbezeichner .q
entfernt habe.

einen Simple Container zu erstellen funktioniert erstmal problemlos.
Allerdings habe ich keine Idee, wie ich einen einmal geschriebenen
Wert wieder auslesen kann (unten mit den '???' versehen).

Code: Alles auswählen

IncludeFile "sc.pbi"

Define *SC.SC_Data
Define Test.s

; Öffnen / Erstellen
*SC = SC_Open("D:\downloads\SC\SC\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:\downloads\SC\SC\testcontainer.sc")
If *SC
  ; Wert auslesen
  If SC_GetEntry(*SC, "huhu")
    ; und nu ???
  EndIf     
  SC_Close(*SC)
EndIf 
Danke und Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Simple Container [Include]

Beitrag von cxAlex »

Danke schonmal fürs testen :)

Ah, das mit den Quads hab ich nicht bemerkt da ich das ganze unter x64 programmiert habe, da gehts :oops:
Ich werde die Zähler auf Integer ändern.

Übrigens musst du die Rückgabe von SC_Open() nicht zwingend in einer SC_Data Struktur speichern, ein einfacher Integer tuts auch ;)

Sobald du in dem if Block bist (wenn SC_GetEntry() erfolgreich ist) kannst du mit SC_GetMem(), SC_GetMemSize(), SC_GetName() ... auf die Daten des Entrys zugreifen. Wenn man eine Enumeration startet mit SC_EnumerateEntrys() und SC_NextEntry() sind auch diese Funktionen zu verwenden.

Ich bin leider grade nicht zuhause und hab mein Notebook nicht dabei aber ich werd sobald es geht mal ein paar Beispiele basteln die alle Unklarheiten beseitigen.

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

Re: Simple Container [Include]

Beitrag von Kiffi »

cxAlex hat geschrieben:Sobald du in dem if Block bist (wenn SC_GetEntry() erfolgreich ist) kannst du mit SC_GetMem(), SC_GetMemSize(), SC_GetName() ... auf die Daten des Entrys zugreifen.
aaah!

Code: Alles auswählen

; Wert auslesen
If SC_GetEntry(SC, "huhu")
  Debug PeekS(SC_GetMem(SC), SC_GetMemSize(SC))
EndIf
ja, schön, klappt! :)
cxAlex hat geschrieben:Übrigens musst du die Rückgabe von SC_Open() nicht zwingend in einer SC_Data Struktur speichern, ein einfacher Integer tuts auch
ich glaube mir einzubilden, dass das gestern noch nicht geklappt hat.
Kann aber auch an der Hitze gelegen haben...

Umso besser, wenn's auch so funktioniert. :)

Primstens. Das Überhammer für Deinen "Simple Container" wäre jetzt,
wenn man LinkLists in solch einen Container speichern könnte... :allright:

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

Re: Simple Container [Include]

Beitrag von cxAlex »

:D

Meins du native PB - Listen als Container-Eintrag speichern und laden? Sollte machbar sein, ich werd mal versuchen sowasin einem Beispiel zu realisieren wenn ich zuhause bin.

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, Sorry dass das so lange gedauert hat, hab Momentan viel zu tun.

Update:
  • Fehlerhafte Laufvariablen auf Integer geändert
  • Eintrags - Name nun unbegrenzt, vorhandene Einträge können nun sogar umbenannt werden.
  • SafeDelete Option für SC_DeleteEntry(), der Eintrag wird sicherheitshalber noch mit Zufallsdaten überschrieben.
  • Enumeration nun lauffähig, ich muss betrunken gewesen sein als ich den Sch*** programmiert hab :oops:
  • Es sind nun beliebig viele Xtra-Data Einträge pro Eintrag möglich, String- und Numerische- Einträge, ansprechbar über eine String-ID
  • Interne Anpassungen am Eintrags-Header, ab nun ist jede Version auf- und abwärtskompatibel, egal wie viele Einträge vom Header dazu/wegkommen!
  • Das Enpacken und in den Speicher laden eines Eintrages ist nun optional, auch bei einer Enumeration. Nützlich wenn man nur prüfen will ob ein Eintrag existiert, nur alle Einträge aufzählen will.
  • Mehrere kleine Optimierungen/Bugfixes, u.a. im FreeSpace Controller und ein Memory-Leak beim schließen der Datei
Nach außen hin ist das ganze natürlich immer noch simpel zu bedienen, der interne Aufbau ist inzwischen alles andere als Simpel :mrgreen:

Ein Beispiel zum speichern von Listen werde ich diese Woche noch machen, das ist jetzt sehr einfach über die XtraData - Einträge möglich, oder ich werd das Ganze zu einem Speicherblock verwursten.

Im Ordner befindet sich eine SC_Test.pb, die 2 Proceduren zum Packen/Entpacken von Dateien in den Container bereitstellt und auch die Verwendung mehrerer XtraData Einträge recht schön zeigt wie ich finde.

Download im 1. Post oder:
http://paladiumproject.q-soft.ch/public/misc/SC.zip

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

Re: Simple Container [Include]

Beitrag von Kiffi »

*push*
cxAlex hat geschrieben:Ein Beispiel zum speichern von Listen werde ich diese Woche noch machen, das ist jetzt sehr einfach über die XtraData - Einträge möglich, oder ich werd das Ganze zu einem Speicherblock verwursten.
gibt's diesbezüglich schon was neues? Das Speichern von Listen würde
IMO nämlich prima in die Lücke zwischen den Preferences-Befehlen
und XML/Datenbank passen.

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 das ich mich lang nicht gemeldet hab, bin grad immer viel unterwegs und war 2 Wochen im Ausland.
Ich hab das ganze ein bisschen erweitert, ich bin leider aber auch jetzt nicht zu Hause, vorraussichtlich morgen zwischen 8 und 12 Uhr sollte ich dazu kommen das ganze onlinezu stellen mit einem Listen - speicher Beispiel :D

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 »

Sorry für die Verspätung, haufen Streß grade /:->

Spezielle für Kiffi :wink: :
Hier die wirklich laaange versprochenen Proceduren zum Speichern und Laden von Listen in einem SC - Container. Denn aktuellen Source kann/will ich leider gerade nicht uploaden da der gerade nicht wirklich stabil ist, es werden gerade einige neue Features implementiert die ich noch nicht genug getestet habe. Die Funktionsweise finde ich selbsterklärend, sonst einfach hier fragen.

Code: Alles auswählen

Procedure SC_SaveList(SC, Id$, List myList(), ElementSize)
  Protected *cListMem, *ListMem, ListSize = ListSize(myList())
  Protected RtVar
  
  If ListSize
    ; Listenspeicher anlegen
    *ListMem = AllocateMemory(ListSize*ElementSize)
    *cListMem = *ListMem
    
    ResetList(myList()) ; Liste in Speicher umlegen
    While NextElement(myList())
      CopyMemory(@myList(), *cListMem, ElementSize)
      *cListMem + ElementSize
    Wend
    
    If SC_AddEntry(SC, Id$, *ListMem, ListSize*ElementSize) ; in den Container speichern
      ; zusätzliche Daten schreiben, zur vereinfachung
      SC_SetXtraDataQuad(SC, "ElementSize", ElementSize)
      SC_SetXtraDataQuad(SC, "ListSize", ListSize)
      
      ; Rückgabe wahrsetzen
      RtVar = #True
    EndIf
    
    FreeMemory(*ListMem)
    
  EndIf
  
  ProcedureReturn RtVar
EndProcedure

Procedure SC_LoadList(SC, Id$, List myList())
  Protected *cListMem, ListSize, ElementSize
  Protected RtVar
  
  If SC_GetEntry(SC, Id$) ; ist der Eintrag da?
    *cListMem = SC_GetMem(SC)
    
    ; Extradaten laden
    ListSize = SC_GetXtraDataQuad(SC, "ListSize")
    ElementSize = SC_GetXtraDataQuad(SC, "ElementSize")
    
    If SC_GetMemSize(SC) = ListSize*ElementSize ; sicherheitsprüfung
      ClearList(myList())
      
      While ListSize ; Speicher in Liste übertragen
        AddElement(myList())
        CopyMemory(*cListMem, @myList(), ElementSize)
        
        *cListMem + ElementSize
        ListSize-1  
      Wend
      
      RtVar = #True
    EndIf
    
  EndIf
  
  ProcedureReturn RtVar
EndProcedure
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 »

*push*

Kann jemand bestätigen das die Funktionen Ok sind? Die neue Version von SC dauert noch ein bisschen, ich baue gerade eine Ordner - Verwaltung und mehrere Packer usw. ein.

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
Antworten