|
Maximale Datenbankgrößen in OAIII
Hallo zusammen,
jetzt habe ich lange gesucht und doch nichts gefunden: wo finde ich die Limitierungen für Datenbanken unter OAIII/OA4 ? Es muss wohl eine maximale Dateigröße bei 32768 kB geben. Läßt sich das umgehen? Gibt es auch Einschränkungen bezüglich der Anzahl von Datensätzen? Gruß Hans Jürgen |
|
EDIT: Lt. Handbuch hast du bei OA4 2048 Byte pro Datensatz bei max. 2.2.Milliarden Datensätzen = 4.0 TB für eine Datei wenn ich mich nicht verrechnet habe.
Über OA3 habe ich leider keine Angaben. |
|
Da stößt Du vorher aber auf das FAT-Limit von 2GB pro file ;)
|
|
In welchem Handbuch und unter welchem Kapitel steht das? Ich habe ja die OA3 Unterlagen hier, finde aber nichts.
|
|
Im Datenbankhandbuch ganz hinten (vor dem Inhaltsverzeichnis).
|
|
Ich habe das OAIII Datenbank-Handbuch, da steht dummerweise nichts. Und auch alle anderen Handbücher habe ich durchsucht.
Gibt es eigentlich außer dem OA4-Programmierer-Handbuch noch weitere Handbücher als PDF irgendwo? |
|
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hab nur die OA4 Handbücher ...
|
|
Hallo zusammen,
Ich hab das jetzt mal verifiziert, OA3 hat tatsächlich ein 32MB Limit, es dürfte sich hierbei wohl um einen Design/Programmierfehler handeln. Ich würde es als Bug klassifizieren, nachdem keinerlei Sicherheitsüberprüfungen zu diesem Limit implementiert sind und der Fehler somit für die Datenintegrität gefährlich ist (u.A. zerschießt man sich bei der Reparatur das .IF file). Bevor wir zur weiteren Analyse schreiten gleich vorweg: Dieser Fehler wurde in OA4 behoben, dort kann man also ungestört mit großen Dateien operieren (bei der Netzwerkversion aber meinen Heap-Patch nicht vergessen, dort ist nämlich wiederum ein Speicherüberschreiber bug drinnen, aber das haben wir eh schon in einem anderen Thread abgehandelt). Aufgrund der Natur des Fehlers, ist es leider nicht möglich, das so einfach zu patchen, da hierfür umfangreiche Änderungen des Programmablaufs notwendig wären (Aufruf anderer Funktionen mit anderen Parametern, etc.). Nun zur Fehleranalyse: Schreibt man ein kleines Programm, welches in einer Schleife einfach versucht, die Datenbank zu befüllen und mit dem uns wohl bekannten TRACE-Utility mitprotokolliert, so erhält man kurz vor Abbruch Folgendes: 8 = Filehandle der .DF Datei Code:
42 3A3B:135D lseek(8, 0, 2) = 33551361 ; Länge der Datei?Hier kann man noch nicht ganz verstehen, was los ist, aber beim Reparieren der Datei offenbart sich das Ganze dann etwas detaillierter. Merken wir uns vorerst nur einmal die Adresse der hier zur Anwendung kommenden Funktion, welche lseek aufruft -> 3A3B:135D Repariert man die .DF Datei also mit dem Reparaturtool, so kann man schön sehen, wie die .IF Datei sich kurz vor Abbruch der Reparatur mit einem Fehler selbst zerstört. Auch hier können wir wieder den Trace betrachten (7 ist hier das handle zur .DF Datei, 8 ist das zur .IF Datei): Code:
26C4:24E7 lseek(8, 33550336, 0) = 33550336Der Seek auf Position 2048 sieht wie ein 16bit Integer Überlauf aus, denn unter 16bit Systemen wie DOS ist ein INT nunmal so lang. Die Bestätigung dieser Theorie findet sich, wenn man die Seek-Funktion an der angegebenen Adresse zerlegt, ich habe sie hier dokumentiert und erläutert. Nachdem ich den Debugger in einer anderen Umgebung ausgeführt habe, als den Trace, bitte nicht darüber wundern, dass hier im Dump ein anderes Segment steht als im TRACE: Code:
2393:133A 8BEC mov bp,spJetzt stellt sich noch die Frage, wo diese Funktion aufgerufen wird. Sieht man sich die Returnadresse am Stack an und folgt dieser, landet man nach Ausführen der Funktion wieder im UCSD-Pascal PCODE-Interpreter. Anhand der gelesenen Bytes lässt sich feststellen, wo im PCODE wir uns befinden. Es handelt sich um eine Stelle im PASCAL.IMAGE der OA3.SPI, also im PASCAL-Teil der Runtime. Sieht man sich die PCODE Opcodes dort an, so hat man zumindest eine Vermutung, was hier getan wird. Leider sind die PCODE Opcodes der Pascal Runtime für die hier verwendete DOS-Version scheinbar nirgends dokumentiert, sie dürften sich rein von der Logik her auch von der klassischen PCode-Machine für Apple II unterscheiden, leider ist es mir bis heute nicht gelungen heruaszufinden, welches UCSD Development-System hier verwendet wird. Eventuell ist das von SPI selbst gestrickt, oder sie haben es irgendwo zugekauft, es finden sich jedoch keine Spuren davon im Netz, man findet meist nur die alten Runtime-Systeme aus Ende der 70er Jahre. Hier mein "Interpretationsversuch" der Opcodes (alles Hex): Code:
-------------------------------------------------------von PASCAL.IMAGE an, so handelt es sich vermutlich um die UCSD Pascal BlockRead-Funktion: Code:
FUNCTION BLOCKREAD(FILEID: FILE, ARRAY, BLOCKS: INTEGER, [ RELBLOCK: INTEGER] ): INTEGER;Sieht man sich die Adresse der Schreiboperationen beim Datenfile über die 32MB-Grenze hinaus an, so wird man feststellen, dass beim .DF dort dieselbe BlockWrite-Funktion verwendet wird, womit man dort eben genauso in das Limit hineinläuft. Sieht man sich nun einen Trace von OpenAccess IV an derselben Stelle an und überprüft mit einem Debugger auch noch die aufgerufenen Funktionen, so sieht man, dass die BlockRead / BlockWrite Funktionen hier scheinbar nicht mehr verwendet werden, sondern welche, die diese Limitierung nicht mehr haben: Code:
26C4:23AE lseek(8, 33547588, 0) = 33547588Lg. |
|
Du bist wirklich ein absoluter Profi - danke für die Klärung! Bleibt wirklich nur OA4.
Gruß und schönen Sonntag Hans Jürgen |
| Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr. |
Powered by vBulletin® Version 3.8.7 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.