Exemple #1
0
        internal static RowLayout LoadFieldDefinition(DataReader reader, out int version)
        {
            var dateTimeKind   = DateTimeKind.Unspecified;
            var dateTimeType   = DateTimeType.Undefined;
            var stringEncoding = StringEncoding.UTF8;

            if (reader.ReadString(8) != "DatTable")
            {
                throw new FormatException();
            }

            version = reader.Read7BitEncodedInt32();
            if ((version < 1) || (version > 4))
            {
                throw new InvalidDataException("Unknown Table version!");
            }

            // read name and create layout
            var layoutName = reader.ReadString();
            var fieldCount = reader.Read7BitEncodedInt32();
            var fields     = new FieldProperties[fieldCount];

            for (var i = 0; i < fieldCount; i++)
            {
                var fieldName        = reader.ReadString();
                var dataType         = (DataType)reader.Read7BitEncodedInt32();
                var fieldFlags       = (FieldFlags)reader.Read7BitEncodedInt32();
                var databaseDataType = dataType;
                switch (dataType)
                {
                case DataType.Enum:
                    databaseDataType = DataType.Int64;
                    break;

                case DataType.User:
                case DataType.String:
                    databaseDataType = DataType.String;
                    if (version > 2)
                    {
                        stringEncoding = (StringEncoding)reader.Read7BitEncodedInt32();
                    }
                    else
                    {
                        stringEncoding = StringEncoding.UTF8;
                    }

                    break;

                case DataType.TimeSpan:
                    if (version > 3)
                    {
                        dateTimeType = (DateTimeType)reader.Read7BitEncodedInt32();
                    }

                    break;

                case DataType.DateTime:
                    if (version > 1)
                    {
                        dateTimeKind = (DateTimeKind)reader.Read7BitEncodedInt32();
                        dateTimeType = (DateTimeType)reader.Read7BitEncodedInt32();
                    }
                    else
                    {
                        dateTimeKind = DateTimeKind.Utc;
                        dateTimeType = DateTimeType.BigIntHumanReadable;
                    }

                    break;
                }

                Type valueType = null;
                if ((dataType & DataType.MaskRequireValueType) != 0)
                {
                    var typeName = reader.ReadString();
                    valueType = AppDom.FindType(typeName.BeforeFirst(','), typeName.AfterFirst(',').Trim());
                }

                var field = fields[i] = new FieldProperties
                {
                    Index          = i,
                    Flags          = fieldFlags,
                    DataType       = dataType,
                    ValueType      = valueType,
                    Name           = fieldName,
                    TypeAtDatabase = databaseDataType,
                    NameAtDatabase = fieldName,
                    DateTimeType   = dateTimeType,
                    DateTimeKind   = dateTimeKind,
                    StringEncoding = stringEncoding
                };
                field.Validate();
            }

            return(RowLayout.CreateUntyped(layoutName, fields));
        }