public void InsertRecord(params object[] fields) { long insertLocation; //Find available spot to place record.... if (_fileHeader.BlocksInFile == 0) { var block = RecordBlock.CreateNew(_stream, _schema, 0); _fileHeader.BlocksInFile++; WriteFileHeader(); insertLocation = block.Insert(fields); } else { var lastBlock = RecordBlock.LoadFromStream(_stream, _schema, _fileHeader.BlocksInFile - 1); if (lastBlock.BlockHeader.FreeBytes > _schema.GetRecordSize()) { insertLocation = lastBlock.Insert(fields); } else { var newBlock = RecordBlock.CreateNew(_stream, _schema, _fileHeader.BlocksInFile); insertLocation = newBlock.Insert(fields); _fileHeader.BlocksInFile++; WriteFileHeader(); } } _indexManager.AddRecord(fields, insertLocation, _schema); }
public DataStore(string fileLocation, string recordName) { _fieldTypeFactory = new Creation.FieldTypeFactory(); _indexManager = new IndexManager(); string fileName = $"{fileLocation}/data_{recordName}.rbs"; string schemaFileName = $"{fileLocation}/schema_{recordName}.rbs"; if (File.Exists(fileName)) { _stream = File.Open(fileName, FileMode.Open); _fileHeader = this.ReadFileHeader(); } else { _stream = File.Create(fileName); _fileHeader = new FileHeader() { BlocksInFile = 0 }; } if (File.Exists(schemaFileName)) { _schemaStream = File.Open(schemaFileName, FileMode.Open); this.ReadSchema(); } else { _schemaStream = File.Create(schemaFileName); _schema = new DataStructure() { Fields = new List <FieldDefinition>(), Indexes = new List <IndexDefinition>() }; } foreach (IndexDefinition indexDefinition in _schema.Indexes) { _indexManager.RegisterIndex(_schema.Fields[indexDefinition.FieldId].DataType, indexDefinition); } //If there are any in-memory indexes, we will have to build the indexes from scratch by reading in the entire table. if (_schema.Indexes.Exists(i => i.IndexType == Indexing.Enums.IndexType.InMemoryIndex)) { foreach (Record record in this.ReadAllRecords()) { _indexManager.AddRecord(record.Fields.Select(f => f.Value).ToArray(), record.Location, _schema); } } }