Added SQLite storage backend.
This commit is contained in:
parent
999ce86a27
commit
3f6007922c
21 changed files with 665 additions and 245 deletions
SharpChat.SQLite
61
SharpChat.SQLite/SQLiteStorage.cs
Normal file
61
SharpChat.SQLite/SQLiteStorage.cs
Normal file
|
@ -0,0 +1,61 @@
|
|||
using SharpChat.Configuration;
|
||||
using SharpChat.Messages;
|
||||
using System.Data.SQLite;
|
||||
using NativeSQLiteConnection = System.Data.SQLite.SQLiteConnection;
|
||||
|
||||
namespace SharpChat.SQLite;
|
||||
|
||||
public class SQLiteStorage(string connString) : Storage, IDisposable {
|
||||
public const string MEMORY = "file::memory:?cache=shared";
|
||||
public const string DEFAULT = "sharpchat.db";
|
||||
|
||||
public SQLiteConnection Connection { get; } = new SQLiteConnection(new NativeSQLiteConnection(connString).OpenAndReturn());
|
||||
|
||||
public MessageStorage CreateMessageStorage() {
|
||||
return new SQLiteMessageStorage(Connection);
|
||||
}
|
||||
|
||||
public async Task UpgradeStorage() {
|
||||
await new SQLiteMigrations(Connection).RunMigrations();
|
||||
}
|
||||
|
||||
public static string BuildConnectionString(Config config) {
|
||||
return BuildConnectionString(
|
||||
config.ReadValue("path", DEFAULT)!,
|
||||
config.ReadValue("pass")
|
||||
);
|
||||
}
|
||||
|
||||
public static string BuildConnectionString(string path, string? password) {
|
||||
return new SQLiteConnectionStringBuilder {
|
||||
DataSource = string.IsNullOrWhiteSpace(path) ? MEMORY : path,
|
||||
DateTimeFormat = SQLiteDateFormats.ISO8601,
|
||||
DateTimeKind = DateTimeKind.Utc,
|
||||
FailIfMissing = false,
|
||||
ForeignKeys = true,
|
||||
JournalMode = SQLiteJournalModeEnum.Wal,
|
||||
LegacyFormat = false,
|
||||
Password = string.IsNullOrWhiteSpace(password) ? null : password,
|
||||
ReadOnly = false,
|
||||
UseUTF16Encoding = false,
|
||||
}.ToString();
|
||||
}
|
||||
|
||||
private bool disposed = false;
|
||||
|
||||
~SQLiteStorage() {
|
||||
DoDispose();
|
||||
}
|
||||
|
||||
public void Dispose() {
|
||||
DoDispose();
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
private void DoDispose() {
|
||||
if(disposed)
|
||||
return;
|
||||
disposed = true;
|
||||
Connection.Dispose();
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue