示例#1
0
        /// <summary>
        /// Inserts the migration record into the migration table
        /// </summary>
        /// <param name="row">A migration row description</param>
        internal void InsertMigrationRecord(MigrationRow row)
        {
            var cmd = Connection.NewCommand(sql.InsertMigration, transaction);

            cmd.AddParameter("Filename", row.Filename);
            cmd.AddParameter("Hash", row.Hash);
            cmd.AddParameter("ExecutionDate", row.ExecutionDate);
            cmd.AddParameter("Duration", row.Duration);

            cmd.ExecuteNonQuery();
        }
示例#2
0
        internal AlreadyRan(IEnumerable <MigrationRow> rows)
        {
            MigrationRow last = null;

            foreach (var row in rows)
            {
                ByFilename[row.Filename] = row;
                ByHash[row.Hash]         = row;
                last = row;
            }

            Last = last;
        }
示例#3
0
        /// <summary>
        /// Run the migrations commands as based on the migration mode
        /// </summary>
        /// <param name="migration">A migration execution object</param>
        /// <param name="mode">An enum defining the migration mode</param>
        private void RunMigrationCommands(Migration migration, MigrateMode mode)
        {
            BeginMigration(migration.UseTransaction);

            if (mode == MigrateMode.Run)
            {
                Log($"  Running \"{migration.Filename}\" {(migration.UseTransaction ? "" : " (NO TRANSACTION)")}");
            }
            else if (mode == MigrateMode.HashMismatch)
            {
                Log($"  {migration.Filename} has been modified since it was run. It is being run again because --force was used.");
            }
            else
            {
                throw new Exception($"Minimig bug: RunMigrationCommands called with mode: {mode}");
            }

            var sw = new Stopwatch();

            sw.Start();
            foreach (string cmd in migration.SqlCommands)
            {
                int result = db.ExecuteCommand(cmd);
                Log("    Result: " + (result == -1 ? "No Rows Affected" : result + " rows"));
            }
            sw.Stop();

            if (!isPreview || tableExists)
            {
                var recordRow = new MigrationRow()
                {
                    Filename      = migration.Filename,
                    Hash          = migration.Hash,
                    ExecutionDate = DateTime.UtcNow,
                    Duration      = (int)sw.ElapsedMilliseconds,
                };

                if (mode == MigrateMode.Run)
                {
                    db.InsertMigrationRecord(recordRow);
                }
                else
                {
                    db.UpdateMigrationRecordHash(recordRow);
                }
            }

            Log();
            EndMigration(migration);
        }
示例#4
0
        /// <summary>
        /// Update the hash of the migration record
        /// </summary>
        /// <param name="row">A migration row description</param>
        internal void UpdateMigrationRecordHash(MigrationRow row)
        {
            var cmd = Connection.NewCommand(sql.UpdateMigrationHash, transaction);

            cmd.AddParameter("Hash", row.Hash);
            cmd.AddParameter("ExecutionDate", row.ExecutionDate);
            cmd.AddParameter("Duration", row.Duration);
            cmd.AddParameter("Filename", row.Filename);

            int affected = cmd.ExecuteNonQuery();

            if (affected != 1)
            {
                throw new Exception($"Failure updating the migration record. {affected} rows affected. Expected 1.");
            }
        }
示例#5
0
        internal AlreadyRan GetAlreadyRan()
        {
            var results = new List <MigrationRow>();
            var cmd     = _connection.NewCommand(_sql.GetAlreadyRan);

            using (var rdr = cmd.ExecuteReader())
            {
                while (rdr.Read())
                {
                    var row = new MigrationRow();

                    row.Id            = rdr.GetInt32(0);
                    row.Filename      = rdr.GetString(1);
                    row.Hash          = rdr.GetString(2);
                    row.ExecutionDate = rdr.GetDateTime(3);
                    row.Duration      = rdr.GetInt32(4);

                    results.Add(row);
                }
            }

            return(new AlreadyRan(results));
        }