Пример #1
0
        public TableManager(
            bool isNew,
            Transaction transaction,
            string tableCatalogName = "tblname",
            string fieldCatalogName = "fldcat")
        {
            _tableCatalogName = tableCatalogName;
            _fieldCatalogName = fieldCatalogName;

            var tableCatalogSchema = new Schema();

            tableCatalogSchema.AddStringField("tblname", MAX_NAME_LENGTH);
            tableCatalogSchema.AddIntField("reclength");

            _tableCatalogInfo = new TableInfo(_tableCatalogName, tableCatalogSchema);

            var fieldCatalogSchema = new Schema();

            fieldCatalogSchema.AddStringField("tblname", MAX_NAME_LENGTH);
            fieldCatalogSchema.AddStringField("fldname", MAX_NAME_LENGTH);
            fieldCatalogSchema.AddIntField("type");
            fieldCatalogSchema.AddIntField("length");
            fieldCatalogSchema.AddIntField("offset");

            _fieldCatalogInfo = new TableInfo(_fieldCatalogName, fieldCatalogSchema);

            if (isNew)
            {
                CreateTable(_tableCatalogName, tableCatalogSchema, transaction);
                CreateTable(_fieldCatalogName, fieldCatalogSchema, transaction);
            }
        }
Пример #2
0
        private Schema CreateSchema()
        {
            var schema = new Schema();

            schema.AddIntField("blk");
            schema.AddIntField("id");

            // TODO for all types
            var indexType = _tableInfo.Schema.FieldType(_fieldName);

            switch (indexType)
            {
            case FieldType.Bool:
                // lol dude why u want BTree on bool??? Are you insane?

                schema.AddBoolField("val");
                break;


            case FieldType.Byte:

                schema.AddByteField("val");
                break;


            case FieldType.Integer:

                schema.AddIntField("val");
                break;


            case FieldType.Date:

                schema.AddDateField("val");
                break;


            case FieldType.Blob:

                var blobFieldLength = _tableInfo.Schema.Length(_fieldName);
                schema.AddBlobField("val", blobFieldLength);
                break;


            case FieldType.String:

                var stringFieldLength = _tableInfo.Schema.Length(_fieldName);
                schema.AddStringField("val", stringFieldLength);
                break;
            }

            return(schema);
        }
Пример #3
0
        public void CanGetStatisticsFromNewTableInTheSameTransaction()
        {
            manager = new StatisticsManager(tableManager, _transaction, tableCatalogName, fieldCatalogName, 1);


            var newTableName = RandomFilename;

            var schema = new Schema();

            schema.AddIntField("Id");
            schema.AddStringField("Guid", 40);

            var newTableInfo = new TableInfo(newTableName, schema);

            tableManager.CreateTable(newTableName, schema, _transaction);

            var recordFile = new RecordFile(newTableInfo, _transaction);

            recordFile.BeforeFirst();

            for (int i = 0; i < 50; ++i)
            {
                recordFile.Insert();
                recordFile.SetInt("Id", i + 10);
                recordFile.SetString("Guid", Guid.NewGuid().ToString());
            }

            var updatedData = manager.GetStatisticalInfo(newTableName, _transaction);

            Assert.AreEqual(50, updatedData.RecordsOutput);
            Assert.AreEqual(3, updatedData.BlocksAccessed);
            Assert.AreEqual(17, updatedData.DistinctValues("Id"));
        }
Пример #4
0
        public void CanReadWrittenIntRecord()
        {
            var tableFile = RandomFilename;
            var schema    = new Schema();

            schema.AddIntField("field");
            _tableInfo = new TableInfo(tableFile, schema);

            _recordFile = new RecordFile(_tableInfo, _transaction);
            _recordFile.MoveToRID(new RID(0, 0));
            _recordFile.SetInt("field", 10);
            _recordFile.Close();

            _transaction.Commit();

            var cm    = new ConcurrencyManager();
            var newTr = new Transaction(_dispatcher, _bufferManager, cm, _fileManager, _logManager);

            var rf = new RecordFile(_tableInfo, newTr);

            rf.MoveToRID(new RID(0, 0));
            var value = rf.GetInt("field");

            Assert.AreEqual(10, value);
        }
Пример #5
0
        public void Setup()
        {
            _logName            = RandomFilename;
            _fileManager        = new FileManager("temp", "DBs", 1024);
            _logManager         = new LogManager(_fileManager, _logName);
            _bufferManager      = new BufferManager(_fileManager, _logManager, new NaiveBufferPoolStrategy(_logManager, _fileManager, 1000));
            _dispatcher         = new TransactionNumberDispatcher(10);
            _concurrencyManager = new ConcurrencyManager();
            _transaction        = new Transaction(_dispatcher, _bufferManager, _concurrencyManager, _fileManager, _logManager);

            var schema = new Schema();

            schema.AddIntField("Id");

            tableCatalogName = RandomFilename;
            fieldCatalogName = RandomFilename;
            viewCatalogName  = RandomFilename;

            tableName = RandomFilename;

            tableManager = new TableManager(true, _transaction, tableCatalogName, fieldCatalogName);

            tableInfo = new TableInfo(tableName, schema);
            tableManager.CreateTable(tableName, schema, _transaction);

            viewManager       = new ViewManager(true, tableManager, _transaction, viewCatalogName);
            statisticsManager = new StatisticsManager(tableManager, _transaction, tableCatalogName, fieldCatalogName, 0);
        }
Пример #6
0
        public void CanGetTableInfoInDifferentTableManager()
        {
            var tableMetadataStorageFilename = RandomFilename;
            var fieldMetadataStorageFilename = RandomFilename;

            tableManager = new TableManager(true, _transaction, tableMetadataStorageFilename, fieldMetadataStorageFilename);
            var schema = new Schema();

            schema.AddIntField("field1");
            schema.AddBlobField("field2", 40);

            tableManager.CreateTable("table1", schema, _transaction);

            _transaction.Commit();

            _concurrencyManager = new ConcurrencyManager();
            _transaction        = new Transaction(_dispatcher, _bufferManager, _concurrencyManager, _fileManager, _logManager);

            tableManager = new TableManager(false, _transaction, tableMetadataStorageFilename, fieldMetadataStorageFilename);

            var tableInfo = tableManager.GetTableInfo("table1", _transaction);

            Assert.AreEqual("table1.tbl", tableInfo.Filename);
            Assert.AreEqual(2, tableInfo.Schema.Fields.Count);
            Assert.AreEqual(48, tableInfo.RecordLength);

            var field1 = tableInfo.Schema.Fields["field1"];
            var field2 = tableInfo.Schema.Fields["field2"];

            Assert.AreEqual(FieldType.Integer, field1.Type);
            Assert.AreEqual(FieldType.Blob, field2.Type);
            Assert.AreEqual(40, field2.Length);
        }
Пример #7
0
        public void CanDeleteRecord()
        {
            var tableFile = RandomFilename;
            var schema    = new Schema();

            schema.AddIntField("field");
            _tableInfo = new TableInfo(tableFile, schema);

            _recordFile = new RecordFile(_tableInfo, _transaction);

            _recordFile.BeforeFirst();

            _recordFile.Insert();
            _recordFile.SetInt("field", 10);

            _recordFile.Delete();

            _transaction.Commit();

            var block = new IO.Primitives.Block(tableFile + ".tbl", 0);
            var page  = _fileManager.ResolvePage(block);

            page.Read(block);

            page.GetInt(0, out var used);
            Assert.AreEqual(0, used);
        }
Пример #8
0
        public void CanGetTableInfoWhileItWasUncommited()
        {
            var tableMetadataStorageFilename = RandomFilename;
            var fieldMetadataStorageFilename = RandomFilename;

            tableManager = new TableManager(true, _transaction, tableMetadataStorageFilename, fieldMetadataStorageFilename);
            var schema = new Schema();

            schema.AddIntField("field1");
            schema.AddBlobField("field2", 40);

            tableManager.CreateTable("table1", schema, _transaction);

            var tableInfo = tableManager.GetTableInfo("table1", _transaction);

            Assert.AreEqual("table1.tbl", tableInfo.Filename);
            Assert.AreEqual(2, tableInfo.Schema.Fields.Count);
            Assert.AreEqual(48, tableInfo.RecordLength);

            var field1 = tableInfo.Schema.Fields["field1"];
            var field2 = tableInfo.Schema.Fields["field2"];

            Assert.AreEqual(FieldType.Integer, field1.Type);
            Assert.AreEqual(FieldType.Blob, field2.Type);
            Assert.AreEqual(40, field2.Length);
        }
Пример #9
0
        public void CanInsertMoreThanForOnePage()
        {
            var tableFile = RandomFilename;
            var schema    = new Schema();

            schema.AddIntField("field");
            _tableInfo = new TableInfo(tableFile, schema);

            _recordFile = new RecordFile(_tableInfo, _transaction);

            _recordFile.BeforeFirst();

            for (int i = 0; i < 12; ++i)
            {
                _recordFile.Insert();
            }

            // And this folk would go to the next page
            _recordFile.Insert();

            var rid = _recordFile.CurrentRID;

            Assert.AreEqual(1, rid.BlockNumber);
            Assert.AreEqual(0, rid.Id);
        }
Пример #10
0
        public void CanGetLength()
        {
            var schema = new Schema();

            schema.AddIntField("field");

            var tableInfo = new TableInfo("table", schema);

            Assert.AreEqual(4, tableInfo.RecordLength);
        }
Пример #11
0
        public void CanGetTableFilename()
        {
            var schema = new Schema();

            schema.AddIntField("field");

            var tableInfo = new TableInfo("table", schema);

            Assert.AreEqual("table.tbl", tableInfo.Filename);
        }
Пример #12
0
        public void CanGetSchema()
        {
            var schema = new Schema();

            schema.AddIntField("field");

            var tableInfo = new TableInfo("table", schema);

            Assert.AreEqual(schema, tableInfo.Schema);
        }
Пример #13
0
        public void CanCreateTableInfo_v1()
        {
            var schema = new Schema();

            schema.AddIntField("field");

            Assert.DoesNotThrow(() =>
            {
                var tableInfo = new TableInfo("table", schema);
            });
        }
Пример #14
0
        public void CannotGetBadOffset()
        {
            var schema = new Schema();

            schema.AddIntField("field");

            var tableInfo = new TableInfo("table", schema);

            var offset = tableInfo.Offset("field123");

            Assert.AreEqual(-1, offset);
        }
Пример #15
0
        public void CanFormatPageWithOneIntFieldInside()
        {
            _schema.AddIntField("field");

            _tableInfo       = new TableInfo(RandomFilename, _schema);
            _recordFormatter = new RecordFormatter(_tableInfo, _fileManager);

            var page = _fileManager.ResolvePage();

            Assert.DoesNotThrow(() =>
            {
                _recordFormatter.Format(page);
            });
        }
Пример #16
0
        public void Setup()
        {
            indexName = "tempIndex";

            schema = new Schema();
            schema.AddIntField("id");

            _logName            = RandomFilename;
            _fileManager        = new FileManager("temp", "DBs", 1024);
            _logManager         = new LogManager(_fileManager, _logName);
            _bufferManager      = new BufferManager(_fileManager, _logManager, new NaiveBufferPoolStrategy(_logManager, _fileManager, 10));
            _dispatcher         = new TransactionNumberDispatcher(10);
            _concurrencyManager = new ConcurrencyManager();
            transaction         = new Transaction(_dispatcher, _bufferManager, _concurrencyManager, _fileManager, _logManager);
        }
Пример #17
0
        public void CanCreateCompleteRecord()
        {
            var schema = new Schema();

            schema.AddIntField("field1");
            schema.AddBoolField("field2");
            schema.AddByteField("field3");
            schema.AddBlobField("field4", 10);
            schema.AddStringField("field5", 10);
            schema.AddDateField("field6");

            var tableInfo = new TableInfo("table", schema);

            Assert.AreEqual(42, tableInfo.RecordLength);
        }
Пример #18
0
        public void Setup()
        {
            _logName            = RandomFilename;
            _fileManager        = new FileManager("temp", "DBs", 100);
            _logManager         = new LogManager(_fileManager, _logName);
            _bufferManager      = new BufferManager(_fileManager, _logManager, new NaiveBufferPoolStrategy(_logManager, _fileManager, 10));
            _dispatcher         = new TransactionNumberDispatcher(10);
            _concurrencyManager = new ConcurrencyManager();
            _transaction        = new Transaction(_dispatcher, _bufferManager, _concurrencyManager, _fileManager, _logManager);

            var sch = new Schema();

            sch.AddIntField("field");
            _tableInfo = new TableInfo(RandomFilename, sch);
        }
Пример #19
0
        public void CanCreateTableInfo_v2()
        {
            var schema = new Schema();

            schema.AddIntField("field");

            var offsets = new Dictionary <string, int>
            {
                { "field", 4 }
            };

            Assert.DoesNotThrow(() =>
            {
                var tableInfo = new TableInfo("table", schema, offsets, 8);
            });
        }
Пример #20
0
        public void CanNavigateThourghExistingRecordsMoreRecords()
        {
            var tableFile = RandomFilename;
            var schema    = new Schema();

            schema.AddIntField("field");
            _tableInfo = new TableInfo(tableFile, schema);

            _recordFile = new RecordFile(_tableInfo, _transaction);

            _recordFile.BeforeFirst();

            for (int i = 0; i < 12; ++i)
            {
                _recordFile.Insert();
                _recordFile.SetInt("field", i);
            }

            // And this folk would go to the next page
            _recordFile.Insert();
            _recordFile.SetInt("field", 123);

            _transaction.Commit();

            var cm    = new ConcurrencyManager();
            var newTr = new Transaction(_dispatcher, _bufferManager, cm, _fileManager, _logManager);

            var rf = new RecordFile(_tableInfo, newTr);

            rf.BeforeFirst();

            for (int i = 0; i < 12; ++i)
            {
                rf.Next();
                var value = rf.GetInt("field");
                Assert.AreEqual(i, value);
            }

            rf.Next();
            var lastValue = rf.GetInt("field");

            Assert.AreEqual(123, lastValue);

            var canMoveNext = rf.Next();

            Assert.IsFalse(canMoveNext);
        }
Пример #21
0
        public void CanAddIntField()
        {
            var schema = new Schema();

            Assert.DoesNotThrow(() =>
            {
                schema.AddIntField("field");
            });

            var fields = schema.Fields;
            var field  = fields.First();

            Assert.IsNotNull(fields);
            Assert.AreEqual(1, fields.Count);
            Assert.AreEqual(FieldType.Integer, field.Value.Type);
            Assert.AreEqual("field", field.Key);
        }
Пример #22
0
        public void CanCreateIntegerIndex()
        {
            var indexTableName = RandomFilename;

            var schema = new Schema();

            schema.AddIntField("Field");

            tableInfo = new TableInfo(indexTableName, schema);
            tableManager.CreateTable(indexTableName, schema, _transaction);


            indexInfo = new IndexInfo("index", indexTableName, "Field", tableManager, statisticsManager, _transaction, 1024);

            // Todo check them out
            var indexSchema = indexInfo.Open();

            Assert.Pass();
        }
Пример #23
0
        public void CanCreateViewAndGetViewInfo()
        {
            metadataManager = new MetadataManager(_fileManager, tableManager, viewManager, indexManager, statisticsManager);

            var schema = new Schema();

            schema.AddIntField("Id");
            schema.AddStringField("Name", 50);

            var tableName = RandomFilename;

            Assert.DoesNotThrow(() =>
            {
                metadataManager.CreateView(tableName, "definition of a view", _transaction);
            });

            var viewDefinition = metadataManager.GetViewDefinition(tableName, _transaction);

            Assert.IsNotNull(viewDefinition);
            Assert.AreEqual("definition of a view", viewDefinition);
        }
Пример #24
0
        public void CanCreateTableAndGetTableInfo()
        {
            metadataManager = new MetadataManager(_fileManager, tableManager, viewManager, indexManager, statisticsManager);

            var schema = new Schema();

            schema.AddIntField("Id");
            schema.AddStringField("Name", 50);

            var tableName = RandomFilename;

            Assert.DoesNotThrow(() =>
            {
                metadataManager.CreateTable(tableName, schema, _transaction);
            });

            var tableInfo = metadataManager.GetTableInfo(tableName, _transaction);

            Assert.IsNotNull(tableInfo);
            Assert.AreEqual(58, tableInfo.RecordLength);
        }
Пример #25
0
        public void CanGetBeforeFirstAndInsertValues()
        {
            var tableFile = RandomFilename;
            var schema    = new Schema();

            schema.AddIntField("field");
            _tableInfo = new TableInfo(tableFile, schema);

            _recordFile = new RecordFile(_tableInfo, _transaction);

            _recordFile.BeforeFirst();

            _recordFile.Insert();
            _recordFile.SetInt("field", 10);

            _recordFile.Insert();
            _recordFile.SetInt("field", 20);

            _transaction.Commit();

            var block = new IO.Primitives.Block(tableFile + ".tbl", 0);
            var page  = _fileManager.ResolvePage(block);

            page.Read(block);

            page.GetInt(0, out var used1);
            page.GetInt(8, out var used2);


            page.GetInt(4, out var value1);
            page.GetInt(12, out var value2);

            Assert.AreEqual(1, used1);
            Assert.AreEqual(1, used2);

            Assert.AreEqual(10, value1);
            Assert.AreEqual(20, value2);
        }
Пример #26
0
        public void CanWriteIntOnARecord()
        {
            var tableFile = RandomFilename;
            var schema    = new Schema();

            schema.AddIntField("field");
            _tableInfo = new TableInfo(tableFile, schema);

            _recordFile = new RecordFile(_tableInfo, _transaction);
            _recordFile.MoveToRID(new RID(0, 0));
            _recordFile.SetInt("field", 10);
            _recordFile.Close();

            _transaction.Commit();

            var block = new IO.Primitives.Block(tableFile + ".tbl", 0);
            var page  = _fileManager.ResolvePage(block);

            page.Read(block);

            _ = page.GetInt(4, out var value);
            Assert.AreEqual(10, value);
        }
Пример #27
0
        public void CanReadIntFromRecord()
        {
            var fn    = RandomFilename;
            var block = new Block(fn, 0);

            var sch = new Schema();

            sch.AddIntField("field");

            var page = _fileManager.ResolvePage(block);

            page.Read(block);

            page.SetInt(0, 4);
            page.SetInt(4, 10);

            page.Write(block);

            recordPage = new RecordPage(block, _tableInfo, _transaction, _fileManager);
            recordPage.MoveToId(0);
            var value = recordPage.GetInt("field");

            Assert.AreEqual(10, value);
        }
Пример #28
0
        public void WouldGetNullIfTableWasNotFound()
        {
            var tableMetadataStorageFilename = RandomFilename;
            var fieldMetadataStorageFilename = RandomFilename;

            tableManager = new TableManager(true, _transaction, tableMetadataStorageFilename, fieldMetadataStorageFilename);
            var schema = new Schema();

            schema.AddIntField("field1");
            schema.AddBlobField("field2", 40);

            tableManager.CreateTable("table1", schema, _transaction);

            _transaction.Commit();

            _concurrencyManager = new ConcurrencyManager();
            _transaction        = new Transaction(_dispatcher, _bufferManager, _concurrencyManager, _fileManager, _logManager);

            tableManager = new TableManager(false, _transaction, tableMetadataStorageFilename, fieldMetadataStorageFilename);

            var tableInfo = tableManager.GetTableInfo("table2", _transaction);

            Assert.IsNull(tableInfo);
        }
Пример #29
0
        public void CanCreateTable()
        {
            var tableMetadataStorageFilename = RandomFilename;
            var fieldMetadataStorageFilename = RandomFilename;

            tableManager = new TableManager(true, _transaction, tableMetadataStorageFilename, fieldMetadataStorageFilename);
            var schema = new Schema();

            schema.AddIntField("field1");
            schema.AddBlobField("field2", 40);

            tableManager.CreateTable("table1", schema, _transaction);

            _transaction.Commit();

            _concurrencyManager = new ConcurrencyManager();
            _transaction        = new Transaction(_dispatcher, _bufferManager, _concurrencyManager, _fileManager, _logManager);

            var tableCatalogSchema = new Schema();

            tableCatalogSchema.AddStringField("tblname", TableManager.MAX_NAME_LENGTH);
            tableCatalogSchema.AddIntField("reclength");

            var tableCatalogInfo       = new TableInfo(tableMetadataStorageFilename, tableCatalogSchema);
            var tableCatalogRecordPage = new RecordFile(tableCatalogInfo, _transaction);

            tableCatalogRecordPage.BeforeFirst();
            tableCatalogRecordPage.Next();

            // skip all tables definition and all fields definition tables
            tableCatalogRecordPage.Next();
            tableCatalogRecordPage.Next();

            var tableName    = tableCatalogRecordPage.GetString("tblname");
            var recordLength = tableCatalogRecordPage.GetInt("reclength");

            Assert.AreEqual("table1", tableName);
            Assert.AreEqual(new TableInfo("table1", schema).RecordLength, recordLength);

            var fieldCatalogSchema = new Schema();

            fieldCatalogSchema.AddStringField("tblname", TableManager.MAX_NAME_LENGTH);
            fieldCatalogSchema.AddStringField("fldname", TableManager.MAX_NAME_LENGTH);
            fieldCatalogSchema.AddIntField("type");
            fieldCatalogSchema.AddIntField("length");
            fieldCatalogSchema.AddIntField("offset");
            var fieldCatalogInfo       = new TableInfo(fieldMetadataStorageFilename, fieldCatalogSchema);
            var fieldCatalogRecordPage = new RecordFile(fieldCatalogInfo, _transaction);

            fieldCatalogRecordPage.BeforeFirst();
            fieldCatalogRecordPage.Next();

            // 2 field for table metadata table, 5 fields for field metadata table
            fieldCatalogRecordPage.Next();
            fieldCatalogRecordPage.Next();
            fieldCatalogRecordPage.Next();
            fieldCatalogRecordPage.Next();
            fieldCatalogRecordPage.Next();
            fieldCatalogRecordPage.Next();
            fieldCatalogRecordPage.Next();

            var field1Table  = fieldCatalogRecordPage.GetString("tblname");
            var field1Name   = fieldCatalogRecordPage.GetString("fldname");
            var field1Type   = fieldCatalogRecordPage.GetInt("type");
            var field1Length = fieldCatalogRecordPage.GetInt("length");
            var field1Offset = fieldCatalogRecordPage.GetInt("offset");

            Assert.AreEqual("table1", field1Table);
            Assert.AreEqual("field1", field1Name);
            Assert.AreEqual(2, field1Type);
            Assert.AreEqual(sizeof(int), field1Length);
            Assert.AreEqual(0, field1Offset);

            fieldCatalogRecordPage.Next();

            var field2Table  = fieldCatalogRecordPage.GetString("tblname");
            var field2Name   = fieldCatalogRecordPage.GetString("fldname");
            var field2Type   = fieldCatalogRecordPage.GetInt("type");
            var field2Length = fieldCatalogRecordPage.GetInt("length");
            var field2Offset = fieldCatalogRecordPage.GetInt("offset");

            Assert.AreEqual("table1", field2Table);
            Assert.AreEqual("field2", field2Name);
            Assert.AreEqual(4, field2Type);
            Assert.AreEqual(40, field2Length);
            Assert.AreEqual(4, field2Offset);
        }