예제 #1
0
        public override IEnumerable <IMigrationScript> GetMigrations(IEnumerable <string> locations, string prefix, string separator, string suffix)
        {
            List <string> locationList = locations.ToList();

            Check.HasNoNulls(locationList, nameof(locations));
            Check.NotNullOrEmpty(prefix, nameof(prefix));       // V
            Check.NotNullOrEmpty(separator, nameof(separator)); // __
            Check.NotNullOrEmpty(suffix, nameof(suffix));       // .sql

            string[] resourceRefs = _embeddedResourceContext.GetManifestResourceNames();
            var      migrations   = resourceRefs.AsEnumerable()
                                    .Where(resourceRef => resourceRef.EndsWith(suffix, StringComparison.CurrentCultureIgnoreCase))
                                    .Where(resourceRef => locationList.Any(resourceRef.StartsWith))
                                    .Select(resourceRef =>
            {
                var name = ResourceRefToName(resourceRef);
                MigrationUtil.ExtractVersionAndDescription(name, prefix, separator, out string version,
                                                           out string description);
                return((IMigrationScript) new EmbeddedResourceMigrationScript(version, name, description,
                                                                              () => _embeddedResourceContext.GetManifestResourceStream(resourceRef) ??
                                                                              throw new InvalidOperationException($"Bad resource reference: {resourceRef}"),
                                                                              Encoding.UTF8,
                                                                              _normalizeLineEndingsForChecksum));
            })
                                    .OrderBy(migration => migration.Version).ToList();

            CheckForDuplicates(migrations);

            return(migrations);
        }
        public IEnumerable <MigrationScript> GetMigrations(string prefix, string separator, string suffix, Encoding encoding = null)
        {
            Check.NotNullOrEmpty(prefix, nameof(prefix));       // V
            Check.NotNullOrEmpty(separator, nameof(separator)); // __
            Check.NotNullOrEmpty(suffix, nameof(suffix));       // .sql

            var migrations = new List <EmbeddedResourceMigrationScript>();

            foreach (var assembly in _assemblies)
            {
                assembly.GetManifestResourceNames()
                .Where(x => _filters.Any() ? _filters.Any(f => x.StartsWith(f, StringComparison.OrdinalIgnoreCase)) : true)
                .Where(x => x.EndsWith(suffix, StringComparison.CurrentCultureIgnoreCase))
                .Where(x => GetFileName(x).StartsWith(prefix))
                .Select(x =>
                {
                    MigrationUtil.ExtractVersionAndDescription(GetFileName(x), prefix, separator, out string version, out string description);
                    return(new EmbeddedResourceMigrationScript(
                               version: version,
                               description: description,
                               name: GetFileName(x),
                               content: assembly.GetManifestResourceStream(x),
                               encoding: encoding ?? Encoding.UTF8));
                })
                .ToList()
                .ForEach(x => migrations.Add(x));
            }

            return(migrations.Cast <MigrationBase>() // NET 3.5
                   .CheckForDuplicates()
                   .OrderBy(x => x.Version)
                   .Cast <MigrationScript>()          // NET 3.5
                   .ToList());
        }
예제 #3
0
        private IMigrationScript LoadMigrationFromFile(string script, string prefix, string separator)
        {
            Check.FileExists(script, nameof(script));           // V1_3_1__Migration_description.sql
            Check.NotNullOrEmpty(prefix, nameof(prefix));       // V
            Check.NotNullOrEmpty(separator, nameof(separator)); // __

            MigrationUtil.ExtractVersionAndDescription(script, prefix, separator, out string version, out string description);
            return(new FileMigrationScript(script, version, description, normalizeLineEndings: _normalizeLineEndingsForChecksum));
        }
예제 #4
0
        private FileMigrationScript LoadMigrationFromFile(string script, string prefix, string separator, Encoding textEncoding)
        {
            Check.FileExists(script, nameof(script));           // V1_3_1__Migration_description.sql
            Check.NotNullOrEmpty(prefix, nameof(prefix));       // V
            Check.NotNullOrEmpty(separator, nameof(separator)); // __
            Check.NotNull(textEncoding, nameof(textEncoding));

            MigrationUtil.ExtractVersionAndDescription(script, prefix, separator, out string version, out string description);
            return(new FileMigrationScript(script, version, description, textEncoding));
        }
        public IEnumerable <string> LoadSqlStatements(Dictionary <string, string> placeholders, Encoding encoding, string delimiter)
        {
            Check.NotNull(placeholders, nameof(placeholders));
            Check.NotNull(encoding, nameof(encoding));

            string sql = File.ReadAllText(Path, encoding);

            foreach (var entry in placeholders)
            {
                sql = sql.Replace(entry.Key, entry.Value);
            }

            return(MigrationUtil.SplitSqlStatements(sql, delimiter));
        }
예제 #6
0
        public IEnumerable <string> LoadSqlStatements(IDictionary <string, string> placeholders, string delimiter)
        {
            if (placeholders == null || placeholders.Count == 0)
            {
                return(MigrationUtil.SplitSqlStatements(StreamToString(), delimiter));
            }

            var sql = new StringBuilder(StreamToString());

            foreach (var entry in placeholders)
            {
                sql.Replace(entry.Key, entry.Value);
            }
            return(MigrationUtil.SplitSqlStatements(sql.ToString(), delimiter));
        }
예제 #7
0
        public IEnumerable <MigrationScript> GetRepeatableMigrations(string prefix, string separator, string suffix, Encoding?encoding = null)
        {
            Check.NotNullOrEmpty(prefix, nameof(prefix));       // R
            Check.NotNullOrEmpty(separator, nameof(separator)); // __
            Check.NotNullOrEmpty(suffix, nameof(suffix));       // .sql

            var migrations = new List <EmbeddedResourceMigrationScript>();

            encoding ??= Encoding.UTF8;

            foreach (var assembly in _assemblies)
            {
                assembly.GetManifestResourceNames()
                .Where(x => _filters.Any() ? _filters.Any(f => x.StartsWith(f, StringComparison.OrdinalIgnoreCase)) : true)
                .Where(x => x.EndsWith(suffix, StringComparison.OrdinalIgnoreCase))
                .Where(x =>
                       //GetFileName(x).StartsWith(prefix, StringComparison.OrdinalIgnoreCase)
                       GetFileName(x).Substring(GetFileName(x).IndexOf(separator) + separator.Length, prefix.Length).Equals(prefix, StringComparison.OrdinalIgnoreCase)      // "*R*"
                       )
                .Select(x =>
                {
                    MigrationUtil.ExtractDescription(GetFileName(x), prefix, separator, out string description);
                    return(new EmbeddedResourceMigrationScript(
                               version: null,
                               description,
                               name: GetFileName(x),
                               content: assembly.GetManifestResourceStream(x),
                               type: MetadataType.RepeatableMigration,
                               encoding));
                })
                .ToList()
                .ForEach(x => migrations.Add(x));
            }

            return(migrations.Cast <MigrationBase>() // NET 3.5
                   .CheckForDuplicateName()
                   .OrderBy(x => x.Name)
                   .Cast <MigrationScript>()          // NET 3.5
                   .ToList());
        }
예제 #8
0
        public IEnumerable <MigrationScript> GetRepeatableMigrations(string prefix, string separator, string suffix, Encoding?encoding = null)
        {
            Check.NotNullOrEmpty(prefix, nameof(prefix));       // R
            Check.NotNullOrEmpty(separator, nameof(separator)); // __
            Check.NotNullOrEmpty(suffix, nameof(suffix));       // .sql

            var migrations = new List <FileMigrationScript>();

            encoding ??= Encoding.UTF8;

            foreach (string location in _locations.Distinct(StringComparer.OrdinalIgnoreCase)) // Remove duplicate locations if any
            {
                DirectoryInfo dirToScan = ResolveDirectory(location);
                if (!dirToScan.Exists)
                {
                    continue;
                }

                dirToScan.GetFiles("*", SearchOption.AllDirectories)   // Get scripts recursively
                .Where(f => !migrations.Any(m => m.Path == f.FullName) // Scripts not already loaded
                       //&& f.Name.StartsWith(prefix, StringComparison.OrdinalIgnoreCase) // "R*"
                       && f.Name.Substring(f.Name.IndexOf(separator) + separator.Length, prefix.Length).Equals(prefix, StringComparison.OrdinalIgnoreCase) &&         // "*R*"
                       f.Name.EndsWith(suffix, StringComparison.OrdinalIgnoreCase))          // "*.sql"
                .Select(f =>
                {
                    MigrationUtil.ExtractDescription(f.FullName, prefix, separator, out string description);
                    return(new FileMigrationScript(f.FullName, version: null, description, MetadataType.RepeatableMigration, encoding));
                })
                .ToList()
                .ForEach(x => migrations.Add(x));
            }

            return(migrations.Cast <MigrationBase>() // NET 3.5
                   .CheckForDuplicateName()
                   .OrderBy(x => x.Name)
                   .Cast <MigrationScript>()          // NET 3.5
                   .ToList());
        }
예제 #9
0
        public IEnumerable <MigrationScript> GetMigrations(string prefix, string separator, string suffix, Encoding encoding = null)
        {
            Check.NotNullOrEmpty(prefix, nameof(prefix));       // V
            Check.NotNullOrEmpty(separator, nameof(separator)); // __
            Check.NotNullOrEmpty(suffix, nameof(suffix));       // .sql

            var    migrations    = new List <FileMigrationScript>();
            string searchPattern = $"{prefix}*{suffix}"; // "V*.sql"

            encoding = encoding ?? Encoding.UTF8;

            foreach (string location in _locations.Distinct(StringComparer.OrdinalIgnoreCase)) // Remove duplicate locations if any
            {
                DirectoryInfo dirToScan = ResolveDirectory(location);
                if (!dirToScan.Exists)
                {
                    continue;
                }

                dirToScan.GetFiles(searchPattern, SearchOption.AllDirectories)   // Get scripts recursively
                .Where(f => !migrations.Any(m => m.Path == f.FullName))          // Scripts not already loaded
                .Select(f =>
                {
                    MigrationUtil.ExtractVersionAndDescription(f.FullName, prefix, separator, out string version, out string description);
                    return(new FileMigrationScript(path: f.FullName, version, description, MetadataType.Migration, encoding));
                })
                .ToList()
                .ForEach(x => migrations.Add(x));
            }

            return(migrations.Cast <MigrationBase>() // NET 3.5
                   .CheckForDuplicateVersion()
                   .OrderBy(x => x.Version)
                   .Cast <MigrationScript>()          // NET 3.5
                   .ToList());
        }
예제 #10
0
 public void When_migration_name_format_is_incorrect_Throws_EvolveConfigurationException(string script)
 {
     Assert.Throws <EvolveConfigurationException>(() => MigrationUtil.ExtractVersionAndDescription(script, "V", "__", out string version, out string description));
 }
예제 #11
0
 public void Can_get_migration_version_and_description(string script, string expectedVersion, string expectedDescription)
 {
     MigrationUtil.ExtractVersionAndDescription(script, "V", "__", out string version, out string description);
     Assert.Equal(expectedVersion, version);
     Assert.Equal(expectedDescription, description);
 }
예제 #12
0
 public void When_repeatable_migration_gets_a_null_version_and_a_description(string script, string expectedDescription)
 {
     MigrationUtil.ExtractDescription(script, "R", "__", out string description);
     Assert.Equal(expectedDescription, description);
 }
예제 #13
0
 internal static void WriteJobNotFoundError(Task task, string jobName, Exception ex)
 {
     MigrationUtil.ThrowOnNullOrEmptyArgument(jobName, "jobName");
     task.WriteError(new MigrationBatchNotFoundException(jobName, ex), ExchangeErrorCategory.Client, null);
 }
예제 #14
0
 public void When_migration_name_format_is_incorrect_Throws_EvolveConfigurationException(string script)
 {
     Assert.Throws <EvolveConfigurationException>(() => MigrationUtil.ExtractVersionAndDescription(script, TestContext.SqlMigrationPrefix, TestContext.SqlMigrationSeparator, out string version, out string description));
 }
예제 #15
0
 public void Can_get_migration_version_and_description(string script, string expectedVersion, string expectedDescription)
 {
     MigrationUtil.ExtractVersionAndDescription(script, TestContext.SqlMigrationPrefix, TestContext.SqlMigrationSeparator, out string version, out string description);
     Assert.Equal(expectedVersion, version);
     Assert.Equal(expectedDescription, description);
 }