public virtual bool CompareColumnDefinitions(Lfx.Data.ColumnDefinition col1, Lfx.Data.ColumnDefinition col2) { return(col1 == col2); }
/// <summary> /// Carga lee la información de la estructura de las tablas de datos desde un documento XML. /// </summary> /// <param name="xmlDoc">El documento desde el cual cargar la información de la estructura.</param> private void AddFromXml(System.Xml.XmlDocument xmlDoc) { System.Xml.XmlNodeList ClavesXml = xmlDoc.SelectNodes("/Database/Constraint"); foreach (System.Xml.XmlNode ClaveXml in ClavesXml) { Lfx.Data.ConstraintDefinition Con = new Lfx.Data.ConstraintDefinition(ClaveXml.Attributes["table"].Value); Con.Name = ClaveXml.Attributes["name"].Value; Con.Column = ClaveXml.Attributes["column"].Value; Con.ReferenceTable = ClaveXml.Attributes["reference_table"].Value; Con.ReferenceColumn = ClaveXml.Attributes["reference_column"].Value; Constraints.Add(Con.Name, Con); } System.Xml.XmlNodeList TablasXml = xmlDoc.SelectNodes("/Database/Table"); foreach (System.Xml.XmlNode TablaXml in TablasXml) { string TableName = TablaXml.Attributes["name"].Value; Lfx.Data.TableStructure Tabla; if (m_Tables.ContainsKey(TableName)) { // Ya existe la tabla, sólo agrego la definición de las columnas nuevas Tabla = m_Tables[TableName]; } else { // Es una definición de una tabla nueva Tabla = new Lfx.Data.TableStructure(); Tabla.Name = TableName; if (TablaXml.Attributes["label"] != null) { Tabla.Label = TablaXml.Attributes["label"].Value; } Tabla.Columns = new System.Collections.Generic.Dictionary <string, Lfx.Data.ColumnDefinition>(); } System.Xml.XmlNodeList ColumnasXml = TablaXml.SelectNodes("Column"); foreach (System.Xml.XmlNode ColumnaXml in ColumnasXml) { Lfx.Data.ColumnDefinition Columna = new Lfx.Data.ColumnDefinition(); Columna.Name = ColumnaXml.Attributes["name"].Value; if (ColumnaXml.Attributes["inputtype"] != null) { switch (ColumnaXml.Attributes["inputtype"].Value) { case "AlphanumericSet": Columna.InputFieldType = InputFieldTypes.AlphanumericSet; Columna.FieldType = DbTypes.VarChar; break; case "Binary": Columna.InputFieldType = InputFieldTypes.Binary; Columna.FieldType = DbTypes.Blob; break; case "Bool": Columna.InputFieldType = InputFieldTypes.Bool; Columna.FieldType = DbTypes.TinyInt; break; case "Currency": Columna.InputFieldType = InputFieldTypes.Currency; Columna.FieldType = DbTypes.Currency; Columna.Lenght = 15; Columna.Precision = 4; break; case "Date": Columna.InputFieldType = InputFieldTypes.Date; Columna.FieldType = DbTypes.DateTime; break; case "DateTime": Columna.InputFieldType = InputFieldTypes.DateTime; Columna.FieldType = DbTypes.DateTime; break; case "Image": Columna.InputFieldType = InputFieldTypes.Image; Columna.FieldType = DbTypes.Blob; break; case "Integer": Columna.InputFieldType = InputFieldTypes.Integer; Columna.FieldType = DbTypes.Integer; break; case "MediumInt": Columna.InputFieldType = InputFieldTypes.Integer; Columna.FieldType = DbTypes.MediumInt; break; case "SmallInt": Columna.InputFieldType = InputFieldTypes.Integer; Columna.FieldType = DbTypes.SmallInt; break; case "TinyInt": Columna.InputFieldType = InputFieldTypes.Integer; Columna.FieldType = DbTypes.TinyInt; break; case "Memo": Columna.InputFieldType = InputFieldTypes.Memo; Columna.FieldType = DbTypes.Text; break; case "Numeric": Columna.InputFieldType = InputFieldTypes.Numeric; Columna.FieldType = DbTypes.Numeric; Columna.Lenght = 15; Columna.Precision = 4; break; case "NumericSet": Columna.InputFieldType = InputFieldTypes.NumericSet; Columna.FieldType = DbTypes.SmallInt; break; case "Relation": Columna.InputFieldType = InputFieldTypes.Relation; if (ColumnaXml.Attributes["relation_table"] != null) { Columna.Relation = new Relation(Columna.Name, ColumnaXml.Attributes["relation_table"].Value, ColumnaXml.Attributes["relation_key"].Value, ColumnaXml.Attributes["relation_detail"].Value); } Columna.FieldType = DbTypes.Integer; break; case "Serial": Columna.InputFieldType = InputFieldTypes.Serial; Columna.FieldType = DbTypes.Serial; break; case "Text": Columna.InputFieldType = InputFieldTypes.Text; Columna.FieldType = DbTypes.VarChar; break; default: throw new NotImplementedException("Lfx.Data.DataBaseCache.CargarEstructuraDesdeXml: Falta implementar " + ColumnaXml.Attributes["inputtype"].Value); } } else { Columna.FieldType = Lfx.Data.Types.FromSqlType(ColumnaXml.Attributes["datatype"].Value); } if (ColumnaXml.Attributes["lenght"] != null) { Columna.Lenght = Lfx.Types.Parsing.ParseInt(ColumnaXml.Attributes["lenght"].Value); } else if (Columna.FieldType == DbTypes.VarChar) { // La longitud predeterminada para los campos VarChar es de 200 Columna.Lenght = 200; } if (ColumnaXml.Attributes["precision"] != null) { Columna.Precision = Lfx.Types.Parsing.ParseInt(ColumnaXml.Attributes["precision"].Value); } if (ColumnaXml.Attributes["label"] != null) { Columna.Label = ColumnaXml.Attributes["label"].Value; } else { Columna.Label = Columna.Name; } if (ColumnaXml.Attributes["section"] != null) { Columna.Section = ColumnaXml.Attributes["section"].Value; } if (ColumnaXml.Attributes["required"] != null && ColumnaXml.Attributes["required"].Value == "!") { Columna.Required = true; } else { Columna.Required = false; } if (ColumnaXml.Attributes["nullable"] == null) { Columna.Nullable = false; } else if (ColumnaXml.Attributes["nullable"].Value == "1") { Columna.Nullable = true; } else { Columna.Nullable = false; } if (ColumnaXml.Attributes["primary_key"] != null) { Columna.PrimaryKey = System.Convert.ToBoolean(Lfx.Types.Parsing.ParseInt(ColumnaXml.Attributes["primary_key"].Value)); } if (ColumnaXml.Attributes["default"] != null && ColumnaXml.Attributes["default"].Value.Length > 0) { Columna.DefaultValue = ColumnaXml.Attributes["default"].Value; } else { switch (Columna.FieldType) { case DbTypes.VarChar: Columna.DefaultValue = null; break; case DbTypes.Text: case DbTypes.Blob: Columna.DefaultValue = null; break; case DbTypes.Currency: case DbTypes.Integer: case DbTypes.NonExactDecimal: case DbTypes.Numeric: case DbTypes.Serial: case DbTypes.SmallInt: case DbTypes.TinyInt: case DbTypes.MediumInt: if (Columna.Nullable) { Columna.DefaultValue = "NULL"; } else { Columna.DefaultValue = null; } break; case DbTypes.DateTime: Columna.DefaultValue = null; break; default: Columna.DefaultValue = ""; break; } } if (Tabla.Columns.ContainsKey(Columna.Name)) { Tabla.Columns[Columna.Name] = Columna; } else { Tabla.Columns.Add(Columna.Name, Columna); } } //Agrego los campos de sys_tags if (this.TagList.ContainsKey(Tabla.Name)) { foreach (Data.Tag Tg in this.TagList[Tabla.Name]) { Lfx.Data.ColumnDefinition Columna = new Lfx.Data.ColumnDefinition(Tg.FieldName, Tg.FieldType); switch (Columna.FieldType) { case Lfx.Data.DbTypes.VarChar: Columna.Lenght = 200; break; case Lfx.Data.DbTypes.Numeric: Columna.Lenght = 15; Columna.Precision = 4; break; } Columna.Nullable = Tg.Nullable; Columna.PrimaryKey = false; Columna.Label = Tg.Label; if (Tg.DefaultValue != null) { Columna.DefaultValue = Tg.DefaultValue.ToString(); } if (Tabla.Columns.ContainsKey(Tg.FieldName)) { Tabla.Columns[Columna.Name] = Columna; } else { Tabla.Columns.Add(Columna.Name, Columna); } } } if (Tabla.Indexes == null) { Tabla.Indexes = new System.Collections.Generic.Dictionary <string, Lfx.Data.IndexDefinition>(); } System.Xml.XmlNodeList IndicesXml = TablaXml.SelectNodes("Index"); foreach (System.Xml.XmlNode IndiceXml in IndicesXml) { Lfx.Data.IndexDefinition Indice = new Lfx.Data.IndexDefinition(Tabla.Name); Indice.Name = IndiceXml.Attributes["name"].Value; if (IndiceXml.Attributes["unique"] != null) { Indice.Unique = System.Convert.ToBoolean(Lfx.Types.Parsing.ParseInt(IndiceXml.Attributes["unique"].Value)); } if (IndiceXml.Attributes["primary"] != null) { Indice.Primary = System.Convert.ToBoolean(Lfx.Types.Parsing.ParseInt(IndiceXml.Attributes["primary"].Value)); } Indice.Columns = new List <string>(IndiceXml.Attributes["columns"].Value.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); Tabla.Indexes.Add(Indice.Name, Indice); if (Indice.Primary) { // Marco las claves primarias foreach (string ColName in Indice.Columns) { Tabla.Columns[ColName].PrimaryKey = true; } } } if (m_Tables.ContainsKey(Tabla.Name) == false) { this.m_Tables.Add(Tabla.Name, Tabla); } } }
/// <summary> /// Carga lee la información de la estructura de las tablas de datos desde un documento XML. /// </summary> /// <param name="xmlDoc">El documento desde el cual cargar la información de la estructura.</param> private void AddFromXml(System.Xml.XmlDocument xmlDoc) { System.Xml.XmlNodeList ClavesXml = xmlDoc.SelectNodes("/Database/Constraint"); foreach (System.Xml.XmlNode ClaveXml in ClavesXml) { Lfx.Data.ConstraintDefinition Con = new Lfx.Data.ConstraintDefinition(ClaveXml.Attributes["table"].Value); Con.Name = ClaveXml.Attributes["name"].Value; Con.Column = ClaveXml.Attributes["column"].Value; Con.ReferenceTable = ClaveXml.Attributes["reference_table"].Value; Con.ReferenceColumn = ClaveXml.Attributes["reference_column"].Value; Constraints.Add(Con.Name, Con); } System.Xml.XmlNodeList TablasXml = xmlDoc.SelectNodes("/Database/Table"); foreach (System.Xml.XmlNode TablaXml in TablasXml) { string TableName = TablaXml.Attributes["name"].Value; Lfx.Data.TableStructure Tabla; if (m_Tables.ContainsKey(TableName)) { // Ya existe la tabla, sólo agrego la definición de las columnas nuevas Tabla = m_Tables[TableName]; } else { // Es una definición de una tabla nueva Tabla = new Lfx.Data.TableStructure(); Tabla.Name = TableName; if (TablaXml.Attributes["label"] != null) Tabla.Label = TablaXml.Attributes["label"].Value; Tabla.Columns = new System.Collections.Generic.Dictionary<string, Lfx.Data.ColumnDefinition>(); } System.Xml.XmlNodeList ColumnasXml = TablaXml.SelectNodes("Column"); foreach (System.Xml.XmlNode ColumnaXml in ColumnasXml) { Lfx.Data.ColumnDefinition Columna = new Lfx.Data.ColumnDefinition(); Columna.Name = ColumnaXml.Attributes["name"].Value; if (ColumnaXml.Attributes["inputtype"] != null) { switch (ColumnaXml.Attributes["inputtype"].Value) { case "AlphanumericSet": Columna.InputFieldType = InputFieldTypes.AlphanumericSet; Columna.FieldType = DbTypes.VarChar; break; case "Binary": Columna.InputFieldType = InputFieldTypes.Binary; Columna.FieldType = DbTypes.Blob; break; case "Bool": Columna.InputFieldType = InputFieldTypes.Bool; Columna.FieldType = DbTypes.TinyInt; break; case "Currency": Columna.InputFieldType = InputFieldTypes.Currency; Columna.FieldType = DbTypes.Currency; Columna.Lenght = 15; Columna.Precision = 4; break; case "Date": Columna.InputFieldType = InputFieldTypes.Date; Columna.FieldType = DbTypes.DateTime; break; case "DateTime": Columna.InputFieldType = InputFieldTypes.DateTime; Columna.FieldType = DbTypes.DateTime; break; case "Image": Columna.InputFieldType = InputFieldTypes.Image; Columna.FieldType = DbTypes.Blob; break; case "Integer": Columna.InputFieldType = InputFieldTypes.Integer; Columna.FieldType = DbTypes.Integer; break; case "MediumInt": Columna.InputFieldType = InputFieldTypes.Integer; Columna.FieldType = DbTypes.MediumInt; break; case "SmallInt": Columna.InputFieldType = InputFieldTypes.Integer; Columna.FieldType = DbTypes.SmallInt; break; case "TinyInt": Columna.InputFieldType = InputFieldTypes.Integer; Columna.FieldType = DbTypes.TinyInt; break; case "Memo": Columna.InputFieldType = InputFieldTypes.Memo; Columna.FieldType = DbTypes.Text; break; case "Numeric": Columna.InputFieldType = InputFieldTypes.Numeric; Columna.FieldType = DbTypes.Numeric; Columna.Lenght = 15; Columna.Precision = 4; break; case "NumericSet": Columna.InputFieldType = InputFieldTypes.NumericSet; Columna.FieldType = DbTypes.SmallInt; break; case "Relation": Columna.InputFieldType = InputFieldTypes.Relation; if (ColumnaXml.Attributes["relation_table"] != null) Columna.Relation = new Relation(Columna.Name, ColumnaXml.Attributes["relation_table"].Value, ColumnaXml.Attributes["relation_key"].Value, ColumnaXml.Attributes["relation_detail"].Value); Columna.FieldType = DbTypes.Integer; break; case "Serial": Columna.InputFieldType = InputFieldTypes.Serial; Columna.FieldType = DbTypes.Serial; break; case "Text": Columna.InputFieldType = InputFieldTypes.Text; Columna.FieldType = DbTypes.VarChar; break; default: throw new NotImplementedException("Lfx.Data.DataBaseCache.CargarEstructuraDesdeXml: Falta implementar " + ColumnaXml.Attributes["inputtype"].Value); } } else { Columna.FieldType = Lfx.Data.Types.FromSqlType(ColumnaXml.Attributes["datatype"].Value); } if (ColumnaXml.Attributes["lenght"] != null) Columna.Lenght = Lfx.Types.Parsing.ParseInt(ColumnaXml.Attributes["lenght"].Value); else if (Columna.FieldType == DbTypes.VarChar) // La longitud predeterminada para los campos VarChar es de 200 Columna.Lenght = 200; if (ColumnaXml.Attributes["precision"] != null) Columna.Precision = Lfx.Types.Parsing.ParseInt(ColumnaXml.Attributes["precision"].Value); if (ColumnaXml.Attributes["label"] != null) Columna.Label = ColumnaXml.Attributes["label"].Value; else Columna.Label = Columna.Name; if (ColumnaXml.Attributes["section"] != null) Columna.Section = ColumnaXml.Attributes["section"].Value; if (ColumnaXml.Attributes["required"] != null && ColumnaXml.Attributes["required"].Value == "!") Columna.Required = true; else Columna.Required = false; if (ColumnaXml.Attributes["nullable"] == null) Columna.Nullable = false; else if (ColumnaXml.Attributes["nullable"].Value == "1") Columna.Nullable = true; else Columna.Nullable = false; if (ColumnaXml.Attributes["primary_key"] != null) Columna.PrimaryKey = System.Convert.ToBoolean(Lfx.Types.Parsing.ParseInt(ColumnaXml.Attributes["primary_key"].Value)); if (ColumnaXml.Attributes["default"] != null && ColumnaXml.Attributes["default"].Value.Length > 0) { Columna.DefaultValue = ColumnaXml.Attributes["default"].Value; } else { switch (Columna.FieldType) { case DbTypes.VarChar: Columna.DefaultValue = null; break; case DbTypes.Text: case DbTypes.Blob: Columna.DefaultValue = null; break; case DbTypes.Currency: case DbTypes.Integer: case DbTypes.NonExactDecimal: case DbTypes.Numeric: case DbTypes.Serial: case DbTypes.SmallInt: case DbTypes.TinyInt: case DbTypes.MediumInt: if (Columna.Nullable) Columna.DefaultValue = "NULL"; else Columna.DefaultValue = null; break; case DbTypes.DateTime: Columna.DefaultValue = null; break; default: Columna.DefaultValue = ""; break; } } if (Tabla.Columns.ContainsKey(Columna.Name)) Tabla.Columns[Columna.Name] = Columna; else Tabla.Columns.Add(Columna.Name, Columna); } //Agrego los campos de sys_tags if (this.TagList.ContainsKey(Tabla.Name)) { foreach (Data.Tag Tg in this.TagList[Tabla.Name]) { Lfx.Data.ColumnDefinition Columna = new Lfx.Data.ColumnDefinition(Tg.FieldName, Tg.FieldType); switch (Columna.FieldType) { case Lfx.Data.DbTypes.VarChar: Columna.Lenght = 200; break; case Lfx.Data.DbTypes.Numeric: Columna.Lenght = 15; Columna.Precision = 4; break; } Columna.Nullable = Tg.Nullable; Columna.PrimaryKey = false; Columna.Label = Tg.Label; if (Tg.DefaultValue != null) Columna.DefaultValue = Tg.DefaultValue.ToString(); if (Tabla.Columns.ContainsKey(Tg.FieldName)) Tabla.Columns[Columna.Name] = Columna; else Tabla.Columns.Add(Columna.Name, Columna); } } if (Tabla.Indexes == null) Tabla.Indexes = new System.Collections.Generic.Dictionary<string, Lfx.Data.IndexDefinition>(); System.Xml.XmlNodeList IndicesXml = TablaXml.SelectNodes("Index"); foreach (System.Xml.XmlNode IndiceXml in IndicesXml) { Lfx.Data.IndexDefinition Indice = new Lfx.Data.IndexDefinition(Tabla.Name); Indice.Name = IndiceXml.Attributes["name"].Value; if (IndiceXml.Attributes["unique"] != null) Indice.Unique = System.Convert.ToBoolean(Lfx.Types.Parsing.ParseInt(IndiceXml.Attributes["unique"].Value)); if (IndiceXml.Attributes["primary"] != null) Indice.Primary = System.Convert.ToBoolean(Lfx.Types.Parsing.ParseInt(IndiceXml.Attributes["primary"].Value)); Indice.Columns = new List<string>(IndiceXml.Attributes["columns"].Value.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); Tabla.Indexes.Add(Indice.Name, Indice); if (Indice.Primary) { // Marco las claves primarias foreach (string ColName in Indice.Columns) { Tabla.Columns[ColName].PrimaryKey = true; } } } if (m_Tables.ContainsKey(Tabla.Name) == false) this.m_Tables.Add(Tabla.Name, Tabla); } }