Eine einfache Wrapper-Klasse zur direkten Nutzung von SQLite (sqlite3.dll).
Die Implementierung stellt keine Universal-Schnittstelle dar! Es werden lediglich die Grundfunktionalitäten breitgestellt, diese aber in bequemer Weise.
Quellcode
Der Quellcode steht zur Verfügung unter https://github.com/diub/diub.SQlite3.
Beispiel Klasse
Alle Felder, welche in der Tabelle abgelegt werden sollen, müssen public sein!
public class StorageHash : LUIDRecord { public Int64 FileSize; public byte [] SHA512; public byte [] MD5; /// <summary> /// Laufende Nummer für UNDO. /// </summary> public Id SessionId; }
// SEOS; Serialized Object Storage; bezieht sich auf diub.SeOSQLite internal SQLite3 SEOS; SEOS = new SQLite3 ("C:\\Example.sqlite"); bool b = SEOS.Connect (); // oder SEOS.Open (); ... bool b = SEOS.Disconnect (); // oder SEOS.Close ();
Der Aufruf kann beliebig oft erfolgen: Existiert die Tabelle bereits, wird sie nicht neu angelegt oder verändert.
bool b = SEOS.CreateTable ("StorageTable", typeof (StorageHash));
bool b = SEOS.DropTable ("StorageTable");
// Index über eine Spalte bool b = SEOS.CreateIndex ("StorageTable", "StorageTable_ID", true, nameof (StorageHash.LUID) ); // Index über mehrere Spalten bool b = SEOS.CreateIndex ("StorageTable", "StorageTable_INDEX", true, nameof (StorageHash.FileSize), nameof (StorageHash.MD5), nameof (StorageHash.SHA512) );
Vergleichstypen
Prepare...Query
Vordefinierte Abfrage beschleunigen die Verarbeitung enorm.
Wichtig! Die Datenbank muss bei der Erzeugung geöffnet sein!
In vielen Beispielen zu SQLite wird die Datenbank geöffnet, bearbeitet und anschließend gleich wieder geschlossen. Dieses Vorgehen dient nur dem Beispiel!
Im echten Betrieb wird die Datenbank (global) geöffnet und erst, wenn keine Zugriffe mehr erfolgen sollen, geschlossen.
QueryItem
QueryItem dienen der Definition von Teilabfragen durch Angabe von Feldname und Vergleichstyp (QueryCompareType)!
Abfrage
public SQLite3.SQLiteInsertQuery<StorageHash> insert_query = SEOS.PrepareInsertQuery<StorageHash> ("StorageTable");
Ausführung
StorageHash sh = new StorageHash (Identifier, IFD); bool b = SEOS.Insert<StorageHash> ( insert_query, sh); bool b = insert_query.Insert ( SEOS, sh); // Funktioniert so nur, so lange die Datenbank ständig geöffnet bleibt! // sonst vorher: insert_query.Database = ... ; bool b = insert_query.Insert ( sh);
Abfrage
// Default: QueryCompareType.EQUAL queries = new List<QueryItem> (); queries.Add (new QueryItem (nameof (StorageHash.FileSize))); queries.Add (new QueryItem (nameof (StorageHash.SHA512))); queries.Add (new QueryItem (nameof (StorageHash.MD5))); public SQLite3.SQLiteSelectQuery<StorageHash> select_query; select_query = SEOS.PrepareSelectQuery<StorageHash> ( "StorageTable", queries.ToArray());
Ausführung
List<StorageHash> hashes; byte [] SHA512 = {..}, MD5 = {..}; hashes = SEOS.SelectList<StorageHash> ( select_query, 32184, SHA512, MD5); hashes = select_query.SelectList ( SEOS, 32184, SHA512, MD5); // Funktioniert so nur, solage die Datenbank ständig geöffnet bleibt! // sonst vorher: select_query.Database = ... ; hashes = select_query.SelectList ( 32184, SHA512, MD5);
Abfrage
public SQLite3.SQLiteDeleteQuery storage_sessionid_delete_query; query = new QueryItem (nameof (StorageHash.SessionId)); delete_query = SEOS.PrepareDeleteQuery<StorageHash> ( "StorageTable", query);
Ausführung
bool b = SEOS.Delete (delete_query, SessionId); bool b = delete_query.Delete ( SEOS, SessionId); // Funktioniert so nur, solage die Datenbank ständig geöffnet bleibt! // sonst vorher: delete_query.Database = ... ; bool b = delete_query.Delete (SessionId);
Die Aktualisierung ist dual implementiert.
Abfrage
public SQLite3.SQLiteUpdateQuery storage_sessionid_update_query; query = new QueryItem (nameof (StorageHash.SessionId)); update_query = PrepareUpdateQuery<StorageHash> ("StorageTable", query);
Ausführung
StorageHash sh = new StorageHash (Identifier, IFD); bool b = SEOS.UpdateOrInsert<StorageHash> ( update_query, sh, storage_hash.SessionId); bool b = update_query.UpdateOrInsert ( SEOS, sh, storage_hash.SessionId); // Funktioniert so nur, solage die Datenbank ständig geöffnet bleibt! // sonst vorher: update_query.Database = ... ; bool b = update_query.UpdateOrInsert ( sh, storage_hash.SessionId); ////// bool b = SEOS.UpdateIfExist<StorageHash> ( update_query, sh, storage_hash.SessionId); bool b = update_query.UpdateIfExist ( SEOS, sh, storage_hash.SessionId); // Funktioniert so nur, solage die Datenbank ständig geöffnet bleibt! // sonst vorher: update_query.Database = ... ; bool b = update_query.UpdateIfExist ( sh, storage_hash.SessionId);
Die Abfragen werden nicht zwischengespeichert! Daher ist diese Variante deutlich langsamer.
Auslesen
List<StorageHash> hashes; query = new QueryItem ( nameof (StorageHash.FileSize), 32876, QueryCompareType.Equal ); hashes = SEOS.QueryList<StorageHash> ("StorageHash", query);
Einen (den ersten gefundenen) oder Keinen (bzw. default (T))
StorageHash hash; query = new QueryItem ( nameof (StorageHash.FileSize), 32876, QueryCompareType.Equal ); hash = SEOS.QueryOne<StorageHash> ("StorageHash", query);
Für Details zu Transaktionen siehe die originale SQLite-Dokumentation!
bool b; b = SEOS.BeginTransaction (); b = SEOS.Commit (); b = SEOS.Rollback ()
TransactionModes
Manuelle Transaktionen beschleunigen Insert-, Delete- und Update-Operationen. Einzeloperationen werden automatisch immer in eine Begin-Commit-Abfolge eingebettet und sind daher sehr langsam!
Daher weden 2 sehr unterschiedliche Transaktions-Modi (TransactionMode) unterstützt:
Die hier vorgestellten Funktionen ändern die Strukturen einer Tabelle. Vordefinierte Abfragen verlieren dadurch ihre Gültigkeit!
bool b; b = AddColumn ("StorageHash", "SpalteX", typeof (string)); b = DropColumn ("StorageHash", "SpalteX"); b = RenameColumn ("StorageHash", "SpalteX", "SpalteY"); b = RenameTable ("StorageHash", "StorageHashBackup")