AppDbContext: Add ExecuteBatch() and ExecuteScalar()

This commit is contained in:
2024-01-05 13:41:27 +01:00
parent f28a1a2db9
commit 121ca10261
4 changed files with 67 additions and 110 deletions

View File

@ -13,25 +13,13 @@ namespace Elwig.Helpers {
private static int VersionOffset = 0;
private static async Task ExNonQuery(SqliteConnection cnx, string sql) {
using var cmd = cnx.CreateCommand();
cmd.CommandText = sql;
await (await cmd.ExecuteReaderAsync()).CloseAsync();
}
private static async Task<object?> ExScalar(SqliteConnection cnx, string sql) {
using var cmd = cnx.CreateCommand();
cmd.CommandText = sql;
return await cmd.ExecuteScalarAsync();
}
public static async Task<string> CheckDb() {
using var cnx = AppDbContext.Connect();
var applId = (long?)await ExScalar(cnx, "PRAGMA application_id") ?? 0;
var applId = (long?)await AppDbContext.ExecuteScalar(cnx, "PRAGMA application_id") ?? 0;
if (applId != 0x454C5747) throw new Exception("Invalid application_id of database");
var schemaVers = (long?)await ExScalar(cnx, "PRAGMA schema_version") ?? 0;
var schemaVers = (long?)await AppDbContext.ExecuteScalar(cnx, "PRAGMA schema_version") ?? 0;
VersionOffset = (int)(schemaVers % 100);
if (VersionOffset != 0) {
// schema was modified manually/externally
@ -39,7 +27,7 @@ namespace Elwig.Helpers {
}
await UpdateDbSchema(cnx, (int)(schemaVers / 100), RequiredSchemaVersion);
var userVers = (long?)await ExScalar(cnx, "PRAGMA user_version") ?? 0;
var userVers = (long?)await AppDbContext.ExecuteScalar(cnx, "PRAGMA user_version") ?? 0;
var major = userVers >> 24;
var minor = (userVers >> 16) & 0xFF;
var patch = userVers & 0xFFFF;
@ -48,7 +36,7 @@ namespace Elwig.Helpers {
(App.VersionMajor == major && App.VersionMinor > minor) ||
(App.VersionMajor == major && App.VersionMinor == minor && App.VersionPatch > patch)) {
long vers = (App.VersionMajor << 24) | (App.VersionMinor << 16) | App.VersionPatch;
await ExNonQuery(cnx, $"PRAGMA user_version = {vers}");
await AppDbContext.ExecuteBatch(cnx, $"PRAGMA user_version = {vers}");
}
return $"{major}.{minor}.{patch}";
@ -83,7 +71,7 @@ namespace Elwig.Helpers {
if (toExecute.Count == 0)
return;
await ExNonQuery(cnx, """
await AppDbContext.ExecuteBatch(cnx, """
PRAGMA locking_mode = EXCLUSIVE;
PRAGMA foreign_keys = OFF;
BEGIN EXCLUSIVE;
@ -91,9 +79,9 @@ namespace Elwig.Helpers {
foreach (var script in toExecute) {
using var stream = asm.GetManifestResourceStream(script) ?? throw new Exception("Unable to load embedded resource");
using var reader = new StreamReader(stream);
await ExNonQuery(cnx, await reader.ReadToEndAsync());
await AppDbContext.ExecuteBatch(cnx, await reader.ReadToEndAsync());
}
await ExNonQuery(cnx, $"""
await AppDbContext.ExecuteBatch(cnx, $"""
PRAGMA foreign_key_check;
COMMIT;
PRAGMA foreign_keys = ON;