Ejemplo n.º 1
0
        public IEnumerable <Script> GetScripts(ScriptSettings scriptSettings)
        {
            var scripts = new List <Script>();

            if (scriptSettings is not null)
            {
                var scriptSearchOption = scriptSettings.ScriptRecursiveSearch.Value ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;

                // Get scripts
                if (!Directory.Exists(scriptSettings.ScriptBaseDirectory))
                {
                    Logger.LogMessage($"The script base directory {scriptSettings.ScriptBaseDirectory} does not exist.");
                    return(scripts);
                }

                var sqlScripts = Directory.GetFiles(scriptSettings.ScriptBaseDirectory, $"*.{SQL_SCRIPT_EXTENSION}", scriptSearchOption).Select(s => new FileInfo(s)).ToList();
                if (sqlScripts.Any())
                {
                    Logger.LogMessage($"Found total {sqlScripts.Count} sql scripts. Start validating and filtering scripts...");
                }
                else
                {
                    Logger.LogWarning($"Found no sql scripts in {scriptSettings.ScriptBaseDirectory}.");
                }

                // Validate by naming pattern
                sqlScripts = FilterScriptsByNamingPattern(scriptSettings, sqlScripts);
                Logger.LogMessage($"Filtered ");
                scripts = ExtractScriptInformation(scriptSettings, sqlScripts);
                scripts = FilterScriptsByExecutionMode(scriptSettings, scripts);
            }

            return(scripts.OrderBy(i => i.OrderCriteria).ToList());
        }
Ejemplo n.º 2
0
        private List <Script> ExtractScriptInformation(ScriptSettings scriptSettings, List <FileInfo> sqlScripts)
        {
            var validScripts = new List <Script>();

            foreach (var sqlScript in sqlScripts)
            {
                var match = Regex.Match(sqlScript.Name, scriptSettings.ScriptNamePattern);

                // Extract order criteria
                var orderCriteria = match.Groups[1].Value;
                if (string.IsNullOrWhiteSpace(orderCriteria))
                {
                    throw new ArgumentNullException($"The order criteria part cannot be extracted from {sqlScript.Name}");
                }

                var uniqueScriptId = sqlScript.FullName
                                     .Replace(new FileInfo(scriptSettings.ScriptBaseDirectory).Directory.FullName, string.Empty)
                                     .Replace("/", @"\")
                                     .Substring(1);

                // Create new script object
                validScripts.Add(new Script
                {
                    UniqueScriptId = uniqueScriptId,
                    Name           = sqlScript.Name,
                    OrderCriteria  = orderCriteria,
                    MigrationType  = ScriptTypeName,
                    FullFilePath   = sqlScript.FullName
                });
            }

            return(validScripts);
        }
Ejemplo n.º 3
0
        private List <Script> FilterScriptsByExecutionMode(ScriptSettings scriptSettings, List <Script> scripts)
        {
            var filteredScripts = new List <Script>(scripts);

            // Order by descending, newest scripts first
            switch (scriptSettings.ExecutionFilterMode.ToLower())
            {
            case ScriptExecutionFilterMode.FILTER_BY_COUNT:
                var filterCount = int.Parse(scriptSettings.ExecutionFilterValue);
                if (filterCount < 0)
                {
                    throw new ArgumentException($"Invalid execution filter value (count): {filterCount}");
                }

                filteredScripts = filteredScripts.OrderByDescending(s => s.OrderCriteria).Take(filterCount).ToList();
                break;

            case ScriptExecutionFilterMode.FILTER_BY_DAYS:
                var filterDays = double.Parse(scriptSettings.ExecutionFilterValue);
                if (filterDays < 0)
                {
                    throw new ArgumentException($"Invalid execution filter value (days): {filterDays}");
                }

                filteredScripts = filteredScripts.Where(s => DateTime.ParseExact(s.OrderCriteria, "yyyyMMddHHmmss", CultureInfo.InvariantCulture) >= DateTime.Now.AddDays(-filterDays).Date).ToList();
                break;

            case ScriptExecutionFilterMode.FILTER_BY_DATE:
                var filterDate = DateTime.ParseExact(scriptSettings.ExecutionFilterValue, "yyyyMMddHHmmss", CultureInfo.InvariantCulture);
                filteredScripts = filteredScripts.Where(s => DateTime.ParseExact(s.OrderCriteria, "yyyyMMddHHmmss", CultureInfo.InvariantCulture) >= filterDate).ToList();
                break;

            case ScriptExecutionFilterMode.FILTER_BY_ALL:
                // no filtering applied, take all scripts
                break;

            default:
                throw new ArgumentException($"Unknown execution filter mode {scriptSettings.ExecutionFilterMode}");
            }

            // Order by ascending, newest scripts last
            return(filteredScripts);
        }
Ejemplo n.º 4
0
        private List <FileInfo> FilterScriptsByNamingPattern(ScriptSettings scriptSettings, List <FileInfo> sqlScripts)
        {
            var validScripts = new List <FileInfo>();

            foreach (var sqlScript in sqlScripts)
            {
                // Verify script naming convention
                var match = Regex.Match(sqlScript.Name, scriptSettings.ScriptNamePattern);
                if (!match.Success && scriptSettings.TreatScriptNamePatternMismatchAsError.Value)
                {
                    throw new FormatException($"The sql script {sqlScript.FullName} does not meet the naming pattern {scriptSettings.ScriptNamePattern}.");
                }
                else if (!match.Success)
                {
                    Logger.LogWarning($"The sql script {sqlScript.FullName} does not meet the naming pattern {scriptSettings.ScriptNamePattern} and will be ignored.");
                }
                else
                {
                    validScripts.Add(sqlScript);
                }
            }

            return(validScripts);
        }
Ejemplo n.º 5
0
 public Settings()
 {
     PreScripts           = new ScriptSettings();
     PostScripts          = new ScriptSettings();
     ReferenceDataScripts = new ScriptSettings();
 }