示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
            }
        }
示例#4
0
        internal void SaveOID(int oid, SqoTypeInfo ti)
        {
            long position = MetaHelper.GetSeekPosition(ti, oid);

            byte[] oidBuff = ByteConverter.IntToByteArray(oid);
            file.Write(position, oidBuff);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#9
0
        internal void RollbackDeleteObject(int oid, SqoTypeInfo ti)
        {
            long position = MetaHelper.GetSeekPosition(ti, oid);

            byte[] oidBuff = ByteConverter.IntToByteArray(oid);
            lock (file)
            {
                file.Write(position, oidBuff);
            }
        }
示例#10
0
        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);
        }
示例#11
0
        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);
            }
        }
示例#12
0
        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);
        }
示例#13
0
        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);
            }
        }
示例#14
0
        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);
        }
示例#15
0
        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);
        }
示例#16
0
        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));
        }
示例#17
0
        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));
        }
示例#18
0
        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));
        }
示例#19
0
        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);
        }
示例#20
0
        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);
        }
示例#21
0
        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);
        }
示例#22
0
        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);
        }
示例#23
0
        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;
                        }
                    }
                }
            }
        }
示例#24
0
        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));
        }
示例#25
0
        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);
        }
示例#26
0
        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;
            }
        }
示例#27
0
        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);
        }
示例#28
0
        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
            }
        }
示例#29
0
        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);
            }
        }