Manage default SQL values conversion in Datq Migrations

--HG--
branch : dev
This commit is contained in:
Sebastien Ros
2010-09-22 14:17:45 -07:00
parent f6b895960c
commit 3f4e817b56
6 changed files with 64 additions and 28 deletions

View File

@@ -96,7 +96,7 @@ namespace Orchard.Tests.DataMigration {
.Column("Lastname", DbType.String, column => column.WithLength(100).NotNull()) .Column("Lastname", DbType.String, column => column.WithLength(100).NotNull())
.Column("SN", DbType.AnsiString, column => column.WithLength(40).Unique()) .Column("SN", DbType.AnsiString, column => column.WithLength(40).Unique())
.Column("Salary", DbType.Decimal, column => column.WithPrecision(9).WithScale(2)) .Column("Salary", DbType.Decimal, column => column.WithPrecision(9).WithScale(2))
.Column("Gender", DbType.Decimal, column => column.WithDefault("''")) .Column("Gender", DbType.Decimal, column => column.WithDefault(""))
); );
} }
@@ -109,7 +109,7 @@ namespace Orchard.Tests.DataMigration {
.Column("Lastname", DbType.String, column => column.WithLength(100).NotNull()) .Column("Lastname", DbType.String, column => column.WithLength(100).NotNull())
.Column("SN", DbType.AnsiString, column => column.WithLength(40).Unique()) .Column("SN", DbType.AnsiString, column => column.WithLength(40).Unique())
.Column("Salary", DbType.Decimal, column => column.WithPrecision(9).WithScale(2)) .Column("Salary", DbType.Decimal, column => column.WithPrecision(9).WithScale(2))
.Column("Gender", DbType.Decimal, column => column.WithDefault("''")) .Column("Gender", DbType.Decimal, column => column.WithDefault(""))
); );
_schemaBuilder _schemaBuilder
@@ -133,7 +133,7 @@ namespace Orchard.Tests.DataMigration {
.AlterTable("User", table => table .AlterTable("User", table => table
.AddColumn("Age", DbType.Int32)) .AddColumn("Age", DbType.Int32))
.AlterTable("User", table => table .AlterTable("User", table => table
.AlterColumn("Lastname", column => column.WithDefault("'John'"))) .AlterColumn("Lastname", column => column.WithDefault("John")))
.AlterTable("User", table => table .AlterTable("User", table => table
.DropColumn("Firstname") .DropColumn("Firstname")
); );

View File

@@ -23,17 +23,17 @@ namespace Orchard.Users.DataMigrations {
// Adds registration fields to previous versions // Adds registration fields to previous versions
SchemaBuilder SchemaBuilder
.AlterTable("UserPartRecord", table => table.AddColumn<string>("RegistrationStatus", c => c.WithDefault("'Approved'"))) .AlterTable("UserPartRecord", table => table.AddColumn<string>("RegistrationStatus", c => c.WithDefault("Approved")))
.AlterTable("UserPartRecord", table => table.AddColumn<string>("EmailStatus", c => c.WithDefault("'Approved'"))) .AlterTable("UserPartRecord", table => table.AddColumn<string>("EmailStatus", c => c.WithDefault("Approved")))
.AlterTable("UserPartRecord", table => table.AddColumn<string>("EmailChallengeToken")); .AlterTable("UserPartRecord", table => table.AddColumn<string>("EmailChallengeToken"));
// Site Settings record // Site Settings record
SchemaBuilder.CreateTable("RegistrationSettingsPartRecord", table => table SchemaBuilder.CreateTable("RegistrationSettingsPartRecord", table => table
.ContentPartRecord() .ContentPartRecord()
.Column<bool>("UsersCanRegister", c => c.WithDefault("'0'")) .Column<bool>("UsersCanRegister", c => c.WithDefault(false))
.Column<bool>("UsersMustValidateEmail", c => c.WithDefault("'0'")) .Column<bool>("UsersMustValidateEmail", c => c.WithDefault(false))
.Column<bool>("UsersAreModerated", c => c.WithDefault("'0'")) .Column<bool>("UsersAreModerated", c => c.WithDefault(false))
.Column<bool>("NotifyModeration", c => c.WithDefault("'0'")) .Column<bool>("NotifyModeration", c => c.WithDefault(false))
); );
return 2; return 2;

View File

@@ -94,12 +94,14 @@ namespace Orchard.Data.Migration.Generator {
var command = new CreateTableCommand(tableName); var command = new CreateTableCommand(tableName);
foreach (var column in table.ColumnIterator) { foreach (var column in table.ColumnIterator) {
var table1 = table; // create copies for local variables to be evaluated at the time the loop is called, and not lately when the la;bda is executed
var column1 = column; var tableCopy = table;
var sqlType = column1.GetSqlTypeCode(mapping); var columnCopy = column;
var sqlType = columnCopy.GetSqlTypeCode(mapping);
command.Column(column.Name, sqlType.DbType, command.Column(column.Name, sqlType.DbType,
action => { action => {
if (table1.PrimaryKey.Columns.Any(c => c.Name == column1.Name)) { if (tableCopy.PrimaryKey.Columns.Any(c => c.Name == columnCopy.Name)) {
action.PrimaryKey(); action.PrimaryKey();
if ( !isContentPart ) { if ( !isContentPart ) {
@@ -108,26 +110,26 @@ namespace Orchard.Data.Migration.Generator {
} }
if ( column1.IsLengthDefined() if ( columnCopy.IsLengthDefined()
&& new DbType[] { DbType.StringFixedLength, DbType.String, DbType.AnsiString, DbType.AnsiStringFixedLength }.Contains(sqlType.DbType) && new DbType[] { DbType.StringFixedLength, DbType.String, DbType.AnsiString, DbType.AnsiStringFixedLength }.Contains(sqlType.DbType)
&& column1.Length != Column.DefaultLength) { && columnCopy.Length != Column.DefaultLength) {
action.WithLength(column1.Length); action.WithLength(columnCopy.Length);
} }
if (column1.IsPrecisionDefined()) { if (columnCopy.IsPrecisionDefined()) {
action.WithPrecision((byte) column1.Precision); action.WithPrecision((byte) columnCopy.Precision);
action.WithScale((byte) column1.Scale); action.WithScale((byte) columnCopy.Scale);
} }
if (column1.IsNullable) { if (columnCopy.IsNullable) {
action.Nullable(); action.Nullable();
} }
if ( column1.IsUnique ) { if ( columnCopy.IsUnique ) {
action.Unique(); action.Unique();
} }
if(column1.DefaultValue != null) { if(columnCopy.DefaultValue != null) {
action.WithDefault(column1.DefaultValue); action.WithDefault(columnCopy.DefaultValue);
} }
}); });
} }

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using NHibernate; using NHibernate;
@@ -200,7 +201,7 @@ namespace Orchard.Data.Migration.Interpreters {
// [default value] // [default value]
if (!string.IsNullOrEmpty(command.Default)) { if (!string.IsNullOrEmpty(command.Default)) {
builder.Append(" set default ").Append(command.Default).Append(Space); builder.Append(" set default ").Append(ConvertToSqlValue(command.Default)).Append(Space);
} }
_sqlStatements.Add(builder.ToString()); _sqlStatements.Add(builder.ToString());
} }
@@ -304,7 +305,7 @@ namespace Orchard.Data.Migration.Interpreters {
// [default value] // [default value]
if (!string.IsNullOrEmpty(command.Default)) { if (!string.IsNullOrEmpty(command.Default)) {
builder.Append(" default ").Append(command.Default).Append(Space); builder.Append(" default ").Append(ConvertToSqlValue(command.Default)).Append(Space);
} }
// nullable // nullable
@@ -352,5 +353,38 @@ namespace Orchard.Data.Migration.Interpreters {
return false; return false;
} }
private static string ConvertToSqlValue(object value) {
if ( value == null ) {
return "null";
}
TypeCode typeCode = Type.GetTypeCode(value.GetType());
switch (typeCode) {
case TypeCode.Empty:
case TypeCode.Object:
case TypeCode.DBNull:
case TypeCode.String:
case TypeCode.Char:
return String.Concat("'", Convert.ToString(value).Replace("'", "''"), "'");
case TypeCode.Boolean:
return (bool) value ? "1" : "0";
case TypeCode.SByte:
case TypeCode.Int16:
case TypeCode.UInt16:
case TypeCode.Int32:
case TypeCode.UInt32:
case TypeCode.Int64:
case TypeCode.UInt64:
case TypeCode.Single:
case TypeCode.Double:
case TypeCode.Decimal:
return Convert.ToString(value, CultureInfo.InvariantCulture);
case TypeCode.DateTime:
return String.Concat("'", Convert.ToString(value, CultureInfo.InvariantCulture), "'");
}
return "null";
}
} }
} }

View File

@@ -17,7 +17,7 @@ namespace Orchard.Data.Migration.Schema {
public DbType DbType { get; private set; } public DbType DbType { get; private set; }
public string Default { get; private set; } public object Default { get; private set; }
public int? Length { get; private set; } public int? Length { get; private set; }
@@ -26,7 +26,7 @@ namespace Orchard.Data.Migration.Schema {
return this; return this;
} }
public ColumnCommand WithDefault(string @default) { public ColumnCommand WithDefault(object @default) {
Default = @default; Default = @default;
return this; return this;
} }

View File

@@ -73,7 +73,7 @@ namespace Orchard.Data.Migration.Schema {
return this; return this;
} }
public new CreateColumnCommand WithDefault(string @default) { public new CreateColumnCommand WithDefault(object @default) {
base.WithDefault(@default); base.WithDefault(@default);
return this; return this;
} }