You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
4.7 KiB
125 lines
4.7 KiB
using OpenDBDiff.Abstractions.Schema;
|
|
using OpenDBDiff.Abstractions.Schema.Model;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace OpenDBDiff.SqlServer.Schema.Model
|
|
{
|
|
public class XMLSchema : SQLServerSchemaBase
|
|
{
|
|
public XMLSchema(ISchemaBase parent)
|
|
: base(parent, ObjectType.XMLSchema)
|
|
{
|
|
this.Dependencies = new List<ObjectDependency>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Clona el objeto en una nueva instancia.
|
|
/// </summary>
|
|
public new XMLSchema Clone(ISchemaBase parent)
|
|
{
|
|
XMLSchema item = new XMLSchema(parent);
|
|
item.Text = this.Text;
|
|
item.Status = this.Status;
|
|
item.Name = this.Name;
|
|
item.Id = this.Id;
|
|
item.Owner = this.Owner;
|
|
item.Guid = this.Guid;
|
|
item.Dependencies = this.Dependencies;
|
|
return item;
|
|
}
|
|
|
|
public List<ObjectDependency> Dependencies { get; set; }
|
|
|
|
public string Text { get; set; }
|
|
|
|
public override string ToSql()
|
|
{
|
|
StringBuilder sql = new StringBuilder();
|
|
sql.Append("CREATE XML SCHEMA COLLECTION ");
|
|
sql.Append(this.FullName + " AS ");
|
|
sql.Append("N'" + this.Text + "'");
|
|
sql.Append("\r\nGO\r\n");
|
|
return sql.ToString();
|
|
}
|
|
|
|
public override string ToSqlAdd()
|
|
{
|
|
return ToSql();
|
|
}
|
|
|
|
public override string ToSqlDrop()
|
|
{
|
|
return "DROP XML SCHEMA COLLECTION " + FullName + "\r\nGO\r\n";
|
|
}
|
|
|
|
private SQLScriptList ToSQLChangeColumns()
|
|
{
|
|
Hashtable fields = new Hashtable();
|
|
SQLScriptList list = new SQLScriptList();
|
|
if ((this.Status == ObjectStatus.Alter) || (this.Status == ObjectStatus.Rebuild))
|
|
{
|
|
foreach (ObjectDependency dependency in this.Dependencies)
|
|
{
|
|
ISchemaBase itemDepens = ((Database)this.Parent).Find(dependency.Name);
|
|
if (dependency.IsCodeType)
|
|
{
|
|
list.AddRange(((ICode)itemDepens).Rebuild());
|
|
}
|
|
if (dependency.Type == ObjectType.Table)
|
|
{
|
|
Column column = ((Table)itemDepens).Columns[dependency.ColumnName];
|
|
if ((column.Parent.Status != ObjectStatus.Drop) && (column.Parent.Status != ObjectStatus.Create) && ((column.Status != ObjectStatus.Create)))
|
|
{
|
|
if (!fields.ContainsKey(column.FullName))
|
|
{
|
|
if (column.HasToRebuildOnlyConstraint)
|
|
column.Parent.Status = ObjectStatus.RebuildDependencies;
|
|
list.AddRange(column.RebuildConstraint(true));
|
|
list.Add("ALTER TABLE " + column.Parent.FullName + " ALTER COLUMN " + column.ToSQLRedefine(null, 0, "") + "\r\nGO\r\n", 0, ScriptAction.AlterColumn);
|
|
/*Si la columna va a ser eliminada o la tabla va a ser reconstruida, no restaura la columna*/
|
|
if ((column.Status != ObjectStatus.Drop) && (column.Parent.Status != ObjectStatus.Rebuild))
|
|
list.AddRange(column.Alter(ScriptAction.AlterColumnRestore));
|
|
fields.Add(column.FullName, column.FullName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Devuelve el schema de diferencias del Schema en formato SQL.
|
|
/// </summary>
|
|
public override SQLScriptList ToSqlDiff(System.Collections.Generic.ICollection<ISchemaBase> schemas)
|
|
{
|
|
SQLScriptList list = new SQLScriptList();
|
|
|
|
if (this.Status == ObjectStatus.Drop)
|
|
{
|
|
list.Add(ToSqlDrop(), 0, ScriptAction.DropXMLSchema);
|
|
}
|
|
if (this.Status == ObjectStatus.Create)
|
|
{
|
|
list.Add(ToSql(), 0, ScriptAction.AddXMLSchema);
|
|
}
|
|
if (this.Status == ObjectStatus.Alter)
|
|
{
|
|
list.AddRange(ToSQLChangeColumns());
|
|
list.Add(ToSqlDrop() + ToSql(), 0, ScriptAction.AddXMLSchema);
|
|
}
|
|
return list;
|
|
}
|
|
|
|
public bool Compare(XMLSchema obj)
|
|
{
|
|
if (obj == null) throw new ArgumentNullException("obj");
|
|
if (!this.Text.Equals(obj.Text)) return false;
|
|
return true;
|
|
}
|
|
}
|
|
}
|