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); }
/// <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); }