예제 #1
0
        private MigrationScript 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 MigrationScript(script, version, description));
        }
예제 #2
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 <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)      // "*V*"
                       )
                .Select(x =>
                {
                    MigrationUtil.ExtractVersionAndDescription(GetFileName(x), prefix, separator, out string version, out string description);
                    return(new EmbeddedResourceMigrationScript(
                               version,
                               description,
                               name: GetFileName(x),
                               content: assembly.GetManifestResourceStream(x),
                               type: 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());
        }
예제 #3
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>();

            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) // "V*"
                       && f.Name.Substring(f.Name.IndexOf(separator) + separator.Length, prefix.Length).Equals(prefix, StringComparison.OrdinalIgnoreCase) &&         // "*V*"
                       f.Name.EndsWith(suffix, StringComparison.OrdinalIgnoreCase))               // "*.sql"
                .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());
        }
예제 #4
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));
 }
예제 #5
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);
 }
예제 #6
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));
 }
예제 #7
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);
 }