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)); }
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) { }
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); }