From 46ec4fa3bab824be377214096659b6e98371608d Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Thu, 16 Jun 2011 23:58:50 -0700 Subject: [PATCH] Replaced MigSharp with MigrationsDotNet --- Libraries/MigSharp.dll | Bin 165888 -> 0 bytes Libraries/MigSharp.xml | 1335 ----------------- Migrator.net/Migrator.Providers/Dialect.cs | 46 +- NzbDrone.5.1.ReSharper | 1 + NzbDrone.Core.Test/Framework/MockLib.cs | 4 +- NzbDrone.Core/Datastore/Connection.cs | 2 + .../Datastore/Migrations/Legacy/Migration.cs | 69 - .../Datastore/Migrations/Migration.cs | 112 ++ .../Datastore/Migrations/MigrationExport.cs | 62 - NzbDrone.Core/Datastore/MigrationsHelper.cs | 14 +- NzbDrone.Core/NzbDrone.Core.csproj | 6 +- 11 files changed, 148 insertions(+), 1503 deletions(-) delete mode 100644 Libraries/MigSharp.dll delete mode 100644 Libraries/MigSharp.xml delete mode 100644 NzbDrone.Core/Datastore/Migrations/Legacy/Migration.cs create mode 100644 NzbDrone.Core/Datastore/Migrations/Migration.cs delete mode 100644 NzbDrone.Core/Datastore/Migrations/MigrationExport.cs diff --git a/Libraries/MigSharp.dll b/Libraries/MigSharp.dll deleted file mode 100644 index d0c2659026fd978dda90f828e63a4ce4be4d0f2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165888 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 R?mQ!KWl;WF^#3je{x{5f4FUiF diff --git a/Libraries/MigSharp.xml b/Libraries/MigSharp.xml deleted file mode 100644 index 1dc15a3fc..000000000 --- a/Libraries/MigSharp.xml +++ /dev/null @@ -1,1335 +0,0 @@ - - - - MigSharp - - - - - Represents a type that knows how to provide database-specific DDL statements. - - - - - Checks whether a user created table exists on the database. The returned SQL command must yield 0 if the table does not exist. - - The database name. - The table name. - The SQL command to be executed. - - - - Converts an object to its SQL representation for scripting. - - - - - Creates a tables with the specified - - The name of the new table. - The columns of the new table. - Empty if there are no primary key columns. - The SQL commands to be executed. - - - - Drops a table. - - The SQL commands to be executed. - - - - Adds columns to an existing table. - - The SQL commands to be executed. - - - - Renames an existing table. - - The SQL commands to be executed. - - - - Renames a column of an existing table. - - The SQL commands to be executed. - - - - Removes a column from an existing table. - - The SQL commands to be executed. - - - - Changes the data type of a column. - - The SQL commands to be executed. - - - - Adds an index to a table. - - The SQL commands to be executed. - - - - Drops an index from a table. - - The SQL commands to be executed. - - - - Adds a foreign key constraint to a table. - - The SQL commands to be executed. - - - - Drops a foreign key constraint from a table. - - The SQL commands to be executed. - - - - Adds a primary key constraint to a table. - - The SQL commands to be executed. - - - - Renames the primary key. - - The SQL commands to be executed. - - - - Drops a primary key constraint from a table. - - The SQL commands to be executed. - - - - Adds an unique constraint to a table. - - The SQL commands to be executed. - - - - Drops a unique constraint from a table. - - The SQL commands to be executed. - - - - Drops the default value (constraint) from a column. - - The SQL commands to be executed. - - - - Represents the main entry point to perform migrations. - - - - - Initializes a new instance of . - - Connection string to the database to be migrated. - The name of the provider that should be used for this migrator (). - Options. - - - - Initializes a new instance of for a specific module. - - Connection string to the database to be migrated. - The name of the provider that should be used for this migrator (). - The name of the module whose migrations should be executed. - - - - Initializes a new instance of with default options. - - Connection string to the database to be migrated. - The name of the provider that should be used for this migrator (). - - - - Executes all pending migrations found in . - - The assembly to search for migrations. - Optional assemblies that hold additional migrations. - - - - Executes all migrations required to reach . - - - - Optional assemblies that hold additional migrations. - - - - Retrieves all pending migrations. - - The assembly that contains the migrations. - Optional assemblies that hold additional migrations. - - - - Retrieves all required migrations to reach . - - The assembly that contains the migrations. - The timestamp to migrate to. - When the migration path would require downgrading a migration which is not reversible. - Optional assemblies that hold additional migrations. - - - - Checks if any migrations are pending to be performed. - - The assembly that contains the migrations. - Optional assemblies that hold additional migrations. - - - - Injects a custom version mechanism. - - - - - Injects a custom bootstrapping mechanism. - - - - - Represents a database. - - - - - Creates a new table on the database. - - The name of the new table. - Optionally, the name of the primary key constraint. - - - - Executes a custom query. - - Custom SQL which must be understood by all providers that should be supported by this migration. - - - - Executes a custom action against the . Use this method if you need to directly access the - underlying or . - - - - - Gets the context of the migration. - - - - - Gets existing tables. - - - - - Contains the extension methods for the interface. - - - - - Creates a new table on the database with a default primary key constraint name. - - - - - Represents the context of a migration. - - - - - Gets the metadata describing the underlying provider. - - - - - Represents an index. - - - - - Drops the index. - - - - - Represents an index which is about to be added to a table. - - - - - Adds the index on the provided column. - - - - - Represents a primary key constraint which is about to be added to a table. - - - - - Adds the index on the provided column. - - - - - Represents a batch of s. - - - - - Performs the migrations contained in this batch. - - - - - Raised before each migration that will be executed. - - - - - Raised after each migration that has been executed. - - - - - Gets the number of migrations in this batch. - - - - - Gets a list of s that were used to create new objects (excluding primary key columns). - - - - - Gets a list of s that were used to create primary key columns. - - - - - Gets a list of names of any created objects. - - - - - Gets a list of method names that were used for the migration. - - - - - Represents a collection of existing indexes of a table. - - - - - Gets an index by name. - - - - - Represents an unique constraint. - - - - - Drops the unique constraint. - - - - - Represents a foreign key constraint. - - - - - Drops the foreign key constraint. - - - - - Executes the migration step and updates the versioning information in one transaction. - - Might be null in the case of a bootstrap step. - - - - Executes the migration step and updates the versioning information in one transaction. - - - - - Represents a pair of column names which is used as an element of a foreign key relationship. - - - - - Gets the name of the referencing column. - - - - - Gets the name of the referenced column. - - - - - Represents the version of a database containing all information about past migrations. - - - - - Verifies if a specific migration was executed. - - It might seems odd that this method does not receive a connection. However, the idea is that the object implementing - this interface initializes itself once upon construction and the answers the calls to this method from a cache. - Thus, it would not need to do any round-trip to the database which is important as this method is called for each migration. - - - - - - Updates the versioning to include or exclude the migration depending on the provided . - - Post-condition: if was , must return true. - Otherwise was and must return false. - - - The metadata of the migration to be included in the versioning table. - An open connection to the database containing the versioning table. - The associated transaction. - The direction of the migration. - Used to execute s. - - - - Represents a created table. - - - - - Represents a created table. - - - - - Adds a non-nullable column which is part of the primary key constraint to the table being created. - - - - - Adds a non-nullable column to the table being created. - - - - - Adds a nullable column to the table being created. - - - - - Gets the name of the table. - - - - - Represents a unique constraint which is about to be added to a table. - - - - - Adds the unique constraint on the provided column. - - - - - Declares the support of a specific data type. - - - - - Initializes a new instance. - - - - - Gets the supported data type. - - - - - Gets or sets the maximum length for character data types or the maximum total number of decimal digits for numeric data types. - - - - - Gets or sets the maximum number of decimal digits that can be stored to the right of the decimal point. Scale is a value from 0 through . - - - - - Indicates if the data type can be used in primary key columns. By default, this is false. - - - - - Gets or sets a warning message if there are any restrictions when using this . - The warning message is logged when executing a migration containing this data type. - - - - - Indicates if the data type can be scripted. - - - - - Represents an added column on an existing table. - - - - - Represents a table that was created before. - - - - - Adds a not-nullable column. - - - - - Adds a nullable column. - - - - - Gets the name of the table. - - - - - Specifies the size and the scale of the data type of the column. - - The length for character data types or the maximum total number of decimal digits for numeric data types. - The maximum number of decimal digits that can be stored to the right of the decimal point. Scale must be a value from 0 through . - - - - Adds a default value to the column. - - - - - Adds a default value to the column. - - - - - Adds a default value to the column which is dropped after adding the column to the table. - Use this method to fill a non-nullable column with default values. - - - - - Adds a default value to the column which is dropped after adding the column to the table. - Use this method to fill a non-nullable column with default values. - - - - - Contains the extensions methods for the interface. - - - - - Specifies the size of the data type of the column. - - - The length for character data types or the maximum total number of decimal digits for numeric data types. - - - - Sets the default of the column to be the current system time of the database server. - - - - - Reperesents metadata about an . - - - - - Gets the unique name of this provider. - - - - - Gets the invariant name of the provider needed for . - - - - - Gets an indication if the underlying provider supports transactions. - - - - - Gets an expression that specifies how s are addressed in command texts. The literal 'p' is replaced by the parameter name. - - - - - Gets the maximum length of object names within the database. 0 meaning that there is non restriction which is the default. - - - - - Represents a column on a newly created table. - - - - - Specifies the size and the scale of the data type of the column. - - The length for character data types or the maximum total number of decimal digits for numeric data types. - The maximum number of decimal digits that can be stored to the right of the decimal point. Scale must be a value from 0 through . - - - - Puts the column under an unique constraint. - - Optionally, specify the name of the unique constraint. If null or empty, a default constraint name will be generated. - - - - Makes the column auto-increment. - - - - - Adds a default value to the column. - - - - - Adds a default value to the column. - - - - - Gets the column name. - - - - - This exception is thrown when a requested downgrade path contains an irreversible migration. - - - - - Contains the names of the supported providers. - - - - - Represents the run-time context of a migration. - - - - - Gets the connection which is used to perform the migration. - - - - - Gets the transaction which is used to perform the migration. - - - - - Gets the that should be used to execute database modifying commands. - This ensures that they are logged and scripted consistently. - - - - - Lists special default values for columns. - - - - - Represents the current date time of the database server. - - - - - Represents a collection of providers that should be supported for all migrations. Validation of migrations is performed - against providers contained within this list. - - - - - Initializes a new instance used for unit testing. - - - - - Initializes a new instance which is ready-to-use with the default providers. - - - - - Adds a provider. - - - - - Removes a provider. - - - - - Removes all ODBC providers. - - - - - Sets the collection to a list of providers. - - - - - Resets the collection to support all providers that are delivered with Mig#. - - - - - Gets the names of the providers. - - - - - Represents a collection of existing unique constraints of a table. - - - - - Gets an unique constraint by name. - - - - - Use this attribute to mark classes as migrations. - - - - - The maximum string length for a module name. - - - - - Initializes a new instance of the attribute. - - - - - Gets the name of the module to which this migration belongs to (see also ). - - - - - Gets the tag associated with this migration. - - - - - Represents a migration that can also be downgraded. - - - - - The interface that needs to be implemented in order to define a migration. - Additionally, the must be applied - to a class implementing this interface in order to be recognized as a migration. - - - - - Applies the required changes to the provided for this migration. - - - - - Undoes all changes from the method. - - - - - Represents a foreign key constraint which is about to be added to a table. - - - - - Specifies the columns on which the foreign key is defined. - - - This method is not called 'On', as 'On' is a reserved language keyword (see FxCop rule "Identifiers should not match keywords"). - - - - - Contains information about used data types, longest name, etc. for a specific migration. - - - - - Gets the full type name of the migration for this report. - - - - - Gets the error message for the migration if there was an . - - - - - Gets a list of s that were used to create new objects (including primary key columns). - - - - - Gets a list of s that were used to create primary key columns. - - - - - Gets the longest name of any created objects. - - - - - Gets a list of used provider method names. - - - - - Marks the class as an provider implementing . - - - - - Initializes a new instance. - - - - - Gets the unique name of this provider. - - - - - Gets the invariant name of the provider needed for . - - - - - Gets or sets an indication if the underlying provider supports transactions. True by default. - - - - - Gets an expression that specifies how s are addressed in command texts. The literal 'p' is replaced by the parameter name. - The default is '@p'. - - - - - Gets or sets the maximum length of object names within the database. 0 meaning that there is non restriction which is the default. - - - - - Represents a collection of existing foreign key constraints of a table. - - - - - Gets an foreign key constraint by name. - - - - - Represents an existing column whose data type is being altered. - - - - - Specifies the size and the scale of the new data type of the column. - - The length for character data types or the maximum total number of decimal digits for numeric data types. - The maximum number of decimal digits that can be stored to the right of the decimal point. Scale must be a value from 0 through . - - - - Adds a default value to the column. - - - - - Adds a default value to the column. - - - - - Contains the extensions methods for the interface. - - - - - Specifies the size of the new data type of the column. - - - The length for character data types or the maximum total number of decimal digits for numeric data types. - - - - Sets the default of the column to be the current system time of the database server. - - - - - MigSharp provider for Microsoft SQL Compact Edition 4.0. - - - - - Represents a collection of existing tables. - - - - - Gets a table by its name. - - - - - Represents a collection of existing columns. - - - - - Gets a column by its name. - - - - - Represents an existing column. - - - - - Renames the column. - - - - - Removes the column from its table. - - - - - Alters the column to be a nullable column. - - A new or the old data type of the column. - - - - Alters the column to be a nullable column. - - A new or the old data type of the column. - - - - Gets the name of the column. - - - - - Gets the name of the table of the column. - - - - - Contains the extensions methods for the interface. - - - - - Specifies the size of the data type of the column. - - - The length for character data types or the maximum total number of decimal digits for numeric data types. - - - - Puts the column under an unique constraint with a default constraint name. - - - - - Sets the default of the column to be the current system time of the database server. - - - - - Visits all commands executed against a and translates them into SQL - using a specific . - - - - - Translates the recorded commands on the to SQL commands. - - - - - Represents a SQL data type. - - - - - Initializes a new instance of . - - - - - Used in validation messages and for debugging. - - - - - Gets the length for character data types or the maximum total number of decimal digits for numeric data types. - - - - - Gets the maximum number of decimal digits that can be stored to the right of the decimal point. Scale is a value from 0 through . - - - - - Use this class to configure the behaviour of the . - - - - - Initializes an instance of default options. - - - - - Initializes options that select migrations for specific module only. - - The name of the selected module. Only migrations for this module will be executed. - - - - Suppresses validation warnings for the provider called and the data type under the . - - - - - Outputs the SQL used for the migrations to external files without affecting the database. - - - - - Outputs the SQL used for the migrations to external files without affecting the database. - - - - - Outputs the SQL used for the migrations to external files while migrating the database. - - - - - Outputs the SQL used for the migrations to external files while migrating the database. - - - - - Sets the level of general information being traced. - - - - - Sets the level of SQL information being traced. - - - - - Sets the level of performance information being traced. - - - - - Gets or sets the table name of the versioning table. - - - - - Gets the providers that should be supported for all migrations. Compatibility validation of migrations is performed - against the providers in this collection. - - - - - Gets or sets a function that selects the module based on its name. Only migrations for this module will be executed. - - - - - Expresses under which circumstances a warning should be expressed for a given and its OfSize parameters. - - - - - Suppresses all warnings for the specified . Use diligently. - - - - - Suppresses warnings for the specified when it is used without a specified size. - - - - - Suppresses warnings for the specified when it is used with a specified size. - - - - - Suppresses warnings for the specified when it is used with a specified size and a specified scale. - - - - - Validates s against the list of supported providers. - - - - - Represents a table that was created before. - - - - - Gets the primary key constraint of the table. - - Optionally, the name of the primary key constraint. If null or empty, the default name will be used. - - - - Renames the table. - - - - - Drops the table. - - - - - Adds a primary key constraint to the table. - - Optionally, the primary key constraint name. If null or empty, a default name will be generated. - - - - Adds an index to the table. - - Optionally, the index name. If null or empty, a default name will be generated. - - - - Adds a foreign key constraint to another table. - - The name of the referenced table. - Optionally, the name of the foreign key constraint. If null or empty, a default name will be generated. - - - - Adds an unique constraint to the table. - - Optionally, the name of the unique constraint. If null or empty, a default name will be generated. - - - - Gets the columns of the table. - - - - - Gets the unique constraints of the table. - - - - - Gets the unique constraints of the table. - - - - - Gets the foreign key constraints of the table. - - - - - Represents a primary key constraint. - - - - - Drops the primary key constraint. - - - - - Renames the primary key constraint and all associated resources (e.g. Oracle maintains an index along with the primary key which is renamed, too). - - - - - - Returns the longer string. - - - - - Returns the longest string. - - - - - Creates a name with the following structure: '_[0]_[1]_..._'. - The contained names are shortened such that the complete generated name fits characters. - - The table name. - The postfix to be appended to the name. The postfix will *not* be shortened in any way. - The maximum length of the generated name. - Additional names that should be included in the result which follow the table name. - - - - Event arguments for migration events. - - - - - Initializes a new instance. - - - - - Gets the associated metadata. - - - - - Gets the direction of the migration step. - - - - - Implements a custom bootstrapping logic which is executed if the versioning table of MigSharp doe not exists yet. - - - - - Triggers whatever actions are needed to prepare the custom bootstrapping. This method is called exactly once, - before is called any times. - - The connection used to update the versioning table. - The transaction used to update the versioning table. - - - - Returns true if the migration should be assumed as already executed when bootstrapping the versioning. - - - - - Triggers whatever actions are needed to finish the custom bootstrapping. This method is called exactly once, - after is called any times. - - The connection used to update the versioning table. - The transaction used to update the versioning table. - - - - Contains extension methods for the interface. - - - - - Gets the primary key constraint of the table with the default name. - - - - - Adds a primary key constraint to the table with the default name. - - - - - Adds an index to the table. - - - - - Adds a foreign key constraint to another table with the default name. - - - The name of the referenced table. - - - - Adds an unique constraint to the table with the default name. - - - - - Gets an unique constraint by the name of its first column. - - - - - Gets an foreign key constraint by the name of its referenced table. - - - - - Implements without creating a versioning table until it is really needed. - - - - diff --git a/Migrator.net/Migrator.Providers/Dialect.cs b/Migrator.net/Migrator.Providers/Dialect.cs index 11df04dde..6c1a2fabf 100644 --- a/Migrator.net/Migrator.Providers/Dialect.cs +++ b/Migrator.net/Migrator.Providers/Dialect.cs @@ -9,11 +9,11 @@ namespace Migrator.Providers /// /// Defines the implementations specific details for a particular database. /// - public abstract class Dialect + public abstract class Dialect { private readonly Dictionary propertyMap = new Dictionary(); private readonly TypeNames typeNames = new TypeNames(); - + protected Dialect() { RegisterProperty(ColumnProperty.Null, "NULL"); @@ -26,9 +26,9 @@ namespace Migrator.Providers public ITransformationProvider NewProviderForDialect(string connectionString) { - return (ITransformationProvider) Activator.CreateInstance(TransformationProvider, this, connectionString); + return (ITransformationProvider)Activator.CreateInstance(TransformationProvider, this, connectionString); } - + /// /// Subclasses register a typename for the given type code and maximum /// column length. $l in the type name will be replaced by the column @@ -56,9 +56,9 @@ namespace Migrator.Providers public ColumnPropertiesMapper GetColumnMapper(Column column) { string type = column.Size > 0 ? GetTypeName(column.Type, column.Size) : GetTypeName(column.Type); - if (! IdentityNeedsType && column.IsIdentity) + if (!IdentityNeedsType && column.IsIdentity) type = String.Empty; - + return new ColumnPropertiesMapper(this, type); } @@ -100,15 +100,15 @@ namespace Migrator.Providers public virtual string GetTypeName(DbType type, int length, int precision, int scale) { string resultWithLength = typeNames.Get(type, length, precision, scale); - if (resultWithLength != null) + if (resultWithLength != null) return resultWithLength; return GetTypeName(type); } - + public void RegisterProperty(ColumnProperty property, string sql) { - if (! propertyMap.ContainsKey(property)) + if (!propertyMap.ContainsKey(property)) { propertyMap.Add(property, sql); } @@ -128,22 +128,22 @@ namespace Migrator.Providers { get { return false; } } - + public virtual bool TableNameNeedsQuote { get { return false; } } - + public virtual bool ConstraintNameNeedsQuote { get { return false; } } - + public virtual bool IdentityNeedsType { get { return true; } } - + public virtual bool NeedsNotNullForIdentity { get { return true; } @@ -153,28 +153,40 @@ namespace Migrator.Providers { get { return true; } } - + public virtual string Quote(string value) { return String.Format(QuoteTemplate, value); } - + public virtual string QuoteTemplate { get { return "\"{0}\""; } } - + public virtual string Default(object defaultValue) { + if (defaultValue is String && defaultValue == String.Empty) + { + defaultValue = "''"; + } + return String.Format("DEFAULT {0}", defaultValue); } - + public ColumnPropertiesMapper GetAndMapColumnProperties(Column column) { ColumnPropertiesMapper mapper = GetColumnMapper(column); mapper.MapColumnProperties(column); if (column.DefaultValue != null) + { + if (column.DefaultValue is String && column.DefaultValue.ToString() == string.Empty) + { + column.DefaultValue = @"''"; + } + mapper.Default = column.DefaultValue; + } return mapper; } } diff --git a/NzbDrone.5.1.ReSharper b/NzbDrone.5.1.ReSharper index 6b649dee3..a23a81a3a 100644 --- a/NzbDrone.5.1.ReSharper +++ b/NzbDrone.5.1.ReSharper @@ -21,6 +21,7 @@ unsafe volatile + 140 diff --git a/NzbDrone.Core.Test/Framework/MockLib.cs b/NzbDrone.Core.Test/Framework/MockLib.cs index 85c4cb554..b0585ea21 100644 --- a/NzbDrone.Core.Test/Framework/MockLib.cs +++ b/NzbDrone.Core.Test/Framework/MockLib.cs @@ -73,9 +73,7 @@ namespace NzbDrone.Core.Test.Framework } var connectionString = Connection.GetConnectionString(fileName); - - MigrationsHelper.MigrateDatabase(connectionString); - + var database = Connection.GetPetaPocoDb(connectionString); return database; diff --git a/NzbDrone.Core/Datastore/Connection.cs b/NzbDrone.Core/Datastore/Connection.cs index 1c45779db..e6ecd8a1c 100644 --- a/NzbDrone.Core/Datastore/Connection.cs +++ b/NzbDrone.Core/Datastore/Connection.cs @@ -59,6 +59,8 @@ namespace NzbDrone.Core.Datastore public static IDatabase GetPetaPocoDb(string connectionString) { + MigrationsHelper.Run(connectionString, true); + var profileConnection = ProfiledDbConnection.Get(new SQLiteConnection(connectionString)); Database.Mapper = new CustomeMapper(); diff --git a/NzbDrone.Core/Datastore/Migrations/Legacy/Migration.cs b/NzbDrone.Core/Datastore/Migrations/Legacy/Migration.cs deleted file mode 100644 index 2d5f74f2c..000000000 --- a/NzbDrone.Core/Datastore/Migrations/Legacy/Migration.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Migrator.Framework; - -namespace NzbDrone.Core.Datastore.Migrations.Legacy -{ - [Migration(20110523)] - public class Migration20110523 : Migration - { - public override void Up() - { - Database.RemoveTable(RepositoryProvider.JobsSchema.Name); - } - - public override void Down() - { - throw new NotImplementedException(); - } - } - - [Migration(20110603)] - public class Migration20110603 : Migration - { - public override void Up() - { - Database.RemoveTable("Seasons"); - - MigrationsHelper.RemoveDeletedColumns(Database); - MigrationsHelper.AddNewColumns(Database); - } - - public override void Down() - { - throw new NotImplementedException(); - } - } - - [Migration(20110604)] - public class Migration20110604 : Migration - { - public override void Up() - { - MigrationsHelper.ForceSubSonicMigration(Connection.CreateSimpleRepository(Connection.MainConnectionString)); - - var episodesTable = RepositoryProvider.EpisodesSchema; - //Database.AddIndex("idx_episodes_series_season_episode", episodesTable.Name, true, - // episodesTable.GetColumnByPropertyName("SeriesId").Name, - // episodesTable.GetColumnByPropertyName("SeasonNumber").Name, - // episodesTable.GetColumnByPropertyName("EpisodeNumber").Name); - - Database.AddIndex("idx_episodes_series_season", episodesTable.Name, false, - episodesTable.GetColumnByPropertyName("SeriesId").Name, - episodesTable.GetColumnByPropertyName("SeasonNumber").Name); - - Database.AddIndex("idx_episodes_series", episodesTable.Name, false, - episodesTable.GetColumnByPropertyName("SeriesId").Name); - - MigrationsHelper.RemoveDeletedColumns(Database); - MigrationsHelper.AddNewColumns(Database); - } - - public override void Down() - { - throw new NotImplementedException(); - } - } -} diff --git a/NzbDrone.Core/Datastore/Migrations/Migration.cs b/NzbDrone.Core/Datastore/Migrations/Migration.cs new file mode 100644 index 000000000..b26e4cd12 --- /dev/null +++ b/NzbDrone.Core/Datastore/Migrations/Migration.cs @@ -0,0 +1,112 @@ +using System; +using System.Data; +using Migrator.Framework; + +namespace NzbDrone.Core.Datastore.Migrations +{ + [Migration(20110523)] + public class Migration20110523 : Migration + { + public override void Up() + { + Database.RemoveTable(RepositoryProvider.JobsSchema.Name); + } + + public override void Down() + { + throw new NotImplementedException(); + } + } + + [Migration(20110603)] + public class Migration20110603 : Migration + { + public override void Up() + { + Database.RemoveTable("Seasons"); + } + + public override void Down() + { + throw new NotImplementedException(); + } + } + + [Migration(20110604)] + public class Migration20110616 : Migration + { + public override void Up() + { + Database.AddTable("Series", "SQLite", new[] + { + new Column("SeriesId", DbType.Int32, ColumnProperty.PrimaryKey), + new Column("Title", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("CleanTitle", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("Status", DbType.String, ColumnProperty.Null), + new Column("Overview", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("AirsDayOfWeek", DbType.Int16, ColumnProperty.Null), + new Column("AirTimes", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("Language", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("Path", DbType.String, ColumnProperty.NotNull), + new Column("Monitored", DbType.Boolean, ColumnProperty.NotNull), + new Column("QualityProfileId", DbType.Int16, ColumnProperty.NotNull), + new Column("SeasonFolder", DbType.Boolean, ColumnProperty.NotNull), + new Column("LastInfoSync", DbType.DateTime, ColumnProperty.Null), + new Column("LastDiskSync", DbType.DateTime, ColumnProperty.Null), + }); + + Database.AddTable("Episodes", "SQLite", new[] + { + new Column("EpisodeId", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), + new Column("TvDbEpisodeId", DbType.Int32, ColumnProperty.Null), + new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull), + new Column("SeasonNumber", DbType.Int16, ColumnProperty.NotNull), + new Column("EpisodeNumber", DbType.Int16, ColumnProperty.NotNull), + new Column("Title", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("Overview", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("Ignored", DbType.Boolean, ColumnProperty.NotNull, false), + new Column("EpisodeFileId", DbType.Int32, ColumnProperty.Null), + new Column("AirDate", DbType.DateTime, ColumnProperty.Null), + new Column("GrabDate", DbType.DateTime, ColumnProperty.Null), + }); + + + Database.AddTable("EpisodeFiles", "SQLite", new[] + { + new Column("EpisodeFileId", DbType.Int32, + ColumnProperty.PrimaryKeyWithIdentity), + new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull), + new Column("Path", DbType.String, ColumnProperty.NotNull), + new Column("Quality", DbType.Int16, ColumnProperty.NotNull), + new Column("Proper", DbType.Int16, ColumnProperty.NotNull), + new Column("Size", DbType.Int64, ColumnProperty.NotNull), + new Column("DateAdded", DbType.DateTime, ColumnProperty.NotNull), + new Column("SeasonNumber", DbType.Int16, ColumnProperty.NotNull) + }); + + + Database.AddTable("Config", "SQLite", new[] + { + new Column("Key", DbType.String, ColumnProperty.PrimaryKey), + new Column("Value", DbType.String, ColumnProperty.NotNull), + }); + + Database.AddTable("EpisodeFiles", "SQLite", new[] + { + new Column("HistoryId", DbType.Int64, ColumnProperty.NotNull), + new Column("EpisodeId", DbType.Int32, ColumnProperty.NotNull), + new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull), + new Column("NzbTitle", DbType.String, ColumnProperty.NotNull), + new Column("Date", DbType.DateTime, ColumnProperty.NotNull), + new Column("Quality", DbType.Int16, ColumnProperty.NotNull), + new Column("IsProper", DbType.Boolean, ColumnProperty.NotNull), + new Column("Indexer", DbType.String, ColumnProperty.NotNull) + }); + } + + public override void Down() + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/Migrations/MigrationExport.cs b/NzbDrone.Core/Datastore/Migrations/MigrationExport.cs deleted file mode 100644 index d7714ab1a..000000000 --- a/NzbDrone.Core/Datastore/Migrations/MigrationExport.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Text; -using MigSharp; - -namespace NzbDrone.Core.Datastore.Migrations -{ - [MigrationExport] - internal class Migration1 : IMigration - { - public void Up(IDatabase db) - { - db.CreateTable("Series") - .WithPrimaryKeyColumn("SeriesId", DbType.Int32).AsIdentity() - .WithNullableColumn("Title", DbType.String) - .WithNullableColumn("CleanTitle", DbType.String) - .WithNullableColumn("Status", DbType.String) - .WithNullableColumn("Overview", DbType.String) - .WithNullableColumn("AirsDayOfWeek", DbType.Int16) - .WithNullableColumn("AirTimes", DbType.String) - .WithNullableColumn("Language", DbType.String) - .WithNotNullableColumn("Path", DbType.String) - .WithNotNullableColumn("Monitored", DbType.Boolean) - .WithNotNullableColumn("QualityProfileId", DbType.Int16) - .WithNotNullableColumn("SeasonFolder", DbType.Boolean) - .WithNullableColumn("LastInfoSync", DbType.DateTime) - .WithNullableColumn("LastDiskSync", DbType.DateTime); - - - db.CreateTable("Episodes") - .WithPrimaryKeyColumn("EpisodeId", DbType.Int32).AsIdentity() - .WithNullableColumn("TvDbEpisodeId", DbType.Int32) - - .WithNotNullableColumn("SeriesId", DbType.Int32) - .WithNotNullableColumn("SeasonNumber", DbType.Int16) - .WithNotNullableColumn("EpisodeNumber", DbType.Int16) - .WithNotNullableColumn("Title", DbType.String).HavingDefault(String.Empty) - - .WithNotNullableColumn("Overview", DbType.String).HavingDefault(String.Empty) - .WithNotNullableColumn("Ignored", DbType.Boolean).HavingDefault(false) - .WithNullableColumn("EpisodeFileId", DbType.Int32) - .WithNullableColumn("AirDate", DbType.DateTime) - .WithNullableColumn("GrabDate", DbType.DateTime); - - db.CreateTable("EpisodeFiles") - .WithPrimaryKeyColumn("EpisodeFileId", DbType.Int32).AsIdentity() - .WithNotNullableColumn("SeriesId", DbType.Int32) - .WithNotNullableColumn("Path", DbType.String) - .WithNotNullableColumn("Quality", DbType.Int16) - .WithNotNullableColumn("Proper", DbType.Int16) - .WithNotNullableColumn("Size", DbType.Int64) - .WithNotNullableColumn("DateAdded", DbType.DateTime) - .WithNotNullableColumn("SeasonNumber", DbType.Int16); - - db.CreateTable("Config") - .WithNotNullableColumn("Key", DbType.String).Unique() - .WithNotNullableColumn("Value", DbType.String); - } - } -} diff --git a/NzbDrone.Core/Datastore/MigrationsHelper.cs b/NzbDrone.Core/Datastore/MigrationsHelper.cs index 192c1cd23..fb610e587 100644 --- a/NzbDrone.Core/Datastore/MigrationsHelper.cs +++ b/NzbDrone.Core/Datastore/MigrationsHelper.cs @@ -5,7 +5,6 @@ using System.Linq; using System.Reflection; using System.Text; using Migrator.Framework; -using MigSharp; using NLog; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; @@ -19,6 +18,8 @@ namespace NzbDrone.Core.Datastore { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + public static bool IsMigrated { get; private set; } + public static void Run(string connetionString, bool trace) { Logger.Info("Preparing run database migration"); @@ -51,20 +52,9 @@ namespace NzbDrone.Core.Datastore } } - - public static void MigrateDatabase(string connectionString) - { - var migrator = new MigSharp.Migrator(connectionString, ProviderNames.SQLite); - migrator.MigrateAll(typeof(MigrationsHelper).Assembly); - } - public static void ForceSubSonicMigration(IRepository repository) { - repository.Single(1); - repository.Single(1); - repository.Single(1); repository.Single(1); - repository.Single(1); repository.Single(1); repository.Single(1); } diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index a4df3b791..b3208e305 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -130,9 +130,6 @@ ..\Libraries\Exceptioneer.WindowsFormsClient.dll - - ..\Libraries\MigSharp.dll - False ..\packages\MiniProfiler.1.3\lib\MvcMiniProfiler.dll @@ -174,8 +171,7 @@ - - +