private void ReadSQLMetadata(MetaObject metaObject) { if (string.IsNullOrWhiteSpace(metaObject.TableName)) { return; } List <FieldSqlInfo> sql_fields = GetSqlFields(metaObject.TableName); ClusteredIndexInfo indexInfo = GetClusteredIndexInfo(metaObject.TableName); foreach (FieldSqlInfo info in sql_fields) { bool found = false; MetaField field = null; foreach (MetaProperty p in metaObject.Properties) { if (string.IsNullOrEmpty(p.Field)) { continue; } if (info.COLUMN_NAME.TrimStart('_') == MetadataTokens.Periodicity) { continue; } if (info.COLUMN_NAME.TrimStart('_').StartsWith(p.Field)) { field = new MetaField() { Name = info.COLUMN_NAME, Purpose = SqlUtility.ParseFieldPurpose(info.COLUMN_NAME) }; p.Fields.Add(field); found = true; break; } } if (!found) { string propertyName = string.Empty; int propertyType = (int)DataTypes.NULL; if (metaObject.Owner != null && // таблица итогов регистра накопления metaObject.TypeName == MetaObjectTypes.AccumulationRegister && metaObject.Owner.TypeName == MetaObjectTypes.AccumulationRegister) { // find property name in main table object by field name foreach (MetaProperty ownerProperty in metaObject.Owner.Properties) { if (ownerProperty.Fields.Where(f => f.Name == info.COLUMN_NAME).FirstOrDefault() != null) { propertyName = ownerProperty.Name; if (ownerProperty.PropertyType == (int)DataTypes.Multiple) { propertyType = (int)DataTypes.Multiple; } break; } } } MetaProperty property = metaObject.Properties.Where(p => p.Name == propertyName).FirstOrDefault(); if (property == null) { property = new MetaProperty() { Name = string.IsNullOrEmpty(propertyName) ? info.COLUMN_NAME : propertyName, Purpose = PropertyPurpose.System }; metaObject.Properties.Add(property); MatchFieldToProperty(info, property); if (property.PropertyType == (int)DataTypes.NULL) { property.PropertyType = propertyType; } } field = new MetaField() { Name = info.COLUMN_NAME, Purpose = SqlUtility.ParseFieldPurpose(info.COLUMN_NAME) }; property.Fields.Add(field); } field.TypeName = info.DATA_TYPE; field.Length = info.CHARACTER_MAXIMUM_LENGTH; field.Precision = info.NUMERIC_PRECISION; field.Scale = info.NUMERIC_SCALE; field.IsNullable = info.IS_NULLABLE; if (indexInfo != null) { ClusteredIndexColumnInfo columnInfo = indexInfo.GetColumnByName(info.COLUMN_NAME); if (columnInfo != null) { field.IsPrimaryKey = true; field.KeyOrdinal = columnInfo.KEY_ORDINAL; } } } }
private void ParseMetaObjectDimensions(StreamReader reader, string line, MetaObject metaObject) { ParseMetaProperties(reader, line, metaObject, MetaPropertyPurpose.Dimension); }
private void ParseMetaObjectMeasures(StreamReader reader, string line, MetaObject metaObject) { ParseMetaProperties(reader, line, metaObject, MetaPropertyPurpose.Measure); }
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); } } } }