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.
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.
//NICHT KOPIEREN UND EINFÜGEN, SCHON IM SCRIPT ENTHALTEN!
#if defined DUDB_CONVERT
#define dUser(%0).( DOF_GetString(DOF_File(%0),
#define dUserSet(%0).( DOF_SetString(DOF_File(%0),
#define dUserINT(%0).( DOF_GetInt(DOF_File(%0),
#define dUserSetINT(%0).( DOF_SetInt(DOF_File(%0),
#define dUserFLOAT(%0).( DOF_GetFloat(DOF_File(%0),
#define dUserSetFLOAT(%0).( DOF_SetFloat(DOF_File(%0),
#define udb_Create(%0,%1) DOF_CreateFile(DOF_File(%0),%1)
#define udb_RenameUser(%0,%1) DOF_RenameFile(DOF_File(%0),DOF_File(%1))
#define udb_Exists(%0) DOF_FileExists(DOF_File(%0))
#define udb_Remove(%0) DOF_RemoveFile(DOF_File(%0))
#define udb_CheckLogin(%0,%1) DOF_CheckLogin(DOF_File(%0),%1)
#define udb_hash num_hash
#define udb_encode DOF_udb_encode
#define udb_decode DOF_udb_decode
#endif
#if defined DINI_CONVERT
#define dini_Exists DOF_FileExists
#define dini_Remove DOF_RemoveFile
#define dini_Create DOF_CreateFile
#define dini_Set DOF_SetString
#define dini_Get DOF_GetString
#define dini_IntSet DOF_SetInt
#define dini_Int DOF_GetInt
#define dini_BoolSet DOF_SetBool
#define dini_Bool DOF_GetBool
#define dini_FloatSet DOF_SetFloat
#define dini_Float DOF_GetFloat
#define dini_Unset DOF_Unset
#define dini_Isset DOF_IsSet
#endif
Alles anzeigen
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)