private T Run <T>(Func <IDbConnection, T> acquire) { using (var conn = DbConnectionFactory.OpenConnection()) { return(acquire(conn)); } }
private void ApplyCustomBootstrapping(Versioning versioning, ComposablePartCatalog catalog) { var timestampProviders = InitializeTimestampProviders(catalog, _options.ModuleSelector); using (IDbConnection connection = _dbConnectionFactory.OpenConnection(_connectionInfo)) { using (IDbTransaction transaction = _connectionInfo.SupportsTransactions ? connection.BeginTransaction() : null) { _customBootstrapper.BeginBootstrapping(connection, transaction); // bootstrapping is a "global" operation; therefore we need to call IsContained on *all* migrations var allMigrations = ImportAllMigrations(catalog, timestampProviders) .Select(m => m.Metadata); var migrationsContainedAtBootstrapping = from m in allMigrations where _customBootstrapper.IsContained(m) select m; versioning.UpdateToInclude(migrationsContainedAtBootstrapping, connection, transaction); _customBootstrapper.EndBootstrapping(connection, transaction); if (transaction != null) { transaction.Commit(); } } } }
public void TestScriptingAllMigrations() { DirectoryInfo targetDirectory = PrepareScriptingDirectory(); _options.VersioningTableName = "My Versioning Table"; // test overriding the default versioning table name _options.OnlyScriptSqlTo(targetDirectory); var migrator = new Migrator(ConnectionString, ProviderName, _options); migrator.MigrateAll(typeof(Migration1).Assembly); // assert that all script files were generated List <FileInfo> scriptFiles = targetDirectory.GetFiles(string.Format(CultureInfo.InvariantCulture, "Migration.*.*.sql")) .OrderBy(f => int.Parse(Regex.Match(f.Name, @"Migration\..*\.(\d+)\.sql").Groups[1].Value, CultureInfo.InvariantCulture)) .ToList(); Assert.AreEqual(Migrations.Count, scriptFiles.Count); Assert.AreEqual("Migration." + MigrationExportAttribute.DefaultModuleName + ".1.sql", scriptFiles[0].Name); Assert.AreEqual("Migration." + Migration2.Module + ".2.sql", scriptFiles[1].Name); // assert Versioning table was *not* created as we are scripting only DataTable versioningTable = GetTable(_options.VersioningTableName); Assert.IsNull(versioningTable, string.Format(CultureInfo.CurrentCulture, "The '{0}' table was created altough ScriptingMode was ScriptOnly.", _options.VersioningTableName)); // assert Customer table was *not* created as we are scripting only var migration1 = new Migration1(); DataTable customerTable = GetTable(migration1.Tables[0].Name); Assert.IsNull(customerTable, string.Format(CultureInfo.CurrentCulture, "The '{0}' table was created altough ScriptingMode was ScriptOnly.", migration1.Tables[0].Name)); // execute generated script files against database and recheck results IProviderMetadata providerMetadata; _options.SupportedProviders.GetProvider(ProviderName, out providerMetadata); var info = new ConnectionInfo(ConnectionString, providerMetadata.InvariantName, providerMetadata.SupportsTransactions); var factory = new DbConnectionFactory(); using (IDbConnection connection = factory.OpenConnection(info)) { foreach (FileInfo scriptFile in scriptFiles) { Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Reading script '{0}':", scriptFile.FullName)); string[] scriptLines = File.ReadAllLines(scriptFile.FullName); foreach (string line in scriptLines) { Trace.WriteLine(line); } // group all lines between empty lines into one command (some database platforms require DDL operations to // be executed in separated commands) Trace.WriteLine(Environment.NewLine + string.Format(CultureInfo.CurrentCulture, "Executing script '{0}':", scriptFile.FullName)); string commandText = string.Empty; foreach (string line in scriptLines) { if (line.Trim().Length != 0) { commandText += line; } else { ExecuteCommand(commandText, connection); commandText = string.Empty; } } Assert.IsEmpty(commandText, "The script should end with an empty line."); } } VerifyResultsOfAllMigrations(); // delete script files targetDirectory.Delete(true); }
/// <summary> /// Initializes a new instance of the <see cref="DatabaseWrapper"/> class and connects to the Database /// </summary> public DatabaseWrapper(string connectionName) { Connection = DbConnectionFactory.OpenConnection(connectionName); }