using System; using System.Collections.Generic; using System.Data; using Microsoft.Data.Sqlite; using Migrato.Core; namespace Migrato.Sqlite; /// /// SQLite implementation of /// public class SqliteMigrationProvider : IMigrationProvider { private const string VersionTableName = "migrato_version"; /// public IDbConnection CreateConnection(string connectionString) { var connection = new SqliteConnection(connectionString); connection.Open(); return connection; } /// public void EnsureVersionTable(IDbConnection connection) { using var command = connection.CreateCommand(); command.CommandText = $@"CREATE TABLE IF NOT EXISTS {VersionTableName} ( version INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL, applied_at TEXT NOT NULL );"; command.ExecuteNonQuery(); } /// public IReadOnlyList GetAppliedMigrations(IDbConnection connection) { using var command = connection.CreateCommand(); command.CommandText = $"SELECT version, name, applied_at FROM {VersionTableName};"; var results = new List(); using var reader = command.ExecuteReader(); while (reader.Read()) { results.Add(new AppliedMigration { Version = reader.GetInt64(0), Name = reader.GetString(1), AppliedAt = DateTimeOffset.Parse(reader.GetString(2)), }); } return results; } /// public void RecordMigration(IDbConnection connection, IDbTransaction transaction, Migration migration) { using var command = connection.CreateCommand(); command.Transaction = transaction; command.CommandText = $"INSERT INTO {VersionTableName} (version, name, applied_at) VALUES ($version, $name, $appliedAt);"; AddParameter(command, "$version", migration.Version); AddParameter(command, "$name", migration.Name); AddParameter(command, "$appliedAt", DateTimeOffset.UtcNow.ToString("O")); command.ExecuteNonQuery(); } /// public void RemoveMigration(IDbConnection connection, IDbTransaction transaction, long version) { using var command = connection.CreateCommand(); command.Transaction = transaction; command.CommandText = $"DELETE FROM {VersionTableName} WHERE version = $version;"; AddParameter(command, "$version", version); command.ExecuteNonQuery(); } private static void AddParameter(IDbCommand command, string name, object value) { var parameter = command.CreateParameter(); parameter.ParameterName = name; parameter.Value = value; command.Parameters.Add(parameter); } }