internal bool SaveFieldValue(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 = byteTransformer.GetBytes(value); file.Write((long)(position + (long)ai.Header.PositionInRecord), by); return(true); }
internal byte[] GetObjectBytes(ObjectInfo oi, RawdataSerializer rawSerializer) { byte[] oidBuff = ByteConverter.IntToByteArray(oi.Oid); byte[] buffer = new byte[oi.SqoTypeInfo.Header.lengthOfRecord]; int curentIndex = 0; Array.Copy(oidBuff, 0, buffer, curentIndex, oidBuff.Length); curentIndex += oidBuff.Length; bool oidToParentSet = false; foreach (FieldSqoInfo ai in oi.AtInfo.Keys) { byte[] by = null; if (ai.AttributeTypeId == MetaExtractor.complexID || ai.AttributeTypeId == (MetaExtractor.ArrayTypeIDExtra + MetaExtractor.complexID) || ai.AttributeTypeId == MetaExtractor.documentID) { //to be able to cache for circular reference, we need to asign OID to it if (!oidToParentSet) { //just set OID to parentObject, do not save anything ComplexObjectEventArgs args = new ComplexObjectEventArgs(true, oi); this.OnNeedSaveComplexObject(args); oidToParentSet = true; } } int parentOID = -1; if (!oi.Inserted) { parentOID = oi.Oid; } IByteTransformer byteTransformer = ByteTransformerFactory.GetByteTransformer(this, rawSerializer, ai, oi.SqoTypeInfo, parentOID); by = byteTransformer.GetBytes(oi.AtInfo[ai]); Array.Copy(by, 0, buffer, curentIndex, by.Length); curentIndex += by.Length; } return(buffer); }
internal void SaveObjectTable(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 { this.MarkObjectAsDelete(-oid, actualTypeinfo); 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 = this.GetComplexObjectBytes(fieldVal); } } else if (typeof(IList).IsAssignableFrom(ai.AttributeType))//array { if (existed) { by = (byte[])fieldVal; } else { by = rawSerializer.SerializeArray(fieldVal, ai.AttributeType, ai.Header.Length, ai.Header.RealLength, actualTypeinfo.Header.version, null, this, ai.IsText); } } else if (ai.IsText) { if (existed) { FieldSqoInfo oldAi = joinedFields[ai]; if (oldAi != null && oldAi.IsText) { by = (byte[])fieldVal; } else { by = rawSerializer.SerializeArray(fieldVal, ai.AttributeType, ai.Header.Length, ai.Header.RealLength, actualTypeinfo.Header.version, null, this, ai.IsText); } } else { by = rawSerializer.SerializeArray(fieldVal, ai.AttributeType, ai.Header.Length, ai.Header.RealLength, actualTypeinfo.Header.version, null, this, ai.IsText); } } else if (ai.AttributeTypeId == MetaExtractor.dictionaryID) { if (existed) { by = (byte[])fieldVal; } else { IByteTransformer byteTransformer = ByteTransformerFactory.GetByteTransformer(this, rawSerializer, ai, actualTypeinfo, 0); by = byteTransformer.GetBytes(fieldVal); } } 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); file.Write(position, buffer); } }