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; } } } } }
private static void ReadMemberValue(ObjectRow currentRow, System.Xml.XmlReader reader, int index, Dictionary <int, Type> members) { if (!reader.IsEmptyElement) { if (members[index] == typeof(char)) { string s = reader.ReadElementContentAsString(); if (!string.IsNullOrEmpty(s)) { currentRow[index] = s[0]; } } else if (members[index] == typeof(Guid)) { string s = reader.ReadElementContentAsString(); currentRow[index] = new Guid(s); } else if (members[index].IsEnum()) { string s = reader.ReadElementContentAsString(); Type enumType = Enum.GetUnderlyingType(members[index]); object realObject = Convertor.ChangeType(s, enumType); currentRow[index] = Enum.ToObject(members[index], realObject); } else { currentRow[index] = reader.ReadElementContentAs(members[index], null); } } else { reader.ReadElementContentAsString(); } //reader.MoveToElement(); }
public static IObjectList <T> ImportFromXML <T>(System.Xml.XmlReader reader, Siaqodb siaqodb) { ObjectTable obTable = new ObjectTable(); reader.Read(); reader.ReadStartElement("SiaqodbObjects"); SqoTypeInfo ti = siaqodb.GetSqoTypeInfo <T>(); bool colFinish = false; ObjectRow currentRow = null; int index = 0; Dictionary <int, Type> members = new Dictionary <int, Type>(); while (reader.Read()) { if (reader.IsStartElement() && reader.Name == "objects") { colFinish = true; } if (reader.IsStartElement() && !colFinish) { reader.MoveToFirstAttribute(); //string type = reader.Value; Type t = Type.GetType(reader.Value); reader.MoveToElement(); reader.ReadStartElement(); string columnName = reader.ReadContentAsString(); if (columnName == "OID") { throw new SiaqodbException("OID is set only internally, cannot be imported"); } obTable.Columns.Add(columnName, index); if (t.IsGenericType()) { Type genericTypeDef = t.GetGenericTypeDefinition(); if (genericTypeDef == typeof(Nullable <>)) { t = t.GetGenericArguments()[0]; } } members.Add(index, t); index++; } if (reader.IsStartElement() && reader.Name == "object") { currentRow = obTable.NewRow(); obTable.Rows.Add(currentRow); index = 0; } if (reader.IsStartElement() && reader.Name == "memberValue") { ReadMemberValue(currentRow, reader, index, members); index++; while (reader.Name == "memberValue") { ReadMemberValue(currentRow, reader, index, members); index++; } } } return(ObjectTableHelper.CreateObjectsFromTable <T>(obTable, ti)); }