From a48db83be9827e9832e08a39283f4288df850150 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sat, 14 Jan 2012 21:47:13 -0800 Subject: [PATCH] Separated migration for LogDB and Application update. --- Libraries/Migrator.NET/Migrator.Framework.dll | Bin 28160 -> 28160 bytes Libraries/Migrator.NET/Migrator.Framework.xml | 331 +++---- Libraries/Migrator.NET/Migrator.Providers.dll | Bin 78848 -> 78848 bytes Libraries/Migrator.NET/Migrator.Providers.xml | 136 +-- Libraries/Migrator.NET/Migrator.XML | 40 +- Libraries/Migrator.NET/Migrator.dll | Bin 16384 -> 16384 bytes Migrator.net/Migrator.Framework/Column.cs | 126 --- .../Migrator.Framework/ColumnProperty.cs | 50 - .../ForeignKeyConstraint.cs | 11 - Migrator.net/Migrator.Framework/IColumn.cs | 34 - Migrator.net/Migrator.Framework/ILogger.cs | 97 -- Migrator.net/Migrator.Framework/IMigration.cs | 39 - .../ITransformationProvider.cs | 485 ---------- .../Loggers/.svn/all-wcprops | 35 - .../Migrator.Framework/Loggers/.svn/entries | 198 ---- .../.svn/text-base/ConsoleWriter.cs.svn-base | 28 - .../text-base/IAttachableLogger.cs.svn-base | 33 - .../.svn/text-base/ILogWriter.cs.svn-base | 33 - .../Loggers/.svn/text-base/Logger.cs.svn-base | 169 ---- .../text-base/SqlScriptFileLogger.cs.svn-base | 93 -- .../Loggers/ConsoleWriter.cs | 28 - .../Loggers/IAttachableLogger.cs | 33 - .../Migrator.Framework/Loggers/ILogWriter.cs | 33 - .../Migrator.Framework/Loggers/Logger.cs | 169 ---- .../Loggers/SqlScriptFileLogger.cs | 93 -- Migrator.net/Migrator.Framework/Migration.cs | 119 --- .../Migrator.Framework/MigrationAttribute.cs | 53 -- .../Migrator.Framework/MigrationException.cs | 30 - .../Migrator.Framework.csproj | 84 -- .../Migrator.Framework/MigratorDotNet.snk | Bin 596 -> 0 bytes .../SchemaBuilder/.svn/all-wcprops | 77 -- .../SchemaBuilder/.svn/entries | 436 --------- .../.svn/prop-base/ForeignKey.cs.svn-base | 5 - .../.svn/prop-base/IFluentColumn.cs.svn-base | 5 - .../text-base/AddColumnExpression.cs.svn-base | 40 - .../text-base/AddTableExpression.cs.svn-base | 28 - .../DeleteTableExpression.cs.svn-base | 28 - .../.svn/text-base/FluentColumn.cs.svn-base | 80 -- .../.svn/text-base/ForeignKey.cs.svn-base | 39 - .../.svn/text-base/IColumnOptions.cs.svn-base | 13 - .../text-base/IDeleteTableOptions.cs.svn-base | 24 - .../.svn/text-base/IFluentColumn.cs.svn-base | 22 - .../text-base/IForeignKeyOptions.cs.svn-base | 20 - .../ISchemaBuilderExpression.cs.svn-base | 20 - .../RenameTableExpression.cs.svn-base | 31 - .../.svn/text-base/SchemaBuilder.cs.svn-base | 169 ---- .../SchemaBuilder/AddColumnExpression.cs | 40 - .../SchemaBuilder/AddTableExpression.cs | 28 - .../SchemaBuilder/DeleteTableExpression.cs | 28 - .../SchemaBuilder/FluentColumn.cs | 80 -- .../SchemaBuilder/ForeignKey.cs | 39 - .../SchemaBuilder/IColumnOptions.cs | 13 - .../SchemaBuilder/IDeleteTableOptions.cs | 24 - .../SchemaBuilder/IFluentColumn.cs | 22 - .../SchemaBuilder/IForeignKeyOptions.cs | 20 - .../SchemaBuilder/ISchemaBuilderExpression.cs | 20 - .../SchemaBuilder/RenameTableExpression.cs | 31 - .../SchemaBuilder/SchemaBuilder.cs | 169 ---- .../Migrator.Framework/StringUtils.cs | 43 - .../ColumnPropertiesMapper.cs | 119 --- Migrator.net/Migrator.Providers/Dialect.cs | 193 ---- .../ForeignKeyConstraintMapper.cs | 24 - .../Migrator.Providers/Impl/.svn/all-wcprops | 5 - .../Migrator.Providers/Impl/.svn/entries | 43 - .../Impl/SQLite/.svn/all-wcprops | 17 - .../Impl/SQLite/.svn/entries | 96 -- .../.svn/text-base/SQLiteDialect.cs.svn-base | 44 - .../SQLiteTransformationProvider.cs.svn-base | 232 ----- .../Impl/SQLite/SQLiteDialect.cs | 44 - .../SQLite/SQLiteTransformationProvider.cs | 232 ----- .../Migrator.Providers.csproj | 119 --- .../Migrator.Providers/MigratorDotNet.snk | Bin 596 -> 0 bytes .../NoOpTransformationProvider.cs | 352 ------- .../TransformationProvider.cs | 881 ------------------ Migrator.net/Migrator.Providers/TypeNames.cs | 130 --- Migrator.net/Migrator/BaseMigrate.cs | 110 --- Migrator.net/Migrator/Compile/ScriptEngine.cs | 118 --- .../Migrator/DuplicatedVersionException.cs | 26 - .../IrreversibleMigrationException.cs | 26 - Migrator.net/Migrator/MigrateAnywhere.cs | 99 -- Migrator.net/Migrator/MigrateDown.cs | 0 Migrator.net/Migrator/MigrateUp.cs | 0 Migrator.net/Migrator/MigrationComparer.cs | 43 - Migrator.net/Migrator/MigrationLoader.cs | 136 --- Migrator.net/Migrator/Migrator.cs | 177 ---- Migrator.net/Migrator/Migrator.csproj | 77 -- Migrator.net/Migrator/MigratorDotNet.snk | Bin 596 -> 0 bytes Migrator.net/Migrator/ProviderFactory.cs | 75 -- Migrator.net/Migrator/Tools/SchemaDumper.cs | 70 -- Migrator.net/config/AssemblyInfo.cs | 27 - NzbDrone.Common/PathExtentions.cs | 4 +- .../Datastore/Migrations/Migration20110707.cs | 31 +- .../Datastore/Migrations/Migration20110726.cs | 9 +- .../Datastore/Migrations/Migration20110909.cs | 9 +- .../Datastore/Migrations/Migration20111011.cs | 9 +- .../Datastore/Migrations/Migration20111112.cs | 9 +- .../Datastore/Migrations/Migration20111125.cs | 12 +- .../Datastore/Migrations/NzbDroneMigration.cs | 41 + NzbDrone.Core/NzbDrone.Core.csproj | 5 + 99 files changed, 330 insertions(+), 7488 deletions(-) delete mode 100644 Migrator.net/Migrator.Framework/Column.cs delete mode 100644 Migrator.net/Migrator.Framework/ColumnProperty.cs delete mode 100644 Migrator.net/Migrator.Framework/ForeignKeyConstraint.cs delete mode 100644 Migrator.net/Migrator.Framework/IColumn.cs delete mode 100644 Migrator.net/Migrator.Framework/ILogger.cs delete mode 100644 Migrator.net/Migrator.Framework/IMigration.cs delete mode 100644 Migrator.net/Migrator.Framework/ITransformationProvider.cs delete mode 100644 Migrator.net/Migrator.Framework/Loggers/.svn/all-wcprops delete mode 100644 Migrator.net/Migrator.Framework/Loggers/.svn/entries delete mode 100644 Migrator.net/Migrator.Framework/Loggers/.svn/text-base/ConsoleWriter.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/Loggers/.svn/text-base/IAttachableLogger.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/Loggers/.svn/text-base/ILogWriter.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/Loggers/.svn/text-base/Logger.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/Loggers/.svn/text-base/SqlScriptFileLogger.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/Loggers/ConsoleWriter.cs delete mode 100644 Migrator.net/Migrator.Framework/Loggers/IAttachableLogger.cs delete mode 100644 Migrator.net/Migrator.Framework/Loggers/ILogWriter.cs delete mode 100644 Migrator.net/Migrator.Framework/Loggers/Logger.cs delete mode 100644 Migrator.net/Migrator.Framework/Loggers/SqlScriptFileLogger.cs delete mode 100644 Migrator.net/Migrator.Framework/Migration.cs delete mode 100644 Migrator.net/Migrator.Framework/MigrationAttribute.cs delete mode 100644 Migrator.net/Migrator.Framework/MigrationException.cs delete mode 100644 Migrator.net/Migrator.Framework/Migrator.Framework.csproj delete mode 100644 Migrator.net/Migrator.Framework/MigratorDotNet.snk delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/all-wcprops delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/entries delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/prop-base/ForeignKey.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/prop-base/IFluentColumn.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/AddColumnExpression.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/AddTableExpression.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/DeleteTableExpression.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/FluentColumn.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/ForeignKey.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IColumnOptions.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IDeleteTableOptions.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IFluentColumn.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IForeignKeyOptions.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/ISchemaBuilderExpression.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/RenameTableExpression.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/SchemaBuilder.cs.svn-base delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/AddColumnExpression.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/AddTableExpression.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/DeleteTableExpression.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/FluentColumn.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/ForeignKey.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/IColumnOptions.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/IDeleteTableOptions.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/IFluentColumn.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/IForeignKeyOptions.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/ISchemaBuilderExpression.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/RenameTableExpression.cs delete mode 100644 Migrator.net/Migrator.Framework/SchemaBuilder/SchemaBuilder.cs delete mode 100644 Migrator.net/Migrator.Framework/StringUtils.cs delete mode 100644 Migrator.net/Migrator.Providers/ColumnPropertiesMapper.cs delete mode 100644 Migrator.net/Migrator.Providers/Dialect.cs delete mode 100644 Migrator.net/Migrator.Providers/ForeignKeyConstraintMapper.cs delete mode 100644 Migrator.net/Migrator.Providers/Impl/.svn/all-wcprops delete mode 100644 Migrator.net/Migrator.Providers/Impl/.svn/entries delete mode 100644 Migrator.net/Migrator.Providers/Impl/SQLite/.svn/all-wcprops delete mode 100644 Migrator.net/Migrator.Providers/Impl/SQLite/.svn/entries delete mode 100644 Migrator.net/Migrator.Providers/Impl/SQLite/.svn/text-base/SQLiteDialect.cs.svn-base delete mode 100644 Migrator.net/Migrator.Providers/Impl/SQLite/.svn/text-base/SQLiteTransformationProvider.cs.svn-base delete mode 100644 Migrator.net/Migrator.Providers/Impl/SQLite/SQLiteDialect.cs delete mode 100644 Migrator.net/Migrator.Providers/Impl/SQLite/SQLiteTransformationProvider.cs delete mode 100644 Migrator.net/Migrator.Providers/Migrator.Providers.csproj delete mode 100644 Migrator.net/Migrator.Providers/MigratorDotNet.snk delete mode 100644 Migrator.net/Migrator.Providers/NoOpTransformationProvider.cs delete mode 100644 Migrator.net/Migrator.Providers/TransformationProvider.cs delete mode 100644 Migrator.net/Migrator.Providers/TypeNames.cs delete mode 100644 Migrator.net/Migrator/BaseMigrate.cs delete mode 100644 Migrator.net/Migrator/Compile/ScriptEngine.cs delete mode 100644 Migrator.net/Migrator/DuplicatedVersionException.cs delete mode 100644 Migrator.net/Migrator/IrreversibleMigrationException.cs delete mode 100644 Migrator.net/Migrator/MigrateAnywhere.cs delete mode 100644 Migrator.net/Migrator/MigrateDown.cs delete mode 100644 Migrator.net/Migrator/MigrateUp.cs delete mode 100644 Migrator.net/Migrator/MigrationComparer.cs delete mode 100644 Migrator.net/Migrator/MigrationLoader.cs delete mode 100644 Migrator.net/Migrator/Migrator.cs delete mode 100644 Migrator.net/Migrator/Migrator.csproj delete mode 100644 Migrator.net/Migrator/MigratorDotNet.snk delete mode 100644 Migrator.net/Migrator/ProviderFactory.cs delete mode 100644 Migrator.net/Migrator/Tools/SchemaDumper.cs delete mode 100644 Migrator.net/config/AssemblyInfo.cs create mode 100644 NzbDrone.Core/Datastore/Migrations/NzbDroneMigration.cs diff --git a/Libraries/Migrator.NET/Migrator.Framework.dll b/Libraries/Migrator.NET/Migrator.Framework.dll index 5d62387c9b1a9bbc49e2bac4db1c8379e5f7e8f4..d007c6541bd50f842eee0d1f18589e7a2b5f6170 100644 GIT binary patch literal 28160 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 literal 28160 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 Q_bvDGbp7Ag|927ie>snWc>n+a diff --git a/Libraries/Migrator.NET/Migrator.Framework.xml b/Libraries/Migrator.NET/Migrator.Framework.xml index 4002f9f26..b8e7f4d55 100644 --- a/Libraries/Migrator.NET/Migrator.Framework.xml +++ b/Libraries/Migrator.NET/Migrator.Framework.xml @@ -4,44 +4,6 @@ Migrator.Framework - - - Describe a migration - - - - - Describe the migration - - The unique version of the migration. - - - - The version reflected by the migration - - - - - Set to true to ignore this migration. - - - - - Convert a classname to something more readable. - ex.: CreateATable => Create a table - - - - - - - - - - - - - Log that we have started a migration @@ -131,6 +93,56 @@ The format string ("{0}, blabla {1}"). Parameters to apply to the format string. + + + Represents a table column properties. + + + + + Null is allowable + + + + + Null is not allowable + + + + + Identity column, autoinc + + + + + Unique Column + + + + + Indexed Column + + + + + Unsigned Column + + + + + Foreign Key + + + + + Primary Key + + + + + Primary key. Make the column a PrimaryKey and unsigned + + The main interface to use in Migrations to make changes on a database schema. @@ -625,112 +637,35 @@ The list of Migrations currently applied to the database. + + + Connection string to the database + + Logger used to log details of operations performed during migration - + - Return the plural of a word. - - The singular form - The plural form of - - - - Return the singular of a word. - - The plural form - The singular form of - - - - Capitalizes a word. - - The word to be capitalized. - capitalized. - - - - Defines tranformations to port the database to the current version. + Describe a migration - + - This is run after the Up transaction has been committed + Describe the migration + + The unique version of the migration. + + + + The version reflected by the migration - + - Defines transformations to revert things done in Up. - - - - - This is run after the Down transaction has been committed - - - - - This gets called once on the first migration object. - - - - - Represents the database. - . - - Migration.Framework.ITransformationProvider - - - - Represents a table column properties. - - - - - Null is allowable - - - - - Null is not allowable - - - - - Identity column, autoinc - - - - - Unique Column - - - - - Indexed Column - - - - - Unsigned Column - - - - - Foreign Key - - - - - Primary Key - - - - - Primary key. Make the column a PrimaryKey and unsigned + Set to true to ignore this migration. @@ -752,35 +687,6 @@ - - - Represents a table column. - - - - - Base class for migration errors. - - - - - Handles writing a message to the log medium (i.e. file, console) - - - - - Write this message - - - - - - - Write this message, as a line - - - - A migration is a group of transformation applied to the database schema @@ -835,6 +741,38 @@ + + + Defines tranformations to port the database to the current version. + + + + + This is run after the Up transaction has been committed + + + + + Defines transformations to revert things done in Up. + + + + + This is run after the Down transaction has been committed + + + + + This gets called once on the first migration object. + + + + + Represents the database. + . + + Migration.Framework.ITransformationProvider + Defines tranformations to port the database to the current version. @@ -867,6 +805,52 @@ Migration.Framework.ITransformationProvider + + + Text logger for the migration mediator + + + + + Handles writing a message to the log medium (i.e. file, console) + + + + + Write this message + + + + + + + Write this message, as a line + + + + + + + Represents a table column. + + + + + Convert a classname to something more readable. + ex.: CreateATable => Create a table + + + + + + + + + + + + + Adds a Table to be created to the Schema @@ -895,6 +879,27 @@ Column name to be added IColumnOptions to restrict chaining + + + Return the plural of a word. + + The singular form + The plural form of + + + + Return the singular of a word. + + The plural form + The singular form of + + + + Capitalizes a word. + + The word to be capitalized. + capitalized. + A set of extension methods for the transformation provider to make it easier to @@ -905,9 +910,9 @@ code that creates the tables etc. directly within migration. - + - Text logger for the migration mediator + Base class for migration errors. diff --git a/Libraries/Migrator.NET/Migrator.Providers.dll b/Libraries/Migrator.NET/Migrator.Providers.dll index 89e3d810607d48a12a8fc84aa514dcea2869ec1d..2d9627001fdaae9f8eda5fa026bf926ab5f6658c 100644 GIT binary patch literal 78848 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 V*jWl|)#qPyPwq$m{{K?YCHe{ literal 78848 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%0A($uw0iB+`m$L7sLu=A)9cBTE` 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.Providers + + + Defines the implementations specific details for a particular database. + + + + + Subclasses register a typename for the given type code and maximum + column length. $l in the type name will be replaced by the column + length (if appropriate) + + The typecode + Maximum length of database type + The database type name + + + + Suclasses register a typename for the given type code. $l in the + typename will be replaced by the column length (if appropriate). + + The typecode + The database type name + + + + Get the name of the database type associated with the given + + The DbType + The database type name used by ddl. + + + + Get the name of the database type associated with the given + + The DbType + The database type name used by ddl. + + + + + Get the name of the database type associated with the given + + The DbType + The database type name used by ddl. + + + + + + + Subclasses register which DbTypes are unsigned-compatible (ie, available in signed and unsigned variants) + + + + + + Determine if a particular database type has an unsigned variant + + The DbType + True if the database type has an unsigned variant, otherwise false + Migration transformations provider for Microsoft SQL Server Compact Edition. @@ -190,70 +251,9 @@ The list of Migrations currently applied to the database. - + - Defines the implementations specific details for a particular database. - - - - - Subclasses register a typename for the given type code and maximum - column length. $l in the type name will be replaced by the column - length (if appropriate) - - The typecode - Maximum length of database type - The database type name - - - - Suclasses register a typename for the given type code. $l in the - typename will be replaced by the column length (if appropriate). - - The typecode - The database type name - - - - Get the name of the database type associated with the given - - The DbType - The database type name used by ddl. - - - - Get the name of the database type associated with the given - - The DbType - The database type name used by ddl. - - - - - Get the name of the database type associated with the given - - The DbType - The database type name used by ddl. - - - - - - - Subclasses register which DbTypes are unsigned-compatible (ie, available in signed and unsigned variants) - - - - - - Determine if a particular database type has an unsigned variant - - The DbType - True if the database type has an unsigned variant, otherwise false - - - - Migration transformations provider for PostgreSql (using NPGSql .Net driver) + No Op (Null Object Pattern) implementation of the ITransformationProvider @@ -358,6 +358,11 @@ + + + Migration transformations provider for PostgreSql (using NPGSql .Net driver) + + Summary description for MySqlTransformationProvider. @@ -380,10 +385,5 @@ - - - No Op (Null Object Pattern) implementation of the ITransformationProvider - - diff --git a/Libraries/Migrator.NET/Migrator.XML b/Libraries/Migrator.NET/Migrator.XML index 665acafbd..b88f07386 100644 --- a/Libraries/Migrator.NET/Migrator.XML +++ b/Libraries/Migrator.NET/Migrator.XML @@ -4,9 +4,19 @@ Migrator - + - Comparer of Migration by their version attribute. + Exception thrown when a migration number is not unique. + + + + + Handles loading Provider implementations + + + + + Description of MigrateAnywhere. @@ -23,6 +33,12 @@ The most recently applied Migration. + + + Exception thrown in a migration Down() method + when changes can't be undone. + + Migrations mediator. @@ -99,25 +115,9 @@ Returns the last version of the migrations. - + - Exception thrown in a migration Down() method - when changes can't be undone. - - - - - Exception thrown when a migration number is not unique. - - - - - Handles loading Provider implementations - - - - - Description of MigrateAnywhere. + Comparer of Migration by their version attribute. diff --git a/Libraries/Migrator.NET/Migrator.dll b/Libraries/Migrator.NET/Migrator.dll index 88e7addb7d82b3a36cc17fed3ac34a6d95809a0a..7409148b8b74114215c99546af6e5140a40ef28d 100644 GIT binary patch literal 16384 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 literal 16384 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 b@&7}8wz$91{aZIA|DjC#Ph - /// Represents a table column. - /// - public class Column : IColumn - { - private string _name; - private DbType _type; - private int _size; - private ColumnProperty _property; - private object _defaultValue; - - public Column(string name) - { - Name = name; - } - - public Column(string name, DbType type) - { - Name = name; - Type = type; - } - - public Column(string name, DbType type, int size) - { - Name = name; - Type = type; - Size = size; - } - - public Column(string name, DbType type, object defaultValue) - { - Name = name; - Type = type; - DefaultValue = defaultValue; - } - - public Column(string name, DbType type, ColumnProperty property) - { - Name = name; - Type = type; - ColumnProperty = property; - } - - public Column(string name, DbType type, int size, ColumnProperty property) - { - Name = name; - Type = type; - Size = size; - ColumnProperty = property; - } - - public Column(string name, DbType type, int size, ColumnProperty property, object defaultValue) - { - Name = name; - Type = type; - Size = size; - ColumnProperty = property; - DefaultValue = defaultValue; - } - - public Column(string name, DbType type, ColumnProperty property, object defaultValue) - { - Name = name; - Type = type; - ColumnProperty = property; - DefaultValue = defaultValue; - } - - public string Name - { - get { return _name; } - set { _name = value; } - } - - public DbType Type - { - get { return _type; } - set { _type = value; } - } - - public int Size - { - get { return _size; } - set { _size = value; } - } - - public ColumnProperty ColumnProperty - { - get { return _property; } - set { _property = value; } - } - - public object DefaultValue - { - get { return _defaultValue; } - set { _defaultValue = value; } - } - - public bool IsIdentity - { - get { return (ColumnProperty & ColumnProperty.Identity) == ColumnProperty.Identity; } - } - - public bool IsPrimaryKey - { - get { return (ColumnProperty & ColumnProperty.PrimaryKey) == ColumnProperty.PrimaryKey; } - } - } -} diff --git a/Migrator.net/Migrator.Framework/ColumnProperty.cs b/Migrator.net/Migrator.Framework/ColumnProperty.cs deleted file mode 100644 index 434f89f13..000000000 --- a/Migrator.net/Migrator.Framework/ColumnProperty.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; - -namespace Migrator.Framework -{ - - /// - /// Represents a table column properties. - /// - [Flags] - public enum ColumnProperty - { - None = 0, - /// - /// Null is allowable - /// - Null = 1, - /// - /// Null is not allowable - /// - NotNull = 2, - /// - /// Identity column, autoinc - /// - Identity = 4, - /// - /// Unique Column - /// - Unique = 8, - /// - /// Indexed Column - /// - Indexed = 16, - /// - /// Unsigned Column - /// - Unsigned = 32, - /// - /// Foreign Key - /// - ForeignKey = Unsigned | Null, - /// - /// Primary Key - /// - PrimaryKey = 64 | Unsigned | NotNull, - /// - /// Primary key. Make the column a PrimaryKey and unsigned - /// - PrimaryKeyWithIdentity = PrimaryKey | Identity - } -} diff --git a/Migrator.net/Migrator.Framework/ForeignKeyConstraint.cs b/Migrator.net/Migrator.Framework/ForeignKeyConstraint.cs deleted file mode 100644 index 26d29fbcd..000000000 --- a/Migrator.net/Migrator.Framework/ForeignKeyConstraint.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Migrator.Framework -{ - public enum ForeignKeyConstraint - { - Cascade, - SetNull, - NoAction, - Restrict, - SetDefault - } -} diff --git a/Migrator.net/Migrator.Framework/IColumn.cs b/Migrator.net/Migrator.Framework/IColumn.cs deleted file mode 100644 index aa2a4d183..000000000 --- a/Migrator.net/Migrator.Framework/IColumn.cs +++ /dev/null @@ -1,34 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -using System.Data; - -namespace Migrator.Framework -{ - public interface IColumn - { - ColumnProperty ColumnProperty { get; set; } - - string Name { get; set; } - - DbType Type { get; set; } - - int Size { get; set; } - - bool IsIdentity { get; } - - bool IsPrimaryKey { get; } - - object DefaultValue { get; set; } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/ILogger.cs b/Migrator.net/Migrator.Framework/ILogger.cs deleted file mode 100644 index d6b0cee0e..000000000 --- a/Migrator.net/Migrator.Framework/ILogger.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Migrator.Framework -{ - public interface ILogger - { - /// - /// Log that we have started a migration - /// - /// Start list of versions - /// Final Version - void Started(List currentVersion, long finalVersion); - - /// - /// Log that we are migrating up - /// - /// Version we are migrating to - /// Migration name - void MigrateUp(long version, string migrationName); - - /// - /// Log that we are migrating down - /// - /// Version we are migrating to - /// Migration name - void MigrateDown(long version, string migrationName); - - /// - /// Inform that a migration corresponding to the number of - /// version is untraceable (not found?) and will be ignored. - /// - /// Version we couldnt find - void Skipping(long version); - - /// - /// Log that we are rolling back to version - /// - /// - /// version - /// - void RollingBack(long originalVersion); - - /// - /// Log a Sql statement that changes the schema or content of the database as part of a migration - /// - /// - /// SELECT statements should not be logged using this method as they do not alter the data or schema of the - /// database. - /// - /// The Sql statement to log - void ApplyingDBChange(string sql); - - /// - /// Log that we had an exception on a migration - /// - /// The version of the migration that caused the exception. - /// The name of the migration that caused the exception. - /// The exception itself - void Exception(long version, string migrationName, Exception ex); - - /// - /// Log that we had an exception on a migration - /// - /// An informative message to show to the user. - /// The exception itself - void Exception(string message, Exception ex); - - /// - /// Log that we have finished a migration - /// - /// List of versions with which we started - /// Final Version - void Finished(List currentVersion, long finalVersion); - - /// - /// Log a message - /// - /// The format string ("{0}, blabla {1}"). - /// Parameters to apply to the format string. - void Log(string format, params object[] args); - - /// - /// Log a Warning - /// - /// The format string ("{0}, blabla {1}"). - /// Parameters to apply to the format string. - void Warn(string format, params object[] args); - - /// - /// Log a Trace Message - /// - /// The format string ("{0}, blabla {1}"). - /// Parameters to apply to the format string. - void Trace(string format, params object[] args); - } -} diff --git a/Migrator.net/Migrator.Framework/IMigration.cs b/Migrator.net/Migrator.Framework/IMigration.cs deleted file mode 100644 index eb7a77509..000000000 --- a/Migrator.net/Migrator.Framework/IMigration.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace Migrator.Framework -{ - public interface IMigration - { - string Name { get; } - - /// - /// Represents the database. - /// . - /// - /// Migration.Framework.ITransformationProvider - ITransformationProvider Database { get; set; } - - /// - /// Defines tranformations to port the database to the current version. - /// - void Up(); - - /// - /// This is run after the Up transaction has been committed - /// - void AfterUp(); - - /// - /// Defines transformations to revert things done in Up. - /// - void Down(); - - /// - /// This is run after the Down transaction has been committed - /// - void AfterDown(); - - /// - /// This gets called once on the first migration object. - /// - void InitializeOnce(string[] args); - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/ITransformationProvider.cs b/Migrator.net/Migrator.Framework/ITransformationProvider.cs deleted file mode 100644 index 30a9bf4fd..000000000 --- a/Migrator.net/Migrator.Framework/ITransformationProvider.cs +++ /dev/null @@ -1,485 +0,0 @@ -using System; -using System.Data; -using System.Collections.Generic; - -namespace Migrator.Framework -{ - /// - /// The main interface to use in Migrations to make changes on a database schema. - /// - public interface ITransformationProvider : IDisposable - { - - /// - /// Get this provider or a NoOp provider if you are not running in the context of 'provider'. - /// - ITransformationProvider this[string provider] { get; } - - /// - /// The list of Migrations currently applied to the database. - /// - List AppliedMigrations { get; } - - ILogger Logger { get; set; } - - /// - /// Add a column to an existing table - /// - /// The name of the table that will get the new column - /// The name of the new column - /// The data type for the new columnd - /// The precision or size of the column - /// Properties that can be ORed together - /// The default value of the column if no value is given in a query - void AddColumn(string table, string column, DbType type, int size, ColumnProperty property, object defaultValue); - - /// - /// Add a column to an existing table - /// - /// The name of the table that will get the new column - /// The name of the new column - /// The data type for the new columnd - void AddColumn(string table, string column, DbType type); - - /// - /// Add a column to an existing table - /// - /// The name of the table that will get the new column - /// The name of the new column - /// The data type for the new columnd - /// The precision or size of the column - void AddColumn(string table, string column, DbType type, int size); - - /// - /// Add a column to an existing table - /// - /// The name of the table that will get the new column - /// The name of the new column - /// The data type for the new columnd - /// The precision or size of the column - /// Properties that can be ORed together - void AddColumn(string table, string column, DbType type, int size, ColumnProperty property); - - /// - /// Add a column to an existing table - /// - /// The name of the table that will get the new column - /// The name of the new column - /// The data type for the new columnd - /// Properties that can be ORed together - void AddColumn(string table, string column, DbType type, ColumnProperty property); - - /// - /// Add a column to an existing table with the default column size. - /// - /// The name of the table that will get the new column - /// The name of the new column - /// The data type for the new columnd - /// The default value of the column if no value is given in a query - void AddColumn(string table, string column, DbType type, object defaultValue); - - /// - /// Add a column to an existing table - /// - /// The name of the table that will get the new column - /// An instance of a Column with the specified properties - void AddColumn(string table, Column column); - - /// - /// Add a foreign key constraint - /// - /// The name of the foreign key. e.g. FK_TABLE_REF - /// The table that the foreign key will be created in (eg. Table.FK_id) - /// The columns that are the foreign keys (eg. FK_id) - /// The table that holds the primary keys (eg. Table.PK_id) - /// The columns that are the primary keys (eg. PK_id) - void AddForeignKey(string name, string foreignTable, string[] foreignColumns, string primaryTable, string[] primaryColumns); - - /// - /// Add a foreign key constraint - /// - /// The name of the foreign key. e.g. FK_TABLE_REF - /// The table that the foreign key will be created in (eg. Table.FK_id) - /// The columns that are the foreign keys (eg. FK_id) - /// The table that holds the primary keys (eg. Table.PK_id) - /// The columns that are the primary keys (eg. PK_id) - /// Constraint parameters - void AddForeignKey(string name, string foreignTable, string[] foreignColumns, string primaryTable, string[] primaryColumns, ForeignKeyConstraint constraint); - - /// - /// Add a foreign key constraint - /// - /// - /// The name of the foreign key. e.g. FK_TABLE_REF - /// The table that the foreign key will be created in (eg. Table.FK_id) - /// The column that is the foreign key (eg. FK_id) - /// The table that holds the primary keys (eg. Table.PK_id) - /// The column that is the primary key (eg. PK_id) - void AddForeignKey(string name, string foreignTable, string foreignColumn, string primaryTable, string primaryColumn); - - /// - /// Add a foreign key constraint - /// - /// The name of the foreign key. e.g. FK_TABLE_REF - /// The table that the foreign key will be created in (eg. Table.FK_id) - /// The column that is the foreign key (eg. FK_id) - /// The table that holds the primary key (eg. Table.PK_id) - /// The column that is the primary key (eg. PK_id) - /// Constraint parameters - void AddForeignKey(string name, string foreignTable, string foreignColumn, string primaryTable, string primaryColumn, ForeignKeyConstraint constraint); - - /// - /// Add a foreign key constraint when you don't care about the name of the constraint. - /// Warning: This will prevent you from dropping the constraint since you won't know the name. - /// - /// The table that the foreign key will be created in (eg. Table.FK_id) - /// The column that is the foreign key (eg. FK_id) - /// The table that holds the primary key (eg. Table.PK_id) - /// The column that is the primary key (eg. PK_id) - void GenerateForeignKey(string foreignTable, string foreignColumn, string primaryTable, string primaryColumn); - - /// - /// Add a foreign key constraint when you don't care about the name of the constraint. - /// Warning: This will prevent you from dropping the constraint since you won't know the name. - /// - /// The table that the foreign key will be created in (eg. Table.FK_id) - /// The columns that are the foreign keys (eg. FK_id) - /// The table that holds the primary key (eg. Table.PK_id) - /// The column that is the primary key (eg. PK_id) - void GenerateForeignKey(string foreignTable, string[] foreignColumns, string primaryTable, string[] primaryColumns); - - /// - /// Add a foreign key constraint when you don't care about the name of the constraint. - /// Warning: This will prevent you from dropping the constraint since you won't know the name. - /// - /// The table that the foreign key will be created in (eg. Table.FK_id) - /// The columns that are the foreign keys (eg. FK_id) - /// The table that holds the primary key (eg. Table.PK_id) - /// The columns that are the primary keys (eg. PK_id) - /// Constraint parameters - void GenerateForeignKey(string foreignTable, string[] foreignColumns, string primaryTable, string[] primaryColumns, ForeignKeyConstraint constraint); - - /// - /// Add a foreign key constraint when you don't care about the name of the constraint. - /// Warning: This will prevent you from dropping the constraint since you won't know the name. - /// - /// The table that the foreign key will be created in (eg. Table.FK_id) - /// The columns that are the foreign keys (eg. FK_id) - /// The table that holds the primary key (eg. Table.PK_id) - /// The column that is the primary key (eg. PK_id) - /// Constraint parameters - void GenerateForeignKey(string foreignTable, string foreignColumn, string primaryTable, string primaryColumn, - ForeignKeyConstraint constraint); - - /// - /// Add a foreign key constraint when you don't care about the name of the constraint. - /// Warning: This will prevent you from dropping the constraint since you won't know the name. - /// - /// The current expectations are that there is a column named the same as the foreignTable present in - /// the table. This is subject to change because I think it's not a good convention. - /// - /// The table that the foreign key will be created in (eg. Table.FK_id) - /// The table that holds the primary key (eg. Table.PK_id) - void GenerateForeignKey(string foreignTable, string primaryTable); - - /// - /// Add a foreign key constraint when you don't care about the name of the constraint. - /// Warning: This will prevent you from dropping the constraint since you won't know the name. - /// - /// The current expectations are that there is a column named the same as the foreignTable present in - /// the table. This is subject to change because I think it's not a good convention. - /// - /// The table that the foreign key will be created in (eg. Table.FK_id) - /// The table that holds the primary key (eg. Table.PK_id) - /// - void GenerateForeignKey(string foreignTable, string primaryTable, ForeignKeyConstraint constraint); - - /// - /// Add an Index to a table - /// - /// The name of the index to add. - /// The name of the table that will get the index. - /// If the index will be unique - /// The name of the column or columns that are in the index. - void AddIndex(string name, string table, bool unique, params string[] columns); - - /// - /// Add a primary key to a table - /// - /// The name of the primary key to add. - /// The name of the table that will get the primary key. - /// The name of the column or columns that are in the primary key. - void AddPrimaryKey(string name, string table, params string[] columns); - - /// - /// Add a constraint to a table - /// - /// The name of the constraint to add. - /// The name of the table that will get the constraint - /// The name of the column or columns that will get the constraint. - void AddUniqueConstraint(string name, string table, params string[] columns); - - /// - /// Add a constraint to a table - /// - /// The name of the constraint to add. - /// The name of the table that will get the constraint - /// The check constraint definition. - void AddCheckConstraint(string name, string table, string checkSql); - - /// - /// Add a table - /// - /// The name of the table to add. - /// The columns that are part of the table. - void AddTable(string name, params Column[] columns); - - /// - /// Add a table - /// - /// The name of the table to add. - /// The name of the database engine to use. (MySQL) - /// The columns that are part of the table. - void AddTable(string name, string engine, params Column[] columns); - - /// - /// Start a transction - /// - void BeginTransaction(); - - /// - /// Change the definition of an existing column. - /// - /// The name of the table that will get the new column - /// An instance of a Column with the specified properties and the name of an existing column - void ChangeColumn(string table, Column column); - - /// - /// Check to see if a column exists - /// - /// - /// - /// - bool ColumnExists(string table, string column); - - /// - /// Commit the running transction - /// - void Commit(); - - /// - /// Check to see if a constraint exists - /// - /// The name of the constraint - /// The table that the constraint lives on. - /// - bool ConstraintExists(string table, string name); - - /// - /// Check to see if a primary key constraint exists on the table - /// - /// The name of the primary key - /// The table that the constraint lives on. - /// - bool PrimaryKeyExists(string table, string name); - - /// - /// Execute an arbitrary SQL query - /// - /// The SQL to execute. - /// - int ExecuteNonQuery(string sql); - - /// - /// Execute an arbitrary SQL query - /// - /// The SQL to execute. - /// - IDataReader ExecuteQuery(string sql); - - /// - /// Execute an arbitrary SQL query - /// - /// The SQL to execute. - /// A single value that is returned. - object ExecuteScalar(string sql); - - /// - /// Get the information about the columns in a table - /// - /// The table name that you want the columns for. - /// - Column[] GetColumns(string table); - - /// - /// Get information about a single column in a table - /// - /// The table name that you want the columns for. - /// The column name for which you want information. - /// - Column GetColumnByName(string table, string column); - - /// - /// Get the names of all of the tables - /// - /// The names of all the tables. - string[] GetTables(); - - /// - /// Insert data into a table - /// - /// The table that will get the new data - /// The names of the columns - /// The values in the same order as the columns - /// - int Insert(string table, string[] columns, string[] values); - - /// - /// Delete data from a table - /// - /// The table that will have the data deleted - /// The names of the columns used in a where clause - /// The values in the same order as the columns - /// - int Delete(string table, string[] columns, string[] values); - - /// - /// Delete data from a table - /// - /// The table that will have the data deleted - /// The name of the column used in a where clause - /// The value for the where clause - /// - int Delete(string table, string whereColumn, string whereValue); - - /// - /// Marks a Migration version number as having been applied - /// - /// The version number of the migration that was applied - void MigrationApplied(long version); - - /// - /// Marks a Migration version number as having been rolled back from the database - /// - /// The version number of the migration that was removed - void MigrationUnApplied(long version); - - /// - /// Remove an existing column from a table - /// - /// The name of the table to remove the column from - /// The column to remove - void RemoveColumn(string table, string column); - - /// - /// Remove an existing foreign key constraint - /// - /// The table that contains the foreign key. - /// The name of the foreign key to remove - void RemoveForeignKey(string table, string name); - - /// - /// Remove an existing constraint - /// - /// The table that contains the foreign key. - /// The name of the constraint to remove - void RemoveConstraint(string table, string name); - - /// - /// Remove an existing index - /// - /// The table that contains the index. - /// The name of the index to remove - void RemoveIndex(string table, string name); - - /// - /// Remove an existing table - /// - /// The name of the table - void RemoveTable(string tableName); - - /// - /// Rename an existing table - /// - /// The old name of the table - /// The new name of the table - void RenameTable(string oldName, string newName); - - /// - /// Rename an existing table - /// - /// The name of the table - /// The old name of the column - /// The new name of the column - void RenameColumn(string tableName, string oldColumnName, string newColumnName); - - /// - /// Rollback the currently running transaction. - /// - void Rollback(); - - /// - /// Get values from a table - /// - /// The columns to select - /// The table to select from - /// The where clause to limit the selection - /// - IDataReader Select(string what, string from, string where); - - /// - /// Get values from a table - /// - /// The columns to select - /// The table to select from - /// - IDataReader Select(string what, string from); - - /// - /// Get a single value from a table - /// - /// The columns to select - /// The table to select from - /// - /// - object SelectScalar(string what, string from, string where); - - /// - /// Get a single value from a table - /// - /// The columns to select - /// The table to select from - /// - object SelectScalar(string what, string from); - - /// - /// Check if a table already exists - /// - /// The name of the table that you want to check on. - /// - bool TableExists(string tableName); - - /// - /// Update the values in a table - /// - /// The name of the table to update - /// The names of the columns. - /// The values for the columns in the same order as the names. - /// - int Update(string table, string[] columns, string[] columnValues); - - /// - /// Update the values in a table - /// - /// The name of the table to update - /// The names of the columns. - /// The values for the columns in the same order as the names. - /// A where clause to limit the update - /// - int Update(string table, string[] columns, string[] values, string where); - - IDbCommand GetCommand(); - - void ExecuteSchemaBuilder(SchemaBuilder.SchemaBuilder schemaBuilder); - } -} diff --git a/Migrator.net/Migrator.Framework/Loggers/.svn/all-wcprops b/Migrator.net/Migrator.Framework/Loggers/.svn/all-wcprops deleted file mode 100644 index 1d7a4067b..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/.svn/all-wcprops +++ /dev/null @@ -1,35 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 54 -/svn/!svn/ver/120/trunk/src/Migrator.Framework/Loggers -END -Logger.cs -K 25 -svn:wc:ra_dav:version-url -V 64 -/svn/!svn/ver/120/trunk/src/Migrator.Framework/Loggers/Logger.cs -END -ConsoleWriter.cs -K 25 -svn:wc:ra_dav:version-url -V 70 -/svn/!svn/ver/73/trunk/src/Migrator.Framework/Loggers/ConsoleWriter.cs -END -IAttachableLogger.cs -K 25 -svn:wc:ra_dav:version-url -V 75 -/svn/!svn/ver/120/trunk/src/Migrator.Framework/Loggers/IAttachableLogger.cs -END -SqlScriptFileLogger.cs -K 25 -svn:wc:ra_dav:version-url -V 77 -/svn/!svn/ver/120/trunk/src/Migrator.Framework/Loggers/SqlScriptFileLogger.cs -END -ILogWriter.cs -K 25 -svn:wc:ra_dav:version-url -V 68 -/svn/!svn/ver/120/trunk/src/Migrator.Framework/Loggers/ILogWriter.cs -END diff --git a/Migrator.net/Migrator.Framework/Loggers/.svn/entries b/Migrator.net/Migrator.Framework/Loggers/.svn/entries deleted file mode 100644 index ebffeac65..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/.svn/entries +++ /dev/null @@ -1,198 +0,0 @@ -10 - -dir -147 -http://migratordotnet.googlecode.com/svn/trunk/src/Migrator.Framework/Loggers -http://migratordotnet.googlecode.com/svn - - - -2008-09-11T21:48:32.631850Z -120 -geofflane - - - - - - - - - - - - - - -8c3eb3c4-eb3a-0410-862c-73fa8ce6028b - -Logger.cs -file - - - - -2011-05-23T18:17:16.585003Z -24718815685110ea98d3f4207a358907 -2008-09-11T21:48:32.631850Z -120 -geofflane - - - - - - - - - - - - - - - - - - - - - -4456 - -ConsoleWriter.cs -file - - - - -2011-05-23T18:17:16.587003Z -32bbf60aa8f07bbc281ac3be2da2a214 -2008-04-24T03:58:41.677562Z -43 -dkode8 - - - - - - - - - - - - - - - - - - - - - -838 - -IAttachableLogger.cs -file - - - - -2011-05-23T18:17:16.587003Z -e0226db3d0d21f0b59d7593f76835e9f -2008-09-11T21:48:32.631850Z -120 -geofflane - - - - - - - - - - - - - - - - - - - - - -1114 - -SqlScriptFileLogger.cs -file - - - - -2011-05-23T18:17:16.589003Z -bb2a95971af988525878e60b8cdb21a7 -2008-09-11T21:48:32.631850Z -120 -geofflane - - - - - - - - - - - - - - - - - - - - - -2527 - -ILogWriter.cs -file - - - - -2011-05-23T18:17:16.590003Z -53fd3ec26d0d191e9d4ae77530e5d928 -2008-09-11T21:48:32.631850Z -120 -geofflane - - - - - - - - - - - - - - - - - - - - - -1088 - diff --git a/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/ConsoleWriter.cs.svn-base b/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/ConsoleWriter.cs.svn-base deleted file mode 100644 index 8c93ec371..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/ConsoleWriter.cs.svn-base +++ /dev/null @@ -1,28 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -using System; - -namespace Migrator.Framework.Loggers -{ - public class ConsoleWriter : ILogWriter - { - public void Write(string message, params object[] args) - { - Console.Write(message, args); - } - - public void WriteLine(string message, params object[] args) - { - Console.WriteLine(message, args); - } - } -} diff --git a/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/IAttachableLogger.cs.svn-base b/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/IAttachableLogger.cs.svn-base deleted file mode 100644 index 24b09a352..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/IAttachableLogger.cs.svn-base +++ /dev/null @@ -1,33 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -namespace Migrator.Framework.Loggers -{ - /// - /// ILogger interface. - /// Implicit in this interface is that the logger will delegate actual - /// logging to the (s) that have been attached - /// - public interface IAttachableLogger: ILogger - { - /// - /// Attach an - /// - /// - void Attach(ILogWriter writer); - - /// - /// Detach an - /// - /// - void Detach(ILogWriter writer); - } -} diff --git a/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/ILogWriter.cs.svn-base b/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/ILogWriter.cs.svn-base deleted file mode 100644 index 298f53dce..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/ILogWriter.cs.svn-base +++ /dev/null @@ -1,33 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -namespace Migrator.Framework.Loggers -{ - /// - /// Handles writing a message to the log medium (i.e. file, console) - /// - public interface ILogWriter - { - /// - /// Write this message - /// - /// - /// - void Write(string message, params object[] args); - - /// - /// Write this message, as a line - /// - /// - /// - void WriteLine(string message, params object[] args); - } -} diff --git a/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/Logger.cs.svn-base b/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/Logger.cs.svn-base deleted file mode 100644 index 4f27b1a7d..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/Logger.cs.svn-base +++ /dev/null @@ -1,169 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -using System; -using System.Collections.Generic; - -namespace Migrator.Framework.Loggers -{ - /// - /// Text logger for the migration mediator - /// - public class Logger : IAttachableLogger - { - private readonly bool _trace; - private readonly List _writers = new List(); - - public Logger(bool trace) - { - _trace = trace; - } - - public Logger(bool trace, params ILogWriter[] writers) - : this(trace) - { - _writers.AddRange(writers); - } - - public void Attach(ILogWriter writer) - { - _writers.Add(writer); - } - - public void Detach(ILogWriter writer) - { - _writers.Remove(writer); - } - - public void Started(long currentVersion, long finalVersion) - { - WriteLine("Current version : {0}. Target version : {1}", currentVersion, finalVersion); - } - - public void Started(List currentVersions, long finalVersion) - { - WriteLine("Latest version applied : {0}. Target version : {1}", LatestVersion(currentVersions), finalVersion); - } - - public void MigrateUp(long version, string migrationName) - { - WriteLine("Applying {0}: {1}", version.ToString(), migrationName); - } - - public void MigrateDown(long version, string migrationName) - { - WriteLine("Removing {0}: {1}", version.ToString(), migrationName); - } - - public void Skipping(long version) - { - WriteLine("{0} {1}", version.ToString(), ""); - } - - public void RollingBack(long originalVersion) - { - WriteLine("Rolling back to migration {0}", originalVersion); - } - - public void ApplyingDBChange(string sql) - { - Log(sql); - } - - public void Exception(long version, string migrationName, Exception ex) - { - WriteLine("============ Error Detail ============"); - WriteLine("Error in migration: {0}", version); - LogExceptionDetails(ex); - WriteLine("======================================"); - } - - public void Exception(string message, Exception ex) - { - WriteLine("============ Error Detail ============"); - WriteLine("Error: {0}", message); - LogExceptionDetails(ex); - WriteLine("======================================"); - } - - private void LogExceptionDetails(Exception ex) - { - WriteLine("{0}", ex.Message); - WriteLine("{0}", ex.StackTrace); - Exception iex = ex.InnerException; - while (iex != null) - { - WriteLine("Caused by: {0}", iex); - WriteLine("{0}", ex.StackTrace); - iex = iex.InnerException; - } - } - - public void Finished(long originalVersion, long currentVersion) - { - WriteLine("Migrated to version {0}", currentVersion); - } - - public void Finished(List originalVersions, long currentVersion) - { - WriteLine("Migrated to version {0}", currentVersion); - } - - public void Log(string format, params object[] args) - { - WriteLine(format, args); - } - - public void Warn(string format, params object[] args) - { - Write("Warning! : "); - WriteLine(format, args); - } - - public void Trace(string format, params object[] args) - { - if (_trace) - { - Log(format, args); - } - } - - private void Write(string message, params object[] args) - { - foreach (ILogWriter writer in _writers) - { - writer.Write(message, args); - } - } - - private void WriteLine(string message, params object[] args) - { - foreach (ILogWriter writer in _writers) - { - writer.WriteLine(message, args); - } - } - - public static ILogger ConsoleLogger() - { - return new Logger(false, new ConsoleWriter()); - } - - private string LatestVersion(List versions) - { - if (versions.Count > 0) - { - return versions[versions.Count - 1].ToString(); - } - return "No migrations applied yet!"; - } - } -} diff --git a/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/SqlScriptFileLogger.cs.svn-base b/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/SqlScriptFileLogger.cs.svn-base deleted file mode 100644 index de70868f4..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/.svn/text-base/SqlScriptFileLogger.cs.svn-base +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -namespace Migrator.Framework.Loggers -{ - public class SqlScriptFileLogger : ILogger, IDisposable - { - private readonly ILogger _innerLogger; - private TextWriter _streamWriter; - - public SqlScriptFileLogger(ILogger logger, TextWriter streamWriter) - { - _innerLogger = logger; - _streamWriter = streamWriter; - } - - #region IDisposable Members - - public void Dispose() - { - if (_streamWriter != null) - { - _streamWriter.Dispose(); - _streamWriter = null; - } - } - - #endregion - - public void Log(string format, params object[] args) - { - _innerLogger.Log(format, args); - } - - public void Warn(string format, params object[] args) - { - _innerLogger.Warn(format, args); - } - - public void Trace(string format, params object[] args) - { - _innerLogger.Trace(format, args); - } - - public void ApplyingDBChange(string sql) - { - _innerLogger.ApplyingDBChange(sql); - _streamWriter.WriteLine(sql); - } - - public void Started(List appliedVersions, long finalVersion) - { - _innerLogger.Started(appliedVersions, finalVersion); - } - - public void MigrateUp(long version, string migrationName) - { - _innerLogger.MigrateUp(version, migrationName); - } - - public void MigrateDown(long version, string migrationName) - { - _innerLogger.MigrateDown(version, migrationName); - } - - public void Skipping(long version) - { - _innerLogger.Skipping(version); - } - - public void RollingBack(long originalVersion) - { - _innerLogger.RollingBack(originalVersion); - } - - public void Exception(long version, string migrationName, Exception ex) - { - _innerLogger.Exception(version, migrationName, ex); - } - - public void Exception(string message, Exception ex) - { - _innerLogger.Exception(message, ex); - } - - public void Finished(List appliedVersions, long currentVersion) - { - _innerLogger.Finished(appliedVersions, currentVersion); - _streamWriter.Close(); - } - } -} diff --git a/Migrator.net/Migrator.Framework/Loggers/ConsoleWriter.cs b/Migrator.net/Migrator.Framework/Loggers/ConsoleWriter.cs deleted file mode 100644 index 8c93ec371..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/ConsoleWriter.cs +++ /dev/null @@ -1,28 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -using System; - -namespace Migrator.Framework.Loggers -{ - public class ConsoleWriter : ILogWriter - { - public void Write(string message, params object[] args) - { - Console.Write(message, args); - } - - public void WriteLine(string message, params object[] args) - { - Console.WriteLine(message, args); - } - } -} diff --git a/Migrator.net/Migrator.Framework/Loggers/IAttachableLogger.cs b/Migrator.net/Migrator.Framework/Loggers/IAttachableLogger.cs deleted file mode 100644 index 24b09a352..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/IAttachableLogger.cs +++ /dev/null @@ -1,33 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -namespace Migrator.Framework.Loggers -{ - /// - /// ILogger interface. - /// Implicit in this interface is that the logger will delegate actual - /// logging to the (s) that have been attached - /// - public interface IAttachableLogger: ILogger - { - /// - /// Attach an - /// - /// - void Attach(ILogWriter writer); - - /// - /// Detach an - /// - /// - void Detach(ILogWriter writer); - } -} diff --git a/Migrator.net/Migrator.Framework/Loggers/ILogWriter.cs b/Migrator.net/Migrator.Framework/Loggers/ILogWriter.cs deleted file mode 100644 index 298f53dce..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/ILogWriter.cs +++ /dev/null @@ -1,33 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -namespace Migrator.Framework.Loggers -{ - /// - /// Handles writing a message to the log medium (i.e. file, console) - /// - public interface ILogWriter - { - /// - /// Write this message - /// - /// - /// - void Write(string message, params object[] args); - - /// - /// Write this message, as a line - /// - /// - /// - void WriteLine(string message, params object[] args); - } -} diff --git a/Migrator.net/Migrator.Framework/Loggers/Logger.cs b/Migrator.net/Migrator.Framework/Loggers/Logger.cs deleted file mode 100644 index 4f27b1a7d..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/Logger.cs +++ /dev/null @@ -1,169 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -using System; -using System.Collections.Generic; - -namespace Migrator.Framework.Loggers -{ - /// - /// Text logger for the migration mediator - /// - public class Logger : IAttachableLogger - { - private readonly bool _trace; - private readonly List _writers = new List(); - - public Logger(bool trace) - { - _trace = trace; - } - - public Logger(bool trace, params ILogWriter[] writers) - : this(trace) - { - _writers.AddRange(writers); - } - - public void Attach(ILogWriter writer) - { - _writers.Add(writer); - } - - public void Detach(ILogWriter writer) - { - _writers.Remove(writer); - } - - public void Started(long currentVersion, long finalVersion) - { - WriteLine("Current version : {0}. Target version : {1}", currentVersion, finalVersion); - } - - public void Started(List currentVersions, long finalVersion) - { - WriteLine("Latest version applied : {0}. Target version : {1}", LatestVersion(currentVersions), finalVersion); - } - - public void MigrateUp(long version, string migrationName) - { - WriteLine("Applying {0}: {1}", version.ToString(), migrationName); - } - - public void MigrateDown(long version, string migrationName) - { - WriteLine("Removing {0}: {1}", version.ToString(), migrationName); - } - - public void Skipping(long version) - { - WriteLine("{0} {1}", version.ToString(), ""); - } - - public void RollingBack(long originalVersion) - { - WriteLine("Rolling back to migration {0}", originalVersion); - } - - public void ApplyingDBChange(string sql) - { - Log(sql); - } - - public void Exception(long version, string migrationName, Exception ex) - { - WriteLine("============ Error Detail ============"); - WriteLine("Error in migration: {0}", version); - LogExceptionDetails(ex); - WriteLine("======================================"); - } - - public void Exception(string message, Exception ex) - { - WriteLine("============ Error Detail ============"); - WriteLine("Error: {0}", message); - LogExceptionDetails(ex); - WriteLine("======================================"); - } - - private void LogExceptionDetails(Exception ex) - { - WriteLine("{0}", ex.Message); - WriteLine("{0}", ex.StackTrace); - Exception iex = ex.InnerException; - while (iex != null) - { - WriteLine("Caused by: {0}", iex); - WriteLine("{0}", ex.StackTrace); - iex = iex.InnerException; - } - } - - public void Finished(long originalVersion, long currentVersion) - { - WriteLine("Migrated to version {0}", currentVersion); - } - - public void Finished(List originalVersions, long currentVersion) - { - WriteLine("Migrated to version {0}", currentVersion); - } - - public void Log(string format, params object[] args) - { - WriteLine(format, args); - } - - public void Warn(string format, params object[] args) - { - Write("Warning! : "); - WriteLine(format, args); - } - - public void Trace(string format, params object[] args) - { - if (_trace) - { - Log(format, args); - } - } - - private void Write(string message, params object[] args) - { - foreach (ILogWriter writer in _writers) - { - writer.Write(message, args); - } - } - - private void WriteLine(string message, params object[] args) - { - foreach (ILogWriter writer in _writers) - { - writer.WriteLine(message, args); - } - } - - public static ILogger ConsoleLogger() - { - return new Logger(false, new ConsoleWriter()); - } - - private string LatestVersion(List versions) - { - if (versions.Count > 0) - { - return versions[versions.Count - 1].ToString(); - } - return "No migrations applied yet!"; - } - } -} diff --git a/Migrator.net/Migrator.Framework/Loggers/SqlScriptFileLogger.cs b/Migrator.net/Migrator.Framework/Loggers/SqlScriptFileLogger.cs deleted file mode 100644 index de70868f4..000000000 --- a/Migrator.net/Migrator.Framework/Loggers/SqlScriptFileLogger.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -namespace Migrator.Framework.Loggers -{ - public class SqlScriptFileLogger : ILogger, IDisposable - { - private readonly ILogger _innerLogger; - private TextWriter _streamWriter; - - public SqlScriptFileLogger(ILogger logger, TextWriter streamWriter) - { - _innerLogger = logger; - _streamWriter = streamWriter; - } - - #region IDisposable Members - - public void Dispose() - { - if (_streamWriter != null) - { - _streamWriter.Dispose(); - _streamWriter = null; - } - } - - #endregion - - public void Log(string format, params object[] args) - { - _innerLogger.Log(format, args); - } - - public void Warn(string format, params object[] args) - { - _innerLogger.Warn(format, args); - } - - public void Trace(string format, params object[] args) - { - _innerLogger.Trace(format, args); - } - - public void ApplyingDBChange(string sql) - { - _innerLogger.ApplyingDBChange(sql); - _streamWriter.WriteLine(sql); - } - - public void Started(List appliedVersions, long finalVersion) - { - _innerLogger.Started(appliedVersions, finalVersion); - } - - public void MigrateUp(long version, string migrationName) - { - _innerLogger.MigrateUp(version, migrationName); - } - - public void MigrateDown(long version, string migrationName) - { - _innerLogger.MigrateDown(version, migrationName); - } - - public void Skipping(long version) - { - _innerLogger.Skipping(version); - } - - public void RollingBack(long originalVersion) - { - _innerLogger.RollingBack(originalVersion); - } - - public void Exception(long version, string migrationName, Exception ex) - { - _innerLogger.Exception(version, migrationName, ex); - } - - public void Exception(string message, Exception ex) - { - _innerLogger.Exception(message, ex); - } - - public void Finished(List appliedVersions, long currentVersion) - { - _innerLogger.Finished(appliedVersions, currentVersion); - _streamWriter.Close(); - } - } -} diff --git a/Migrator.net/Migrator.Framework/Migration.cs b/Migrator.net/Migrator.Framework/Migration.cs deleted file mode 100644 index 5150e1cef..000000000 --- a/Migrator.net/Migrator.Framework/Migration.cs +++ /dev/null @@ -1,119 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework -{ - /// - /// A migration is a group of transformation applied to the database schema - /// (or sometimes data) to port the database from one version to another. - /// The Up() method must apply the modifications (eg.: create a table) - /// and the Down() method must revert, or rollback the modifications - /// (eg.: delete a table). - /// - /// Each migration must be decorated with the [Migration(0)] attribute. - /// Each migration number (0) must be unique, or else a - /// DuplicatedVersionException will be trown. - /// - /// - /// All migrations are executed inside a transaction. If an exception is - /// thrown, the transaction will be rolledback and transformations wont be - /// applied. - /// - /// - /// It is best to keep a limited number of transformation inside a migration - /// so you can easely move from one version of to another with fine grain - /// modifications. - /// You should give meaningful name to the migration class and prepend the - /// migration number to the filename so they keep ordered, eg.: - /// 002_CreateTableTest.cs. - /// - /// - /// Use the Database property to apply transformation and the - /// Logger property to output informations in the console (or other). - /// For more details on transformations see - /// ITransformationProvider. - /// - /// - /// - /// The following migration creates a new Customer table. - /// (File 003_AddCustomerTable.cs) - /// - /// [Migration(3)] - /// public class AddCustomerTable : Migration - /// { - /// public override void Up() - /// { - /// Database.AddTable("Customer", - /// new Column("Name", typeof(string), 50), - /// new Column("Address", typeof(string), 100) - /// ); - /// } - /// public override void Down() - /// { - /// Database.RemoveTable("Customer"); - /// } - /// } - /// - /// - public abstract class Migration : IMigration - { - private ITransformationProvider _transformationProvider; - - public string Name - { - get { return StringUtils.ToHumanName(GetType().Name); } - } - - /// - /// Defines tranformations to port the database to the current version. - /// - public abstract void Up(); - - /// - /// This is run after the Up transaction has been committed - /// - public virtual void AfterUp() - { - } - - /// - /// Defines transformations to revert things done in Up. - /// - public abstract void Down(); - - /// - /// This is run after the Down transaction has been committed - /// - public virtual void AfterDown() - { - } - - /// - /// Represents the database. - /// . - /// - /// Migration.Framework.ITransformationProvider - public ITransformationProvider Database - { - get { return _transformationProvider; } - set { _transformationProvider = value; } - } - - /// - /// This gets called once on the first migration object. - /// - public virtual void InitializeOnce(string[] args) - { - } - } -} diff --git a/Migrator.net/Migrator.Framework/MigrationAttribute.cs b/Migrator.net/Migrator.Framework/MigrationAttribute.cs deleted file mode 100644 index c424dac14..000000000 --- a/Migrator.net/Migrator.Framework/MigrationAttribute.cs +++ /dev/null @@ -1,53 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -using System; - -namespace Migrator.Framework -{ - /// - /// Describe a migration - /// - public class MigrationAttribute : Attribute - { - private long _version; - private bool _ignore = false; - - /// - /// Describe the migration - /// - /// The unique version of the migration. - public MigrationAttribute(long version) - { - Version = version; - } - - /// - /// The version reflected by the migration - /// - public long Version - { - get { return _version; } - private set { _version = value; } - } - - /// - /// Set to true to ignore this migration. - /// - public bool Ignore - { - get { return _ignore; } - set { _ignore = value; } - } - } -} diff --git a/Migrator.net/Migrator.Framework/MigrationException.cs b/Migrator.net/Migrator.Framework/MigrationException.cs deleted file mode 100644 index e88ea4a8c..000000000 --- a/Migrator.net/Migrator.Framework/MigrationException.cs +++ /dev/null @@ -1,30 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -using System; - -namespace Migrator.Framework -{ - /// - /// Base class for migration errors. - /// - public class MigrationException : Exception - { - public MigrationException(string message) - : base(message) {} - - public MigrationException(string message, Exception cause) - : base(message, cause) {} - - public MigrationException(string migration, int version, Exception innerException) - : base(String.Format("Exception in migration {0} (#{1})", migration, version), innerException) {} - } -} diff --git a/Migrator.net/Migrator.Framework/Migrator.Framework.csproj b/Migrator.net/Migrator.Framework/Migrator.Framework.csproj deleted file mode 100644 index 809a986e8..000000000 --- a/Migrator.net/Migrator.Framework/Migrator.Framework.csproj +++ /dev/null @@ -1,84 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {5270F048-E580-486C-B14C-E5B9F6E539D4} - Library - Migrator.Framework - Migrator.Framework - - - 3.5 - - - true - MigratorDotNet.snk - v2.0 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - x86 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/MigratorDotNet.snk b/Migrator.net/Migrator.Framework/MigratorDotNet.snk deleted file mode 100644 index 5032d709b5f932cf07ddd8f648e48be997070eca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098&QAO#LALQS0Pij|L3{e%+^Z1cMB$8_) zTaxrG8m7jW|B>|0ivYdq(NB_WJ&jUxSbMA&!J|{m17Uova_*H^0YnLR0Q_XBJa2oy z98cM~9-lR`>|bA04N`T?30>i4Uh5-{9hcdO^!>}B^Jr(0JNas~*g)nQt;-9%IS-DPEMCsK~mxp34ur)AjGXP3a_8S8CdF&!+R#@v&; zpSu_NSs}MQ1bXQGxwaz_aX|Y1R@@Ab)8O3Y{H%def>^smsL{yum|K9wR`(a zT`haxuW78Z4^*wu+c|fIAzF3U0BJCwo)=}^AvWg;1YS^J9)NT&^wz&UU;Y%BZS7^7J$mBz z6_gYtrvS|G(JYkfM$T^oxrpWU)3wQ<(7X>v{@rPNJ}i1cW42dvoYR3k9LQGlzN74e ipJfbR0EsQaV{z})*xHUESl1@BOSH$vUMU&v@-ebWnkO;< diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/all-wcprops b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/all-wcprops deleted file mode 100644 index ea94932b1..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/all-wcprops +++ /dev/null @@ -1,77 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 60 -/svn/!svn/ver/124/trunk/src/Migrator.Framework/SchemaBuilder -END -FluentColumn.cs -K 25 -svn:wc:ra_dav:version-url -V 76 -/svn/!svn/ver/124/trunk/src/Migrator.Framework/SchemaBuilder/FluentColumn.cs -END -IDeleteTableOptions.cs -K 25 -svn:wc:ra_dav:version-url -V 83 -/svn/!svn/ver/122/trunk/src/Migrator.Framework/SchemaBuilder/IDeleteTableOptions.cs -END -RenameTableExpression.cs -K 25 -svn:wc:ra_dav:version-url -V 85 -/svn/!svn/ver/124/trunk/src/Migrator.Framework/SchemaBuilder/RenameTableExpression.cs -END -AddTableExpression.cs -K 25 -svn:wc:ra_dav:version-url -V 82 -/svn/!svn/ver/124/trunk/src/Migrator.Framework/SchemaBuilder/AddTableExpression.cs -END -ISchemaBuilderExpression.cs -K 25 -svn:wc:ra_dav:version-url -V 88 -/svn/!svn/ver/124/trunk/src/Migrator.Framework/SchemaBuilder/ISchemaBuilderExpression.cs -END -IColumnOptions.cs -K 25 -svn:wc:ra_dav:version-url -V 78 -/svn/!svn/ver/124/trunk/src/Migrator.Framework/SchemaBuilder/IColumnOptions.cs -END -ForeignKey.cs -K 25 -svn:wc:ra_dav:version-url -V 74 -/svn/!svn/ver/122/trunk/src/Migrator.Framework/SchemaBuilder/ForeignKey.cs -END -IFluentColumn.cs -K 25 -svn:wc:ra_dav:version-url -V 77 -/svn/!svn/ver/124/trunk/src/Migrator.Framework/SchemaBuilder/IFluentColumn.cs -END -AddColumnExpression.cs -K 25 -svn:wc:ra_dav:version-url -V 83 -/svn/!svn/ver/124/trunk/src/Migrator.Framework/SchemaBuilder/AddColumnExpression.cs -END -SchemaBuilder.cs -K 25 -svn:wc:ra_dav:version-url -V 77 -/svn/!svn/ver/124/trunk/src/Migrator.Framework/SchemaBuilder/SchemaBuilder.cs -END -IForeignKeyOptions.cs -K 25 -svn:wc:ra_dav:version-url -V 82 -/svn/!svn/ver/122/trunk/src/Migrator.Framework/SchemaBuilder/IForeignKeyOptions.cs -END -DeleteTableExpression.cs -K 25 -svn:wc:ra_dav:version-url -V 85 -/svn/!svn/ver/124/trunk/src/Migrator.Framework/SchemaBuilder/DeleteTableExpression.cs -END diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/entries b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/entries deleted file mode 100644 index 4b47ae201..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/entries +++ /dev/null @@ -1,436 +0,0 @@ -10 - -dir -147 -http://migratordotnet.googlecode.com/svn/trunk/src/Migrator.Framework/SchemaBuilder -http://migratordotnet.googlecode.com/svn - - - -2008-12-22T16:27:00.481752Z -124 -geofflane - - - - - - - - - - - - - - -8c3eb3c4-eb3a-0410-862c-73fa8ce6028b - -FluentColumn.cs -file - - - - -2011-05-23T18:17:16.661007Z -530a5a0d558d87b32e4a9681f0066bfb -2008-12-22T16:27:00.481752Z -124 -geofflane - - - - - - - - - - - - - - - - - - - - - -1746 - -IDeleteTableOptions.cs -file - - - - -2011-05-23T18:17:16.662007Z -ca7d7dcec6bf029e9d68f797d12a0b23 -2008-12-17T03:32:49.850862Z -122 -dkode8 - - - - - - - - - - - - - - - - - - - - - -748 - -RenameTableExpression.cs -file - - - - -2011-05-23T18:17:16.663007Z -09ce9cc03039ba2986e97bf91babb390 -2008-12-22T16:27:00.481752Z -124 -geofflane - - - - - - - - - - - - - - - - - - - - - -927 - -AddTableExpression.cs -file - - - - -2011-05-23T18:17:16.665007Z -5021cf7ddfeaf239e49f0cc34d912972 -2008-12-22T16:27:00.481752Z -124 -geofflane - - - - - - - - - - - - - - - - - - - - - -843 - -ISchemaBuilderExpression.cs -file - - - - -2011-05-23T18:17:16.665007Z -5edc417b65a8294e9c701da78a2a0fd0 -2008-12-22T16:27:00.481752Z -124 -geofflane - - - - - - - - - - - - - - - - - - - - - -665 - -IColumnOptions.cs -file - - - - -2011-05-23T18:17:16.666007Z -725aafda14fca858a75392468e46912d -2008-12-22T16:27:00.481752Z -124 -geofflane - - - - - - - - - - - - - - - - - - - - - -231 - -ForeignKey.cs -file - - - - -2011-05-23T18:17:16.668007Z -dfb33fc890b6aaabfcbfbb9a55c8f628 -2008-12-17T03:32:49.850862Z -122 -dkode8 -has-props - - - - - - - - - - - - - - - - - - - - -1014 - -IFluentColumn.cs -file - - - - -2011-05-23T18:17:16.670007Z -0da0bc3bfc129443966847f12f24fec4 -2008-12-22T16:27:00.481752Z -124 -geofflane -has-props - - - - - - - - - - - - - - - - - - - - -706 - -AddColumnExpression.cs -file - - - - -2011-05-23T18:17:16.671007Z -a28232c3bc6fe16fe65fff83b1327ac3 -2008-12-22T16:27:00.481752Z -124 -geofflane - - - - - - - - - - - - - - - - - - - - - -1334 - -SchemaBuilder.cs -file - - - - -2011-05-23T18:17:16.672008Z -28742d9b060cf61f51534d162246e764 -2008-12-22T16:27:00.481752Z -124 -geofflane - - - - - - - - - - - - - - - - - - - - - -4441 - -IForeignKeyOptions.cs -file - - - - -2011-05-23T18:17:16.673008Z -67796061d9ed8701e6df79e76657ab92 -2008-12-17T03:32:49.850862Z -122 -dkode8 - - - - - - - - - - - - - - - - - - - - - -689 - -DeleteTableExpression.cs -file - - - - -2011-05-23T18:17:16.674008Z -99d55609a1311b914534e6d16d0064b2 -2008-12-22T16:27:00.481752Z -124 -geofflane - - - - - - - - - - - - - - - - - - - - - -857 - diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/prop-base/ForeignKey.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/prop-base/ForeignKey.cs.svn-base deleted file mode 100644 index 316065866..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/prop-base/ForeignKey.cs.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mergeinfo -V 0 - -END diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/prop-base/IFluentColumn.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/prop-base/IFluentColumn.cs.svn-base deleted file mode 100644 index 316065866..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/prop-base/IFluentColumn.cs.svn-base +++ /dev/null @@ -1,5 +0,0 @@ -K 13 -svn:mergeinfo -V 0 - -END diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/AddColumnExpression.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/AddColumnExpression.cs.svn-base deleted file mode 100644 index 0bcbc9433..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/AddColumnExpression.cs.svn-base +++ /dev/null @@ -1,40 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public class AddColumnExpression : ISchemaBuilderExpression - { - private IFluentColumn _column; - private string _toTable; - - - public AddColumnExpression(string toTable, IFluentColumn column) - { - _column = column; - _toTable = toTable; - } - public void Create(ITransformationProvider provider) - { - provider.AddColumn(_toTable, _column.Name, _column.Type, _column.Size, _column.ColumnProperty, _column.DefaultValue); - - if (_column.ForeignKey != null) - { - provider.AddForeignKey( - "FK_" + _toTable + "_" + _column.Name + "_" + _column.ForeignKey.PrimaryTable + "_" + - _column.ForeignKey.PrimaryKey, - _toTable, _column.Name, _column.ForeignKey.PrimaryTable, _column.ForeignKey.PrimaryKey, _column.Constraint); - } - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/AddTableExpression.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/AddTableExpression.cs.svn-base deleted file mode 100644 index 1bb3360c5..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/AddTableExpression.cs.svn-base +++ /dev/null @@ -1,28 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public class AddTableExpression : ISchemaBuilderExpression - { - private string _newTable; - public AddTableExpression(string newTable) - { - _newTable = newTable; - } - public void Create(ITransformationProvider provider) - { - provider.AddTable(_newTable); - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/DeleteTableExpression.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/DeleteTableExpression.cs.svn-base deleted file mode 100644 index 82666ee5d..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/DeleteTableExpression.cs.svn-base +++ /dev/null @@ -1,28 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public class DeleteTableExpression : ISchemaBuilderExpression - { - private string _tableName; - public DeleteTableExpression(string tableName) - { - _tableName = tableName; - } - public void Create(ITransformationProvider provider) - { - provider.RemoveTable(_tableName); - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/FluentColumn.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/FluentColumn.cs.svn-base deleted file mode 100644 index e1cc1ca02..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/FluentColumn.cs.svn-base +++ /dev/null @@ -1,80 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -using System.Data; - -namespace Migrator.Framework.SchemaBuilder -{ - public class FluentColumn : IFluentColumn - { - private Column _inner; - private ForeignKeyConstraint _constraint; - private ForeignKey _fk; - - public FluentColumn(string columnName) - { - _inner = new Column(columnName); - } - - public ColumnProperty ColumnProperty - { - get { return _inner.ColumnProperty; } - set { _inner.ColumnProperty = value; } - } - - public string Name - { - get { return _inner.Name; } - set { _inner.Name = value; } - } - - public DbType Type - { - get { return _inner.Type; } - set { _inner.Type = value; } - } - - public int Size - { - get { return _inner.Size; } - set { _inner.Size = value; } - } - - public bool IsIdentity - { - get { return _inner.IsIdentity; } - } - - public bool IsPrimaryKey - { - get { return _inner.IsPrimaryKey; } - } - - public object DefaultValue - { - get { return _inner.DefaultValue; } - set { _inner.DefaultValue = value; } - } - - public ForeignKeyConstraint Constraint - { - get { return _constraint; } - set { _constraint = value; } - } - public ForeignKey ForeignKey - { - get { return _fk; } - set { _fk = value; } - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/ForeignKey.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/ForeignKey.cs.svn-base deleted file mode 100644 index 095b0948a..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/ForeignKey.cs.svn-base +++ /dev/null @@ -1,39 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public class ForeignKey - { - private string _primaryTable; - private string _primaryKey; - - public ForeignKey(string primaryTable, string primaryKey) - { - _primaryTable = primaryTable; - _primaryKey = primaryKey; - } - - public string PrimaryTable - { - get { return _primaryTable; } - set { _primaryTable = value; } - } - - public string PrimaryKey - { - get { return _primaryKey; } - set { _primaryKey = value; } - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IColumnOptions.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IColumnOptions.cs.svn-base deleted file mode 100644 index 8fd8cb32d..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IColumnOptions.cs.svn-base +++ /dev/null @@ -1,13 +0,0 @@ -using System.Data; - -namespace Migrator.Framework.SchemaBuilder -{ - public interface IColumnOptions - { - SchemaBuilder OfType(DbType dbType); - - SchemaBuilder WithSize(int size); - - IForeignKeyOptions AsForeignKey(); - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IDeleteTableOptions.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IDeleteTableOptions.cs.svn-base deleted file mode 100644 index 4d4152519..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IDeleteTableOptions.cs.svn-base +++ /dev/null @@ -1,24 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public interface IDeleteTableOptions - { - SchemaBuilder WithTable(string name); - - SchemaBuilder AddTable(string name); - - IDeleteTableOptions DeleteTable(string name); - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IFluentColumn.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IFluentColumn.cs.svn-base deleted file mode 100644 index 6500ba948..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IFluentColumn.cs.svn-base +++ /dev/null @@ -1,22 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public interface IFluentColumn : IColumn - { - ForeignKeyConstraint Constraint { get; set; } - - ForeignKey ForeignKey { get; set; } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IForeignKeyOptions.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IForeignKeyOptions.cs.svn-base deleted file mode 100644 index 3cb52cbf1..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/IForeignKeyOptions.cs.svn-base +++ /dev/null @@ -1,20 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public interface IForeignKeyOptions - { - SchemaBuilder ReferencedTo(string primaryKeyTable, string primaryKeyColumn); - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/ISchemaBuilderExpression.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/ISchemaBuilderExpression.cs.svn-base deleted file mode 100644 index 0db89f886..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/ISchemaBuilderExpression.cs.svn-base +++ /dev/null @@ -1,20 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public interface ISchemaBuilderExpression - { - void Create(ITransformationProvider provider); - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/RenameTableExpression.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/RenameTableExpression.cs.svn-base deleted file mode 100644 index 7880618a9..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/RenameTableExpression.cs.svn-base +++ /dev/null @@ -1,31 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public class RenameTableExpression : ISchemaBuilderExpression - { - private string _oldName; - private string _newName; - - public RenameTableExpression(string oldName, string newName) - { - _oldName = oldName; - _newName = newName; - } - public void Create(ITransformationProvider provider) - { - provider.RenameTable(_oldName, _newName); - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/SchemaBuilder.cs.svn-base b/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/SchemaBuilder.cs.svn-base deleted file mode 100644 index a02c4fe6d..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/.svn/text-base/SchemaBuilder.cs.svn-base +++ /dev/null @@ -1,169 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -using System; -using System.Collections.Generic; -using System.Data; - -namespace Migrator.Framework.SchemaBuilder -{ - public class SchemaBuilder : IColumnOptions, IForeignKeyOptions, IDeleteTableOptions - { - private string _currentTable; - private IFluentColumn _currentColumn; - private IList _exprs; - - public SchemaBuilder() - { - _exprs = new List(); - } - - public IEnumerable Expressions - { - get { return _exprs; } - } - - /// - /// Adds a Table to be created to the Schema - /// - /// Table name to be created - /// SchemaBuilder for chaining - public SchemaBuilder AddTable(string name) - { - if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException("name"); - - _exprs.Add(new AddTableExpression(name)); - _currentTable = name; - - return this; - } - - public IDeleteTableOptions DeleteTable(string name) - { - if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException("name"); - _currentTable = ""; - _currentColumn = null; - - _exprs.Add(new DeleteTableExpression(name)); - - return this; - } - - /// - /// Reference an existing table. - /// - /// Table to reference - /// SchemaBuilder for chaining - public SchemaBuilder RenameTable(string newName) - { - if (string.IsNullOrEmpty(newName)) - throw new ArgumentNullException("newName"); - - _exprs.Add(new RenameTableExpression(_currentTable, newName)); - _currentTable = newName; - - return this; - } - - /// - /// Reference an existing table. - /// - /// Table to reference - /// SchemaBuilder for chaining - public SchemaBuilder WithTable(string name) - { - if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException("name"); - - _currentTable = name; - - return this; - } - - /// - /// Adds a Column to be created - /// - /// Column name to be added - /// IColumnOptions to restrict chaining - public IColumnOptions AddColumn(string name) - { - if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException("name"); - if (string.IsNullOrEmpty(_currentTable)) - throw new ArgumentException("missing referenced table"); - - IFluentColumn column = new FluentColumn(name); - _currentColumn = column; - - _exprs.Add(new AddColumnExpression(_currentTable, column)); - return this; - } - - public SchemaBuilder OfType(DbType columnType) - { - _currentColumn.Type = columnType; - - return this; - } - - public SchemaBuilder WithProperty(ColumnProperty columnProperty) - { - _currentColumn.ColumnProperty = columnProperty; - - return this; - } - - public SchemaBuilder WithSize(int size) - { - if (size == 0) - throw new ArgumentNullException("size", "Size must be greater than zero"); - - _currentColumn.Size = size; - - return this; - } - - public SchemaBuilder WithDefaultValue(object defaultValue) - { - if (defaultValue == null) - throw new ArgumentNullException("defaultValue", "DefaultValue cannot be null or empty"); - - _currentColumn.DefaultValue = defaultValue; - - return this; - } - - public IForeignKeyOptions AsForeignKey() - { - _currentColumn.ColumnProperty = ColumnProperty.ForeignKey; - - return this; - } - - public SchemaBuilder ReferencedTo(string primaryKeyTable, string primaryKeyColumn) - { - _currentColumn.Constraint = ForeignKeyConstraint.NoAction; - _currentColumn.ForeignKey = new ForeignKey(primaryKeyTable, primaryKeyColumn); - return this; - } - - public SchemaBuilder WithConstraint(ForeignKeyConstraint action) - { - _currentColumn.Constraint = action; - - return this; - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/AddColumnExpression.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/AddColumnExpression.cs deleted file mode 100644 index 0bcbc9433..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/AddColumnExpression.cs +++ /dev/null @@ -1,40 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public class AddColumnExpression : ISchemaBuilderExpression - { - private IFluentColumn _column; - private string _toTable; - - - public AddColumnExpression(string toTable, IFluentColumn column) - { - _column = column; - _toTable = toTable; - } - public void Create(ITransformationProvider provider) - { - provider.AddColumn(_toTable, _column.Name, _column.Type, _column.Size, _column.ColumnProperty, _column.DefaultValue); - - if (_column.ForeignKey != null) - { - provider.AddForeignKey( - "FK_" + _toTable + "_" + _column.Name + "_" + _column.ForeignKey.PrimaryTable + "_" + - _column.ForeignKey.PrimaryKey, - _toTable, _column.Name, _column.ForeignKey.PrimaryTable, _column.ForeignKey.PrimaryKey, _column.Constraint); - } - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/AddTableExpression.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/AddTableExpression.cs deleted file mode 100644 index 1bb3360c5..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/AddTableExpression.cs +++ /dev/null @@ -1,28 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public class AddTableExpression : ISchemaBuilderExpression - { - private string _newTable; - public AddTableExpression(string newTable) - { - _newTable = newTable; - } - public void Create(ITransformationProvider provider) - { - provider.AddTable(_newTable); - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/DeleteTableExpression.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/DeleteTableExpression.cs deleted file mode 100644 index 82666ee5d..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/DeleteTableExpression.cs +++ /dev/null @@ -1,28 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public class DeleteTableExpression : ISchemaBuilderExpression - { - private string _tableName; - public DeleteTableExpression(string tableName) - { - _tableName = tableName; - } - public void Create(ITransformationProvider provider) - { - provider.RemoveTable(_tableName); - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/FluentColumn.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/FluentColumn.cs deleted file mode 100644 index e1cc1ca02..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/FluentColumn.cs +++ /dev/null @@ -1,80 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -using System.Data; - -namespace Migrator.Framework.SchemaBuilder -{ - public class FluentColumn : IFluentColumn - { - private Column _inner; - private ForeignKeyConstraint _constraint; - private ForeignKey _fk; - - public FluentColumn(string columnName) - { - _inner = new Column(columnName); - } - - public ColumnProperty ColumnProperty - { - get { return _inner.ColumnProperty; } - set { _inner.ColumnProperty = value; } - } - - public string Name - { - get { return _inner.Name; } - set { _inner.Name = value; } - } - - public DbType Type - { - get { return _inner.Type; } - set { _inner.Type = value; } - } - - public int Size - { - get { return _inner.Size; } - set { _inner.Size = value; } - } - - public bool IsIdentity - { - get { return _inner.IsIdentity; } - } - - public bool IsPrimaryKey - { - get { return _inner.IsPrimaryKey; } - } - - public object DefaultValue - { - get { return _inner.DefaultValue; } - set { _inner.DefaultValue = value; } - } - - public ForeignKeyConstraint Constraint - { - get { return _constraint; } - set { _constraint = value; } - } - public ForeignKey ForeignKey - { - get { return _fk; } - set { _fk = value; } - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/ForeignKey.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/ForeignKey.cs deleted file mode 100644 index 095b0948a..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/ForeignKey.cs +++ /dev/null @@ -1,39 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public class ForeignKey - { - private string _primaryTable; - private string _primaryKey; - - public ForeignKey(string primaryTable, string primaryKey) - { - _primaryTable = primaryTable; - _primaryKey = primaryKey; - } - - public string PrimaryTable - { - get { return _primaryTable; } - set { _primaryTable = value; } - } - - public string PrimaryKey - { - get { return _primaryKey; } - set { _primaryKey = value; } - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/IColumnOptions.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/IColumnOptions.cs deleted file mode 100644 index 8fd8cb32d..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/IColumnOptions.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Data; - -namespace Migrator.Framework.SchemaBuilder -{ - public interface IColumnOptions - { - SchemaBuilder OfType(DbType dbType); - - SchemaBuilder WithSize(int size); - - IForeignKeyOptions AsForeignKey(); - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/IDeleteTableOptions.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/IDeleteTableOptions.cs deleted file mode 100644 index 4d4152519..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/IDeleteTableOptions.cs +++ /dev/null @@ -1,24 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public interface IDeleteTableOptions - { - SchemaBuilder WithTable(string name); - - SchemaBuilder AddTable(string name); - - IDeleteTableOptions DeleteTable(string name); - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/IFluentColumn.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/IFluentColumn.cs deleted file mode 100644 index 6500ba948..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/IFluentColumn.cs +++ /dev/null @@ -1,22 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public interface IFluentColumn : IColumn - { - ForeignKeyConstraint Constraint { get; set; } - - ForeignKey ForeignKey { get; set; } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/IForeignKeyOptions.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/IForeignKeyOptions.cs deleted file mode 100644 index 3cb52cbf1..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/IForeignKeyOptions.cs +++ /dev/null @@ -1,20 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public interface IForeignKeyOptions - { - SchemaBuilder ReferencedTo(string primaryKeyTable, string primaryKeyColumn); - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/ISchemaBuilderExpression.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/ISchemaBuilderExpression.cs deleted file mode 100644 index 0db89f886..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/ISchemaBuilderExpression.cs +++ /dev/null @@ -1,20 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public interface ISchemaBuilderExpression - { - void Create(ITransformationProvider provider); - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/RenameTableExpression.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/RenameTableExpression.cs deleted file mode 100644 index 7880618a9..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/RenameTableExpression.cs +++ /dev/null @@ -1,31 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -namespace Migrator.Framework.SchemaBuilder -{ - public class RenameTableExpression : ISchemaBuilderExpression - { - private string _oldName; - private string _newName; - - public RenameTableExpression(string oldName, string newName) - { - _oldName = oldName; - _newName = newName; - } - public void Create(ITransformationProvider provider) - { - provider.RenameTable(_oldName, _newName); - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/SchemaBuilder/SchemaBuilder.cs b/Migrator.net/Migrator.Framework/SchemaBuilder/SchemaBuilder.cs deleted file mode 100644 index a02c4fe6d..000000000 --- a/Migrator.net/Migrator.Framework/SchemaBuilder/SchemaBuilder.cs +++ /dev/null @@ -1,169 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -using System; -using System.Collections.Generic; -using System.Data; - -namespace Migrator.Framework.SchemaBuilder -{ - public class SchemaBuilder : IColumnOptions, IForeignKeyOptions, IDeleteTableOptions - { - private string _currentTable; - private IFluentColumn _currentColumn; - private IList _exprs; - - public SchemaBuilder() - { - _exprs = new List(); - } - - public IEnumerable Expressions - { - get { return _exprs; } - } - - /// - /// Adds a Table to be created to the Schema - /// - /// Table name to be created - /// SchemaBuilder for chaining - public SchemaBuilder AddTable(string name) - { - if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException("name"); - - _exprs.Add(new AddTableExpression(name)); - _currentTable = name; - - return this; - } - - public IDeleteTableOptions DeleteTable(string name) - { - if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException("name"); - _currentTable = ""; - _currentColumn = null; - - _exprs.Add(new DeleteTableExpression(name)); - - return this; - } - - /// - /// Reference an existing table. - /// - /// Table to reference - /// SchemaBuilder for chaining - public SchemaBuilder RenameTable(string newName) - { - if (string.IsNullOrEmpty(newName)) - throw new ArgumentNullException("newName"); - - _exprs.Add(new RenameTableExpression(_currentTable, newName)); - _currentTable = newName; - - return this; - } - - /// - /// Reference an existing table. - /// - /// Table to reference - /// SchemaBuilder for chaining - public SchemaBuilder WithTable(string name) - { - if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException("name"); - - _currentTable = name; - - return this; - } - - /// - /// Adds a Column to be created - /// - /// Column name to be added - /// IColumnOptions to restrict chaining - public IColumnOptions AddColumn(string name) - { - if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException("name"); - if (string.IsNullOrEmpty(_currentTable)) - throw new ArgumentException("missing referenced table"); - - IFluentColumn column = new FluentColumn(name); - _currentColumn = column; - - _exprs.Add(new AddColumnExpression(_currentTable, column)); - return this; - } - - public SchemaBuilder OfType(DbType columnType) - { - _currentColumn.Type = columnType; - - return this; - } - - public SchemaBuilder WithProperty(ColumnProperty columnProperty) - { - _currentColumn.ColumnProperty = columnProperty; - - return this; - } - - public SchemaBuilder WithSize(int size) - { - if (size == 0) - throw new ArgumentNullException("size", "Size must be greater than zero"); - - _currentColumn.Size = size; - - return this; - } - - public SchemaBuilder WithDefaultValue(object defaultValue) - { - if (defaultValue == null) - throw new ArgumentNullException("defaultValue", "DefaultValue cannot be null or empty"); - - _currentColumn.DefaultValue = defaultValue; - - return this; - } - - public IForeignKeyOptions AsForeignKey() - { - _currentColumn.ColumnProperty = ColumnProperty.ForeignKey; - - return this; - } - - public SchemaBuilder ReferencedTo(string primaryKeyTable, string primaryKeyColumn) - { - _currentColumn.Constraint = ForeignKeyConstraint.NoAction; - _currentColumn.ForeignKey = new ForeignKey(primaryKeyTable, primaryKeyColumn); - return this; - } - - public SchemaBuilder WithConstraint(ForeignKeyConstraint action) - { - _currentColumn.Constraint = action; - - return this; - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Framework/StringUtils.cs b/Migrator.net/Migrator.Framework/StringUtils.cs deleted file mode 100644 index 4d91d4305..000000000 --- a/Migrator.net/Migrator.Framework/StringUtils.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.Text; -using System.Text.RegularExpressions; - -namespace Migrator.Framework -{ - public class StringUtils - { - /// - /// Convert a classname to something more readable. - /// ex.: CreateATable => Create a table - /// - /// - /// - public static string ToHumanName(string className) - { - string name = Regex.Replace(className, "([A-Z])", " $1").Substring(1); - return name.Substring(0, 1).ToUpper() + name.Substring(1).ToLower(); - } - - /// - /// - /// - /// - /// - /// - /// - public static string ReplaceOnce(string template, string placeholder, string replacement) - { - int loc = template.IndexOf(placeholder); - if (loc < 0) - { - return template; - } - else - { - return new StringBuilder(template.Substring(0, loc)) - .Append(replacement) - .Append(template.Substring(loc + placeholder.Length)) - .ToString(); - } - } - } -} diff --git a/Migrator.net/Migrator.Providers/ColumnPropertiesMapper.cs b/Migrator.net/Migrator.Providers/ColumnPropertiesMapper.cs deleted file mode 100644 index 8682a2c29..000000000 --- a/Migrator.net/Migrator.Providers/ColumnPropertiesMapper.cs +++ /dev/null @@ -1,119 +0,0 @@ -using System; -using System.Collections.Generic; -using Migrator.Framework; - -namespace Migrator.Providers -{ - /// - /// This is basically a just a helper base class - /// per-database implementors may want to override ColumnSql - /// - public class ColumnPropertiesMapper - { - protected Dialect dialect; - - /// The SQL type - protected string type; - - /// The name of the column - protected string name; - - /// - /// the type of the column - /// - protected string columnSql; - - /// - /// Sql if This column is Indexed - /// - protected bool indexed = false; - - /// - /// Sql if this column has a default value - /// - protected object defaultVal; - - public ColumnPropertiesMapper(Dialect dialect, string type) - { - this.dialect = dialect; - this.type = type; - } - - /// - /// The sql for this column, override in database-specific implementation classes - /// - public virtual string ColumnSql - { - get { return columnSql; } - } - - public string Name - { - get { return name; } - set { name = value; } - } - - public object Default - { - get { return defaultVal; } - set { defaultVal = value; } - } - - public string QuotedName - { - get { return dialect.Quote(Name); } - } - - public string IndexSql - { - get - { - if (dialect.SupportsIndex && indexed) - return String.Format("INDEX({0})", dialect.Quote(name)); - return null; - } - } - - public void MapColumnProperties(Column column) - { - Name = column.Name; - indexed = PropertySelected(column.ColumnProperty, ColumnProperty.Indexed); - - List vals = new List(); - vals.Add(dialect.ColumnNameNeedsQuote ? QuotedName : Name); - - vals.Add(type); - - if (! dialect.IdentityNeedsType) - AddValueIfSelected(column, ColumnProperty.Identity, vals); - - AddValueIfSelected(column, ColumnProperty.Unsigned, vals); - if (! PropertySelected(column.ColumnProperty, ColumnProperty.PrimaryKey) || dialect.NeedsNotNullForIdentity) - AddValueIfSelected(column, ColumnProperty.NotNull, vals); - - AddValueIfSelected(column, ColumnProperty.PrimaryKey, vals); - - if (dialect.IdentityNeedsType) - AddValueIfSelected(column, ColumnProperty.Identity, vals); - - AddValueIfSelected(column, ColumnProperty.Unique, vals); - AddValueIfSelected(column, ColumnProperty.ForeignKey, vals); - - if (column.DefaultValue != null) - vals.Add(dialect.Default(column.DefaultValue)); - - columnSql = String.Join(" ", vals.ToArray()); - } - - private void AddValueIfSelected(Column column, ColumnProperty property, ICollection vals) - { - if (PropertySelected(column.ColumnProperty, property)) - vals.Add(dialect.SqlForProperty(property)); - } - - public static bool PropertySelected(ColumnProperty source, ColumnProperty comparison) - { - return (source & comparison) == comparison; - } - } -} diff --git a/Migrator.net/Migrator.Providers/Dialect.cs b/Migrator.net/Migrator.Providers/Dialect.cs deleted file mode 100644 index 16f4426a6..000000000 --- a/Migrator.net/Migrator.Providers/Dialect.cs +++ /dev/null @@ -1,193 +0,0 @@ - -using System; -using System.Data; -using System.Collections.Generic; -using Migrator.Framework; - -namespace Migrator.Providers -{ - /// - /// Defines the implementations specific details for a particular database. - /// - public abstract class Dialect - { - private readonly Dictionary propertyMap = new Dictionary(); - private readonly TypeNames typeNames = new TypeNames(); - - protected Dialect() - { - RegisterProperty(ColumnProperty.Null, "NULL"); - RegisterProperty(ColumnProperty.NotNull, "NOT NULL"); - RegisterProperty(ColumnProperty.Unique, "UNIQUE"); - RegisterProperty(ColumnProperty.PrimaryKey, "PRIMARY KEY"); - } - - public abstract Type TransformationProvider { get; } - - public ITransformationProvider NewProviderForDialect(string 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 - /// length (if appropriate) - /// - /// The typecode - /// Maximum length of database type - /// The database type name - protected void RegisterColumnType(DbType code, int capacity, string name) - { - typeNames.Put(code, capacity, name); - } - - /// - /// Suclasses register a typename for the given type code. $l in the - /// typename will be replaced by the column length (if appropriate). - /// - /// The typecode - /// The database type name - protected void RegisterColumnType(DbType code, string name) - { - typeNames.Put(code, name); - } - - public ColumnPropertiesMapper GetColumnMapper(Column column) - { - string type = column.Size > 0 ? GetTypeName(column.Type, column.Size) : GetTypeName(column.Type); - if (!IdentityNeedsType && column.IsIdentity) - type = String.Empty; - - return new ColumnPropertiesMapper(this, type); - } - - /// - /// Get the name of the database type associated with the given - /// - /// The DbType - /// The database type name used by ddl. - public virtual string GetTypeName(DbType type) - { - string result = typeNames.Get(type); - if (result == null) - { - throw new Exception(string.Format("No default type mapping for DbType {0}", type)); - } - - return result; - } - - /// - /// Get the name of the database type associated with the given - /// - /// The DbType - /// The database type name used by ddl. - /// - public virtual string GetTypeName(DbType type, int length) - { - return GetTypeName(type, length, 0, 0); - } - - /// - /// Get the name of the database type associated with the given - /// - /// The DbType - /// The database type name used by ddl. - /// - /// - /// - public virtual string GetTypeName(DbType type, int length, int precision, int scale) - { - string resultWithLength = typeNames.Get(type, length, precision, scale); - if (resultWithLength != null) - return resultWithLength; - - return GetTypeName(type); - } - - public void RegisterProperty(ColumnProperty property, string sql) - { - if (!propertyMap.ContainsKey(property)) - { - propertyMap.Add(property, sql); - } - propertyMap[property] = sql; - } - - public string SqlForProperty(ColumnProperty property) - { - if (propertyMap.ContainsKey(property)) - { - return propertyMap[property]; - } - return String.Empty; - } - - public virtual bool ColumnNameNeedsQuote - { - 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; } - } - - public virtual bool SupportsIndex - { - 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.ToString() == 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; - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Providers/ForeignKeyConstraintMapper.cs b/Migrator.net/Migrator.Providers/ForeignKeyConstraintMapper.cs deleted file mode 100644 index 35c4a8e93..000000000 --- a/Migrator.net/Migrator.Providers/ForeignKeyConstraintMapper.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Migrator.Framework; - -namespace Migrator.Providers -{ - public class ForeignKeyConstraintMapper - { - public string SqlForConstraint(ForeignKeyConstraint constraint) - { - switch(constraint) - { - case ForeignKeyConstraint.Cascade: - return "CASCADE"; - case ForeignKeyConstraint.Restrict: - return "RESTRICT"; - case ForeignKeyConstraint.SetDefault: - return "SET DEFAULT"; - case ForeignKeyConstraint.SetNull: - return "SET NULL"; - default: - return "NO ACTION"; - } - } - } -} diff --git a/Migrator.net/Migrator.Providers/Impl/.svn/all-wcprops b/Migrator.net/Migrator.Providers/Impl/.svn/all-wcprops deleted file mode 100644 index 2ad37dc87..000000000 --- a/Migrator.net/Migrator.Providers/Impl/.svn/all-wcprops +++ /dev/null @@ -1,5 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 51 -/svn/!svn/ver/144/trunk/src/Migrator.Providers/Impl -END diff --git a/Migrator.net/Migrator.Providers/Impl/.svn/entries b/Migrator.net/Migrator.Providers/Impl/.svn/entries deleted file mode 100644 index 2b80596b8..000000000 --- a/Migrator.net/Migrator.Providers/Impl/.svn/entries +++ /dev/null @@ -1,43 +0,0 @@ -10 - -dir -147 -http://migratordotnet.googlecode.com/svn/trunk/src/Migrator.Providers/Impl -http://migratordotnet.googlecode.com/svn - - - -2010-03-25T22:27:09.529568Z -144 -geofflane - - - - - - - - - - - - - - -8c3eb3c4-eb3a-0410-862c-73fa8ce6028b - -SQLite -dir - -PostgreSQL -dir - -Oracle -dir - -Mysql -dir - -SqlServer -dir - diff --git a/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/all-wcprops b/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/all-wcprops deleted file mode 100644 index cd10a5fe9..000000000 --- a/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/all-wcprops +++ /dev/null @@ -1,17 +0,0 @@ -K 25 -svn:wc:ra_dav:version-url -V 58 -/svn/!svn/ver/108/trunk/src/Migrator.Providers/Impl/SQLite -END -SQLiteTransformationProvider.cs -K 25 -svn:wc:ra_dav:version-url -V 90 -/svn/!svn/ver/108/trunk/src/Migrator.Providers/Impl/SQLite/SQLiteTransformationProvider.cs -END -SQLiteDialect.cs -K 25 -svn:wc:ra_dav:version-url -V 74 -/svn/!svn/ver/87/trunk/src/Migrator.Providers/Impl/SQLite/SQLiteDialect.cs -END diff --git a/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/entries b/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/entries deleted file mode 100644 index bbb0295b3..000000000 --- a/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/entries +++ /dev/null @@ -1,96 +0,0 @@ -10 - -dir -147 -http://migratordotnet.googlecode.com/svn/trunk/src/Migrator.Providers/Impl/SQLite -http://migratordotnet.googlecode.com/svn - - - -2008-08-04T22:56:23.283456Z -108 -geofflane - - - - - - - - - - - - - - -8c3eb3c4-eb3a-0410-862c-73fa8ce6028b - -SQLiteTransformationProvider.cs -file - - - - -2011-05-23T18:17:16.308987Z -1a5895030f84893a6051489dcd1958d2 -2008-08-04T22:56:23.283456Z -108 -geofflane - - - - - - - - - - - - - - - - - - - - - -8486 - -SQLiteDialect.cs -file - - - - -2011-05-23T18:17:16.309987Z -4dc0c91dddefbb5ec3c85037f025f3f3 -2008-06-12T19:25:48.586161Z -87 -geofflane - - - - - - - - - - - - - - - - - - - - - -1786 - diff --git a/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/text-base/SQLiteDialect.cs.svn-base b/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/text-base/SQLiteDialect.cs.svn-base deleted file mode 100644 index 0731f79ef..000000000 --- a/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/text-base/SQLiteDialect.cs.svn-base +++ /dev/null @@ -1,44 +0,0 @@ - -using System; -using System.Data; -using Migrator.Framework; - -namespace Migrator.Providers.SQLite -{ - public class SQLiteDialect : Dialect - { - public SQLiteDialect() - { - RegisterColumnType(DbType.Binary, "BLOB"); - RegisterColumnType(DbType.Byte, "INTEGER"); - RegisterColumnType(DbType.Int16, "INTEGER"); - RegisterColumnType(DbType.Int32, "INTEGER"); - RegisterColumnType(DbType.Int64, "INTEGER"); - RegisterColumnType(DbType.SByte, "INTEGER"); - RegisterColumnType(DbType.UInt16, "INTEGER"); - RegisterColumnType(DbType.UInt32, "INTEGER"); - RegisterColumnType(DbType.UInt64, "INTEGER"); - RegisterColumnType(DbType.Currency, "NUMERIC"); - RegisterColumnType(DbType.Decimal, "NUMERIC"); - RegisterColumnType(DbType.Double, "NUMERIC"); - RegisterColumnType(DbType.Single, "NUMERIC"); - RegisterColumnType(DbType.VarNumeric, "NUMERIC"); - RegisterColumnType(DbType.String, "TEXT"); - RegisterColumnType(DbType.AnsiStringFixedLength, "TEXT"); - RegisterColumnType(DbType.StringFixedLength, "TEXT"); - RegisterColumnType(DbType.DateTime, "DATETIME"); - RegisterColumnType(DbType.Time, "DATETIME"); - RegisterColumnType(DbType.Boolean, "INTEGER"); - RegisterColumnType(DbType.Guid, "UNIQUEIDENTIFIER"); - - RegisterProperty(ColumnProperty.Identity, "AUTOINCREMENT"); - } - - public override Type TransformationProvider { get { return typeof(SQLiteTransformationProvider); } } - - public override bool NeedsNotNullForIdentity - { - get { return false; } - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/text-base/SQLiteTransformationProvider.cs.svn-base b/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/text-base/SQLiteTransformationProvider.cs.svn-base deleted file mode 100644 index ad6f3cc31..000000000 --- a/Migrator.net/Migrator.Providers/Impl/SQLite/.svn/text-base/SQLiteTransformationProvider.cs.svn-base +++ /dev/null @@ -1,232 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using Migrator.Framework; -using ForeignKeyConstraint=Migrator.Framework.ForeignKeyConstraint; -#if DOTNET2 -using SqliteConnection=System.Data.SQLite.SQLiteConnection; -#else -using Mono.Data.Sqlite; -#endif - -namespace Migrator.Providers.SQLite -{ - /// - /// Summary description for SQLiteTransformationProvider. - /// - public class SQLiteTransformationProvider : TransformationProvider - { - public SQLiteTransformationProvider(Dialect dialect, string connectionString) - : base(dialect, connectionString) - { - _connection = new SqliteConnection(_connectionString); - _connection.ConnectionString = _connectionString; - _connection.Open(); - } - - public override void AddForeignKey(string name, string primaryTable, string[] primaryColumns, string refTable, - string[] refColumns, ForeignKeyConstraint constraint) - { - // NOOP Because SQLite doesn't support foreign keys - } - - public override void RemoveForeignKey(string name, string table) - { - // NOOP Because SQLite doesn't support foreign keys - } - - public override void RemoveColumn(string table, string column) - { - if (! (TableExists(table) && ColumnExists(table, column))) - return; - - string[] origColDefs = GetColumnDefs(table); - List colDefs = new List(); - - foreach (string origdef in origColDefs) - { - if (! ColumnMatch(column, origdef)) - colDefs.Add(origdef); - } - - string[] newColDefs = colDefs.ToArray(); - string colDefsSql = String.Join(",", newColDefs); - - string[] colNames = ParseSqlForColumnNames(newColDefs); - string colNamesSql = String.Join(",", colNames); - - AddTable(table + "_temp", null, colDefsSql); - ExecuteQuery(String.Format("INSERT INTO {0}_temp SELECT {1} FROM {0}", table, colNamesSql)); - RemoveTable(table); - ExecuteQuery(String.Format("ALTER TABLE {0}_temp RENAME TO {0}", table)); - } - - public override void RenameColumn(string tableName, string oldColumnName, string newColumnName) - { - if (ColumnExists(tableName, newColumnName)) - throw new MigrationException(String.Format("Table '{0}' has column named '{1}' already", tableName, newColumnName)); - - if (ColumnExists(tableName, oldColumnName)) - { - string[] columnDefs = GetColumnDefs(tableName); - string columnDef = Array.Find(columnDefs, delegate(string col) { return ColumnMatch(oldColumnName, col); }); - - string newColumnDef = columnDef.Replace(oldColumnName, newColumnName); - - AddColumn(tableName, newColumnDef); - ExecuteQuery(String.Format("UPDATE {0} SET {1}={2}", tableName, newColumnName, oldColumnName)); - RemoveColumn(tableName, oldColumnName); - } - } - - public override void ChangeColumn(string table, Column column) - { - if (! ColumnExists(table, column.Name)) - { - Logger.Warn("Column {0}.{1} does not exist", table, column.Name); - return; - } - - string tempColumn = "temp_" + column.Name; - RenameColumn(table, column.Name, tempColumn); - AddColumn(table, column); - ExecuteQuery(String.Format("UPDATE {0} SET {1}={2}", table, column.Name, tempColumn)); - RemoveColumn(table, tempColumn); - } - - public override bool TableExists(string table) - { - using (IDataReader reader = - ExecuteQuery(String.Format("SELECT name FROM sqlite_master WHERE type='table' and name='{0}'",table))) - { - return reader.Read(); - } - } - - public override bool ConstraintExists(string table, string name) - { - return false; - } - - public override string[] GetTables() - { - List tables = new List(); - - using (IDataReader reader = ExecuteQuery("SELECT name FROM sqlite_master WHERE type='table' AND name <> 'sqlite_sequence' ORDER BY name")) - { - while (reader.Read()) - { - tables.Add((string) reader[0]); - } - } - - return tables.ToArray(); - } - - public override Column[] GetColumns(string table) - { - List columns = new List(); - foreach (string columnDef in GetColumnDefs(table)) - { - string name = ExtractNameFromColumnDef(columnDef); - // FIXME: Need to get the real type information - Column column = new Column(name, DbType.String); - bool isNullable = IsNullable(columnDef); - column.ColumnProperty |= isNullable ? ColumnProperty.Null : ColumnProperty.NotNull; - columns.Add(column); - } - return columns.ToArray(); - } - - public string GetSqlDefString(string table) - { - string sqldef = null; - using (IDataReader reader = ExecuteQuery(String.Format("SELECT sql FROM sqlite_master WHERE type='table' AND name='{0}'",table))) - { - if (reader.Read()) - { - sqldef = (string) reader[0]; - } - } - return sqldef; - } - - public string[] GetColumnNames(string table) - { - return ParseSqlForColumnNames(GetSqlDefString(table)); - } - - public string[] GetColumnDefs(string table) - { - return ParseSqlColumnDefs(GetSqlDefString(table)); - } - - /// - /// Turn something like 'columnName INTEGER NOT NULL' into just 'columnName' - /// - public string[] ParseSqlForColumnNames(string sqldef) - { - string[] parts = ParseSqlColumnDefs(sqldef); - return ParseSqlForColumnNames(parts); - } - - public string[] ParseSqlForColumnNames(string[] parts) - { - if (null == parts) - return null; - - for (int i = 0; i < parts.Length; i ++) - { - parts[i] = ExtractNameFromColumnDef(parts[i]); - } - return parts; - } - - /// - /// Name is the first value before the space. - /// - /// - /// - public string ExtractNameFromColumnDef(string columnDef) - { - int idx = columnDef.IndexOf(" "); - if (idx > 0) - { - return columnDef.Substring(0, idx); - } - return null; - } - - public bool IsNullable(string columnDef) - { - return ! columnDef.Contains("NOT NULL"); - } - - public string[] ParseSqlColumnDefs(string sqldef) - { - if (String.IsNullOrEmpty(sqldef)) - { - return null; - } - - sqldef = sqldef.Replace(Environment.NewLine, " "); - int start = sqldef.IndexOf("("); - int end = sqldef.IndexOf(")"); - - sqldef = sqldef.Substring(0, end); - sqldef = sqldef.Substring(start + 1); - - string[] cols = sqldef.Split(new char[]{','}); - for (int i = 0; i < cols.Length; i ++) - { - cols[i] = cols[i].Trim(); - } - return cols; - } - - public bool ColumnMatch(string column, string columnDef) - { - return columnDef.StartsWith(column + " ") || columnDef.StartsWith(_dialect.Quote(column)); - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Providers/Impl/SQLite/SQLiteDialect.cs b/Migrator.net/Migrator.Providers/Impl/SQLite/SQLiteDialect.cs deleted file mode 100644 index 0731f79ef..000000000 --- a/Migrator.net/Migrator.Providers/Impl/SQLite/SQLiteDialect.cs +++ /dev/null @@ -1,44 +0,0 @@ - -using System; -using System.Data; -using Migrator.Framework; - -namespace Migrator.Providers.SQLite -{ - public class SQLiteDialect : Dialect - { - public SQLiteDialect() - { - RegisterColumnType(DbType.Binary, "BLOB"); - RegisterColumnType(DbType.Byte, "INTEGER"); - RegisterColumnType(DbType.Int16, "INTEGER"); - RegisterColumnType(DbType.Int32, "INTEGER"); - RegisterColumnType(DbType.Int64, "INTEGER"); - RegisterColumnType(DbType.SByte, "INTEGER"); - RegisterColumnType(DbType.UInt16, "INTEGER"); - RegisterColumnType(DbType.UInt32, "INTEGER"); - RegisterColumnType(DbType.UInt64, "INTEGER"); - RegisterColumnType(DbType.Currency, "NUMERIC"); - RegisterColumnType(DbType.Decimal, "NUMERIC"); - RegisterColumnType(DbType.Double, "NUMERIC"); - RegisterColumnType(DbType.Single, "NUMERIC"); - RegisterColumnType(DbType.VarNumeric, "NUMERIC"); - RegisterColumnType(DbType.String, "TEXT"); - RegisterColumnType(DbType.AnsiStringFixedLength, "TEXT"); - RegisterColumnType(DbType.StringFixedLength, "TEXT"); - RegisterColumnType(DbType.DateTime, "DATETIME"); - RegisterColumnType(DbType.Time, "DATETIME"); - RegisterColumnType(DbType.Boolean, "INTEGER"); - RegisterColumnType(DbType.Guid, "UNIQUEIDENTIFIER"); - - RegisterProperty(ColumnProperty.Identity, "AUTOINCREMENT"); - } - - public override Type TransformationProvider { get { return typeof(SQLiteTransformationProvider); } } - - public override bool NeedsNotNullForIdentity - { - get { return false; } - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Providers/Impl/SQLite/SQLiteTransformationProvider.cs b/Migrator.net/Migrator.Providers/Impl/SQLite/SQLiteTransformationProvider.cs deleted file mode 100644 index d4731d218..000000000 --- a/Migrator.net/Migrator.Providers/Impl/SQLite/SQLiteTransformationProvider.cs +++ /dev/null @@ -1,232 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using Migrator.Framework; -using ForeignKeyConstraint=Migrator.Framework.ForeignKeyConstraint; -#if DOTNET2 -using SqliteConnection=System.Data.SQLite.SQLiteConnection; -#else -using Mono.Data.Sqlite; -#endif - -namespace Migrator.Providers.SQLite -{ - /// - /// Summary description for SQLiteTransformationProvider. - /// - public class SQLiteTransformationProvider : TransformationProvider - { - public SQLiteTransformationProvider(Dialect dialect, string connectionString) - : base(dialect, connectionString) - { - _connection = new SqliteConnection(_connectionString); - _connection.ConnectionString = _connectionString; - _connection.Open(); - } - - public override void AddForeignKey(string name, string primaryTable, string[] primaryColumns, string refTable, - string[] refColumns, ForeignKeyConstraint constraint) - { - // NOOP Because SQLite doesn't support foreign keys - } - - public override void RemoveForeignKey(string name, string table) - { - // NOOP Because SQLite doesn't support foreign keys - } - - public override void RemoveColumn(string table, string column) - { - if (! (TableExists(table) && ColumnExists(table, column))) - return; - - string[] origColDefs = GetColumnDefs(table); - List colDefs = new List(); - - foreach (string origdef in origColDefs) - { - if (! ColumnMatch(column, origdef)) - colDefs.Add(origdef); - } - - string[] newColDefs = colDefs.ToArray(); - string colDefsSql = String.Join(",", newColDefs); - - string[] colNames = ParseSqlForColumnNames(newColDefs); - string colNamesSql = String.Join(",", colNames); - - AddTable(table + "_temp", null, colDefsSql); - ExecuteQuery(String.Format("INSERT INTO {0}_temp SELECT {1} FROM {0}", table, colNamesSql)); - RemoveTable(table); - ExecuteQuery(String.Format("ALTER TABLE {0}_temp RENAME TO {0}", table)); - } - - public override void RenameColumn(string tableName, string oldColumnName, string newColumnName) - { - if (ColumnExists(tableName, newColumnName)) - throw new MigrationException(String.Format("Table '{0}' has column named '{1}' already", tableName, newColumnName)); - - if (ColumnExists(tableName, oldColumnName)) - { - string[] columnDefs = GetColumnDefs(tableName); - string columnDef = Array.Find(columnDefs, delegate(string col) { return ColumnMatch(oldColumnName, col); }); - - string newColumnDef = columnDef.Replace(oldColumnName, newColumnName); - - AddColumn(tableName, newColumnDef); - ExecuteQuery(String.Format("UPDATE {0} SET {1}={2}", tableName, newColumnName, oldColumnName)); - RemoveColumn(tableName, oldColumnName); - } - } - - public override void ChangeColumn(string table, Column column) - { - if (! ColumnExists(table, column.Name)) - { - Logger.Warn("Column {0}.{1} does not exist", table, column.Name); - return; - } - - string tempColumn = "temp_" + column.Name; - RenameColumn(table, column.Name, tempColumn); - AddColumn(table, column); - ExecuteQuery(String.Format("UPDATE {0} SET {1}={2}", table, column.Name, tempColumn)); - RemoveColumn(table, tempColumn); - } - - public override bool TableExists(string table) - { - using (IDataReader reader = - ExecuteQuery(String.Format("SELECT name FROM sqlite_master WHERE type='table' and name='{0}'",table))) - { - return reader.Read(); - } - } - - public override bool ConstraintExists(string table, string name) - { - return false; - } - - public override string[] GetTables() - { - List tables = new List(); - - using (IDataReader reader = ExecuteQuery("SELECT name FROM sqlite_master WHERE type='table' AND name <> 'sqlite_sequence' ORDER BY name")) - { - while (reader.Read()) - { - tables.Add((string) reader[0]); - } - } - - return tables.ToArray(); - } - - public override Column[] GetColumns(string table) - { - List columns = new List(); - foreach (string columnDef in GetColumnDefs(table)) - { - string name = ExtractNameFromColumnDef(columnDef); - // FIXME: Need to get the real type information - Column column = new Column(name, DbType.String); - bool isNullable = IsNullable(columnDef); - column.ColumnProperty |= isNullable ? ColumnProperty.Null : ColumnProperty.NotNull; - columns.Add(column); - } - return columns.ToArray(); - } - - public string GetSqlDefString(string table) - { - string sqldef = null; - using (IDataReader reader = ExecuteQuery(String.Format("SELECT sql FROM sqlite_master WHERE type='table' AND name='{0}'",table))) - { - if (reader.Read()) - { - sqldef = (string) reader[0]; - } - } - return sqldef; - } - - public string[] GetColumnNames(string table) - { - return ParseSqlForColumnNames(GetSqlDefString(table)); - } - - public string[] GetColumnDefs(string table) - { - return ParseSqlColumnDefs(GetSqlDefString(table)); - } - - /// - /// Turn something like 'columnName INTEGER NOT NULL' into just 'columnName' - /// - public string[] ParseSqlForColumnNames(string sqldef) - { - string[] parts = ParseSqlColumnDefs(sqldef); - return ParseSqlForColumnNames(parts); - } - - public string[] ParseSqlForColumnNames(string[] parts) - { - if (null == parts) - return null; - - for (int i = 0; i < parts.Length; i ++) - { - parts[i] = ExtractNameFromColumnDef(parts[i]); - } - return parts; - } - - /// - /// Name is the first value before the space. - /// - /// - /// - public string ExtractNameFromColumnDef(string columnDef) - { - int idx = columnDef.IndexOf(" "); - if (idx > 0) - { - return columnDef.Substring(0, idx); - } - return null; - } - - public bool IsNullable(string columnDef) - { - return ! columnDef.Contains("NOT NULL"); - } - - public string[] ParseSqlColumnDefs(string sqldef) - { - if (String.IsNullOrEmpty(sqldef)) - { - return null; - } - - sqldef = sqldef.Replace(Environment.NewLine, " "); - int start = sqldef.IndexOf("("); - int end = sqldef.LastIndexOf(")"); - - sqldef = sqldef.Substring(0, end); - sqldef = sqldef.Substring(start + 1); - - string[] cols = sqldef.Split(new char[]{','}); - for (int i = 0; i < cols.Length; i ++) - { - cols[i] = cols[i].Trim(); - } - return cols; - } - - public bool ColumnMatch(string column, string columnDef) - { - return columnDef.StartsWith(column + " ") || columnDef.StartsWith(_dialect.Quote(column)); - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator.Providers/Migrator.Providers.csproj b/Migrator.net/Migrator.Providers/Migrator.Providers.csproj deleted file mode 100644 index 93786bb95..000000000 --- a/Migrator.net/Migrator.Providers/Migrator.Providers.csproj +++ /dev/null @@ -1,119 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {D58C68E4-D789-40F7-9078-C9F587D4363C} - Library - Migrator.Providers - Migrator.Providers - - - 3.5 - - - false - true - MigratorDotNet.snk - v2.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - true - full - false - bin\Debug\ - TRACE;DEBUG;DOTNET2 - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE;DOTNET2 - prompt - 4 - x86 - - - - - - ..\..\Libraries\System.Data.SQLite.dll - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - {5270F048-E580-486C-B14C-E5B9F6E539D4} - Migrator.Framework - - - - - \ No newline at end of file diff --git a/Migrator.net/Migrator.Providers/MigratorDotNet.snk b/Migrator.net/Migrator.Providers/MigratorDotNet.snk deleted file mode 100644 index 5032d709b5f932cf07ddd8f648e48be997070eca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098&QAO#LALQS0Pij|L3{e%+^Z1cMB$8_) zTaxrG8m7jW|B>|0ivYdq(NB_WJ&jUxSbMA&!J|{m17Uova_*H^0YnLR0Q_XBJa2oy z98cM~9-lR`>|bA04N`T?30>i4Uh5-{9hcdO^!>}B^Jr(0JNas~*g)nQt;-9%IS-DPEMCsK~mxp34ur)AjGXP3a_8S8CdF&!+R#@v&; zpSu_NSs}MQ1bXQGxwaz_aX|Y1R@@Ab)8O3Y{H%def>^smsL{yum|K9wR`(a zT`haxuW78Z4^*wu+c|fIAzF3U0BJCwo)=}^AvWg;1YS^J9)NT&^wz&UU;Y%BZS7^7J$mBz z6_gYtrvS|G(JYkfM$T^oxrpWU)3wQ<(7X>v{@rPNJ}i1cW42dvoYR3k9LQGlzN74e ipJfbR0EsQaV{z})*xHUESl1@BOSH$vUMU&v@-ebWnkO;< diff --git a/Migrator.net/Migrator.Providers/NoOpTransformationProvider.cs b/Migrator.net/Migrator.Providers/NoOpTransformationProvider.cs deleted file mode 100644 index 4b7903605..000000000 --- a/Migrator.net/Migrator.Providers/NoOpTransformationProvider.cs +++ /dev/null @@ -1,352 +0,0 @@ -using System; -using System.Data; -using Migrator.Framework; -using ForeignKeyConstraint=Migrator.Framework.ForeignKeyConstraint; -using System.Collections.Generic; - -namespace Migrator.Providers -{ - /// - /// No Op (Null Object Pattern) implementation of the ITransformationProvider - /// - public class NoOpTransformationProvider : ITransformationProvider - { - - public static readonly NoOpTransformationProvider Instance = new NoOpTransformationProvider(); - - private NoOpTransformationProvider() - { - - } - - public virtual ILogger Logger - { - get { return null; } - set { } - } - - public Dialect Dialect - { - get { return null; } - } - - public string[] GetTables() - { - return null; - } - - public Column[] GetColumns(string table) - { - return null; - } - - public Column GetColumnByName(string table, string column) - { - return null; - } - - public void RemoveForeignKey(string table, string name) - { - // No Op - } - - public void RemoveConstraint(string table, string name) - { - // No Op - } - - public void RemoveIndex(string table, string name) - { - // No Op - } - - public void AddTable(string name, params Column[] columns) - { - // No Op - } - - public void AddTable(string name, string engine, params Column[] columns) - { - // No Op - } - - public void RemoveTable(string name) - { - // No Op - } - - public void RenameTable(string oldName, string newName) - { - // No Op - } - - public void RenameColumn(string tableName, string oldColumnName, string newColumnName) - { - // No Op - } - - public void AddColumn(string table, string sqlColumn) - { - // No Op - } - - public void RemoveColumn(string table, string column) - { - // No Op - } - - public bool ColumnExists(string table, string column) - { - return false; - } - - public bool TableExists(string table) - { - return false; - } - - public void AddColumn(string table, string column, DbType type, int size, ColumnProperty property, object defaultValue) - { - // No Op - } - - public void AddColumn(string table, string column, DbType type) - { - // No Op - } - - public void AddColumn(string table, string column, DbType type, object defaultValue) - { - // No Op - } - - public void AddColumn(string table, string column, DbType type, int size) - { - // No Op - } - - public void AddColumn(string table, string column, DbType type, ColumnProperty property) - { - // No Op - } - - public void AddColumn(string table, string column, DbType type, int size, ColumnProperty property) - { - // No Op - } - - public void AddIndex(string name, string table, params string[] columns) - { - //No Op - } - - public void AddIndex(string name, string table, bool unique, params string[] columns) - { - //No Op - } - - public void AddPrimaryKey(string name, string table, params string[] columns) - { - // No Op - } - - public void GenerateForeignKey(string primaryTable, string primaryColumn, string refTable, string refColumn) - { - // No Op - } - - public void GenerateForeignKey(string primaryTable, string[] primaryColumns, string refTable, string[] refColumns) - { - // No Op - } - - public void GenerateForeignKey(string primaryTable, string primaryColumn, string refTable, string refColumn, ForeignKeyConstraint constraint) - { - // No Op - } - - public void GenerateForeignKey(string primaryTable, string[] primaryColumns, string refTable, - string[] refColumns, ForeignKeyConstraint constraint) - { - // No Op - } - - public void AddForeignKey(string name, string primaryTable, string primaryColumn, string refTable, - string refColumn) - { - // No Op - } - - public void AddForeignKey(string name, string primaryTable, string[] primaryColumns, string refTable, string[] refColumns) - { - // No Op - } - - public void AddForeignKey(string name, string primaryTable, string primaryColumn, string refTable, string refColumn, ForeignKeyConstraint constraint) - { - // No Op - } - - public void AddForeignKey(string name, string primaryTable, string[] primaryColumns, string refTable, - string[] refColumns, ForeignKeyConstraint constraint) - { - // No Op - } - - public void AddUniqueConstraint(string name, string table, params string[] columns) - { - // No Op - } - - public void AddCheckConstraint(string name, string table, string checkSql) - { - // No Op - } - - public bool ConstraintExists(string table, string name) - { - return false; - } - - public void ChangeColumn(string table, Column column) - { - // No Op - } - - - public bool PrimaryKeyExists(string table, string name) - { - return false; - } - - public int ExecuteNonQuery(string sql) - { - return 0; - } - - public IDataReader ExecuteQuery(string sql) - { - return null; - } - - public object ExecuteScalar(string sql) - { - return null; - } - - public IDataReader Select(string what, string from) - { - return null; - } - - public IDataReader Select(string what, string from, string where) - { - return null; - } - - public object SelectScalar(string what, string from) - { - return null; - } - - public object SelectScalar(string what, string from, string where) - { - return null; - } - - public int Update(string table, string[] columns, string[] columnValues) - { - return 0; - } - - public int Update(string table, string[] columns, string[] columnValues, string where) - { - return 0; - } - - public int Insert(string table, string[] columns, string[] columnValues) - { - return 0; - } - - public int Delete(string table, string[] columns, string[] columnValues) - { - return 0; - } - - public int Delete(string table, string column, string value) - { - return 0; - } - - public void BeginTransaction() - { - // No Op - } - - public void Rollback() - { - // No Op - } - - public void Commit() - { - // No Op - } - - public ITransformationProvider this[string provider] - { - get { return this; } - } - - public void MigrationApplied(long version) - { - //no op - } - - public void MigrationUnApplied(long version) - { - //no op - } - - public List AppliedMigrations - { - get { return new List(); } - } - - protected void CreateSchemaInfoTable() - { - - } - - public void AddColumn(string table, Column column) - { - // No Op - } - - public void GenerateForeignKey(string primaryTable, string refTable) - { - // No Op - } - - public void GenerateForeignKey(string primaryTable, string refTable, ForeignKeyConstraint constraint) - { - // No Op - } - - public IDbCommand GetCommand() - { - return null; - } - - public void ExecuteSchemaBuilder(Migrator.Framework.SchemaBuilder.SchemaBuilder schemaBuilder) - { - // No Op - } - - public void Dispose() - { - //No Op - } - } -} diff --git a/Migrator.net/Migrator.Providers/TransformationProvider.cs b/Migrator.net/Migrator.Providers/TransformationProvider.cs deleted file mode 100644 index 8ee5c718f..000000000 --- a/Migrator.net/Migrator.Providers/TransformationProvider.cs +++ /dev/null @@ -1,881 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -using System; -using System.Collections.Generic; -using System.Data; -using Migrator.Framework; -using Migrator.Framework.SchemaBuilder; -using ForeignKeyConstraint = Migrator.Framework.ForeignKeyConstraint; -using Migrator.Framework.Loggers; - -namespace Migrator.Providers -{ - /// - /// Base class for every transformation providers. - /// A 'tranformation' is an operation that modifies the database. - /// - public abstract class TransformationProvider : ITransformationProvider - { - private ILogger _logger; - protected IDbConnection _connection; - private IDbTransaction _transaction; - private List _appliedMigrations; - - protected readonly string _connectionString; - protected Dialect _dialect; - - private readonly ForeignKeyConstraintMapper constraintMapper = new ForeignKeyConstraintMapper(); - - protected TransformationProvider(Dialect dialect, string connectionString) - { - _dialect = dialect; - _connectionString = connectionString; - _logger = new Logger(false); - } - - /// - /// Returns the event logger - /// - public virtual ILogger Logger - { - get { return _logger; } - set { _logger = value; } - } - - public Dialect Dialect - { - get { return _dialect; } - } - - public ITransformationProvider this[string provider] - { - get - { - if (null != provider && IsThisProvider(provider)) - return this; - - return NoOpTransformationProvider.Instance; - } - } - - public bool IsThisProvider(string provider) - { - // XXX: This might need to be more sophisticated. Currently just a convention - return GetType().Name.ToLower().StartsWith(provider.ToLower()); - } - - public virtual Column[] GetColumns(string table) - { - List columns = new List(); - using ( - IDataReader reader = - ExecuteQuery( - String.Format("select COLUMN_NAME, IS_NULLABLE from information_schema.columns where table_name = '{0}'", table))) - { - while (reader.Read()) - { - Column column = new Column(reader.GetString(0), DbType.String); - string nullableStr = reader.GetString(1); - bool isNullable = nullableStr == "YES"; - column.ColumnProperty |= isNullable ? ColumnProperty.Null : ColumnProperty.NotNull; - - columns.Add(column); - } - } - - return columns.ToArray(); - } - - public virtual Column GetColumnByName(string table, string columnName) - { - return Array.Find(GetColumns(table), - delegate(Column column) - { - return column.Name == columnName; - }); - } - - public virtual string[] GetTables() - { - List tables = new List(); - using (IDataReader reader = ExecuteQuery("SELECT table_name FROM information_schema.tables")) - { - while (reader.Read()) - { - tables.Add((string)reader[0]); - } - } - return tables.ToArray(); - } - - public virtual void RemoveForeignKey(string table, string name) - { - RemoveConstraint(table, name); - } - - public virtual void RemoveConstraint(string table, string name) - { - if (TableExists(table) && ConstraintExists(table, name)) - { - table = _dialect.TableNameNeedsQuote ? _dialect.Quote(table) : table; - name = _dialect.ConstraintNameNeedsQuote ? _dialect.Quote(name) : name; - ExecuteNonQuery(String.Format("ALTER TABLE {0} DROP CONSTRAINT {1}", table, name)); - } - } - - public void RemoveIndex(string table, string name) - { - throw new NotImplementedException(); - } - - public virtual void AddTable(string table, string engine, string columns) - { - table = _dialect.TableNameNeedsQuote ? _dialect.Quote(table) : table; - string sqlCreate = String.Format("CREATE TABLE {0} ({1})", table, columns); - ExecuteNonQuery(sqlCreate); - } - - /// - /// Add a new table - /// - /// Table name - /// Columns - /// - /// Adds the Test table with two columns: - /// - /// Database.AddTable("Test", - /// new Column("Id", typeof(int), ColumnProperty.PrimaryKey), - /// new Column("Title", typeof(string), 100) - /// ); - /// - /// - public virtual void AddTable(string name, params Column[] columns) - { - // Most databases don't have the concept of a storage engine, so default is to not use it. - AddTable(name, null, columns); - } - - /// - /// Add a new table - /// - /// Table name - /// Columns - /// the database storage engine to use - /// - /// Adds the Test table with two columns: - /// - /// Database.AddTable("Test", "INNODB", - /// new Column("Id", typeof(int), ColumnProperty.PrimaryKey), - /// new Column("Title", typeof(string), 100) - /// ); - /// - /// - public virtual void AddTable(string name, string engine, params Column[] columns) - { - - if (TableExists(name)) - { - Logger.Warn("Table {0} already exists", name); - return; - } - - List pks = GetPrimaryKeys(columns); - bool compoundPrimaryKey = pks.Count > 1; - - List columnProviders = new List(columns.Length); - foreach (Column column in columns) - { - // Remove the primary key notation if compound primary key because we'll add it back later - if (compoundPrimaryKey && column.IsPrimaryKey) - column.ColumnProperty = ColumnProperty.Unsigned | ColumnProperty.NotNull; - - ColumnPropertiesMapper mapper = _dialect.GetAndMapColumnProperties(column); - columnProviders.Add(mapper); - } - - string columnsAndIndexes = JoinColumnsAndIndexes(columnProviders); - AddTable(name, engine, columnsAndIndexes); - - if (compoundPrimaryKey) - { - AddPrimaryKey(String.Format("PK_{0}", name), name, pks.ToArray()); - } - } - - public List GetPrimaryKeys(IEnumerable columns) - { - List pks = new List(); - foreach (Column col in columns) - { - if (col.IsPrimaryKey) - pks.Add(col.Name); - } - return pks; - } - - public virtual void RemoveTable(string name) - { - if (TableExists(name)) - ExecuteNonQuery(String.Format("DROP TABLE {0}", name)); - } - - public virtual void RenameTable(string oldName, string newName) - { - if (TableExists(newName)) - throw new MigrationException(String.Format("Table with name '{0}' already exists", newName)); - - if (TableExists(oldName)) - ExecuteNonQuery(String.Format("ALTER TABLE {0} RENAME TO {1}", oldName, newName)); - } - - public virtual void RenameColumn(string tableName, string oldColumnName, string newColumnName) - { - if (ColumnExists(tableName, newColumnName)) - throw new MigrationException(String.Format("Table '{0}' has column named '{1}' already", tableName, newColumnName)); - - if (ColumnExists(tableName, oldColumnName)) - ExecuteNonQuery(String.Format("ALTER TABLE {0} RENAME COLUMN {1} TO {2}", tableName, oldColumnName, newColumnName)); - } - - public virtual void AddColumn(string table, string sqlColumn) - { - ExecuteNonQuery(String.Format("ALTER TABLE {0} ADD COLUMN {1}", table, sqlColumn)); - } - - public virtual void RemoveColumn(string table, string column) - { - if (ColumnExists(table, column)) - { - ExecuteNonQuery(String.Format("ALTER TABLE {0} DROP COLUMN {1} ", table, column)); - } - } - - public virtual bool ColumnExists(string table, string column) - { - try - { - ExecuteNonQuery(String.Format("SELECT {0} FROM {1}", column, table)); - return true; - } - catch (Exception) - { - return false; - } - } - - public virtual void ChangeColumn(string table, Column column) - { - if (!ColumnExists(table, column.Name)) - { - Logger.Warn("Column {0}.{1} does not exist", table, column.Name); - return; - } - - ColumnPropertiesMapper mapper = _dialect.GetAndMapColumnProperties(column); - ChangeColumn(table, mapper.ColumnSql); - } - - public virtual void ChangeColumn(string table, string sqlColumn) - { - ExecuteNonQuery(String.Format("ALTER TABLE {0} ALTER COLUMN {1}", table, sqlColumn)); - } - - public virtual bool TableExists(string table) - { - try - { - ExecuteNonQuery("SELECT COUNT(*) FROM " + table); - return true; - } - catch (Exception) - { - return false; - } - } - - protected virtual string JoinColumnsAndIndexes(IEnumerable columns) - { - string indexes = JoinIndexes(columns); - string columnsAndIndexes = JoinColumns(columns) + (indexes != null ? "," + indexes : String.Empty); - return columnsAndIndexes; - } - - protected virtual string JoinIndexes(IEnumerable columns) - { - List indexes = new List(); - foreach (ColumnPropertiesMapper column in columns) - { - string indexSql = column.IndexSql; - if (indexSql != null) - indexes.Add(indexSql); - } - - if (indexes.Count == 0) - return null; - - return String.Join(", ", indexes.ToArray()); - } - - protected virtual string JoinColumns(IEnumerable columns) - { - List columnStrings = new List(); - foreach (ColumnPropertiesMapper column in columns) - columnStrings.Add(column.ColumnSql); - return String.Join(", ", columnStrings.ToArray()); - } - - /// - /// Add a new column to an existing table. - /// - /// Table to which to add the column - /// Column name - /// Date type of the column - /// Max length of the column - /// Properties of the column, see ColumnProperty, - /// Default value - public virtual void AddColumn(string table, string column, DbType type, int size, ColumnProperty property, - object defaultValue) - { - if (ColumnExists(table, column)) - { - Logger.Warn("Column {0}.{1} already exists", table, column); - return; - } - - ColumnPropertiesMapper mapper = - _dialect.GetAndMapColumnProperties(new Column(column, type, size, property, defaultValue)); - - AddColumn(table, mapper.ColumnSql); - } - - /// - /// - /// AddColumn(string, string, Type, int, ColumnProperty, object) - /// - /// - public virtual void AddColumn(string table, string column, DbType type) - { - AddColumn(table, column, type, 0, ColumnProperty.Null, null); - } - - /// - /// - /// AddColumn(string, string, Type, int, ColumnProperty, object) - /// - /// - public virtual void AddColumn(string table, string column, DbType type, int size) - { - AddColumn(table, column, type, size, ColumnProperty.Null, null); - } - - public void AddColumn(string table, string column, DbType type, object defaultValue) - { - if (ColumnExists(table, column)) - { - Logger.Warn("Column {0}.{1} already exists", table, column); - return; - } - - ColumnPropertiesMapper mapper = - _dialect.GetAndMapColumnProperties(new Column(column, type, defaultValue)); - - AddColumn(table, mapper.ColumnSql); - - } - - /// - /// - /// AddColumn(string, string, Type, int, ColumnProperty, object) - /// - /// - public virtual void AddColumn(string table, string column, DbType type, ColumnProperty property) - { - AddColumn(table, column, type, 0, property, null); - } - - /// - /// - /// AddColumn(string, string, Type, int, ColumnProperty, object) - /// - /// - public virtual void AddColumn(string table, string column, DbType type, int size, ColumnProperty property) - { - AddColumn(table, column, type, size, property, null); - } - - public void AddIndex(string name, string table, bool unique, params string[] columns) - { - try - { - var uniqueText = ""; - if (unique) uniqueText = "UNIQUE"; - - var command = String.Format("CREATE {0} INDEX {1} ON {2} ({3})", uniqueText, name, table, String.Join(",", columns)); - - ExecuteNonQuery(command); - } - catch (Exception e) - { - Logger.Exception("Unable to add index", e); - } - } - - /// - /// Append a primary key to a table. - /// - /// Constraint name - /// Table name - /// Primary column names - public virtual void AddPrimaryKey(string name, string table, params string[] columns) - { - if (ConstraintExists(table, name)) - { - Logger.Warn("Primary key {0} already exists", name); - return; - } - ExecuteNonQuery( - String.Format("ALTER TABLE {0} ADD CONSTRAINT {1} PRIMARY KEY ({2}) ", table, name, - String.Join(",", columns))); - } - - public virtual void AddUniqueConstraint(string name, string table, params string[] columns) - { - if (ConstraintExists(table, name)) - { - Logger.Warn("Constraint {0} already exists", name); - return; - } - ExecuteNonQuery(String.Format("ALTER TABLE {0} ADD CONSTRAINT {1} UNIQUE({2}) ", table, name, string.Join(", ", columns))); - } - - public virtual void AddCheckConstraint(string name, string table, string checkSql) - { - if (ConstraintExists(table, name)) - { - Logger.Warn("Constraint {0} already exists", name); - return; - } - ExecuteNonQuery(String.Format("ALTER TABLE {0} ADD CONSTRAINT {1} CHECK ({2}) ", table, name, checkSql)); - } - - /// - /// Guesses the name of the foreign key and add it - /// - public virtual void GenerateForeignKey(string primaryTable, string primaryColumn, string refTable, string refColumn) - { - AddForeignKey("FK_" + primaryTable + "_" + refTable, primaryTable, primaryColumn, refTable, refColumn); - } - - /// - /// Guesses the name of the foreign key and add it - /// - /// - public virtual void GenerateForeignKey(string primaryTable, string[] primaryColumns, string refTable, - string[] refColumns) - { - AddForeignKey("FK_" + primaryTable + "_" + refTable, primaryTable, primaryColumns, refTable, refColumns); - } - - /// - /// Guesses the name of the foreign key and add it - /// - public virtual void GenerateForeignKey(string primaryTable, string primaryColumn, string refTable, - string refColumn, ForeignKeyConstraint constraint) - { - AddForeignKey("FK_" + primaryTable + "_" + refTable, primaryTable, primaryColumn, refTable, refColumn, - constraint); - } - - /// - /// Guesses the name of the foreign key and add it - /// - /// - public virtual void GenerateForeignKey(string primaryTable, string[] primaryColumns, string refTable, - string[] refColumns, ForeignKeyConstraint constraint) - { - AddForeignKey("FK_" + primaryTable + "_" + refTable, primaryTable, primaryColumns, refTable, refColumns, - constraint); - } - - /// - /// Append a foreign key (relation) between two tables. - /// tables. - /// - /// Constraint name - /// Table name containing the primary key - /// Primary key column name - /// Foreign table name - /// Foreign column name - public virtual void AddForeignKey(string name, string primaryTable, string primaryColumn, string refTable, - string refColumn) - { - AddForeignKey(name, primaryTable, new string[] { primaryColumn }, refTable, new string[] { refColumn }); - } - - /// - /// - /// AddForeignKey(string, string, string, string, string) - /// - /// - public virtual void AddForeignKey(string name, string primaryTable, string[] primaryColumns, string refTable, string[] refColumns) - { - AddForeignKey(name, primaryTable, primaryColumns, refTable, refColumns, ForeignKeyConstraint.NoAction); - } - - public virtual void AddForeignKey(string name, string primaryTable, string primaryColumn, string refTable, string refColumn, ForeignKeyConstraint constraint) - { - AddForeignKey(name, primaryTable, new string[] { primaryColumn }, refTable, new string[] { refColumn }, - constraint); - } - - public virtual void AddForeignKey(string name, string primaryTable, string[] primaryColumns, string refTable, - string[] refColumns, ForeignKeyConstraint constraint) - { - if (ConstraintExists(primaryTable, name)) - { - Logger.Warn("Constraint {0} already exists", name); - return; - } - - string constraintResolved = constraintMapper.SqlForConstraint(constraint); - ExecuteNonQuery( - String.Format( - "ALTER TABLE {0} ADD CONSTRAINT {1} FOREIGN KEY ({2}) REFERENCES {3} ({4}) ON UPDATE {5} ON DELETE {6}", - primaryTable, name, String.Join(",", primaryColumns), - refTable, String.Join(",", refColumns), constraintResolved, constraintResolved)); - } - - /// - /// Determines if a constraint exists. - /// - /// Constraint name - /// Table owning the constraint - /// true if the constraint exists. - public abstract bool ConstraintExists(string table, string name); - - public virtual bool PrimaryKeyExists(string table, string name) - { - return ConstraintExists(table, name); - } - - public int ExecuteNonQuery(string sql) - { - Logger.Trace(sql); - Logger.ApplyingDBChange(sql); - using (IDbCommand cmd = BuildCommand(sql)) - { - try - { - return cmd.ExecuteNonQuery(); - } - catch (Exception ex) - { - Logger.Warn(ex.Message); - throw; - } - } - } - - private IDbCommand BuildCommand(string sql) - { - IDbCommand cmd = _connection.CreateCommand(); - cmd.CommandText = sql; - cmd.CommandType = CommandType.Text; - if (_transaction != null) - { - cmd.Transaction = _transaction; - } - return cmd; - } - - /// - /// Execute an SQL query returning results. - /// - /// The SQL command. - /// A data iterator, IDataReader. - public IDataReader ExecuteQuery(string sql) - { - Logger.Trace(sql); - using (IDbCommand cmd = BuildCommand(sql)) - { - try - { - return cmd.ExecuteReader(); - } - catch - { - Logger.Warn("query failed: {0}", cmd.CommandText); - throw; - } - } - } - - public object ExecuteScalar(string sql) - { - Logger.Trace(sql); - using (IDbCommand cmd = BuildCommand(sql)) - { - try - { - return cmd.ExecuteScalar(); - } - catch - { - Logger.Warn("Query failed: {0}", cmd.CommandText); - throw; - } - } - } - - public IDataReader Select(string what, string from) - { - return Select(what, from, "1=1"); - } - - public virtual IDataReader Select(string what, string from, string where) - { - return ExecuteQuery(String.Format("SELECT {0} FROM {1} WHERE {2}", what, from, where)); - } - - public object SelectScalar(string what, string from) - { - return SelectScalar(what, from, "1=1"); - } - - public virtual object SelectScalar(string what, string from, string where) - { - return ExecuteScalar(String.Format("SELECT {0} FROM {1} WHERE {2}", what, from, where)); - } - - public virtual int Update(string table, string[] columns, string[] values) - { - return Update(table, columns, values, null); - } - - public virtual int Update(string table, string[] columns, string[] values, string where) - { - string namesAndValues = JoinColumnsAndValues(columns, values); - - string query = "UPDATE {0} SET {1}"; - if (!String.IsNullOrEmpty(where)) - { - query += " WHERE " + where; - } - - return ExecuteNonQuery(String.Format(query, table, namesAndValues)); - } - - public virtual int Insert(string table, string[] columns, string[] values) - { - return ExecuteNonQuery(String.Format("INSERT INTO {0} ({1}) VALUES ({2})", table, String.Join(", ", columns), String.Join(", ", QuoteValues(values)))); - } - - public virtual int Delete(string table) - { - return Delete(table, (string[])null, (string[])null); - } - - public virtual int Delete(string table, string[] columns, string[] values) - { - if (null == columns || null == values) - { - return ExecuteNonQuery(String.Format("DELETE FROM {0}", table)); - } - else - { - return ExecuteNonQuery(String.Format("DELETE FROM {0} WHERE ({1})", table, JoinColumnsAndValues(columns, values))); - } - } - - public virtual int Delete(string table, string wherecolumn, string wherevalue) - { - return ExecuteNonQuery(String.Format("DELETE FROM {0} WHERE {1} = {2}", table, wherecolumn, QuoteValues(wherevalue))); - } - - /// - /// Starts a transaction. Called by the migration mediator. - /// - public void BeginTransaction() - { - if (_transaction == null && _connection != null) - { - EnsureHasConnection(); - _transaction = _connection.BeginTransaction(IsolationLevel.ReadCommitted); - } - } - - protected void EnsureHasConnection() - { - if (_connection.State != ConnectionState.Open) - { - _connection.Open(); - } - } - - /// - /// Rollback the current migration. Called by the migration mediator. - /// - public virtual void Rollback() - { - if (_transaction != null && _connection != null && _connection.State == ConnectionState.Open) - { - try - { - _transaction.Rollback(); - } - finally - { - _connection.Close(); - } - } - _transaction = null; - } - - /// - /// Commit the current transaction. Called by the migrations mediator. - /// - public void Commit() - { - if (_transaction != null && _connection != null && _connection.State == ConnectionState.Open) - { - try - { - _transaction.Commit(); - } - finally - { - _connection.Close(); - } - } - _transaction = null; - } - - /// - /// The list of Migrations currently applied to the database. - /// - public List AppliedMigrations - { - get - { - if (_appliedMigrations == null) - { - _appliedMigrations = new List(); - CreateSchemaInfoTable(); - using (IDataReader reader = Select("version", "SchemaInfo")) - { - while (reader.Read()) - { - _appliedMigrations.Add(Convert.ToInt64(reader.GetValue(0))); - } - } - } - return _appliedMigrations; - } - } - - /// - /// Marks a Migration version number as having been applied - /// - /// The version number of the migration that was applied - public void MigrationApplied(long version) - { - CreateSchemaInfoTable(); - Insert("SchemaInfo", new string[] { "version" }, new string[] { version.ToString() }); - _appliedMigrations.Add(version); - } - - /// - /// Marks a Migration version number as having been rolled back from the database - /// - /// The version number of the migration that was removed - public void MigrationUnApplied(long version) - { - CreateSchemaInfoTable(); - Delete("SchemaInfo", "version", version.ToString()); - _appliedMigrations.Remove(version); - } - - protected void CreateSchemaInfoTable() - { - EnsureHasConnection(); - if (!TableExists("SchemaInfo")) - { - AddTable("SchemaInfo", new Column("Version", DbType.Int64, ColumnProperty.PrimaryKey)); - } - } - - public void AddColumn(string table, Column column) - { - AddColumn(table, column.Name, column.Type, column.Size, column.ColumnProperty, column.DefaultValue); - } - - public void GenerateForeignKey(string primaryTable, string refTable) - { - GenerateForeignKey(primaryTable, refTable, ForeignKeyConstraint.NoAction); - } - - public void GenerateForeignKey(string primaryTable, string refTable, ForeignKeyConstraint constraint) - { - GenerateForeignKey(primaryTable, refTable + "Id", refTable, "Id", constraint); - } - - public IDbCommand GetCommand() - { - return BuildCommand(null); - } - - public void ExecuteSchemaBuilder(SchemaBuilder builder) - { - foreach (ISchemaBuilderExpression expr in builder.Expressions) - expr.Create(this); - } - - public virtual string QuoteValues(string values) - { - return QuoteValues(new string[] { values })[0]; - } - - public virtual string[] QuoteValues(string[] values) - { - return Array.ConvertAll(values, - delegate(string val) - { - if (null == val) - return "null"; - else - return String.Format("'{0}'", val.Replace("'", "''")); - }); - } - - public string JoinColumnsAndValues(string[] columns, string[] values) - { - string[] quotedValues = QuoteValues(values); - string[] namesAndValues = new string[columns.Length]; - for (int i = 0; i < columns.Length; i++) - { - namesAndValues[i] = String.Format("{0}={1}", columns[i], quotedValues[i]); - } - - return String.Join(", ", namesAndValues); - } - - public void Dispose() - { - if (_connection != null && _connection.State == ConnectionState.Open) - { - _connection.Close(); - } - } - } -} diff --git a/Migrator.net/Migrator.Providers/TypeNames.cs b/Migrator.net/Migrator.Providers/TypeNames.cs deleted file mode 100644 index 60d11603d..000000000 --- a/Migrator.net/Migrator.Providers/TypeNames.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using Migrator.Framework; - -namespace Migrator.Providers -{ - /// - /// This class maps a DbType to names. - /// - /// - /// Associations may be marked with a capacity. Calling the Get() - /// method with a type and actual size n will return the associated - /// name with smallest capacity >= n, if available and an unmarked - /// default type otherwise. - /// Eg, setting - /// - /// Names.Put(DbType, "TEXT" ); - /// Names.Put(DbType, 255, "VARCHAR($l)" ); - /// Names.Put(DbType, 65534, "LONGVARCHAR($l)" ); - /// - /// will give you back the following: - /// - /// Names.Get(DbType) // --> "TEXT" (default) - /// Names.Get(DbType,100) // --> "VARCHAR(100)" (100 is in [0:255]) - /// Names.Get(DbType,1000) // --> "LONGVARCHAR(1000)" (100 is in [256:65534]) - /// Names.Get(DbType,100000) // --> "TEXT" (default) - /// - /// On the other hand, simply putting - /// - /// Names.Put(DbType, "VARCHAR($l)" ); - /// - /// would result in - /// - /// Names.Get(DbType) // --> "VARCHAR($l)" (will cause trouble) - /// Names.Get(DbType,100) // --> "VARCHAR(100)" - /// Names.Get(DbType,1000) // --> "VARCHAR(1000)" - /// Names.Get(DbType,10000) // --> "VARCHAR(10000)" - /// - /// - public class TypeNames - { - public const string LengthPlaceHolder = "$l"; - public const string PrecisionPlaceHolder = "$p"; - public const string ScalePlaceHolder = "$s"; - - private readonly Dictionary> weighted = - new Dictionary>(); - - private readonly Dictionary defaults = new Dictionary(); - - /// - /// Get default type name for specified type - /// - /// the type key - /// the default type name associated with the specified key - public string Get(DbType typecode) - { - string result; - if (!defaults.TryGetValue(typecode, out result)) - { - throw new ArgumentException("Dialect does not support DbType." + typecode, "typecode"); - } - return result; - } - - /// - /// Get the type name specified type and size - /// - /// the type key - /// the SQL length - /// the SQL scale - /// the SQL precision - /// - /// The associated name with smallest capacity >= size if available and the - /// default type name otherwise - /// - public string Get(DbType typecode, int size, int precision, int scale) - { - SortedList map; - weighted.TryGetValue(typecode, out map); - if (map != null && map.Count > 0) - { - foreach (KeyValuePair entry in map) - { - if (size <= entry.Key) - { - return Replace(entry.Value, size, precision, scale); - } - } - } - //Could not find a specific type for the size, using the default - return Replace(Get(typecode), size, precision, scale); - } - - private static string Replace(string type, int size, int precision, int scale) - { - type = StringUtils.ReplaceOnce(type, LengthPlaceHolder, size.ToString()); - type = StringUtils.ReplaceOnce(type, ScalePlaceHolder, scale.ToString()); - return StringUtils.ReplaceOnce(type, PrecisionPlaceHolder, precision.ToString()); - } - - /// - /// Set a type name for specified type key and capacity - /// - /// the type key - /// the (maximum) type size/length - /// The associated name - public void Put(DbType typecode, int capacity, string value) - { - SortedList map; - if (!weighted.TryGetValue(typecode, out map)) - { - // add new ordered map - weighted[typecode] = map = new SortedList(); - } - map[capacity] = value; - } - - /// - /// - /// - /// - /// - public void Put(DbType typecode, string value) - { - defaults[typecode] = value; - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator/BaseMigrate.cs b/Migrator.net/Migrator/BaseMigrate.cs deleted file mode 100644 index 5d1847c48..000000000 --- a/Migrator.net/Migrator/BaseMigrate.cs +++ /dev/null @@ -1,110 +0,0 @@ -using Migrator.Framework; -using System.Collections.Generic; - -namespace Migrator -{ - public abstract class BaseMigrate - { - protected readonly ITransformationProvider _provider; - protected ILogger _logger; - protected List _availableMigrations; - protected List _original; - protected long _current; - protected bool _dryrun; - - protected BaseMigrate(List availableMigrations, ITransformationProvider provider, ILogger logger) - { - _provider = provider; - _availableMigrations = availableMigrations; - _original = new List (_provider.AppliedMigrations.ToArray()); //clone - _logger = logger; - } - - public static BaseMigrate GetInstance(List availableMigrations, ITransformationProvider provider, ILogger logger) - { - return new MigrateAnywhere(availableMigrations, provider, logger); - } - - public List AppliedVersions - { - get { return _original; } - } - - public virtual long Current - { - get { return _current; } - protected set { _current = value; } - } - - public virtual bool DryRun - { - get { return _dryrun; } - set { _dryrun = value; } - } - - public abstract long Previous { get; } - public abstract long Next { get; } - - public void Iterate() - { - Current = Next; - } - - public abstract bool Continue(long targetVersion); - - public abstract void Migrate(IMigration migration); - - /// - /// Finds the next migration available to be applied. Only returns - /// migrations that have NOT already been applied. - /// - /// The migration number of the next available Migration. - protected long NextMigration() - { - // Start searching at the current index - int migrationSearch = _availableMigrations.IndexOf(Current)+1; - - // See if we can find a migration that matches the requirement - while(migrationSearch < _availableMigrations.Count - && _provider.AppliedMigrations.Contains(_availableMigrations[migrationSearch])) - { - migrationSearch++; - } - - // did we exhaust the list? - if(migrationSearch == _availableMigrations.Count){ - // we're at the last one. Done! - return _availableMigrations[migrationSearch-1]+1; - } - // found one. - return _availableMigrations[migrationSearch]; - } - - /// - /// Finds the previous migration that has been applied. Only returns - /// migrations that HAVE already been applied. - /// - /// The most recently applied Migration. - protected long PreviousMigration() - { - // Start searching at the current index - int migrationSearch = _availableMigrations.IndexOf(Current)-1; - - // See if we can find a migration that matches the requirement - while(migrationSearch > -1 - && !_provider.AppliedMigrations.Contains(_availableMigrations[migrationSearch])) - { - migrationSearch--; - } - - // did we exhaust the list? - if(migrationSearch < 0){ - // we're at the first one. Done! - return 0; - } - - // found one. - return _availableMigrations[migrationSearch]; - } - } -} diff --git a/Migrator.net/Migrator/Compile/ScriptEngine.cs b/Migrator.net/Migrator/Compile/ScriptEngine.cs deleted file mode 100644 index f9629ba48..000000000 --- a/Migrator.net/Migrator/Compile/ScriptEngine.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System; -using System.CodeDom.Compiler; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using Migrator.Framework; - -namespace Migrator.Compile -{ - public class ScriptEngine - { - public readonly string[] extraReferencedAssemblies; - - private readonly CodeDomProvider _provider; - private string _codeType = "csharp"; - - public ScriptEngine() : this(null, null) - { - } - - public ScriptEngine(string[] extraReferencedAssemblies) - : this(null, extraReferencedAssemblies) - { - } - - public ScriptEngine(string codeType, string[] extraReferencedAssemblies) - { - if (!String.IsNullOrEmpty(codeType)) - _codeType = codeType; - this.extraReferencedAssemblies = extraReferencedAssemblies; - - // There is currently no way to generically create a CodeDomProvider and have it work with .NET 3.5 - _provider = CodeDomProvider.CreateProvider(_codeType); - } - - public Assembly Compile(string directory) - { - string[] files = GetFilesRecursive(directory); - Console.Out.WriteLine("Compiling:"); - Array.ForEach(files, delegate(String file) { Console.Out.WriteLine(file); }); - - return Compile(files); - } - - private string[] GetFilesRecursive(string directory) - { - FileInfo[] files = GetFilesRecursive(new DirectoryInfo(directory)); - string[] fileNames = new string[files.Length]; - for (int i = 0; i < files.Length; i ++) - { - fileNames[i] = files[i].FullName; - } - return fileNames; - } - - private FileInfo[] GetFilesRecursive(DirectoryInfo d) - { - List files = new List(); - files.AddRange(d.GetFiles(String.Format("*.{0}", _provider.FileExtension))); - DirectoryInfo[] subDirs = d.GetDirectories(); - if (subDirs.Length > 0) - { - foreach (DirectoryInfo subDir in subDirs) - { - files.AddRange(GetFilesRecursive(subDir)); - } - } - - return files.ToArray(); - } - - public Assembly Compile(params string[] files) - { - CompilerParameters parms = SetupCompilerParams(); - - CompilerResults compileResult = _provider.CompileAssemblyFromFile(parms, files); - if (compileResult.Errors.Count != 0) - { - foreach (CompilerError err in compileResult.Errors) - { - Console.Error.WriteLine("{0} ({1}:{2}) {3}", err.FileName, err.Line, err.Column, err.ErrorText); - } - } - return compileResult.CompiledAssembly; - } - - private CompilerParameters SetupCompilerParams() - { - string migrationFrameworkPath = FrameworkAssemblyPath(); - CompilerParameters parms = new CompilerParameters(); - parms.CompilerOptions = "/t:library"; - parms.GenerateInMemory = true; - parms.IncludeDebugInformation = true; - parms.OutputAssembly = Path.Combine(Path.GetDirectoryName(migrationFrameworkPath), "MyMigrations.dll"); - - Console.Out.WriteLine("Output assembly: " + parms.OutputAssembly); - - // Add Default referenced assemblies - parms.ReferencedAssemblies.Add("mscorlib.dll"); - parms.ReferencedAssemblies.Add("System.dll"); - parms.ReferencedAssemblies.Add("System.Data.dll"); - parms.ReferencedAssemblies.Add(FrameworkAssemblyPath()); - if (null != extraReferencedAssemblies && extraReferencedAssemblies.Length > 0) - { - Array.ForEach(extraReferencedAssemblies, - delegate(String assemb) { parms.ReferencedAssemblies.Add(assemb); }); - } - return parms; - } - - private static string FrameworkAssemblyPath() - { - string path = typeof (MigrationAttribute).Module.FullyQualifiedName; - Console.Out.WriteLine("Framework DLL: " + path); - return path; - } - } -} \ No newline at end of file diff --git a/Migrator.net/Migrator/DuplicatedVersionException.cs b/Migrator.net/Migrator/DuplicatedVersionException.cs deleted file mode 100644 index 511888fee..000000000 --- a/Migrator.net/Migrator/DuplicatedVersionException.cs +++ /dev/null @@ -1,26 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -using System; - -namespace Migrator -{ - /// - /// Exception thrown when a migration number is not unique. - /// - public class DuplicatedVersionException : Exception - { - public DuplicatedVersionException(long version) - : base(String.Format("Migration version #{0} is duplicated", version)) - { - } - } -} diff --git a/Migrator.net/Migrator/IrreversibleMigrationException.cs b/Migrator.net/Migrator/IrreversibleMigrationException.cs deleted file mode 100644 index 06b960763..000000000 --- a/Migrator.net/Migrator/IrreversibleMigrationException.cs +++ /dev/null @@ -1,26 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -using System; - -namespace Migrator -{ - /// - /// Exception thrown in a migration Down() method - /// when changes can't be undone. - /// - public class IrreversibleMigrationException : Exception - { - public IrreversibleMigrationException() : base("Irreversible migration") - { - } - } -} diff --git a/Migrator.net/Migrator/MigrateAnywhere.cs b/Migrator.net/Migrator/MigrateAnywhere.cs deleted file mode 100644 index eb1bde01e..000000000 --- a/Migrator.net/Migrator/MigrateAnywhere.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Collections.Generic; -using Migrator.Framework; - -namespace Migrator -{ - /// - /// Description of MigrateAnywhere. - /// - public class MigrateAnywhere : BaseMigrate - { - private bool _goForward; - - public MigrateAnywhere(List availableMigrations, ITransformationProvider provider, ILogger logger) - : base(availableMigrations, provider, logger) - { - _current = 0; - if (provider.AppliedMigrations.Count > 0) { - _current = provider.AppliedMigrations[provider.AppliedMigrations.Count - 1]; - } - _goForward = false; - } - - public override long Next - { - get - { - return _goForward - ? NextMigration() - : PreviousMigration(); - } - } - - public override long Previous - { - get - { - return _goForward - ? PreviousMigration() - : NextMigration(); - } - } - - public override bool Continue(long version) - { - // If we're going backwards and our current is less than the target, - // reverse direction. Also, start over at zero to make sure we catch - // any merged migrations that are less than the current target. - if (!_goForward && version >= Current) - { - _goForward = true; - Current = 0; - Iterate(); - } - - // We always finish on going forward. So continue if we're still - // going backwards, or if there are no migrations left in the forward direction. - return !_goForward || Current <= version; - } - - public override void Migrate(IMigration migration) - { - _provider.BeginTransaction(); - MigrationAttribute attr = (MigrationAttribute)Attribute.GetCustomAttribute(migration.GetType(), typeof(MigrationAttribute)); - - if (_provider.AppliedMigrations.Contains(attr.Version)) { - RemoveMigration(migration, attr); - } else { - ApplyMigration(migration, attr); - } - } - - private void ApplyMigration(IMigration migration, MigrationAttribute attr) - { - // we're adding this one - _logger.MigrateUp(Current, migration.Name); - if(! DryRun) - { - migration.Up(); - _provider.MigrationApplied(attr.Version); - _provider.Commit(); - migration.AfterUp(); - } - } - - private void RemoveMigration(IMigration migration, MigrationAttribute attr) - { - // we're removing this one - _logger.MigrateDown(Current, migration.Name); - if (! DryRun) - { - migration.Down(); - _provider.MigrationUnApplied(attr.Version); - _provider.Commit(); - migration.AfterDown(); - } - } - } -} diff --git a/Migrator.net/Migrator/MigrateDown.cs b/Migrator.net/Migrator/MigrateDown.cs deleted file mode 100644 index e69de29bb..000000000 diff --git a/Migrator.net/Migrator/MigrateUp.cs b/Migrator.net/Migrator/MigrateUp.cs deleted file mode 100644 index e69de29bb..000000000 diff --git a/Migrator.net/Migrator/MigrationComparer.cs b/Migrator.net/Migrator/MigrationComparer.cs deleted file mode 100644 index a1f7281f3..000000000 --- a/Migrator.net/Migrator/MigrationComparer.cs +++ /dev/null @@ -1,43 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -using System; -using System.Collections.Generic; -using Migrator.Framework; - -namespace Migrator -{ - /// - /// Comparer of Migration by their version attribute. - /// - public class MigrationTypeComparer : IComparer - { - private readonly bool _ascending = true; - - public MigrationTypeComparer(bool ascending) - { - _ascending = ascending; - } - - public int Compare(Type x, Type y) - { - MigrationAttribute attribOfX = (MigrationAttribute) Attribute.GetCustomAttribute(x, typeof(MigrationAttribute)); - MigrationAttribute attribOfY = (MigrationAttribute) Attribute.GetCustomAttribute(y, typeof(MigrationAttribute)); - - if (_ascending) - return attribOfX.Version.CompareTo(attribOfY.Version); - else - return attribOfY.Version.CompareTo(attribOfX.Version); - - - } - } -} diff --git a/Migrator.net/Migrator/MigrationLoader.cs b/Migrator.net/Migrator/MigrationLoader.cs deleted file mode 100644 index 397ed43c7..000000000 --- a/Migrator.net/Migrator/MigrationLoader.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using Migrator.Framework; - -namespace Migrator -{ - /// - /// Handles inspecting code to find all of the Migrations in assemblies and reading - /// other metadata such as the last revision, etc. - /// - public class MigrationLoader - { - private readonly ITransformationProvider _provider; - private readonly List _migrationsTypes = new List(); - - public MigrationLoader(ITransformationProvider provider, Assembly migrationAssembly, bool trace) - { - _provider = provider; - AddMigrations(migrationAssembly); - - if (trace) - { - provider.Logger.Trace("Loaded migrations:"); - foreach (Type t in _migrationsTypes) - { - provider.Logger.Trace("{0} {1}", GetMigrationVersion(t).ToString().PadLeft(5), StringUtils.ToHumanName(t.Name)); - } - } - } - - public void AddMigrations(Assembly migrationAssembly) - { - if (migrationAssembly != null) - _migrationsTypes.AddRange(GetMigrationTypes(migrationAssembly)); - } - - /// - /// Returns registered migration types. - /// - public List MigrationsTypes - { - get { return _migrationsTypes; } - } - - /// - /// Returns the last version of the migrations. - /// - public long LastVersion - { - get - { - if (_migrationsTypes.Count == 0) - return 0; - return GetMigrationVersion(_migrationsTypes[_migrationsTypes.Count - 1]); - } - } - - /// - /// Check for duplicated version in migrations. - /// - /// CheckForDuplicatedVersion - public void CheckForDuplicatedVersion() - { - List versions = new List(); - foreach (Type t in _migrationsTypes) - { - long version = GetMigrationVersion(t); - - if (versions.Contains(version)) - throw new DuplicatedVersionException(version); - - versions.Add(version); - } - } - - /// - /// Collect migrations in one Assembly. - /// - /// The Assembly to browse. - /// The migrations collection - public static List GetMigrationTypes(Assembly asm) - { - List migrations = new List(); - foreach (Type t in asm.GetExportedTypes()) - { - MigrationAttribute attrib = - (MigrationAttribute) Attribute.GetCustomAttribute(t, typeof (MigrationAttribute)); - - if (attrib != null && typeof(IMigration).IsAssignableFrom(t) && !attrib.Ignore) - { - migrations.Add(t); - } - } - - migrations.Sort(new MigrationTypeComparer(true)); - return migrations; - } - - /// - /// Returns the version of the migration - /// MigrationAttribute. - /// - /// Migration type. - /// Version number sepcified in the attribute - public static long GetMigrationVersion(Type t) - { - MigrationAttribute attrib = (MigrationAttribute) - Attribute.GetCustomAttribute(t, typeof(MigrationAttribute)); - - return attrib.Version; - } - - public List GetAvailableMigrations() - { - //List availableMigrations = new List(); - _migrationsTypes.Sort(new MigrationTypeComparer(true)); - return _migrationsTypes.ConvertAll(new Converter(GetMigrationVersion)); - } - - public IMigration GetMigration(long version) - { - foreach (Type t in _migrationsTypes) - { - if (GetMigrationVersion(t) == version) - { - IMigration migration = (IMigration)Activator.CreateInstance(t); - migration.Database = _provider; - return migration; - } - } - - return null; - } - } -} diff --git a/Migrator.net/Migrator/Migrator.cs b/Migrator.net/Migrator/Migrator.cs deleted file mode 100644 index c41c204e1..000000000 --- a/Migrator.net/Migrator/Migrator.cs +++ /dev/null @@ -1,177 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -using System; -using System.Collections.Generic; -using System.Reflection; -using Migrator.Framework; -using Migrator.Framework.Loggers; - -namespace Migrator -{ - /// - /// Migrations mediator. - /// - public class Migrator - { - private readonly ITransformationProvider _provider; - - private readonly MigrationLoader _migrationLoader; - - private ILogger _logger = new Logger(false); - protected bool _dryrun; - private string[] _args; - - public string[] args - { - get { return _args; } - set { _args = value; } - } - - public Migrator(string provider, string connectionString, Assembly migrationAssembly) - : this(provider, connectionString, migrationAssembly, false) - { - } - - public Migrator(string provider, string connectionString, Assembly migrationAssembly, bool trace) - : this(ProviderFactory.Create(provider, connectionString), migrationAssembly, trace) - { - } - - public Migrator(string provider, string connectionString, Assembly migrationAssembly, bool trace, ILogger logger) - : this(ProviderFactory.Create(provider, connectionString), migrationAssembly, trace, logger) - { - } - - public Migrator(ITransformationProvider provider, Assembly migrationAssembly, bool trace) - : this(provider, migrationAssembly, trace, new Logger(trace, new ConsoleWriter())) - { - } - - public Migrator(ITransformationProvider provider, Assembly migrationAssembly, bool trace, ILogger logger) - { - _provider = provider; - Logger = logger; - - _migrationLoader = new MigrationLoader(provider, migrationAssembly, trace); - _migrationLoader.CheckForDuplicatedVersion(); - } - - - /// - /// Returns registered migration types. - /// - public List MigrationsTypes - { - get { return _migrationLoader.MigrationsTypes; } - } - - /// - /// Run all migrations up to the latest. Make no changes to database if - /// dryrun is true. - /// - public void MigrateToLastVersion() - { - MigrateTo(_migrationLoader.LastVersion); - } - - /// - /// Returns the current migrations applied to the database. - /// - public List AppliedMigrations - { - get { return _provider.AppliedMigrations; } - } - - /// - /// Get or set the event logger. - /// - public ILogger Logger - { - get { return _logger; } - set - { - _logger = value; - _provider.Logger = value; - } - } - - public virtual bool DryRun - { - get { return _dryrun; } - set { _dryrun = value; } - } - - /// - /// Migrate the database to a specific version. - /// Runs all migration between the actual version and the - /// specified version. - /// If version is greater then the current version, - /// the Up() method will be invoked. - /// If version lower then the current version, - /// the Down() method of previous migration will be invoked. - /// If dryrun is set, don't write any changes to the database. - /// - /// The version that must became the current one - public void MigrateTo(long version) - { - - if (_migrationLoader.MigrationsTypes.Count == 0) - { - _logger.Warn("No public classes with the Migration attribute were found."); - return; - } - - bool firstRun = true; - BaseMigrate migrate = BaseMigrate.GetInstance(_migrationLoader.GetAvailableMigrations(), _provider, _logger); - migrate.DryRun = DryRun; - Logger.Started(migrate.AppliedVersions, version); - - while (migrate.Continue(version)) - { - IMigration migration = _migrationLoader.GetMigration(migrate.Current); - if (null == migration) - { - _logger.Skipping(migrate.Current); - migrate.Iterate(); - continue; - } - - try - { - if (firstRun) - { - migration.InitializeOnce(_args); - firstRun = false; - } - - migrate.Migrate(migration); - } - catch (Exception ex) - { - Logger.Exception(migrate.Current, migration.Name, ex); - - // Oho! error! We rollback changes. - Logger.RollingBack(migrate.Previous); - _provider.Rollback(); - - throw; - } - - migrate.Iterate(); - } - - Logger.Finished(migrate.AppliedVersions, version); - } - } -} diff --git a/Migrator.net/Migrator/Migrator.csproj b/Migrator.net/Migrator/Migrator.csproj deleted file mode 100644 index c4303dc1c..000000000 --- a/Migrator.net/Migrator/Migrator.csproj +++ /dev/null @@ -1,77 +0,0 @@ - - - - Debug - AnyCPU - 9.0.30729 - 2.0 - {1FEE70A4-AAD7-4C60-BE60-3F7DC03A8C4D} - Library - Properties - Migrator - Migrator - - - 3.5 - - - true - MigratorDotNet.snk - v2.0 - - - true - full - false - bin\Migrator\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Migrator\Release\ - TRACE - prompt - 4 - x86 - - - - - - - - - AssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - {5270F048-E580-486C-B14C-E5B9F6E539D4} - Migrator.Framework - - - {D58C68E4-D789-40F7-9078-C9F587D4363C} - Migrator.Providers - - - - \ No newline at end of file diff --git a/Migrator.net/Migrator/MigratorDotNet.snk b/Migrator.net/Migrator/MigratorDotNet.snk deleted file mode 100644 index 5032d709b5f932cf07ddd8f648e48be997070eca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098&QAO#LALQS0Pij|L3{e%+^Z1cMB$8_) zTaxrG8m7jW|B>|0ivYdq(NB_WJ&jUxSbMA&!J|{m17Uova_*H^0YnLR0Q_XBJa2oy z98cM~9-lR`>|bA04N`T?30>i4Uh5-{9hcdO^!>}B^Jr(0JNas~*g)nQt;-9%IS-DPEMCsK~mxp34ur)AjGXP3a_8S8CdF&!+R#@v&; zpSu_NSs}MQ1bXQGxwaz_aX|Y1R@@Ab)8O3Y{H%def>^smsL{yum|K9wR`(a zT`haxuW78Z4^*wu+c|fIAzF3U0BJCwo)=}^AvWg;1YS^J9)NT&^wz&UU;Y%BZS7^7J$mBz z6_gYtrvS|G(JYkfM$T^oxrpWU)3wQ<(7X>v{@rPNJ}i1cW42dvoYR3k9LQGlzN74e ipJfbR0EsQaV{z})*xHUESl1@BOSH$vUMU&v@-ebWnkO;< diff --git a/Migrator.net/Migrator/ProviderFactory.cs b/Migrator.net/Migrator/ProviderFactory.cs deleted file mode 100644 index c9f45f9d8..000000000 --- a/Migrator.net/Migrator/ProviderFactory.cs +++ /dev/null @@ -1,75 +0,0 @@ -#region License - -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. - -#endregion - -using System; -using System.Collections.Generic; -using System.Reflection; -using Migrator.Framework; -using Migrator.Providers; - -namespace Migrator -{ - /// - /// Handles loading Provider implementations - /// - public class ProviderFactory - { - private static readonly Assembly providerAssembly; - private static readonly Dictionary dialects = new Dictionary(); - static ProviderFactory() - { - - //string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); - //string fullPath = Path.Combine(directory, "Migrator.Providers.dll"); - //if (fullPath.StartsWith("file:\\")) - // fullPath = fullPath.Substring(6); - //else if (fullPath.StartsWith("file:")) - // fullPath = fullPath.Substring(5); - providerAssembly = Assembly.GetAssembly(typeof(TransformationProvider)); - //providerAssembly = Assembly.LoadFrom("Migrator.Providers.dll"); - LoadDialects(); - } - - public static ITransformationProvider Create(string providerName, string connectionString) - { - object dialectInstance = DialectForProvider(providerName); - MethodInfo mi = dialectInstance.GetType().GetMethod("NewProviderForDialect", new Type[] {typeof (String)}); - return (ITransformationProvider)mi.Invoke(dialectInstance, new object[] { connectionString }); - } - - public static object DialectForProvider(string providerName) - { - if (String.IsNullOrEmpty(providerName)) - return null; - - foreach (string key in dialects.Keys) - { - if (0 < key.IndexOf(providerName, StringComparison.InvariantCultureIgnoreCase)) - return dialects[key]; - } - return null; - } - - public static void LoadDialects() - { - Type dialectType = providerAssembly.GetType("Migrator.Providers.Dialect"); - foreach (Type t in providerAssembly.GetTypes()) - { - if (t.IsSubclassOf(dialectType)) - { - dialects.Add(t.FullName, Activator.CreateInstance(t, null)); - } - } - } - } -} diff --git a/Migrator.net/Migrator/Tools/SchemaDumper.cs b/Migrator.net/Migrator/Tools/SchemaDumper.cs deleted file mode 100644 index ee6195d41..000000000 --- a/Migrator.net/Migrator/Tools/SchemaDumper.cs +++ /dev/null @@ -1,70 +0,0 @@ -#region License -//The contents of this file are subject to the Mozilla Public License -//Version 1.1 (the "License"); you may not use this file except in -//compliance with the License. You may obtain a copy of the License at -//http://www.mozilla.org/MPL/ -//Software distributed under the License is distributed on an "AS IS" -//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -//License for the specific language governing rights and limitations -//under the License. -#endregion - -using System.IO; -using Migrator.Framework; - -namespace Migrator.Tools -{ - public class SchemaDumper - { - private readonly ITransformationProvider _provider; - - public SchemaDumper(string provider, string connectionString) - { - _provider = ProviderFactory.Create(provider, connectionString); - } - - public string Dump() - { - StringWriter writer = new StringWriter(); - - writer.WriteLine("using Migrator;\n"); - writer.WriteLine("[Migration(1)]"); - writer.WriteLine("public class SchemaDump : Migration"); - writer.WriteLine("{"); - writer.WriteLine("\tpublic override void Up()"); - writer.WriteLine("\t{"); - - foreach (string table in _provider.GetTables()) - { - writer.WriteLine("\t\tDatabase.AddTable(\"{0}\",", table); - foreach (Column column in _provider.GetColumns(table)) - { - writer.WriteLine("\t\t\tnew Column(\"{0}\", typeof({1})),", column.Name, column.Type); - } - writer.WriteLine("\t\t);"); - } - - writer.WriteLine("\t}\n"); - writer.WriteLine("\tpublic override void Down()"); - writer.WriteLine("\t{"); - - foreach (string table in _provider.GetTables()) - { - writer.WriteLine("\t\tDatabase.RemoveTable(\"{0}\");", table); - } - - writer.WriteLine("\t}"); - writer.WriteLine("}"); - - return writer.ToString(); - } - - public void DumpTo(string file) - { - using (StreamWriter writer = new StreamWriter(file)) - { - writer.Write(Dump()); - } - } - } -} \ No newline at end of file diff --git a/Migrator.net/config/AssemblyInfo.cs b/Migrator.net/config/AssemblyInfo.cs deleted file mode 100644 index 1f0e5aa7a..000000000 --- a/Migrator.net/config/AssemblyInfo.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Migrator")] -[assembly: AssemblyDescription("Database migration for .NET")] -[assembly: AssemblyProduct("Migrator")] -[assembly: AssemblyCopyright("Copyright © 2006")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a5f0077a-d124-449a-a684-453576551f43")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("0.9.1.*")] diff --git a/NzbDrone.Common/PathExtentions.cs b/NzbDrone.Common/PathExtentions.cs index 16fb16db6..8fd2e043b 100644 --- a/NzbDrone.Common/PathExtentions.cs +++ b/NzbDrone.Common/PathExtentions.cs @@ -14,8 +14,8 @@ public static class PathExtentions private const string LOG_CONFIG_FILE = "log.config"; private const string APP_CONFIG_FILE = "config.xml"; - private const string NZBDRONE_DB_FILE = "nzbdrone.sdf"; - private const string LOG_DB_FILE = "log.sdf"; + public const string NZBDRONE_DB_FILE = "nzbdrone.sdf"; + public const string LOG_DB_FILE = "log.sdf"; private const string UPDATE_SANDBOX_FOLDER_NAME = "nzbdrone_update\\"; private const string UPDATE_PACKAGE_FOLDER_NAME = "nzbdrone\\"; diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20110707.cs b/NzbDrone.Core/Datastore/Migrations/Migration20110707.cs index 9566a0d55..4fedebaa6 100644 --- a/NzbDrone.Core/Datastore/Migrations/Migration20110707.cs +++ b/NzbDrone.Core/Datastore/Migrations/Migration20110707.cs @@ -6,9 +6,9 @@ namespace NzbDrone.Core.Datastore.Migrations { [Migration(20110707)] - public class Migration20110707 : Migration + public class Migration20110707 : NzbDroneMigration { - public override void Up() + protected override void MainDbUpgrade() { Database.AddTable("Series", new[] { @@ -137,6 +137,19 @@ public override void Up() new Column("SonicAllowed", DbType.String, ColumnProperty.NotNull), }); + Database.AddTable("IndexerDefinitions", new[] + { + new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), + new Column("Enable", DbType.Boolean, ColumnProperty.NotNull), + new Column("IndexProviderType", DbType.String, ColumnProperty.NotNull), + new Column("Name", DbType.String, ColumnProperty.NotNull), + }); + } + + + protected override void LogDbUpgrade() + { + Database.AddTable("Logs", new[] { new Column("LogId", DbType.Int64, ColumnProperty.PrimaryKeyWithIdentity), @@ -148,20 +161,6 @@ public override void Up() new Column("ExceptionType", DbType.String, ColumnProperty.Null), new Column("Level", DbType.String, ColumnProperty.NotNull) }); - - Database.AddTable("IndexerDefinitions", new[] - { - new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity), - new Column("Enable", DbType.Boolean, ColumnProperty.NotNull), - new Column("IndexProviderType", DbType.String, ColumnProperty.NotNull), - new Column("Name", DbType.String, ColumnProperty.NotNull), - }); - } - - - public override void Down() - { - throw new NotImplementedException(); } } } \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20110726.cs b/NzbDrone.Core/Datastore/Migrations/Migration20110726.cs index c0ed06601..e064ca101 100644 --- a/NzbDrone.Core/Datastore/Migrations/Migration20110726.cs +++ b/NzbDrone.Core/Datastore/Migrations/Migration20110726.cs @@ -6,9 +6,9 @@ namespace NzbDrone.Core.Datastore.Migrations { [Migration(20110726)] - public class Migration20110726 : Migration + public class Migration20110726 : NzbDroneMigration { - public override void Up() + protected override void MainDbUpgrade() { Database.RemoveTable("ExternalNotificationSettings"); @@ -21,10 +21,5 @@ public override void Up() }); } - - public override void Down() - { - throw new NotImplementedException(); - } } } \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20110909.cs b/NzbDrone.Core/Datastore/Migrations/Migration20110909.cs index 66b77deac..1c041f13f 100644 --- a/NzbDrone.Core/Datastore/Migrations/Migration20110909.cs +++ b/NzbDrone.Core/Datastore/Migrations/Migration20110909.cs @@ -6,9 +6,9 @@ namespace NzbDrone.Core.Datastore.Migrations { [Migration(20110909)] - public class Migration20110909 : Migration + public class Migration20110909 : NzbDroneMigration { - public override void Up() + protected override void MainDbUpgrade() { Database.AddColumn("Series", "Runtime", DbType.Int32, ColumnProperty.Null); Database.AddColumn("Series", "BannerUrl", DbType.String, ColumnProperty.Null); @@ -21,10 +21,5 @@ public override void Up() new Column("MaxSize", DbType.Int32, ColumnProperty.NotNull) }); } - - public override void Down() - { - throw new NotImplementedException(); - } } } \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20111011.cs b/NzbDrone.Core/Datastore/Migrations/Migration20111011.cs index 0e8d97a8c..68f642e3e 100644 --- a/NzbDrone.Core/Datastore/Migrations/Migration20111011.cs +++ b/NzbDrone.Core/Datastore/Migrations/Migration20111011.cs @@ -6,16 +6,11 @@ namespace NzbDrone.Core.Datastore.Migrations { [Migration(20111011)] - public class Migration20111011 : Migration + public class Migration20111011 : NzbDroneMigration { - public override void Up() + protected override void MainDbUpgrade() { Database.AddColumn("Episodes", "PostDownloadStatus", DbType.Int32, ColumnProperty.Null); } - - public override void Down() - { - throw new NotImplementedException(); - } } } \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20111112.cs b/NzbDrone.Core/Datastore/Migrations/Migration20111112.cs index 7c91c87f6..ad0db8728 100644 --- a/NzbDrone.Core/Datastore/Migrations/Migration20111112.cs +++ b/NzbDrone.Core/Datastore/Migrations/Migration20111112.cs @@ -6,9 +6,9 @@ namespace NzbDrone.Core.Datastore.Migrations { [Migration(20111112)] - public class Migration2011112 : Migration + public class Migration2011112 : NzbDroneMigration { - public override void Up() + protected override void MainDbUpgrade() { Database.AddTable("NewznabDefinitions", new[] { @@ -19,10 +19,5 @@ public override void Up() new Column("ApiKey", DbType.String, ColumnProperty.Null) }); } - - public override void Down() - { - throw new NotImplementedException(); - } } } \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20111125.cs b/NzbDrone.Core/Datastore/Migrations/Migration20111125.cs index 4a46828bf..aa3aaf20d 100644 --- a/NzbDrone.Core/Datastore/Migrations/Migration20111125.cs +++ b/NzbDrone.Core/Datastore/Migrations/Migration20111125.cs @@ -1,21 +1,15 @@ -using System; -using System.Data; +using System.Data; using Migrator.Framework; namespace NzbDrone.Core.Datastore.Migrations { [Migration(20111125)] - public class Migration2011125 : Migration + public class Migration2011125 : NzbDroneMigration { - public override void Up() + protected override void MainDbUpgrade() { Database.AddColumn("Series", "IsDaily", DbType.Boolean, ColumnProperty.Null); } - - public override void Down() - { - throw new NotImplementedException(); - } } } \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/Migrations/NzbDroneMigration.cs b/NzbDrone.Core/Datastore/Migrations/NzbDroneMigration.cs new file mode 100644 index 000000000..560df46fe --- /dev/null +++ b/NzbDrone.Core/Datastore/Migrations/NzbDroneMigration.cs @@ -0,0 +1,41 @@ +using System; +using System.Linq; +using Migrator.Framework; +using NzbDrone.Common; + +namespace NzbDrone.Core.Datastore.Migrations +{ + public abstract class NzbDroneMigration : Migration + { + protected virtual void MainDbUpgrade() + { + } + + protected virtual void LogDbUpgrade() + { + } + + public override void Up() + { + if (Database.ConnectionString.Contains(PathExtentions.NZBDRONE_DB_FILE)) + { + MainDbUpgrade(); + } + else if (Database.ConnectionString.Contains(PathExtentions.LOG_DB_FILE)) + { + LogDbUpgrade(); + } + else + { + LogDbUpgrade(); + MainDbUpgrade(); + } + } + + + public override void Down() + { + throw new NotImplementedException(); + } + } +} diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index dac41c9ff..d3b987d6f 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -145,6 +145,10 @@ False ..\Libraries\Migrator.NET\Migrator.Framework.dll + + False + ..\Libraries\Migrator.NET\Migrator.Providers.dll + False ..\packages\MiniProfiler.1.9\lib\net40\MvcMiniProfiler.dll @@ -211,6 +215,7 @@ +