internal async Task RollbackDeleteObjectAsync(int oid, SqoTypeInfo ti) { long position = MetaHelper.GetSeekPosition(ti, oid); byte[] oidBuff = ByteConverter.IntToByteArray(oid); await file.WriteAsync(position, oidBuff).ConfigureAwait(false); }
internal async Task <bool> SaveFieldValueAsync(int oid, string field, SqoTypeInfo ti, object value, RawdataSerializer rawSerializer) { long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; FieldSqoInfo ai = FindField(ti.Fields, field); if (ai == null) { throw new SiaqodbException("Field:" + field + " not exists in the Type Definition, if you use a Property you have to use UseVariable Attribute"); } else if (value != null && ai.AttributeType != value.GetType()) { try { object valConvert = Convertor.ChangeType(value, ai.AttributeType); value = valConvert; } catch { string msg = "Type of value should be:" + ai.AttributeType.ToString(); SiaqodbConfigurator.LogMessage(msg, VerboseLevel.Error); throw new SiaqodbException(msg); } } byte[] by = null; IByteTransformer byteTransformer = ByteTransformerFactory.GetByteTransformer(this, rawSerializer, ai, ti, oid); by = await byteTransformer.GetBytesAsync(value).ConfigureAwait(false); await file.WriteAsync((long)(position + (long)ai.Header.PositionInRecord), by).ConfigureAwait(false); return(true); }
public async Task SerializeObjectAsync(ObjectInfo oi, RawdataSerializer rawSerializer) { if (oi.Oid > oi.SqoTypeInfo.Header.numberOfRecords) { oi.Oid = 0; } if (oi.Oid == 0) { oi.Oid = GetNextOID(oi.SqoTypeInfo); //SaveOID(oi.SqoTypeInfo, oi.Oid); oi.SqoTypeInfo.Header.numberOfRecords++; //it is needed here if exists a nested object of same type oi.Inserted = true; } else if (oi.Oid < 0) { throw new SiaqodbException("Object is already deleted from database"); } long position = MetaHelper.GetSeekPosition(oi.SqoTypeInfo, oi.Oid); byte[] buffer = await GetObjectBytesAsync(oi, rawSerializer).ConfigureAwait(false); await file.WriteAsync(position, buffer).ConfigureAwait(false); if (oi.Inserted) { await SaveNrRecordsAsync(oi.SqoTypeInfo, oi.SqoTypeInfo.Header.numberOfRecords).ConfigureAwait(false); } }
internal void SaveOID(int oid, SqoTypeInfo ti) { long position = MetaHelper.GetSeekPosition(ti, oid); byte[] oidBuff = ByteConverter.IntToByteArray(oid); file.Write(position, oidBuff); }
internal void MarkObjectAsDelete(int oid, SqoTypeInfo ti) { long position = MetaHelper.GetSeekPosition(ti, oid); int deletedOID = (-1) * oid; byte[] deletedOidBuff = ByteConverter.IntToByteArray(deletedOID); file.Write(position, deletedOidBuff); }
internal async Task MarkObjectAsDeleteAsync(int oid, SqoTypeInfo ti) { long position = MetaHelper.GetSeekPosition(ti, oid); int deletedOID = (-1) * oid; byte[] deletedOidBuff = ByteConverter.IntToByteArray(deletedOID); await file.WriteAsync(position, deletedOidBuff).ConfigureAwait(false); }
internal byte[] ReadObjectBytes(int oid, SqoTypeInfo ti) { long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; byte[] b = new byte[recordLength]; file.Read(position, b); return(b); }
internal async Task <byte[]> ReadObjectBytesAsync(int oid, SqoTypeInfo ti) { long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; byte[] b = new byte[recordLength]; await file.ReadAsync(position, b).ConfigureAwait(false); return(b); }
internal void RollbackDeleteObject(int oid, SqoTypeInfo ti) { long position = MetaHelper.GetSeekPosition(ti, oid); byte[] oidBuff = ByteConverter.IntToByteArray(oid); lock (file) { file.Write(position, oidBuff); } }
internal void SaveArrayOIDFieldContent(SqoTypeInfo ti, FieldSqoInfo fi, int objectOID, int newOID) { byte[] arrayOID = ByteConverter.IntToByteArray(newOID); long position = MetaHelper.GetSeekPosition(ti, objectOID); //an array field has size=9 (isNull(bool) + oid of array table(int)+ nrElements(int) //so write oid after first byte which is null/not null long writePosition = (long)(position + (long)fi.Header.PositionInRecord + 1L); file.Write(writePosition, arrayOID); }
public void SerializeObject(byte[] objectData, int oid, SqoTypeInfo ti, bool insert) { long position = MetaHelper.GetSeekPosition(ti, oid); file.Write(position, objectData); if (insert) { SaveNrRecords(ti, ti.Header.numberOfRecords + 1); } }
internal int InsertEmptyObject(SqoTypeInfo tinf) { int oid = GetNextOID(tinf); byte[] oidBuff = ByteConverter.IntToByteArray(oid); long position = MetaHelper.GetSeekPosition(tinf, oid); file.Write(position, oidBuff); SaveNrRecords(tinf, tinf.Header.numberOfRecords + 1); return(oid); }
public async Task SerializeObjectAsync(byte[] objectData, int oid, SqoTypeInfo ti, bool insert) { long position = MetaHelper.GetSeekPosition(ti, oid); await file.WriteAsync(position, objectData).ConfigureAwait(false); if (insert) { await SaveNrRecordsAsync(ti, ti.Header.numberOfRecords + 1).ConfigureAwait(false); } }
public async Task SaveComplexFieldContentAsync(KeyValuePair <int, int> oid_Tid, FieldSqoInfo fi, SqoTypeInfo ti, int oid) { byte[] by = new byte[MetaExtractor.GetAbsoluteSizeOfField(MetaExtractor.complexID)]; byte[] complexOID = ByteConverter.IntToByteArray(oid_Tid.Key); byte[] complexTID = ByteConverter.IntToByteArray(oid_Tid.Value); Array.Copy(complexOID, 0, by, 0, complexOID.Length); Array.Copy(complexTID, 0, by, 4, complexTID.Length); long position = MetaHelper.GetSeekPosition(ti, oid); await file.WriteAsync((long)(position + (long)fi.Header.PositionInRecord), by).ConfigureAwait(false); }
public int SerializeObjectWithNewOID(byte[] objectData, SqoTypeInfo ti) { int oid = GetNextOID(ti); byte[] oidBuff = ByteConverter.IntToByteArray(oid); Array.Copy(oidBuff, 0, objectData, 0, oidBuff.Length); long position = MetaHelper.GetSeekPosition(ti, oid); file.Write(position, objectData); SaveNrRecords(ti, ti.Header.numberOfRecords + 1); return(oid); }
internal int ReadFirstTID(int oid, FieldSqoInfo fi, SqoTypeInfo ti, RawdataSerializer rawdataSerializer) { long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; if (fi == null) { throw new SiaqodbException("Field not exists in the Type Definition, if you use a Property you have to use UseVariable Attribute"); } byte[] b = new byte[fi.Header.Length]; file.Read((long)(position + (long)fi.Header.PositionInRecord), b); return(rawdataSerializer.ReadComplexArrayFirstTID(b, ti.Header.version, this)); }
public async Task <KeyValuePair <int, int> > ReadOIDAndTIDAsync(SqoTypeInfo ti, int oid, FieldSqoInfo fi) { long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; if (fi == null) { throw new SiaqodbException("Field not exists in the Type Definition, if you use a Property you have to use UseVariable Attribute"); } byte[] b = new byte[fi.Header.Length]; await file.ReadAsync((long)(position + (long)fi.Header.PositionInRecord), b).ConfigureAwait(false); return(ReadOIDAndTID(b)); }
internal async Task <List <KeyValuePair <int, int> > > ReadComplexArrayOidsAsync(int oid, FieldSqoInfo fi, SqoTypeInfo ti, RawdataSerializer rawdataSerializer) { long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; if (fi == null) { throw new SiaqodbException("Field not exists in the Type Definition, if you use a Property you have to use UseVariable Attribute"); } byte[] b = new byte[fi.Header.Length]; await file.ReadAsync((long)(position + (long)fi.Header.PositionInRecord), b).ConfigureAwait(false); return(rawdataSerializer.ReadComplexArrayOids(b, ti.Header.version, this)); }
public async Task <int> SerializeObjectWithNewOIDAsync(byte[] objectData, SqoTypeInfo ti) { int oid = GetNextOID(ti); byte[] oidBuff = ByteConverter.IntToByteArray(oid); Array.Copy(oidBuff, 0, objectData, 0, oidBuff.Length); long position = MetaHelper.GetSeekPosition(ti, oid); await file.WriteAsync(position, objectData).ConfigureAwait(false); await SaveNrRecordsAsync(ti, ti.Header.numberOfRecords + 1).ConfigureAwait(false); return(oid); }
public void PreLoadBytes(int oidStart, int oidEnd, SqoTypeInfo ti) { this.oidStart = oidStart; this.oidEnd = oidEnd; long positionStart = MetaHelper.GetSeekPosition(ti, oidStart); long positionEnd = MetaHelper.GetSeekPosition(ti, oidEnd); int recordLength = ti.Header.lengthOfRecord; if (preloadedBytes == null || preloadedBytes.Length != (recordLength + (positionEnd - positionStart))) { preloadedBytes = new byte[recordLength + (positionEnd - positionStart)]; } file.Read(positionStart, preloadedBytes); }
public async Task PreLoadBytesAsync(int oidStart, int oidEnd, SqoTypeInfo ti) { this.oidStart = oidStart; this.oidEnd = oidEnd; long positionStart = MetaHelper.GetSeekPosition(ti, oidStart); long positionEnd = MetaHelper.GetSeekPosition(ti, oidEnd); int recordLength = ti.Header.lengthOfRecord; if (preloadedBytes == null || preloadedBytes.Length != (recordLength + (positionEnd - positionStart))) { preloadedBytes = new byte[recordLength + (positionEnd - positionStart)]; } await file.ReadAsync(positionStart, preloadedBytes).ConfigureAwait(false); }
public async Task <int> ReadOidOfComplexAsync(SqoTypeInfo ti, int oid, FieldSqoInfo fi, RawdataSerializer rawSerializer) { long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; if (fi == null) { throw new SiaqodbException("Field not exists in the Type Definition, if you use a Property you have to use UseVariable Attribute"); } byte[] b = new byte[fi.Header.Length]; await file.ReadAsync((long)(position + (long)fi.Header.PositionInRecord), b).ConfigureAwait(false); byte[] oidOfComplexObjBuff = GetFieldBytes(b, 0, 4); int oidOfComplexObj = ByteConverter.ByteArrayToInt(oidOfComplexObjBuff); return(oidOfComplexObj); }
internal void ReadObjectRow(Sqo.Utilities.ObjectRow row, SqoTypeInfo ti, int oid, RawdataSerializer rawSerializer) { lock (file) { // long position = (long)ti.Header.headerSize + (long)((long)(oid - 1) * (long)ti.Header.lengthOfRecord); long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; byte[] b = new byte[recordLength]; if (oidStart == 0 && oidEnd == 0) { file.Read(position, b); } else { int recordPosition = (oid - oidStart) * recordLength; Array.Copy(preloadedBytes, recordPosition, b, 0, b.Length); } int fieldPosition = 0; byte[] oidBuff = GetFieldBytes(b, fieldPosition, 4); int oidFromFile = ByteConverter.ByteArrayToInt(oidBuff); foreach (FieldSqoInfo ai in ti.Fields) { byte[] field = GetFieldBytes(b, ai.Header.PositionInRecord, ai.Header.Length); if (typeof(IList).IsAssignableFrom(ai.AttributeType) || ai.IsText || ai.AttributeTypeId == MetaExtractor.complexID || ai.AttributeTypeId == MetaExtractor.dictionaryID || ai.AttributeTypeId == MetaExtractor.documentID) { row[ai.Name] = field; } else { try { row[ai.Name] = ByteConverter.DeserializeValueType(ai.AttributeType, field, true, ti.Header.version); } catch (Exception ex) { //SiaqodbConfigurator.LogMessage("Field's" + ai.Name + " value of Type " + ti.TypeName + "cannot be loaded,will be set to default.", VerboseLevel.Info); //row[ai.Name] = MetaHelper.GetDefault(ai.AttributeType); throw ex; } } } } }
internal async Task <ATuple <int, int> > GetArrayMetaOfFieldAsync(SqoTypeInfo ti, int oid, FieldSqoInfo fi) { long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; if (fi == null) { throw new SiaqodbException("Field not exists in the Type Definition, if you use a Property you have to use UseVariable Attribute"); } byte[] bytes = new byte[fi.Header.Length]; await file.ReadAsync((long)(position + (long)fi.Header.PositionInRecord), bytes).ConfigureAwait(false); byte[] oidBytes = new byte[4]; Array.Copy(bytes, 1, oidBytes, 0, 4); int rawInfoOID = (int)ByteConverter.DeserializeValueType(typeof(int), oidBytes, ti.Header.version); byte[] nrElemeBytes = new byte[4]; Array.Copy(bytes, MetaExtractor.ExtraSizeForArray - 4, nrElemeBytes, 0, 4); int nrElem = (int)ByteConverter.DeserializeValueType(typeof(int), nrElemeBytes, ti.Header.version); return(new ATuple <int, int>(rawInfoOID, nrElem)); }
internal async Task <DictionaryInfo> GetDictInfoOfFieldAsync(SqoTypeInfo ti, int oid, FieldSqoInfo fi) { long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; if (fi == null) { throw new SiaqodbException("Field not exists in the Type Definition, if you use a Property you have to use UseVariable Attribute"); } byte[] bytes = new byte[fi.Header.Length]; await file.ReadAsync((long)(position + (long)fi.Header.PositionInRecord), bytes).ConfigureAwait(false); byte[] oidBytes = new byte[4]; Array.Copy(bytes, 1, oidBytes, 0, 4); int rawInfoOID = (int)ByteConverter.DeserializeValueType(typeof(int), oidBytes, ti.Header.version); byte[] nrElemeBytes = new byte[4]; Array.Copy(bytes, oidBytes.Length + 1, nrElemeBytes, 0, 4); int nrElem = (int)ByteConverter.DeserializeValueType(typeof(int), nrElemeBytes, ti.Header.version); byte[] keyTypeIdBytes = new byte[4]; Array.Copy(bytes, oidBytes.Length + nrElemeBytes.Length + 1, keyTypeIdBytes, 0, 4); int keyTypeId = (int)ByteConverter.DeserializeValueType(typeof(int), keyTypeIdBytes, ti.Header.version); byte[] valueTypeIdBytes = new byte[4]; Array.Copy(bytes, oidBytes.Length + nrElemeBytes.Length + keyTypeIdBytes.Length + 1, valueTypeIdBytes, 0, 4); int valueTypeId = (int)ByteConverter.DeserializeValueType(typeof(int), valueTypeIdBytes, ti.Header.version); DictionaryInfo di = new DictionaryInfo(); di.RawOID = rawInfoOID; di.NrElements = nrElem; di.KeyTypeId = keyTypeId; di.ValueTypeId = valueTypeId; return(di); }
public async Task <object> ReadFieldValueAsync(SqoTypeInfo ti, int oid, FieldSqoInfo fi, RawdataSerializer rawSerializer) { long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; if (fi == null) { throw new SiaqodbException("Field not exists in the Type Definition, if you use a Property you have to use UseVariable Attribute"); } byte[] b = new byte[fi.Header.Length]; if (oidEnd == 0 && oidStart == 0) { await file.ReadAsync((long)(position + (long)fi.Header.PositionInRecord), b).ConfigureAwait(false); } else { int fieldPosition = (oid - oidStart) * recordLength + fi.Header.PositionInRecord; Array.Copy(preloadedBytes, fieldPosition, b, 0, b.Length); } IByteTransformer byteTransformer = ByteTransformerFactory.GetByteTransformer(this, rawSerializer, fi, ti); try { return(await byteTransformer.GetObjectAsync(b).ConfigureAwait(false)); } catch (Exception ex) { if (ti.Type != null && ti.Type.IsGenericType() && ti.Type.GetGenericTypeDefinition() == typeof(Indexes.BTreeNode <>)) { throw new IndexCorruptedException(); } //SiaqodbConfigurator.LogMessage("Field's" + fi.Name + " value of Type " + ti.TypeName + "cannot be loaded,will be set to default.", VerboseLevel.Info); // return MetaHelper.GetDefault(fi.AttributeType); throw ex; } }
internal async Task <bool> IsObjectDeletedAsync(int oid, SqoTypeInfo ti) { // long position = (long)ti.Header.headerSize + (long)((long)(oid - 1) * (long)ti.Header.lengthOfRecord); long position = MetaHelper.GetSeekPosition(ti, oid); byte[] bytes = new byte[4];//oid size-int size if (oidStart == 0 && oidEnd == 0) { await file.ReadAsync(position, bytes).ConfigureAwait(false); } else { int oidPosition = (oid - oidStart) * ti.Header.lengthOfRecord; Array.Copy(preloadedBytes, oidPosition, bytes, 0, bytes.Length); } int oidFromFile = ByteConverter.ByteArrayToInt(bytes); if (oid == -oidFromFile) { return(true); } return(false); }
public void ReadObject(object obj, SqoTypeInfo ti, int oid, RawdataSerializer rawSerializer) { //long position = (long)ti.Header.headerSize + (long)((long)(oid - 1) * (long)ti.Header.lengthOfRecord); long position = MetaHelper.GetSeekPosition(ti, oid); int recordLength = ti.Header.lengthOfRecord; byte[] b = new byte[recordLength]; if (oidEnd == 0 && oidStart == 0) { file.Read(position, b); } else { int recordPosition = (oid - oidStart) * recordLength; Array.Copy(preloadedBytes, recordPosition, b, 0, b.Length); } int fieldPosition = 0; byte[] oidBuff = GetFieldBytes(b, fieldPosition, 4); int oidFromFile = ByteConverter.ByteArrayToInt(oidBuff); //eventual make comparison foreach (FieldSqoInfo ai in ti.Fields) { byte[] field = GetFieldBytes(b, ai.Header.PositionInRecord, ai.Header.Length); IByteTransformer byteTransformer = ByteTransformerFactory.GetByteTransformer(this, rawSerializer, ai, ti); object fieldVal = null; try { fieldVal = byteTransformer.GetObject(field); } catch (Exception ex) { if (ti.Type != null && ti.Type.IsGenericType() && ti.Type.GetGenericTypeDefinition() == typeof(Indexes.BTreeNode <>)) { throw new IndexCorruptedException(); } // SiaqodbConfigurator.LogMessage("Field's" + ai.Name + " value of Type " + ti.TypeName + "cannot be loaded, will be set to default.", VerboseLevel.Info); //fieldVal = MetaHelper.GetDefault(ai.AttributeType); throw ex; } if (ai.AttributeTypeId == MetaExtractor.documentID) { DocumentInfo dinfo = fieldVal as DocumentInfo; if (dinfo != null) { if (SiaqodbConfigurator.DocumentSerializer == null) { throw new SiaqodbException("Document serializer is not set, use SiaqodbConfigurator.SetDocumentSerializer method to set it"); } fieldVal = SiaqodbConfigurator.DocumentSerializer.Deserialize(ai.AttributeType, dinfo.Document); //put in weak cache to be able to update the document DocumentEventArgs args = new DocumentEventArgs(); args.ParentObject = obj; args.DocumentInfoOID = dinfo.OID; args.FieldName = ai.Name; args.TypeInfo = ti; this.OnNeedCacheDocument(args); } } #if SILVERLIGHT try { //dobj.SetValue(ai.FInfo, ByteConverter.DeserializeValueType(ai.FInfo.FieldType, field)); MetaHelper.CallSetValue(ai.FInfo, fieldVal, obj, ti.Type); } catch (Exception ex) { throw new SiaqodbException("Override GetValue and SetValue methods of SqoDataObject-Silverlight limitation to private fields"); } #else ai.FInfo.SetValue(obj, fieldVal); #endif } }
internal async Task SaveObjectTableAsync(SqoTypeInfo actualTypeinfo, SqoTypeInfo oldSqoTypeInfo, ObjectTable table, RawdataSerializer rawSerializer) { Dictionary <FieldSqoInfo, FieldSqoInfo> joinedFields = JoinFieldsSqoInfo(actualTypeinfo, oldSqoTypeInfo); foreach (ObjectRow row in table.Rows) { int oid = (int)row["OID"]; if (oid < 0)//deleted { await this.MarkObjectAsDeleteAsync(-oid, actualTypeinfo).ConfigureAwait(false); continue; } byte[] oidBuff = ByteConverter.IntToByteArray(oid); byte[] buffer = new byte[actualTypeinfo.Header.lengthOfRecord]; int curentIndex = 0; Array.Copy(oidBuff, 0, buffer, curentIndex, oidBuff.Length); curentIndex += oidBuff.Length; foreach (FieldSqoInfo ai in actualTypeinfo.Fields) { byte[] by = null; object fieldVal = null; bool existed = false; if (table.Columns.ContainsKey(ai.Name)) { fieldVal = row[ai.Name]; existed = true; } else { if (ai.AttributeTypeId == MetaExtractor.complexID || ai.AttributeTypeId == MetaExtractor.documentID) { fieldVal = null; } else if (typeof(string) == ai.AttributeType) { fieldVal = string.Empty; } else if (ai.AttributeType.IsArray) { fieldVal = Array.CreateInstance(ai.AttributeType.GetElementType(), 0); } else { fieldVal = Activator.CreateInstance(ai.AttributeType); } } if (joinedFields[ai] != null) //existed in old Type { if (ai.AttributeTypeId != joinedFields[ai].AttributeTypeId) { if (typeof(IList).IsAssignableFrom(ai.AttributeType) || ai.AttributeTypeId == MetaExtractor.dictionaryID || joinedFields[ai].AttributeTypeId == MetaExtractor.dictionaryID) { throw new TypeChangedException("Change array or dictionary type it is not supported"); } else { fieldVal = Convertor.ChangeType(fieldVal, ai.AttributeType); } } } if (ai.AttributeTypeId == MetaExtractor.complexID || ai.AttributeTypeId == MetaExtractor.documentID) { if (existed) { by = (byte[])fieldVal; } else { by = await this.GetComplexObjectBytesAsync(fieldVal).ConfigureAwait(false); } } else if (typeof(IList).IsAssignableFrom(ai.AttributeType))//array { if (existed) { by = (byte[])fieldVal; } else { by = await rawSerializer.SerializeArrayAsync(fieldVal, ai.AttributeType, ai.Header.Length, ai.Header.RealLength, actualTypeinfo.Header.version, null, this, ai.IsText).ConfigureAwait(false); } } else if (ai.IsText) { if (existed) { FieldSqoInfo oldAi = joinedFields[ai]; if (oldAi != null && oldAi.IsText) { by = (byte[])fieldVal; } else { by = await rawSerializer.SerializeArrayAsync(fieldVal, ai.AttributeType, ai.Header.Length, ai.Header.RealLength, actualTypeinfo.Header.version, null, this, ai.IsText).ConfigureAwait(false); } } else { by = await rawSerializer.SerializeArrayAsync(fieldVal, ai.AttributeType, ai.Header.Length, ai.Header.RealLength, actualTypeinfo.Header.version, null, this, ai.IsText).ConfigureAwait(false); } } else if (ai.AttributeTypeId == MetaExtractor.dictionaryID) { if (existed) { by = (byte[])fieldVal; } else { IByteTransformer byteTransformer = ByteTransformerFactory.GetByteTransformer(this, rawSerializer, ai, actualTypeinfo, 0); by = await byteTransformer.GetBytesAsync(fieldVal).ConfigureAwait(false); } } else { by = ByteConverter.SerializeValueType(fieldVal, ai.AttributeType, ai.Header.Length, ai.Header.RealLength, actualTypeinfo.Header.version); } Array.Copy(by, 0, buffer, ai.Header.PositionInRecord, ai.Header.Length); //curentIndex += by.Length; } long position = MetaHelper.GetSeekPosition(actualTypeinfo, oid); await file.WriteAsync(position, buffer).ConfigureAwait(false); } }