Example #1
0
        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();
            }
        }
Example #2
0
        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();
            }
        }
Example #3
0
 /// <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);
 }
Example #4
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;
        }
Example #5
0
        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 + "'");
                }
            }
        }
Example #6
0
        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();
            }
        }