Ejemplo n.º 1
0
        public void Serialize(int id, T row)
        {
            BitWriter bitWriter = new BitWriter(m_writer.RecordSize);

            int indexFieldOffSet = 0;

            for (int i = 0; i < m_writer.FieldCache.Length; i++)
            {
                FieldCache <T> info = m_writer.FieldCache[i];

                if (info.IndexMapField && m_writer.Flags.HasFlagExt(DB2Flags.Index))
                {
                    indexFieldOffSet++;
                    continue;
                }

                int fieldIndex = i - indexFieldOffSet;

                if (info.IsArray)
                {
                    if (arrayWriters.TryGetValue(info.Field.FieldType, out var writer))
                    {
                        writer(bitWriter, m_writer, m_fieldMeta[fieldIndex], (Array)info.Getter(row));
                    }
                    else
                    {
                        throw new Exception("Unhandled array type: " + typeof(T).Name);
                    }
                }
                else
                {
                    if (simpleWriters.TryGetValue(info.Field.FieldType, out var writer))
                    {
                        writer(bitWriter, m_writer, m_fieldMeta[fieldIndex], info.Getter(row));
                    }
                    else
                    {
                        throw new Exception("Unhandled field type: " + typeof(T).Name);
                    }
                }
            }

            // pad to record size
            if (!m_writer.Flags.HasFlagExt(DB2Flags.Sparse))
            {
                bitWriter.Resize(m_writer.RecordSize);
            }
            else
            {
                bitWriter.ResizeToMultiple(4);
            }

            Records[id] = bitWriter;
        }
Ejemplo n.º 2
0
        public void Serialize(int id, T row)
        {
            BitWriter bitWriter = new BitWriter(m_writer.RecordSize);

            StringLengths[id] = 0;

            for (int i = 0; i < m_writer.FieldCache.Length; i++)
            {
                FieldCache <T> info = m_writer.FieldCache[i];

                if (info.IsArray)
                {
                    if (arrayWriters.TryGetValue(info.Field.FieldType, out var writer))
                    {
                        Array array = (Array)info.Getter(row);
                        writer(bitWriter, m_writer, array);

                        if (array is string[] strings)
                        {
                            StringLengths[id] = (ushort)strings.Sum(x => x.Length == 0 ? 0 : x.Length + 1);
                        }
                    }
                    else
                    {
                        throw new Exception("Unhandled array type: " + typeof(T).Name);
                    }
                }
                else
                {
                    if (simpleWriters.TryGetValue(info.Field.FieldType, out var writer))
                    {
                        object value = info.Getter(row);
                        writer(bitWriter, m_writer, value);

                        if (value is string strings)
                        {
                            StringLengths[id] = (ushort)(strings.Length == 0 ? 0 : strings.Length + 1);
                        }
                    }
                    else
                    {
                        throw new Exception("Unhandled field type: " + typeof(T).Name);
                    }
                }
            }

            // pad to record size
            bitWriter.Resize(m_writer.RecordSize);
            Records[id] = bitWriter;
        }
Ejemplo n.º 3
0
        public void Serialize(int id, T row)
        {
            BitWriter bitWriter = new BitWriter(m_writer.RecordSize);

            for (int i = 0; i < m_writer.FieldCache.Length; i++)
            {
                FieldCache <T> info = m_writer.FieldCache[i];

                if (info.IsArray)
                {
                    if (arrayWriters.TryGetValue(info.Field.FieldType, out var writer))
                    {
                        writer(bitWriter, m_writer, (Array)info.Getter(row));
                    }
                    else
                    {
                        throw new Exception("Unhandled array type: " + typeof(T).Name);
                    }
                }
                else
                {
                    if (simpleWriters.TryGetValue(info.Field.FieldType, out var writer))
                    {
                        writer(bitWriter, m_writer, info.Getter(row));
                    }
                    else
                    {
                        throw new Exception("Unhandled field type: " + typeof(T).Name);
                    }
                }
            }

            // pad to record size
            bitWriter.Resize(m_writer.RecordSize);
            Records[id] = bitWriter;
        }
Ejemplo n.º 4
0
        public void Serialize(int id, T row)
        {
            BitWriter bitWriter = new BitWriter(m_writer.RecordSize);

            int indexFieldOffSet = 0;

            for (int i = 0; i < m_writer.FieldCache.Length; i++)
            {
                FieldCache <T> info = m_writer.FieldCache[i];

                if (i == m_writer.IdFieldIndex && m_writer.Flags.HasFlagExt(DB2Flags.Index))
                {
                    indexFieldOffSet++;
                    continue;
                }

                int fieldIndex = i - indexFieldOffSet;

                // reference data field
                if (fieldIndex >= m_writer.Meta.Length)
                {
                    m_writer.ReferenceData.Add((int)Convert.ChangeType(info.Getter(row), typeof(int)));
                    continue;
                }

                if (info.IsArray)
                {
                    if (arrayWriters.TryGetValue(info.Field.FieldType, out var writer))
                    {
                        writer(bitWriter, m_writer, m_fieldMeta[fieldIndex], m_columnMeta[fieldIndex], m_palletData[fieldIndex], m_commonData[fieldIndex], (Array)info.Getter(row));
                    }
                    else
                    {
                        throw new Exception("Unhandled array type: " + typeof(T).Name);
                    }
                }
                else
                {
                    if (simpleWriters.TryGetValue(info.Field.FieldType, out var writer))
                    {
                        writer(id, bitWriter, m_writer, m_fieldMeta[fieldIndex], m_columnMeta[fieldIndex], m_palletData[fieldIndex], m_commonData[fieldIndex], info.Getter(row));
                    }
                    else
                    {
                        throw new Exception("Unhandled field type: " + typeof(T).Name);
                    }
                }
            }

            // pad to record size
            if (!m_writer.Flags.HasFlagExt(DB2Flags.Sparse))
            {
                bitWriter.Resize(m_writer.RecordSize);
            }
            else
            {
                bitWriter.ResizeToMultiple(4);
            }

            Records[id] = bitWriter;
        }