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

Version: SQLite3 Multiple Ciphers Version

Ä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_TABLE und SQLITE3MC_API_TABLE_PREFIX
    Das Symbol SQLITE3MC_USE_DISPATCH_TABLE ermöglicht es, alle Symbole der SQLite-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 Symbol SQLITE3MC_API_TABLE_PREFIX ermö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äfix sqlite3mc verwendet.
0%