Beispiel #1
0
        protected override Record GetValue(DataStructure schema, FieldTypeFactory fieldTypeFactory, long currentPosition, byte[] bytes)
        {
            Record record = new Record()
            {
                Fields = new RecordField[schema.Fields.Count], Location = currentPosition
            };
            MemoryStream stream = new MemoryStream(bytes);

            for (int i = 0; i < schema.Fields.Count; i++)
            {
                var field = schema.Fields[i];

                IDataFieldType fieldType  = fieldTypeFactory.GetFieldType(field.DataType);
                object         fieldValue = fieldType.ReadFromStream(stream);
                record.Fields[i] = new RecordField()
                {
                    DataType = field.DataType, Value = fieldValue
                };
            }
            return(record);
        }
Beispiel #2
0
        /// <summary>
        /// Inserts the record returns the location at which it was inserted.
        /// </summary>
        /// <param name="fields"></param>
        /// <returns></returns>
        public long Insert(params object[] fields)
        {
            _stream.SeekToRecord(_schema, BlockHeader.BlockSequence, BlockHeader.RecordCount);

            IDataFieldType[] fieldTypes = new IDataFieldType[fields.Length];

            for (int i = 0; i < fields.Length; i++)
            {
                var fieldDefinition = _schema.Fields[i];

                fieldTypes[i] = _fieldTypeFactory.GetFieldType(fieldDefinition.DataType);
            }

            for (int i = 0; i < fields.Length; i++)
            {
                var field = fields[i];
                if (!fieldTypes[i].IsValid(field))
                {
                    //Maybe i should collect all the failures and return them at once.
                    throw new Exception();
                }
            }

            long recordLocation = _stream.Position;

            //Only if there are no failures, we start writing to the file
            for (int i = 0; i < fields.Length; i++)
            {
                var field = fields[i];
                fieldTypes[i].WriteToStream(_stream, field);
            }


            BlockHeader.FreeBytes -= _schema.GetRecordSize();
            BlockHeader.RecordCount++;
            _stream.Flush();
            this.WriteBlockHeader();

            return(recordLocation);
        }