Freigabe SQLite3MC Version 2.5.0

Die auf SQLite 3.53.4 basierende Version 2.5.0 der SQLite-Verschlüsselungserweiterung SQLite3 Multiple Ciphers wurde freigegeben.
Da die für diese Version vorgenommenen Änderungen — zumindest zur Zeit — keinerlei Auswirkungen auf die Funktionsweise der abhängigen Komponenten wxSQLite3, SQLite3MC-NuGet und apsw-sqlite3mc haben, wurden diese nicht - wie sonst üblich - aktualisiert.
Im Zusammenhang mit den NuGet-Pakten von SQLite3MC hatte ein Anwender von einem Problem berichtet, wenn eine Anwendung mehr als eine Instanz der SQLite-Bibliothek im gleichen Prozessadressraum geladen hat. Da SQLite3MC ein Drop-In-Replacement für die originale SQLite-Bibliothek ist, kann und wird es unter solchen Umständen leicht zu Linker-Konflikten und/oder Laufzeit-Konflikten und im schlimmsten Fall zu beschädigten Datenbankdateien kommen.
Grundsätzlich sollte es, wenn irgend möglich, vermieden werden, mehrere SQLite-Instanzen parallel zu laden, da SQLite selbst keine Vorkehrungen trifft, in einer solchen Umgebung störungsfrei zu funktionieren. Allerdings kommen in der Praxis gelegentlich Situationen auf, in denen es unvermeidbar ist, 2 oder mehr SQLite-Instanzen im Prozessaddressraum zu haben - z.B., wenn eine Dritt-Komponente eine eigene SQLite-Version im Gepäck hat.
Unkritisch ist der Betrieb von 2 oder mehr SQLite-Instanzen innerhalb des gleichen Prozesses nur dann, wenn die Mengen der geöffneten Datenbanken je Instanz disjunkt sind. Allerdings entsteht dabei abhängig von der Betriebssystemplattform in der Regel ein Linker-Problem. Dies gilt insbesondere dann, wenn der Funktionsumfang der verschiedenen Instanzen unterschiedlich ist, denn dann reicht es eben nicht, dafür zu sorgen, dass eine bestimmte Instanz vom Linker vorrangig angesprochen wird.
Die Lösung, die die neue Version optional zur Verfügung stellt, besteht darin, die SQLite-Instanz nahezu vollständig vor dem Linker zu verbergen. Dies geschieht dadurch, dass sämtliche Funktionen der SQLite-Schnittstelle ausschließlich über Dispatch-Tabellen zugänglich sind. Nur die Adressen dieser Dispatch-Tabellen sind für den Linker sichtbar. Dadurch, dass die Linker-Symbole für die Adressen der Dispatch-Tabellen konfigurierbar sind, lassen sich potentielle Konflikte nahezu vollständig vermeiden.
Für die Anwendungsprogrammierung ändert sich de facto nichts, da die SQLite-Funktionsnamen mit Hilfe des C-Präprozessors auf die Dispatch-Tabellen abgebildet werden. Im Prinzip ist dieser Mechanismus bereits aus der Entwicklung von dynamisch ladbaren SQLite-Erweiterungen bekannt. Und tatsächlich wird genau dieser Mechanismus mitgenutzt, da darin die SQLite-Schnittstelle nahezu vollständig bereitgestellt wird. Nur die darin fehlenden Funktionen müssen über eine eigene Dispatch-Tabelle bereitgestellt werden.
Allerdings ist und bleibt es Sache der jeweiligen Anwendung, durch passende Massnahmen dafür zu sorgen, dass keine SQLite-Datenbank gleichzeitig in mehr als einer SQLite-Instanz geöffnet wird.
SQLite3 Multiple Ciphers
Änderungen seit der letzten Freigabe:
- Sichtbarkeit interner Funktionen und globaler Daten angepasst
Viele Funktionen und globale Daten der Kryptoalgorithmen AEGIS und Ascon waren für den Linker sichtbar, was potentiell zu Namenskonflikten führen konnte. Sie wurden daher konsequent als statisch deklariert. - Es wurden zwei Compile-Time-Symbole hinzugefügt:
SQLITE3MC_USE_DISPATCH_TABLEundSQLITE3MC_API_TABLE_PREFIX
Das SymbolSQLITE3MC_USE_DISPATCH_TABLEermöglicht es, alle Symbole derSQLite-API-Funktionen vor dem Linker effektiv zu verbergen, indem Dispatch-Tabellen für den Aufruf der SQLite-API-Funktionen angelegt werden. Dadurch werden Linker- und Laufzeitkonflikte vermieden, falls eine Anwendung nicht vermeiden kann, mehrere SQLite-Instanzen zu laden. Generell sollten es Anwendungen vermeiden, mehrere SQLite-Instanzen zu laden, da dies leicht zu einer Beschädigung der Datenbankdateien führen kann, wenn mehrere SQLite-Instanzen auf dieselbe(n) Datenbankdatei(en) zugreifen. Wenn jedoch jede SQLite-Instanz nur auf eine Menge von Datenbankdateien zugreift, die sich nicht überschneiden, ist es in der Regel unbedenklich, mehrere SQLite-Instanzen im selben Prozess zu betreiben.
Das SymbolSQLITE3MC_API_TABLE_PREFIXermöglicht es, die externen Namen der Dispatch-Tabellen so anzupassen, dass sogar zwei Instanzen von SQLite3MC parallel laufen können, solange sie nicht auf dieselbe(n) Datenbankdatei(en) zugreifen. Ist das Symbol nicht definiert, wird das Standardpräfixsqlite3mcverwendet.