Exemple #1
0
        public static Locator Deserialize(BinaryReader reader)
        {
            if (reader.ReadByte() != VERSION)
            {
                throw new Exception("Invalid Locator version.");
            }

            long id = reader.ReadInt64();

            if (id == Locator.MIN.ID)
            {
                return(Locator.MIN);
            }

            bool isDeleted = reader.ReadBoolean();

            string name          = reader.ReadString();
            int    structureType = reader.ReadByte();

            //data types
            DataType keyDataType    = DataType.Deserialize(reader);
            DataType recordDataType = DataType.Deserialize(reader);

            //types
            string sKeyType = reader.ReadString();
            Type   keyType  = (sKeyType != "") ? TypeCache.GetType(sKeyType) : DataTypeUtils.BuildType(keyDataType);

            string sRecordType = reader.ReadString();
            Type   recordType  = (sRecordType != "") ? TypeCache.GetType(sRecordType) : DataTypeUtils.BuildType(recordDataType);

            //key & record members
            var keyMembers    = ReadMembers(reader);
            var recordMembers = ReadMembers(reader);

            //create time
            DateTime createTime   = new DateTime(reader.ReadInt64());
            DateTime modifiedTime = new DateTime(reader.ReadInt64());
            DateTime accessTime   = new DateTime(reader.ReadInt64());

            //tag
            byte[] tag = reader.ReadBoolean() ? reader.ReadBytes((int)CountCompression.Deserialize(reader)) : null;

            var locator = new Locator(id, name, structureType, keyDataType, recordDataType, keyType, recordType);

            locator.IsDeleted = isDeleted;

            locator.keyMembers    = keyMembers;
            locator.recordMembers = recordMembers;

            locator.CreateTime   = createTime;
            locator.ModifiedTime = modifiedTime;
            locator.AccessTime   = accessTime;

            locator.Tag = tag;

            return(locator);
        }
        private IDescriptor DeserializeDescriptor(BinaryReader reader)
        {
            long   id   = (long)CountCompression.Deserialize(reader);
            string name = reader.ReadString();

            int structureType = (int)CountCompression.Deserialize(reader);

            var keyDataType    = DataType.Deserialize(reader);
            var recordDataType = DataType.Deserialize(reader);

            var keyType    = DataTypeUtils.BuildType(keyDataType);
            var recordType = DataTypeUtils.BuildType(recordDataType);

            var createTime   = new DateTime((long)CountCompression.Deserialize(reader));
            var modifiedTime = new DateTime((long)CountCompression.Deserialize(reader));
            var accessTime   = new DateTime((long)CountCompression.Deserialize(reader));

            var tagLength = (int)CountCompression.Deserialize(reader) - 1;

            byte[] tag = tagLength >= 0 ? reader.ReadBytes(tagLength) : null;

            return(new Descriptor(id, name, structureType, keyDataType, recordDataType, keyType, recordType, createTime, modifiedTime, accessTime, tag));
        }
Exemple #3
0
 public Descriptor(long id, string name, DataType keyDataType, DataType recordDataType)
     : this(id, name, Iveely.STSdb4.Database.StructureType.XTABLE, keyDataType, recordDataType, DataTypeUtils.BuildType(keyDataType), DataTypeUtils.BuildType(recordDataType), DateTime.Now, DateTime.Now, DateTime.Now, null)
 {
 }
Exemple #4
0
        private Item1 Obtain(string name, int structureType, DataType keyDataType, DataType recordDataType, Type keyType, Type recordType)
        {
            Debug.Assert(keyDataType != null);
            Debug.Assert(recordDataType != null);

            Item1 item;

            if (!map.TryGetValue(name, out item))
            {
                if (keyType == null)
                {
                    keyType = DataTypeUtils.BuildType(keyDataType);
                }
                if (recordType == null)
                {
                    recordType = DataTypeUtils.BuildType(recordDataType);
                }

                var            locator = CreateLocator(name, structureType, keyDataType, recordDataType, keyType, recordType);
                XTablePortable table   = new XTablePortable(this, locator);

                map[name] = item = new Item1(locator, table);
            }
            else
            {
                var locator = item.Locator;

                if (locator.StructureType != structureType)
                {
                    throw new ArgumentException(String.Format("Invalid structure type for '{0}'", name));
                }

                if (keyDataType != locator.KeyDataType)
                {
                    throw new ArgumentException("keyDataType");
                }

                if (recordDataType != locator.RecordDataType)
                {
                    throw new ArgumentException("recordDataType");
                }

                if (locator.KeyType == null)
                {
                    locator.KeyType = DataTypeUtils.BuildType(keyDataType);
                }
                else
                {
                    if (keyType != null && keyType != locator.KeyType)
                    {
                        throw new ArgumentException(String.Format("Invalid keyType for table '{0}'", name));
                    }
                }

                if (locator.RecordType == null)
                {
                    locator.RecordType = DataTypeUtils.BuildType(recordDataType);
                }
                else
                {
                    if (recordType != null && recordType != locator.RecordType)
                    {
                        throw new ArgumentException(String.Format("Invalid recordType for table '{0}'", name));
                    }
                }

                locator.AccessTime = DateTime.Now;
            }

            if (!item.Locator.IsReady)
            {
                item.Locator.Prepare();
            }

            if (item.Table == null)
            {
                item.Table = new XTablePortable(this, item.Locator);
            }

            return(item);
        }