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;
                        }
                    }
                }
            }
        }
Exemple #2
0
        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();
        }
Exemple #3
0
        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));
        }