private unsafe void LoadExistingDatabase() { var header = stackalloc TransactionHeader[1]; bool hadIntegrityIssues = _journal.RecoverDatabase(header); if (hadIntegrityIssues) { var message = _journal.Files.Count == 0 ? "Unrecoverable database" : "Database recovered partially. Some data was lost."; _options.InvokeRecoveryError(this, message, null); } var entry = _headerAccessor.CopyHeader(); var nextPageNumber = (header->TransactionId == 0 ? entry.LastPageNumber : header->LastPageNumber) + 1; State = new StorageEnvironmentState(null, null, nextPageNumber) { NextPageNumber = nextPageNumber, Options = Options }; _transactionsCounter = (header->TransactionId == 0 ? entry.TransactionId : header->TransactionId); using (var tx = NewTransaction(TransactionFlags.ReadWrite)) { var root = Tree.Open(tx, header->TransactionId == 0 ? &entry.Root : &header->Root); var freeSpace = Tree.Open(tx, header->TransactionId == 0 ? &entry.FreeSpace : &header->FreeSpace); tx.UpdateRootsIfNeeded(root, freeSpace); tx.Commit(); } }
private void CreateNewDatabase() { const int initialNextPageNumber = 0; State = new StorageEnvironmentState(null, null, initialNextPageNumber) { Options = Options }; using (var tx = NewTransaction(TransactionFlags.ReadWrite)) { var root = Tree.Create(tx, false); var freeSpace = Tree.Create(tx, false); // important to first create the two trees, then set them on the env tx.UpdateRootsIfNeeded(root, freeSpace); tx.Commit(); //since this transaction is never shipped, this is the first previous transaction //when applying shipped logs } }
private unsafe void CreateNewDatabase() { const int initialNextPageNumber = 0; State = new StorageEnvironmentState(null, null, initialNextPageNumber); using (var tx = NewTransaction(TransactionFlags.ReadWrite)) { var root = Tree.Create(tx, _sliceComparer); var freeSpace = Tree.Create(tx, _sliceComparer); // important to first create the two trees, then set them on the env tx.UpdateRootsIfNeeded(root, freeSpace); tx.Commit(); } }