[INCLUDE] Double-O-Files - Schnelles und einfaches Dateisystem (DINI-kompatibel)

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Double-O-Files


    Ich war auf der Suche nach einem Dateisystem, welche viele Werte auf einmal schnell speichern kann.
    Ich benutzte zuvor DINI, dann habe ich DJSON und MySQL getestet, zuviel zu konvertieren, beides lief nicht, wie es sollte.
    Dann habe ich mich dazu entschieden, selbst etwas zu machen, und zwar etwas, das genau für meine Anwendung ist.
    Also habe ich Double-O-Files geschrieben.


    Updates:
    17/9/2010:
    - DOF_Clear entfernt, da es das Laden unglaublich verlangsamt.
    - Freiwillige Option hashcmp hinzugefügt, standardmässig ein, vergleicht die Keystrings mit Hashes, was schneller ist als strcmp.
    Der unterschied wird bei vielen Daten bemerkbar.
    - Neue Funktion: DOF_GetHashCols
    EDIT: - Bug behoben der den Server bei DOF_SetInt mit Werten um 2'000'000'000 freezt.
    16/9/2010:
    - Neue Funktionen: DOF_CopyFile, DOF_RenameKey
    - DOF_Unset wurde optimiert
    - strcpy anstelle von format bei laden einer Datei ==> Datei sollte nun ein kleines bisschen schneller laden
    - Statische Variablen
    - Kommentarsupport hinzugefügt: ;KOMMENTAR wird ignoriert werden.


    Wie funktioniert es?
    Es ist ziemlich einfach:
    Beim laden des ersten Eintrages wird die ganze Datei geladen und in Variablen gespeichert.
    Danach kann die Datei gelesen und gespeichert werden, ohne jedes Mal die Datei neu zu schreiben oder neu zu öffnen.
    Der Unterschied zu DINI ist: Während DINI die Datei für jeden Eintrag neu öffnen oder neu schreibt, öffnen und speichert DOF die Datei nur einmal.
    Sobald eine neue Datei geöffnet werden muss, wird die alte Datei automatisch gespeichert, falls Änderungen vorgenommen wurden.
    Natürlich kann die Datei schon früher manuell gespeichert werden.


    Funktionen:

    DOF_SetFile(file[]);//Du solltest das nicht benutzen.
    DOF_LoadFile();//Du solltest das nicht benutzen.
    DOF_SaveFile();//Benutze es, um die geladene Datei zu speichern.
    DOF_PrintFile(comment[]="");//Schreibt die geladene Datei in die Serverlog.
    DOF_GetString(file[],key[]);//Returnt ein String einer Datei
    DOF_GetStringEx(file[],key[],result[],len);//Formatiert "result" mit einem String einer Datei.
    DOF_GetFloat(file[],key[]);//Gibt einen Floatwert einer Datei.
    DOF_GetInt(file[],key[]);//Gibt einen Integerwert einer Datei.
    DOF_GetBool(file[],key[]);//Gibt einen Booleanwert einer Datei.
    DOF_SetString(file[],key[],value[]);//Setzt ein String einer Datei.
    DOF_Unset(file[],key[]);//Löscht einen Eintrag.
    DOF_IsSet(file[],key[]);//Überprüft, ob ein Eintrag gesetzt wurde.
    DOF_SetFloat(file[],key[],Float:value);//Setzt einen Floatwert einer Datei
    DOF_SetInt(file[],key[],value);//Setzt einen Integerwert einer Datei.
    DOF_SetBool(file[],key[],bool:value);//Setzt einen Booleanwert einer Datei.
    DOF_FileExists(file[]);//Überprüft ob eine Datei existiert.
    DOF_RemoveFile(file[]);//Löscht eine Datei.
    DOF_CreateFile(file[],password[]="");//Erstellt eine Datei mit einem freiwilligen Passwort, z.B. für Userdateien.
    DOF_RenameFile(oldfile[],newfile[]);//Benennt eine Datei um.
    DOF_RenameKey(file[],oldkey[],newkey[]);//Einen Key umbenennen
    DOF_CopyFile(filetocopy[],newfile[]);//Eine Datei kopieren
    DOF_CheckLogin(file[],password[]);//Überprüft das Password einer Datei.
    DOF_File(file[]);//Gibt den genauen Dateinamen einer Userdatei. (Mithilfe des im Script definierten Pfads.)


    Wie installiere ich Double-O-Files?
    1) Lade Double-O-Files.rar runter und extrahiere es in deinen Serverordner.
    2) Öffne Double-O-Files.inc und ändere diese Werte, wenn nötig:

    #define MAX_ENTRIES 128 // Wieviele Einträge willst du maximal lesen pro Datei?
    #define MAX_KEY_SIZE 64 // Maximale Länge einer Variable eines Eintrages.
    #define MAX_VALUE_SIZE // Maximale Länge eines Wertes.
    #define MAX_FILE_SIZE 64 // Maximale Länge eines Dateinamens.
    #define USER_FILE_PATH "%s.dudb.sav" // Pfad der Userdatei, der Standarddefine ist der Pfad von DUDB.

    3) Kommentiere diese Defines, wenn du DUDB oder DINI nicht nach DOF konvertieren willst.
    #define DUDB_CONVERT
    #define DINI_CONVERT
    4) Füge #include <Double-O-Files> deinem Script hinzu.
    Wenn du DUDB oder DINI nach DOF konvertieren willst, entferne #include <dudb> und #include <Dini>.
    5) Füge DOF_Exit(); bei OnGameModeExit oder OnFilterScriptExit hinzu.
    6) Kompiliere deinen Script.


    Wie benutzt man es?
    Beispiel (ohne DUDB/DINI Konvertierung):
    Beispiel: PASTEBIN


    DOF benutzt das selbe Format wie DINI.

    Code
    Key1=Value1
    Key2=Value2
    Key3=Value3


    Es ist am besten, die geöffnete Datei direkt nach dem nach Speichern der Variablen zu speichern mit DOF_SaveFile();
    ABER es ist NICHT notwendig, denn die geöffnete Datei wird direkt vor dem Öffnen einer neuen Datei gespeichert.


    DINI/DUDB nach DOF konvertieren:
    Eigentlich musst du nur Double-O-Files in dein Script includen und DINI oder DUDB entfernen.
    Danach reicht es eigentlich, DOF_Exit(); bei OnGameModeExit oder OnFilterScriptExit einzufügen.
    DOF beinhaltet Makros für alle DINI und DUDB Funktionen.


    Vielleicht möchtest du noch, wie oben beischrieben, DOF_SaveFile(); benutzen, um die geöffnete Datei sofort zu speichern.


    Bugs?
    Keine Bugs bekannt.
    BITTE MELDE BUGS, WENN DU WELCHE FINDEST!


    Wie schnell ist es?
    Es ist viel schneller als DINI, for allem, wenn man viele Daten auf einmal Speichern oder Laden muss, weil es die Datei nur einmal lädt und neu schreibt.
    Ich habe DOF mit DINI und DJSON auf meinem Homeserver verglichen:
    Während DINI beim schreiben extrem langsam ist und DJSON immer langsamer wird, wenn immer mehr Dateien neu hinzukommen, bleibt DOF ziemlich konstant und schnell.
    >> Pastebin: Testergebnisse


    >> Pastebin für den Testscript (Updated)<<


    Wo kann ich Double-O-Files herunterladen!?


    DOWNLOAD auf Sendspace


    oder


    PASTEBIN (ohne DUtils, was notwendig ist)

  • Wirklich nice!
    10/10


    Vllt. noch CreateFolder oder soetwas in der Art hinzufügen das Ordner erstellt.


    DOF_GetBool(file[],key[]);//Gibt einen Booleanwert einer Datei.
    Gibt das False/True zurück?

    Why do programmers always mix up Halloween and Christmas?
    Oct 31 == Dec 25

  • Wirklich nice!
    10/10


    Vllt. noch CreateFolder oder soetwas in der Art hinzufügen das Ordner erstellt.


    DOF_GetBool(file[],key[]);//Gibt einen Booleanwert einer Datei.
    Gibt das False/True zurück?


    Gibt 0 wenn = 0, gibt 1 wenn nicht 0.
    Also ja, false/true.
    (Allerdings find ichs überflüssig, kannst einfach GetInt benutzen^^)


    Für CreateFolder braucht man ein Plugin.

  • Wirklich nice!
    10/10


    Vllt. noch CreateFolder oder soetwas in der Art hinzufügen das Ordner erstellt.


    DOF_GetBool(file[],key[]);//Gibt einen Booleanwert einer Datei.
    Gibt das False/True zurück?


    Ich schreib glaub ich nachher mal ein Filestream plugin ^^ hast mich auf einer idee gebracht...


    frename - Umbennnen
    fcopy - Kopiert eine Datei
    fdelete - Löscht eine Datei
    ffolder - Erstellt einen Ornder
    fdelfolder - Löscht einen Ordner


    Zum DINI inc, sieht echt echt nice;)

  • Zitat

    Dann habe ich mich dazu entschieden, selbst etwas zu machen, und zwar etwas, das genau für meine Anwendung ist.
    Also habe ich Double-O-Files geschrieben.


    xD wie leicht du das so sagen kannst, wielange hast du dafür gebraucht?
    ich meine gelesen zu haben, dass du aus samp weg bist?


    sonst geb ich dir 10/10 dafür weil es eifnach genial ist

  • Genau so ein Plugin gibt es im Englischen Forum schon ^^


    Nice Arbeit,
    10/10 ich denke mal das wird bis jetzt das beste Filesystem sein (Oder zumindest das schnellste).


    MFG DurtyFree

  • Hab ne frage
    bekomm immer ein warning
    warning ret_memcpy is never used
    wodurch wird das ausgelöst und kann man das anders als mit weg bekommen?
    #pragma unused ret_memcpy
    Und ist es immernoch eine der schnellsten daten speicherungs system oder gibs schon noch schnellere?