Ich arbeite gerade an einer kleinen dynamischen Tabellendatenbank, die
ich für den zukünftigen PBOR benutzen möchte. Bisher fehlen noch
jegliche Optimierungen für die Suche in der Datenbank, aber ich habe
schon einige Ideen.
Hier ist der Code mit kommentiertem Beispiel am Ende. Leider habe ich
gerade keine Zeit um eine Anleitung zu schreiben, aber ihr werdet euch
sicherlich auch so zurechtfinden. Wenn jemand Fehler findet, bitte direkt
melden. So wird auch automatisch der zukünftige PBOR von diesen
Fehlern verschont bleiben.
Aber jetzt endlich mal der Code.
///Edit 1:
Nach helpys Vorschlag nun eine neue Benennung mit 'Row' für Zeilen
und 'Col' (Column) für Spalten.
Außerdem habe ich gerade in der Elektrotechnik-AG die Zeit ein bisschen
genutzt und eine neue DumpToFile-Funktion geschrieben und getestet.
Diese Funktion setzt allerdings eine schon geöffnete Datei voraus,
wodurch man dann auch mehrere Tabellen in eine Datei schreiben kann.
Die entsprechende Lesefunktion fehlt allerdings noch. Daran werde ich
mich morgen setzen.
Danach fehlt nur noch die Komprimierungsroutine mit dem
BriefLZ-Algorithmus, den ich damals schon für den PBOR benutzt hatte und
den Rings mir schon vorzeitig bereit gestellt hat. Danke nochmal an ihn.
///Edit 2:
Eine neue Version der Datenbank ist online!
+ Added: Passive DumpToFile-Funktion, d.h. man muss die Datei selbst öffnen. Rückgabe sind die geschriebenen Bytes
+ Added: Mit der Funktion DB_Free kann die Datenbank aus dem Speicher gelöscht werden
+ Added: DB_CreateFromDump erstellt eine Datenbank aus einer Datei, die zuvor geöffnet werden muss
+ Fixed: Fehler, wenn man mehr als 128 Einträge erstellen will
+ Fixed: Noch andere blöde Fehler
///Edit 3:
+ Changed: Speicher- und Ladefunktion für die Liste, aber ohne Rückgabe der geschriebenen Bytes
+ Changed: "DB_"-Präfix entfernt
+ Added: Clear()-Funktion zum Löschen der Datenbank, aber nicht auflösen des Interfaces
+ Added: Memory-Typ 'm' - um ganze Speicherblöcke in die Datenbank zu werfen. Ausgelesen wird immer nur der Pointer zum Speicher. Löschfunktion folgt noch, bis dahin einfach einen leeren String übergeben.
///Edit 4:
+ Fixed: Kleiner Fehler, den ich schonmal hatte
+ Changed: bessere interne Verwaltung der Rows (Zeilen)
///Edit 5:
+ Changed: Alle SelectRowByEntry()-Funktionen beginnen die Suche auf der aktuellen Zeile. Also vorher immer FirstRow() benutzen, wenn es nicht anders gewünscht ist
+ Changed: SelectRowByEntryS() funktioniert jetzt auch mit Wildcards, wenn der optionale Parameter mask auf #True gesetzt wird.
+ Added: SelectRowByEntryD() wählt auf Wunsch alle Doubles aus, die in einem bestimmten Bereich liegen, den man mit dem Parameter range angeben kann. Praktisch wegen den Ungenauigkeiten bei Fließkommazahlen
+ Added: Alle DB_ListByEntry()-Funktionen funktionieren wie die SelectRowByEntry()-Funktionen, erwarten aber eine LinkedList des Typs l, in die alle Indices geschrieben werden, wo der Suchparameter zutrifft. Leider kann ich die Funktionen nicht ins Interface mitaufnehmen, weil dort keine LinkedLists angenommen werden. Bug?
///Edit 6:
+ Added: MatchCase-Parameter nach Umsetzung von Kiffi zum Finden von Strings unabhängig oder abhängig von Groß- und Kleinschreibung.
///Edit 7:
+ Fixed: Kleiner Fehler nach dem Benutzen von ReadDB() und anfügen weiterer Zeilen
+ Added: SetChunkRowSize() nach Kiffis Vorschlag.
///Edit 8: Es gibt einige Änderungen
+ Added: ResetRow() oder SelectRow(0) setzt die aktuelle Zeile vor die erste (ähnlich LinkedList)
+ Changed: Alle SelectRowByEntry()-Funktionen suchen ab einen Eintrag nach dem aktuellen (siehe Beispiele)
+ Added: DeleteRow() hat jetzt einen opt. Parameter zur Auswahl der Zeile
+ Added: GetChunkRowSize() hinzugefügt
+ Added: AddRow() hat einen neuen opt. Parameter für die Angabe der Zeile, hinter der eine neue hinzugefügt werden soll. Mit 0 wird eine Zeile vor der ersten hinzugefügt.
Nun sind die Codes online: ("Ziel speichern unter..." benutzen)
DB.pbi (Die Datenbank als Include)
CompareWithWildcards.pbi (Die Include für die Datenbank)
Beispiele.pb (Beispiele für die Datenbank) <- Nicht mehr vorhanden
Ich habe die ersten beiden Includes ins jaPBe-Include-Verzeichnis gelegt.
Sehr zu empfehlen!

///Edit 9:
Vorweg schonmal: Die Funktion DelCol() bitte noch nicht benutzen. Sie funktioniert noch nicht wirklich richtig.
+Added: AddCol() hat einen neuen zusätzlichen Parameter, mit dem man eine Spalte auch zwischendrin einfügen kann und es geht genauso schnell wie das Einfügen hintendran.
+Added: AddRow() bietet jetzt per optionalen Parameter die Möglichkeit auf einen Schlag einen ganzen Block neuer Zeilen an beliebiger Position zu erstellen.
+Added: LoadDB() zum Laden einer Datenbank mit Angabe des Dateinamens
+Added: SaveDB() zum Speichern eine Datenbank mit Angabe des Dateinamens
+Added: LoadCSV() zum Laden einer CSV-Datei, wie man sie mit Excel exportieren kann. Standardmäßig wird der erste Datensatz der CSV-Datei als Spaltennamen verwendet. Per Parameter kann das Verhalten geändert werden.
+Added: SaveCSV() zum Speicher als CSV-Datei
+Added: Show() öffnet ein Fenster, das die Datenbank zeigt. Hier können auch einzelne Einträge gelöscht werden. Eigentlich nur praktisch zu Debug-Zwecken
+Fixed: Ein paar kleinere Fehler wurden behoben, die anscheinend immer nur mir auffallen.

///Edit 10:
+Added: GetLastError() : gibt die letzte Fehlermeldung als Nummer zurück
+Added: SetNoError() : setzt die letzte Fehlermeldung auf "NoError"
+Added: GetErrorText(Error.l) : gibt die letzte oder eine bestimmte Fehlermeldung als Text zurück
+Added: SwapCols() : Tauscht zwei Spalten
+Added: SwapRows() : Tauscht zwei Zeilen
+Fixed: DelCol() : funktioniert jetzt anstandslos, aber AddCol() ist noch nicht angepasst. Es gibt trotzdem keine Fehler, nur in bestimmten Situationen schlechte Speichernutzung. Zu besseren Speichernutzung also immer Complete auf #True setzen.
///Edit 11:
So, es gibt wieder ein Update.
+Added: PokeDB() schreibt die Datenbank in einen Speicherbereich
+Added: PeekDB() liest die Datenbank aus einem Speicherbereich
+Added: Size() gibt die Größe der DB, die zum Speichern benötigt wird, an
+Fixed: WriteDB() (somit auch SaveDB()) schreibt jetzt ein etwas anderes Format, womit die Dateigröße pro Zeile auch noch um 4 Byte schrumpft
+Changed: ReadDB() (somit auch LoadDB()) auf WriteDB() angepasst
+Added: Eine Fehlermeldung kam durch PeekDB() und PokeDB() hinzu
+Fixed: Ein paar interne Änderungen, die zu Fehler hätten führen können
Ansonsten bin ich wirklich schwer am Grübeln wie ich das jetzt mit dem
Spalten löschen machen soll, damit der Platz, der beim Löschen entsteht, beim Anfügen einer neuen Spalte auch anständig genutzt wird.
Naja, wie gesagt: Ich bin dran!
///Edit 12:
Und hier kommt das neue Update, komplett überarbeitet... *schwitz*
+Added: SelectEntryByPtr() wählt eine Zeile per Pointer aus (Pointer ändert sich beim Speichern und Laden der Datenbank)
+Added: GetRowPtr() gibt den Pointer der aktuellen oder genannten Zeile zurück
+Added: Eine Fehlermeldung kam durch SelectEntryByPtr() hinzu
+Added: Fehlermeldung #DB_RowNotFound: Wenn ein ungültiger Zeilenpointer übergeben wurde, kann es dazu kommen
+Changed: Jede Funktion nochmal umgekrempelt (viele Änderungen -> viele neue Bugs?)
+Bisher schon 54 Funktionen (!)
Es kann sein, dass ich jetzt irgendwas vergessen hab bei der Auflistung.
(Ohje, ich freu mich schon darauf, die Hilfe zu machen... *puh*)
Die Hashfunktionen kommen bald, sie sind schon zur Hälfte fertig. Ich
werde sie außerdem noch in einem neuen Thread einzeln vorstellen. Aber
die Datenbank wird sie verwenden.
Hier wieder der Quellcode als Link:
DB.pbi (Die Datenbank als Include)
CompareWithWildcards.pbi (Die Include für die Datenbank)
Und wieder ein Beispielcode!