public IEnumerable <SqlScript> Filter(IEnumerable <SqlScript> sorted, HashSet <ExecutedSqlScript> executedScripts, ScriptNameComparer comparer) { return(sorted.Where(x => { var executedScriptsOrdered = executedScripts .OrderByDescending(d => d.Applied);//order them by most recently applied first, grab the latest one applied. IEnumerable <ExecutedSqlScript> executedSqlScripts = executedScriptsOrdered.Where(s => s.Name.Equals(x.Name, StringComparison.OrdinalIgnoreCase)); ExecutedSqlScript executedSqlScript = executedSqlScripts.FirstOrDefault(); //if it's a run always script //if the script has not been run (executedSqlScript ==null) //if the script's hashes do not match bool willRun = x.SqlScriptOptions.ScriptType == ScriptType.RunAlways || executedSqlScript == null || // ScriptType.RunOnce (x.SqlScriptOptions.ScriptType == ScriptType.RunHash && executedSqlScript.Hash != x.Hash); return willRun; })); }
public ExecutedSqlScript[] GetExecutedScripts() { IConnectionManager connectionManager = ConnectionManager(); using (connectionManager.OperationStarting(Log(), new List <SqlScript>(), TransactionMode.SingleTransaction)) { return(connectionManager.ExecuteCommandsWithManagedConnection(dbCommandFactory => { if (journalExists || DoesTableExist(dbCommandFactory)) { Log().WriteInformation("Fetching list of already executed scripts."); IDbCommand command = dbCommandFactory(); command.CommandText = GetJournalEntriesSql(); List <ExecutedSqlScript> executedSqlScripts = new List <ExecutedSqlScript>(); using (IDataReader dataReader = command.ExecuteReader()) { while (dataReader.Read()) { ExecutedSqlScript executedSqlScript = new ExecutedSqlScript(); executedSqlScript.Hash = dataReader.GetString(dataReader.GetOrdinal("Hash")); executedSqlScript.Applied = dataReader.GetDateTime(dataReader.GetOrdinal("Applied")); executedSqlScript.Contents = dataReader.GetString(dataReader.GetOrdinal("Contents")); executedSqlScript.Name = dataReader.GetString(dataReader.GetOrdinal("ScriptName")); executedSqlScripts.Add(executedSqlScript); } } return executedSqlScripts.ToArray(); } else { Log().WriteInformation("Journal table does not exist"); return new ExecutedSqlScript[0]; } })); } }