private void removeBtn_Click(object sender, EventArgs e) { ClearDisplay(); Env env = new Env(EnvCreateFlags.None); try { Env.OpenFlags envFlags = Env.OpenFlags.Create | Env.OpenFlags.InitLock | Env.OpenFlags.InitLog | Env.OpenFlags.InitMPool | Env.OpenFlags.InitTxn | Env.OpenFlags.Recover; env.Open(homeDir, envFlags, 0); // remove existing database file Txn txn = env.TxnBegin(null, Txn.BeginFlags.None); env.DbRemove(txn, myDb, null, Env.WriteFlags.None); txn.Commit(Txn.CommitMode.None); env.Close(); // remove existing environment env = new Env(EnvCreateFlags.None); env.Remove(homeDir, Env.RemoveFlags.None); } catch (Exception ex) { errBox.Text = ex.ToString(); tabControl.SelectTab("errorPage"); } finally { env.Close(); } }
private void viewBtn_Click(object sender, EventArgs e) { ClearDisplay(); // open database and read records back - the database is transactional Env env = new Env(EnvCreateFlags.None); try { DbBTree btree; Env.OpenFlags envFlags = Env.OpenFlags.Create | Env.OpenFlags.InitLock | Env.OpenFlags.InitLog | Env.OpenFlags.InitMPool | Env.OpenFlags.InitTxn | Env.OpenFlags.Recover; env.Open(homeDir, envFlags, 0); Db db = env.CreateDatabase(DbCreateFlags.None); Txn txn = env.TxnBegin(null, Txn.BeginFlags.None); DbFile tmpDb = db.Open(txn, Path.Combine(homeDir, myDb), null, DbType.Unknown, Db.OpenFlags.None, 0); txn.Commit(Txn.CommitMode.None); if (tmpDb.DbType == DbType.BTree) { btree = (DbBTree)tmpDb; } else { throw new ApplicationException("Unexpected database type."); } List <Customer> custList = new List <Customer>(); // DbBTreeCursor implements IDisposable - will be closed through "using" using (DbBTreeCursor cursor = btree.OpenCursor(null, DbFileCursor.CreateFlags.None)) { Customer cust = null; while (GetNextRecord(cursor, ref cust)) { custList.Add(cust); } } db.Close(); DataGridViewColumn nameCol = new DataGridViewTextBoxColumn(); nameCol.Name = "NameCol"; nameCol.HeaderText = "Name"; nameCol.DataPropertyName = "Name"; dataGridView.Columns.Add(nameCol); dataGridView.DataSource = custList; tabControl.SelectTab("dataPage"); } catch (Exception ex) { errBox.Text = ex.ToString(); tabControl.SelectTab("errorPage"); } finally { env.Close(); } }
/// <summary> /// 初始化 /// </summary> private void Init() { env = new Env(EnvCreateFlags.None); Env.OpenFlags envFlags = Env.OpenFlags.Create | Env.OpenFlags.InitLock | Env.OpenFlags.InitLog | Env.OpenFlags.InitMPool | Env.OpenFlags.InitTxn | Env.OpenFlags.Recover; env.Open(directory, envFlags, 0); txn = env.TxnBegin(null, Txn.BeginFlags.None); db = env.CreateDatabase(DbCreateFlags.None); btree = (DbHash)db.Open(txn, dbName, null, DbType.Hash, Db.OpenFlags.Create, 0); }
void initDatabase() { Db db = null; Txn txn = null; try { env = new Env(EnvCreateFlags.None); // configure for error and message reporting env.ErrorStream = Console.OpenStandardError( ); env.MessageStream = Console.OpenStandardOutput( ); // initialize environment for locking, logging, memory pool and transactions Env.OpenFlags envFlags = Env.OpenFlags.Create | Env.OpenFlags.InitLock | Env.OpenFlags.InitLog | Env.OpenFlags.InitMPool | Env.OpenFlags.InitTxn | Env.OpenFlags.Recover; env.Open(dbHome, envFlags, 0); // create, configure and open database under a transaction txn = env.TxnBegin(null, Txn.BeginFlags.None); db = env.CreateDatabase(DbCreateFlags.None); // set the BTree comparison function db.BTreeCompare = AppCompare; // error and message reporting already configured on environment // db.ErrorStream = errStream; // db.ErrorPrefix = Path.GetFileName(Application.ExecutablePath); // db.MessageStream = msgStream; dbInstance = (DbBTree)db.Open( txn, dbName, null, DbType.BTree, Db.OpenFlags.Create, 0); txn.Commit(Txn.CommitMode.None); } catch { } isInited = true; }
private void InitOpenFlags() { if (this.envOpenFlagCollection == null) { return; } foreach (EnvironmentOpenFlags flag in this.envOpenFlagCollection) { switch (flag) { case EnvironmentOpenFlags.Create: this.openFlagsField = this.openFlagsField | Env.OpenFlags.Create; break; case EnvironmentOpenFlags.InitCDB: this.openFlagsField = this.openFlagsField | Env.OpenFlags.InitCDB; break; case EnvironmentOpenFlags.InitLock: this.openFlagsField = this.openFlagsField | Env.OpenFlags.InitLock; break; case EnvironmentOpenFlags.InitLog: this.openFlagsField = this.openFlagsField | Env.OpenFlags.InitLog; break; case EnvironmentOpenFlags.InitMPool: this.openFlagsField = this.openFlagsField | Env.OpenFlags.InitMPool; break; case EnvironmentOpenFlags.InitRep: this.openFlagsField = this.openFlagsField | Env.OpenFlags.InitRep; break; case EnvironmentOpenFlags.InitTxn: this.openFlagsField = this.openFlagsField | Env.OpenFlags.InitTxn; break; case EnvironmentOpenFlags.JoinEnv: this.openFlagsField = this.openFlagsField | Env.OpenFlags.JoinEnv; break; case EnvironmentOpenFlags.LockDown: this.openFlagsField = this.openFlagsField | Env.OpenFlags.LockDown; break; case EnvironmentOpenFlags.None: this.openFlagsField = this.openFlagsField | Env.OpenFlags.None; break; case EnvironmentOpenFlags.Private: this.openFlagsField = this.openFlagsField | Env.OpenFlags.Private; break; case EnvironmentOpenFlags.Recover: this.openFlagsField = this.openFlagsField | Env.OpenFlags.Recover; break; case EnvironmentOpenFlags.RecoverFatal: this.openFlagsField = this.openFlagsField | Env.OpenFlags.RecoverFatal; break; case EnvironmentOpenFlags.SystemMem: this.openFlagsField = this.openFlagsField | Env.OpenFlags.SystemMem; break; case EnvironmentOpenFlags.ThreadSafe: this.openFlagsField = this.openFlagsField | Env.OpenFlags.ThreadSafe; break; case EnvironmentOpenFlags.UseEnviron: this.openFlagsField = this.openFlagsField | Env.OpenFlags.UseEnviron; break; case EnvironmentOpenFlags.UseEnvironRoot: this.openFlagsField = this.openFlagsField | Env.OpenFlags.UseEnvironRoot; break; default: throw new ApplicationException("Unknown Env.OpenFlag '" + flag + "'"); } } }
private void loadBtn_Click(object sender, EventArgs e) { ClearDisplay(); MemoryStream errStream = new MemoryStream(); MemoryStream msgStream = new MemoryStream(); TextWriter errWriter = new StreamWriter(errStream); TextWriter msgWriter = new StreamWriter(msgStream); Db db = null; Txn txn = null; Env env = null; try { env = new Env(EnvCreateFlags.None); // configure for error and message reporting env.ErrorStream = errStream; env.ErrorPrefix = Path.GetFileName(Application.ExecutablePath); env.MessageStream = msgStream; // initialize environment for locking, logging, memory pool and transactions Env.OpenFlags envFlags = Env.OpenFlags.Create | Env.OpenFlags.InitLock | Env.OpenFlags.InitLog | Env.OpenFlags.InitMPool | Env.OpenFlags.InitTxn | Env.OpenFlags.Recover; env.Open(homeDir, envFlags, 0); // create, configure and open database under a transaction txn = env.TxnBegin(null, Txn.BeginFlags.None); db = env.CreateDatabase(DbCreateFlags.None); // set the BTree comparison function db.BTreeCompare = AppCompare; // error and message reporting already configured on environment // db.ErrorStream = errStream; // db.ErrorPrefix = Path.GetFileName(Application.ExecutablePath); // db.MessageStream = msgStream; DbBTree btree = (DbBTree)db.Open( txn, myDb, null, DbType.BTree, Db.OpenFlags.Create, 0); txn.Commit(Txn.CommitMode.None); // create a sequence named '###sequence1' under a transaction txn = env.TxnBegin(null, Txn.BeginFlags.None); Sequence seq = btree.CreateSequence(); byte[] seqName = utf8.GetBytes("###sequence1"); DbEntry seqNameEntry = DbEntry.InOut(seqName); seq.Open(txn, ref seqNameEntry, Sequence.OpenFlags.Create); seq.Close(); txn.Commit(Txn.CommitMode.None); // open sequence again, retrieve values and then remove the sequence seq = btree.CreateSequence(); txn = env.TxnBegin(null, Txn.BeginFlags.None); // seq.CacheSize = 1000; // cannot use transactions when CacheSize > 0 seq.Open(txn, ref seqNameEntry, Sequence.OpenFlags.None); Int64 seqVal; for (int indx = 0; indx < 500; indx++) { seqVal = seq.Get(txn, 1, Sequence.ReadFlags.None); } seq.Remove(txn, Sequence.RemoveFlags.None); txn.Commit(Txn.CommitMode.None); // add a few records under a transaction Customer cust; txn = env.TxnBegin(null, Txn.BeginFlags.None); cust = new Customer("John Doe", "122 Yonge Street", "Toronto", "ON", "M5R 5T9", DateTime.Parse("Dec 22, 1965")); AddRecord(btree, txn, cust, errWriter); cust = new Customer("Jane Doby", "23 Bloor Street", "Oshawa", "ON", "L1H 2K9", DateTime.Parse("Jun 1, 1962")); AddRecord(btree, txn, cust, errWriter); cust = new Customer("Rusty Nail", "77 Bond Street", "Markham", "ON", "L3T 7Y8", DateTime.Parse("Sep 9, 1915")); AddRecord(btree, txn, cust, errWriter); cust = new Customer("Rosy Cheek", "11 Adelaide Street", "Whitby", "ON", "K3P 4H4", DateTime.Parse("Jan 2, 1980")); AddRecord(btree, txn, cust, errWriter); // this last one is a duplicate of the first record cust = new Customer("John Doe", "1459 King Street", "Toronto", "ON", "N8N 2L0", DateTime.Parse("Apr 14, 1973")); AddRecord(btree, txn, cust, errWriter); txn.Commit(Txn.CommitMode.None); msgWriter.WriteLine("=================================================="); msgWriter.WriteLine("K E Y S T A T I S T I C S"); msgWriter.WriteLine("=================================================="); // get a key range, under a transaction txn = env.TxnBegin(null, Txn.BeginFlags.None); keyStream.Position = 0; formatter.Serialize(keyStream, "John Doe"); DbEntry key = DbEntry.InOut(keyStream.GetBuffer(), 0, (int)keyStream.Position); DbBTree.KeyRange keyRange = btree.GetKeyRange(txn, ref key); txn.Commit(Txn.CommitMode.None); msgWriter.WriteLine(); string msg = "KeyRange for 'John Doe': Less = {0}, Equal = {1}, Greater = {2}"; msgWriter.WriteLine(string.Format(msg, keyRange.Less, keyRange.Equal, keyRange.Greater)); msgWriter.WriteLine(); // retrieve some database statistics TxnStats stats = env.GetTxnStats(StatFlags.None); DbBTree.Stats btstats = btree.GetStats(null, DbFile.StatFlags.None); CacheFileStats[] cfStats = env.GetCacheFileStats(StatFlags.None); // we can also have them written to the message stream msgWriter.WriteLine("=================================================="); msgWriter.WriteLine("T R A N S A C T I O N S T A T I S T I C S"); msgWriter.WriteLine("=================================================="); msgWriter.WriteLine(); msgWriter.Flush(); env.PrintTxnStats(StatPrintFlags.None); msgWriter.WriteLine(); msgWriter.WriteLine("=================================================="); msgWriter.WriteLine("L O G S T A T I S T I C S"); msgWriter.WriteLine("=================================================="); msgWriter.WriteLine(); msgWriter.Flush(); env.PrintLogStats(StatPrintFlags.All); msgWriter.WriteLine(); msgWriter.WriteLine("=================================================="); msgWriter.WriteLine("L O C K S T A T I S T I C S"); msgWriter.WriteLine("=================================================="); msgWriter.WriteLine(); msgWriter.Flush(); env.PrintLogStats(StatPrintFlags.All); msgWriter.WriteLine(); msgWriter.WriteLine("=================================================="); msgWriter.WriteLine("C A C H E S T A T I S T I C S"); msgWriter.WriteLine("=================================================="); msgWriter.WriteLine(); msgWriter.Flush(); env.PrintCacheStats(CacheStatPrintFlags.All); msgWriter.WriteLine(); msgWriter.WriteLine("=================================================="); msgWriter.WriteLine("B T R E E S T A T I S T I C S"); msgWriter.WriteLine("=================================================="); msgWriter.WriteLine(); msgWriter.Flush(); btree.PrintStats(DbFile.StatPrintFlags.All); } catch (BdbException) { if (txn != null && !txn.IsDisposed) { txn.Abort(); } // errors are reported through error stream already return; } catch (Exception ex) { if (txn != null && !txn.IsDisposed) { txn.Abort(); } errWriter.WriteLine(ex.ToString()); return; } finally { if (db != null) { db.Close(); } if (env != null) { env.Close(); } msgWriter.Flush(); string msgText = utf8.GetString(msgStream.GetBuffer()); if (msgText != "") { msgBox.Text = msgText; } msgWriter.Close(); errWriter.Flush(); string errText = utf8.GetString(errStream.GetBuffer()); if (errText != "") { errBox.Text = errText; tabControl.SelectTab("errorPage"); } errWriter.Close(); } }