private void ReadAssociatedResult(BinaryReader reader)
        {
            var zero = reader.ReadInt16EndianAware();

            if (zero != 0)
            {
                throw new InvalidOperationException("Unsupported record format");
            }

            ORecordType recordType = (ORecordType)reader.ReadByte();

            if (recordType != ORecordType.Document)
            {
                throw new InvalidOperationException("Unsupported record type");
            }

            short clusterId       = reader.ReadInt16EndianAware();
            long  clusterPosition = reader.ReadInt64EndianAware();
            int   recordVersion   = reader.ReadInt32EndianAware();

            var recordLength = reader.ReadInt32EndianAware();
            var record       = reader.ReadBytes(recordLength);

            //var document = RecordCSVSerializer.Deserialize(new ORID(clusterId, clusterPosition), recordVersion, ORecordType.Document, 0, record);
            var document = Serializer
                           .Deserialize(record, new ODocument {
                ORID = new ORID(clusterId, clusterPosition), OVersion = recordVersion, OType = ORecordType.Document
            });

            _database.ClientCache[document.ORID] = document;
        }
        internal static ODocument Deserialize(ORID orid, int version, ORecordType type, short classId, byte[] rawRecord)
        {
            ODocument document = new ODocument();

            document.ORID     = orid;
            document.OVersion = version;
            document.OType    = type;
            document.OClassId = classId;

            string recordString = BinarySerializer.ToString(rawRecord).Trim();

            int atIndex    = recordString.IndexOf('@');
            int colonIndex = recordString.IndexOf(':');
            int index      = 0;

            // parse class name
            if ((atIndex != -1) && (atIndex < colonIndex))
            {
                document.OClassName = recordString.Substring(0, atIndex);
                index = atIndex + 1;
            }

            // start document parsing with first field name
            do
            {
                index = ParseFieldName(index, recordString, document);
            }while (index < recordString.Length);

            return(document);
        }
        internal static ODocument Deserialize(ORID orid, int version, ORecordType type, short classId, byte[] rawRecord)
        {
            ODocument document = new ODocument();
            document.ORID = orid;
            document.OVersion = version;
            document.OType = type;
            document.OClassId = classId;

            string recordString = BinarySerializer.ToString(rawRecord).Trim();

            int atIndex = recordString.IndexOf('@');
            int colonIndex = recordString.IndexOf(':');
            int index = 0;

            // parse class name
            if ((atIndex != -1) && (atIndex < colonIndex))
            {
                document.OClassName = recordString.Substring(0, atIndex);
                index = atIndex + 1;
            }

            // start document parsing with first field name
            do
            {
                index = ParseFieldName(index, recordString, document);
            }
            while (index < recordString.Length);

            return document;
        }
Exemple #4
0
        private ODocument ParseDocument(BinaryReader reader)
        {
            ODocument document = null;

            short classId = reader.ReadInt16EndianAware();

            if (classId == -2) // NULL
            {
            }
            else if (classId == -3) // record id
            {
                ORID orid = new ORID();
                orid.ClusterId       = reader.ReadInt16EndianAware();
                orid.ClusterPosition = reader.ReadInt64EndianAware();

                document          = new ODocument();
                document.ORID     = orid;
                document.OClassId = classId;
            }
            else
            {
                ORecordType type = (ORecordType)reader.ReadByte();

                ORID orid = new ORID();
                orid.ClusterId       = reader.ReadInt16EndianAware();
                orid.ClusterPosition = reader.ReadInt64EndianAware();
                int    version      = reader.ReadInt32EndianAware();
                int    recordLength = reader.ReadInt32EndianAware();
                byte[] rawRecord    = reader.ReadBytes(recordLength);
                document = RecordSerializer.Deserialize(orid, version, type, classId, rawRecord);
            }

            return(document);
        }
        internal static ORecord ToRecord(ORID orid, int version, ORecordType type, short classId, byte[] rawRecord)
        {
            ORecord record = new ORecord(orid, version, type, classId);

            string recordString = BinarySerializer.ToString(rawRecord).Trim();

            int atIndex = recordString.IndexOf('@');
            int colonIndex = recordString.IndexOf(':');
            int index = 0;

            // parse class name
            if ((atIndex != -1) && (atIndex < colonIndex))
            {
                record.ClassName = recordString.Substring(0, atIndex);
                index = atIndex + 1;
            }

            // start document parsing with first field name
            do
            {
                index = ParseFieldName(index, recordString, record.Document);
            }
            while (index < recordString.Length);

            return record;
        }
        internal static ODocument Deserialize(ORID orid, int version, ORecordType type, short classId, byte[] rawRecord)
        {
            ODocument document = new ODocument();
            document.ORID = orid;
            document.OVersion = version;
            document.OType = type;
            document.OClassId = classId;

            string recordString = BinarySerializer.ToString(rawRecord).Trim();

            return Deserialize(recordString, document);
        }
        internal ODocument Deserialize(ORID orid, int version, ORecordType type, short classId, byte[] rawRecord)
        {
            ODocument document = new ODocument();

            document.ORID     = orid;
            document.OVersion = version;
            document.OType    = type;
            document.OClassId = classId;

            string recordString = BinarySerializer.ToString(rawRecord).Trim();

            return(Deserialize(recordString, document));
        }
        private ODocument ParseDocument(ref int offset, byte[] data)
        {
            ODocument document = null;

            short classId = BinarySerializer.ToShort(data.Skip(offset).Take(2).ToArray());

            offset += 2;

            if (classId == -2) // NULL
            {
            }
            else if (classId == -3) // record id
            {
                ORID orid = new ORID();
                orid.ClusterId = BinarySerializer.ToShort(data.Skip(offset).Take(2).ToArray());
                offset        += 2;

                orid.ClusterPosition = BinarySerializer.ToLong(data.Skip(offset).Take(8).ToArray());
                offset += 8;

                document          = new ODocument();
                document.ORID     = orid;
                document.OClassId = classId;
            }
            else
            {
                ORecordType type = (ORecordType)BinarySerializer.ToByte(data.Skip(offset).Take(1).ToArray());
                offset += 1;

                ORID orid = new ORID();
                orid.ClusterId = BinarySerializer.ToShort(data.Skip(offset).Take(2).ToArray());
                offset        += 2;

                orid.ClusterPosition = BinarySerializer.ToLong(data.Skip(offset).Take(8).ToArray());
                offset += 8;

                int version = BinarySerializer.ToInt(data.Skip(offset).Take(4).ToArray());
                offset += 4;

                int recordLength = BinarySerializer.ToInt(data.Skip(offset).Take(4).ToArray());
                offset += 4;

                byte[] rawRecord = data.Skip(offset).Take(recordLength).ToArray();
                offset += recordLength;

                document = RecordSerializer.Deserialize(orid, version, type, classId, rawRecord);
            }

            return(document);
        }
Exemple #9
0
        private T ParseDocument(BinaryReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException($"{nameof(reader)} cannot be null.");
            }

            T document;

            short classId = reader.ReadInt16EndianAware();

            if (classId == -2) // NULL
            {
                document = null;
            }
            else if (classId == -3) // record id
            {
                ORID orid = new ORID();
                orid.ClusterId       = reader.ReadInt16EndianAware();
                orid.ClusterPosition = reader.ReadInt64EndianAware();

                document          = Activator.CreateInstance <T>();
                document.ORID     = orid;
                document.OClassId = classId;
            }
            else
            {
                ORecordType type = (ORecordType)reader.ReadByte();

                ORID orid = new ORID();
                orid.ClusterId       = reader.ReadInt16EndianAware();
                orid.ClusterPosition = reader.ReadInt64EndianAware();
                int    version      = reader.ReadInt32EndianAware();
                int    recordLength = reader.ReadInt32EndianAware();
                byte[] rawRecord    = reader.ReadBytes(recordLength);

                document          = _serializer.Deserialize <T>(rawRecord);
                document.ORID     = orid;
                document.OVersion = version;
                document.OClassId = classId;
            }

            return(document);
        }