/// <summary>
 /// Gets the rename table SQL.
 /// </summary>
 /// <param name="dbTable">The database table.</param>
 /// <param name="table">The table.</param>
 /// <param name="prefix">The prefix.</param>
 /// <returns>System.String.</returns>
 protected override string GetRenameTableSql(DbTableDefinition dbTable, ITableDefinition table, string prefix = null)
 {
     return string.Format("EXECUTE sp_rename N'{1}{0}', N'{2}', 'OBJECT'", table.Name, prefix, dbTable.TableName);
 }
        /// <summary>
        /// Gets the data copy SQL.
        /// </summary>
        /// <param name="dbTable">The database table.</param>
        /// <param name="table">The table.</param>
        /// <param name="prefix">The prefix.</param>
        /// <returns>System.String.</returns>
        protected override string GetDataCopySql(DbTableDefinition dbTable, ITableDefinition table, string prefix = null)
        {
            var result = new StringBuilder();
            var insertColumnList = new StringBuilder();
            var selectColumnList = new StringBuilder();

            // copy all fields
            foreach (var field in table.FieldList)
            {
                if (!field.GenerateDbColumn)
                    continue;

                var dbColumn = dbTable.Columns.FirstOrDefault(x => x.ColumnName == field.ColumnName);
                // only if they present in old table
                if (dbColumn == null)
                    continue;

                insertColumnList.Append("\"").Append(OracleNamesTranslator.Translate(field.ColumnName)).Append("\",");

                var sqlType = GetSqlType(field);

                // convert values
                var oldType = dbColumn.ColumnType.ToLower();
                var newType = GetSqlType(field).ToLower();
                if (AreSameDataTypes(oldType, newType) == false)
                {
                    var defaultValue = string.IsNullOrEmpty(field.DefaultValue) ? "NULL" : field.DefaultValue;

                    if (IsNumericType(newType))
                        selectColumnList.Append("CASE WHEN REGEXP_LIKE(\"")
                                        .Append(OracleNamesTranslator.Translate(dbColumn.ColumnName))
                                        .Append("\",'^-?[[:digit:],.]*$') THEN ")
                                        .Append("CAST(REPLACE(\"")
                                        .Append(OracleNamesTranslator.Translate(dbColumn.ColumnName))
                                        .Append("\", ',', '.') AS ")
                                        .Append(sqlType)
                                        .Append(") ELSE ")
                                        .Append(defaultValue)
                                        .Append(" END,");
                    else if (IsDateType(newType))
                        selectColumnList.Append("CASE WHEN IsDate(\"")
                                        .Append(OracleNamesTranslator.Translate(dbColumn.ColumnName))
                                        .Append("\")=1 THEN ")
                                        .Append("CAST(\"")
                                        .Append(OracleNamesTranslator.Translate(dbColumn.ColumnName))
                                        .Append("\" AS ")
                                        .Append(sqlType)
                                        .Append(") ELSE NULL END,");
                    else if (IsStringType(newType))
                        selectColumnList.Append("CAST(\"").Append(OracleNamesTranslator.Translate(dbColumn.ColumnName)).Append("\" AS ").Append(sqlType).Append("),");
                    else
                        selectColumnList.Append(defaultValue).Append(",");
                }
                else
                    selectColumnList.Append("CAST(\"").Append(OracleNamesTranslator.Translate(dbColumn.ColumnName)).Append("\" AS ").Append(sqlType).Append("),");
            }

            insertColumnList.Remove(insertColumnList.Length - 1, 1);
            selectColumnList.Remove(selectColumnList.Length - 1, 1);

            result.Append("INSERT INTO \"")
                  .Append(OracleNamesTranslator.TranslatePrefix(prefix))
                  .Append(OracleNamesTranslator.Translate(table.Name))
                  .Append("\" (")
                  .Append(insertColumnList)
                  .AppendLine(")");

            result.Append("SELECT ").Append(selectColumnList).Append(" FROM \"").Append(OracleNamesTranslator.Translate(dbTable.TableName)).AppendLine("\";;");

            return result.ToString();
        }
        /// <summary>
        /// Gets the fk constraints SQL.
        /// </summary>
        /// <param name="dbTable">The database table.</param>
        /// <param name="fk">The fk.</param>
        /// <param name="table">The table.</param>
        /// <returns>System.String.</returns>
        protected override string GetFKConstraintsSql(DbTableDefinition dbTable, DbForeignKeyDefinition fk, ITableDefinition table)
        {
            var fKeys = string.Join(",", fk.ForeignKeyColumnsName);
            var pKeys = string.Join(",", fk.PrimaryKeyColumnsName);

            return string.Format(
                @"
IF (EXISTS (SELECT * FROM [INFORMATION_SCHEMA].[TABLES] WHERE [TABLE_SCHEMA] = 'dbo' AND [TABLE_NAME] = N'{0}'))
BEGIN
ALTER TABLE [{0}] WITH CHECK ADD CONSTRAINT [{1}] FOREIGN KEY([{2}])
REFERENCES [{3}] ({4})

ALTER TABLE [{0}] CHECK CONSTRAINT [{1}]

END
",
                fk.ForeignKeyTableName,
                fk.ConstraintName,
                fKeys,
                fk.PrimaryKeyTableName,
                pKeys);
        }
        /// <summary>
        /// Gets the rename table SQL.
        /// </summary>
        /// <param name="dbTable">The database table.</param>
        /// <param name="table">The table.</param>
        /// <param name="prefix">The prefix.</param>
        /// <returns>System.String.</returns>
        protected override string GetRenameTableSql(DbTableDefinition dbTable, ITableDefinition table, string prefix = null)
        {
            var sb = new StringBuilder();

            sb.AppendFormat(@"RENAME ""{1}{0}"" TO ""{2}"";;",
                            OracleNamesTranslator.Translate(table.Name),
                            OracleNamesTranslator.TranslatePrefix(prefix),
                            OracleNamesTranslator.Translate(dbTable.TableName));

            var tableFieldDefinition = table.FieldList.FirstOrDefault(x => x.IsIdentity);

            if (tableFieldDefinition != null)
                sb.AppendFormat(@"ALTER TRIGGER ""{0}"" RENAME TO ""{1}"";;",
                                OracleNamesTranslator.Translate(OracleNamesTranslator.TranslatePrefix(prefix) + "trg_" + table.Name + "_" + tableFieldDefinition.ColumnName),
                                OracleNamesTranslator.Translate("trg_" + table.Name + "_" + tableFieldDefinition.ColumnName));

            return sb.ToString();
        }
        /// <summary>
        /// Gets the drop pk constraints SQL.
        /// </summary>
        /// <param name="table">The table.</param>
        /// <returns>System.String.</returns>
        protected override string GetDropPKConstraintsSql(DbTableDefinition table)
        {
            return string.Format(@"BEGIN
   FOR cc IN (SELECT constraint_name as constraint_exists
    FROM user_constraints
    WHERE constraint_name = '{1}') LOOP
      EXECUTE IMMEDIATE 'ALTER TABLE ""{0}"" DROP CONSTRAINT ""{1}""';
   END LOOP;
END; ;;", OracleNamesTranslator.Translate(table.TableName), OracleNamesTranslator.Translate("PK_" + table.TableName));
        }
示例#6
0
        private static bool CompareForeignKeyDefinitions(ITableDefinition table, DbTableDefinition dbTable)
        {
            foreach (var relationship in table.Relationships.Where(r => r.RelationshipType == RelationshipKinds.OneToMany))
            {
                if (dbTable.ForeignKeys.All(key => key.ConstraintName != relationship.Name))
                    return false;
            }

            return true;
        }
        /// <summary>
        /// Gets the fk constraints SQL.
        /// </summary>
        /// <param name="dbTable">The database table.</param>
        /// <param name="fk">The fk.</param>
        /// <param name="table">The table.</param>
        /// <returns>System.String.</returns>
        protected override string GetFKConstraintsSql(DbTableDefinition dbTable, DbForeignKeyDefinition fk, ITableDefinition table)
        {
            var fKeys = string.Join(",", from c in fk.ForeignKeyColumnsName select "\"" + OracleNamesTranslator.Translate(c) + "\"");
            var pKeys = string.Join(",", from c in fk.PrimaryKeyColumnsName select "\"" + OracleNamesTranslator.Translate(c) + "\"");

            return string.Format(
                @"ALTER TABLE ""{0}"" ADD CONSTRAINT ""{1}"" FOREIGN KEY({2}) REFERENCES ""{3}""({4});;",
                OracleNamesTranslator.Translate(fk.ForeignKeyTableName),
                OracleNamesTranslator.Translate(fk.ConstraintName),
                fKeys,
                OracleNamesTranslator.Translate(fk.PrimaryKeyTableName),
                pKeys);
        }
示例#8
0
 protected override string GetFKConstraintsSql(DbTableDefinition dbTable, DbForeignKeyDefinition fk, ITableDefinition table)
 {
     reportMethodCalled();
     return string.Empty;
 }
示例#9
0
 protected override string GetDropPKConstraintsSql(DbTableDefinition table)
 {
     reportMethodCalled();
     return string.Empty;
 }
示例#10
0
 /// <summary>
 /// Gets the data copy SQL.
 /// </summary>
 /// <param name="dbTable">The database table.</param>
 /// <param name="table">The table.</param>
 /// <param name="prefix">The prefix.</param>
 /// <returns>System.String.</returns>
 protected abstract string GetDataCopySql(DbTableDefinition dbTable, ITableDefinition table, string prefix = null);
示例#11
0
 public MockDatabaseGenerator(Action<MethodBase> callback, DbTableDefinition tableDefinition)
 {
     this.callback = callback;
     this.tableDefinition = tableDefinition;
 }
示例#12
0
 /// <summary>
 /// Gets the drop pk constraints SQL.
 /// </summary>
 /// <param name="table">The table.</param>
 /// <returns>System.String.</returns>
 protected abstract string GetDropPKConstraintsSql(DbTableDefinition table);
示例#13
0
 /// <summary>
 /// Gets the rename table SQL.
 /// </summary>
 /// <param name="dbTable">The database table.</param>
 /// <param name="table">The table.</param>
 /// <param name="prefix">The prefix.</param>
 /// <returns>System.String.</returns>
 protected abstract string GetRenameTableSql(DbTableDefinition dbTable,
                                             ITableDefinition table,
                                             string prefix = null);
示例#14
0
 /// <summary>
 /// Gets the fk constraints SQL.
 /// </summary>
 /// <param name="dbTable">The database table.</param>
 /// <param name="fk">The fk.</param>
 /// <param name="table">The table.</param>
 /// <returns>System.String.</returns>
 protected abstract string GetFKConstraintsSql(DbTableDefinition dbTable,
                                               DbForeignKeyDefinition fk,
                                               ITableDefinition table);
        /// <summary>
        /// Gets the drop pk constraints SQL.
        /// </summary>
        /// <param name="table">The table.</param>
        /// <returns>System.String.</returns>
        protected override string GetDropPKConstraintsSql(DbTableDefinition table)
        {
            return string.Format(@"
IF EXISTS (SELECT * FROM sys.key_constraints
			WHERE type = 'PK'
			AND OBJECT_NAME(parent_object_id) = N'{0}'
			AND name = N'PK_{0}')
    ALTER TABLE [{0}] DROP CONSTRAINT PK_{0}", table.TableName);
        }
示例#16
0
 protected override string GetDataCopySql(DbTableDefinition dbTable, ITableDefinition table, string prefix = null)
 {
     reportMethodCalled();
     return string.Empty;
 }
        /// <summary>
        /// Gets the data copy SQL.
        /// </summary>
        /// <param name="dbTable">The database table.</param>
        /// <param name="table">The table.</param>
        /// <param name="prefix">The prefix.</param>
        /// <returns>System.String.</returns>
        protected override string GetDataCopySql(DbTableDefinition dbTable, ITableDefinition table, string prefix = null)
        {
            var result = new StringBuilder();
            var insertColumnList = new StringBuilder();
            var selectColumnList = new StringBuilder();

            // copy all fields
            foreach (var field in table.FieldList)
            {
                if (!field.GenerateDbColumn)
                    continue;

                var dbColumn = dbTable.Columns.FirstOrDefault(x => x.ColumnName == field.ColumnName);
                // only if they present in old table
                if (dbColumn == null)
                    continue;

                insertColumnList.Append("[").Append(field.ColumnName).Append("],");

                var sqlType = GetSqlType(field);

                // convert values
                var oldType = GetSqlType(dbColumn);
                var newType = GetSqlType(field).ToLower();
                if (AreSameDataTypes(oldType, newType) == false)
                {
                    var defaultValue = string.IsNullOrEmpty(field.DefaultValue) ? "NULL" : field.DefaultValue;

                    if (IsNumericType(newType))
                        selectColumnList.Append("CASE WHEN IsNumeric(")
                                        .Append(dbColumn.ColumnName)
                                        .Append(")=1 THEN ")
                                        .Append("CAST(REPLACE([")
                                        .Append(dbColumn.ColumnName)
                                        .Append("], ',', '.') AS ")
                                        .Append(sqlType)
                                        .Append(") ELSE ")
                                        .Append(defaultValue)
                                        .Append(" END,");
                    else if (IsDateType(newType))
                        selectColumnList.Append("CASE WHEN IsDate(")
                                        .Append(dbColumn.ColumnName)
                                        .Append(")=1 THEN ")
                                        .Append("CAST([")
                                        .Append(dbColumn.ColumnName)
                                        .Append("] AS ")
                                        .Append(sqlType)
                                        .Append(") ELSE NULL END,");
                    else if (IsStringType(newType))
                        selectColumnList.Append("CAST([").Append(dbColumn.ColumnName).Append("] AS ").Append(sqlType).Append("),");
                    else
                        selectColumnList.Append(defaultValue).Append(",");
                }
                else if (dbColumn.ColumnType == "nvarchar" && dbColumn.ColumnSubType == string.Empty && newType != "nvarchar" && newType.Contains("nvarchar"))
                {
                    selectColumnList.Append("CONVERT(")
                                        .Append(newType)
                                        .Append(",")
                                        .Append(dbColumn.ColumnName)
                                        .Append("),");
                }
                else
                    selectColumnList.Append("[").Append(dbColumn.ColumnName).Append("],");
            }

            //if a key field has been changed
            var keyFields = table.FieldList.Where(x => x.IsPrimaryKey);
            var insertColumnListString = insertColumnList.ToString();
            foreach (var field in keyFields)
            {
                if (!insertColumnListString.Contains(field.ColumnName))
                {
                    Log4NetLogger.Instance.Log(LogSeverity.Error, "SqlServerDatabaseGenerator", string.Format("Failed to save data for the table '{0}'. Missing key column '{1}'.", dbTable.TableName, field.ColumnName));
                    return string.Empty;
                }
            }

            insertColumnList.Remove(insertColumnList.Length - 1, 1);
            selectColumnList.Remove(selectColumnList.Length - 1, 1);

            result.Append("IF EXISTS(SELECT * FROM ").Append(dbTable.TableName).AppendLine(")");
            result.Append("INSERT INTO [").Append(prefix).Append(table.Name).Append("] (").Append(insertColumnList).AppendLine(")");
            result.Append("SELECT ").Append(selectColumnList).Append(" FROM [").Append(dbTable.TableName).AppendLine("] WITH (HOLDLOCK TABLOCKX)");

            return result.ToString();
        }
示例#18
0
 /// <summary>
 /// Compares the table definitions.
 /// </summary>
 /// <param name="a1">The a1.</param>
 /// <param name="a2">The a2.</param>
 /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
 private static bool CompareTableDefinitions(DbTableDefinition a1, DbTableDefinition a2)
 {
     return CompareColumnDefinitions(a1.Columns, a2.Columns) && CompareTriggerDefinitions(a1.Triggers, a2.Triggers);
 }