-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMigrator.cs
More file actions
53 lines (47 loc) · 1.39 KB
/
Migrator.cs
File metadata and controls
53 lines (47 loc) · 1.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System.Diagnostics;
using SQLite;
using TimeTracker.Database.Migrations;
using TimeTracker.Migrations;
namespace TimeTracker;
public static class Migrator
{
/// <summary>
/// Order should not be ever changed.
/// Name of migration should include its index for transparency.
/// </summary>
private static readonly List<IDbMigration> Migrations = new()
{
new M1_InitializeDb(),
new M2_AddCategories(),
new M3_AddStatuses(),
new M4_AddUuid(),
new M005_AddTimestampAndReworkElapsed(),
};
public static async Task Migrate(SQLiteAsyncConnection db)
{
int version = 0;
try
{
var versionParam = await db.FindAsync<ControlDb>(pk: (int)ControlDb.ParamId.Version);
version = versionParam?.AsInt ?? 0;
}
catch (SQLiteException)
{
// assuming no ControlDb yet in DB, same as version == 0
}
for (var i = version; i < Migrations.Count; i++)
{
var migration = Migrations[i];
try
{
await migration.Do(db);
}
catch (Exception e)
{
Debug.WriteLine($"Migration {migration.GetType().Name} failed: {e}");
throw;
}
await db.UpdateAsync(new ControlDb(ControlDb.ParamId.Version, i + 1));
}
}
}