private void ParseMetadataObject(Stream stream, string fileName, MetaObject metaObject, DatabaseInfo database) { if (metaObject.Token == null) { return; } if (metaObject.Token == DBToken.Const || metaObject.Token == DBToken.Node) { return; } if (metaObject.Token == DBToken.AccumRg) { ParseAccumulationRegister(fileName); } using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { string line = reader.ReadLine(); // 1. line line = reader.ReadLine(); // 2. line _ = reader.ReadLine(); // 3. line _ = reader.ReadLine(); // 4. line line = reader.ReadLine(); // 5. line: meta object UUID and Name //ParseInternalIdentifier(line, metaObject); ParseMetaObjectName(line, metaObject); line = reader.ReadLine(); // 6. line meta object alias ParseMetaObjectAlias(line, metaObject); SetMetaObjecNamespace(metaObject, database); _ = reader.ReadLine(); // 7. line if (metaObject.Token == DBToken.Reference) { // starts from 8. line //ParseReferenceOwner(reader, metaObject); // свойство справочника "Владелец" } else if (metaObject.Token == DBToken.Document) { // starts from 8. line // TODO: Parse объекты метаданных, которые являются основанием для заполнения текущего // starts after count (количество объектов оснований) * 3 (размер ссылки на объект метаданных) + 1 (тэг закрытия блока объектов оснований) // TODO: Parse все регистры (информационные, накопления и бухгалтерские), // по которым текущий документ выполняет движения } int count = 0; string UUID = null; Match match = null; while ((line = reader.ReadLine()) != null) { match = rxSpecialUUID.Match(line); if (!match.Success) { continue; } string[] lines = line.Split(','); UUID = lines[0].Replace("{", string.Empty); count = int.Parse(lines[1].Replace("}", string.Empty)); if (count == 0) { continue; } if (_SpecialParsers.ContainsKey(UUID)) { _SpecialParsers[UUID](reader, line, metaObject); } } } }
public void ReadSQLMetadata(DatabaseInfo database) { (new SQLMetadataLoader()).Load(ConnectionString, database); }
public void Load(string filePath, DatabaseInfo database) { LoadContext context = new LoadContext(database); using (XmlReader reader = XmlReader.Create(filePath)) { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element) { if (reader.Name == "InfoBase") { Read_InfoBase_Element(reader, context); } if (reader.Name == "Types") { context.TypeCodes.Clear(); context.Database.BaseObjects.Clear(); } if (reader.Name == "Type") { Read_Type_Element(reader, context); } if (reader.Name == "Namespaces") { // do nothing: see Types tag } if (reader.Name == "Namespace") { Read_Namespace_Element(reader, context); } else if (reader.Name == "Entities") { //context.MetaObject.MetaObjects.Clear(); } else if (reader.Name == "Entity") { Read_Entity_Element(reader, context); } else if (reader.Name == "Properties") { //context.Entity.Properties.Clear(); } else if (reader.Name == "Property") { Read_Property_Element(reader, context); } else if (reader.Name == "Tables") { context.MetaObject.TableName = string.Empty; } else if (reader.Name == "Table") { Read_Table_Element(reader, context); } else if (reader.Name == "Fields") { //context.Table.Fields.Clear(); } else if (reader.Name == "Field") { Read_Field_Element(reader, context); } else if (reader.Name == "Value") { Read_Value_Element(reader, context); } } else if (reader.NodeType == XmlNodeType.EndElement) { if (reader.Name == "InfoBase") { Close_InfoBase_Element(context); } else if (reader.Name == "Type") { context.BaseObject = null; context.MetaObject = null; context.MetaObjectOwner = null; } else if (reader.Name == "Namespace") { context.BaseObject = null; context.MetaObject = null; context.MetaObjectOwner = null; } else if (reader.Name == "Entities") { context.MetaObjectOwner = null; } else if (reader.Name == "Entity") { context.MetaObject = null; } else if (reader.Name == "Property") { context.Property = null; } else if (reader.Name == "Table") { context.Table = string.Empty; } else if (reader.Name == "Field") { context.Field = null; } } } } }
public void MakeSecondPass(DatabaseInfo database) { foreach (var ns in database.BaseObjects) { foreach (var dbo in ns.MetaObjects) { foreach (var property in dbo.Properties) { foreach (var type in property.Types) { if (type.TypeCode == 0) { if (type.MetaObject == null) { if (!string.IsNullOrEmpty(type.UUID)) { if (UUIDs.TryGetValue(type.UUID, out MetaObject dbObject)) { type.Name = dbObject.TableName; type.MetaObject = dbObject; type.TypeCode = dbObject.TypeCode; } } } else { type.Name = type.MetaObject.TableName; type.TypeCode = type.MetaObject.TypeCode; } } } } foreach (var nested in dbo.MetaObjects) { foreach (var property in nested.Properties) { foreach (var type in property.Types) { if (type.TypeCode == 0) { if (type.MetaObject == null) { if (!string.IsNullOrEmpty(type.UUID)) { if (UUIDs.TryGetValue(type.UUID, out MetaObject dbObject)) { type.Name = dbObject.TableName; type.MetaObject = dbObject; type.TypeCode = dbObject.TypeCode; } } } else { type.Name = type.MetaObject.TableName; type.TypeCode = type.MetaObject.TypeCode; } } } } } } } }
internal LoadContext(DatabaseInfo database) { Database = database; }