Exemple #1
0
        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);
        }
Exemple #2
0
        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);
                }
            }
        }