hamsterdb Embedded Database  2.1.1
db6.cpp
Go to the documentation of this file.
00001 
00016 #include <iostream>
00017 #include <ham/hamsterdb.hpp>
00018 
00019 #define LOOP 10
00020 
00021 int
00022 run_demo() {
00023   int i;
00024   hamsterdb::env env;      /* hamsterdb environment object */
00025   hamsterdb::db db;      /* hamsterdb database object */
00026   hamsterdb::key key;      /* a key */
00027   hamsterdb::record record;  /* a record */
00028 
00029   /* Create a new environment file and a database in this environment */
00030   env.create("test.db");
00031   db = env.create_db(1);
00032 
00033   /*
00034    * Now we can insert, delete or lookup values in the database
00035    *
00036    * for our test program, we just insert a few values, then look them
00037    * up, then delete them and try to look them up again (which will fail).
00038    */
00039   for (i = 0; i < LOOP; i++) {
00040     key.set_size(sizeof(i));
00041     key.set_data(&i);
00042 
00043     record.set_size(sizeof(i));
00044     record.set_data(&i);
00045 
00046     db.insert(&key, &record);
00047   }
00048 
00049   /*
00050    * Now lookup all values
00051    *
00052    * for db::find(), we could use the flag HAM_RECORD_USER_ALLOC, if WE
00053    * allocate record.data (otherwise the memory is automatically allocated
00054    * by hamsterdb)
00055    */
00056   for (i = 0; i < LOOP; i++) {
00057     key.set_size(sizeof(i));
00058     key.set_data(&i);
00059 
00060     record = db.find(&key);
00061 
00062     /* Check if the value is ok */
00063     if (*(int *)record.get_data() != i) {
00064       std::cerr << "db::find() ok, but returned bad value" << std::endl;
00065       return (-1);
00066     }
00067   }
00068 
00069   /*
00070    * close the database handle, then re-open it (just to demonstrate how
00071    * to open a database file)
00072    */
00073   db.close();
00074   env.close();
00075   env.open("test.db");
00076   db = env.open_db(1);
00077 
00078   /* now erase all values */
00079   for (i = 0; i < LOOP; i++) {
00080     key.set_size(sizeof(i));
00081     key.set_data(&i);
00082 
00083     db.erase(&key);
00084   }
00085 
00086   /*
00087    * Once more we try to find all values. Every db::find() call must
00088    * now fail with HAM_KEY_NOT_FOUND
00089    */
00090   for (i = 0; i < LOOP; i++) {
00091     key.set_size(sizeof(i));
00092     key.set_data(&i);
00093 
00094     try {
00095       record = db.find(&key);
00096     }
00097     catch (hamsterdb::error &e) {
00098       if (e.get_errno() != HAM_KEY_NOT_FOUND) {
00099         std::cerr << "db::find() returned error " << e.get_string()
00100               << std::endl;
00101         return (-1);
00102       }
00103     }
00104   }
00105 
00106   /*
00107    * Done! No need to close the database handles, they are closed in their
00108    * destructor.
00109    */
00110 
00111   std::cout << "success!" << std::endl;
00112   return (0);
00113 }
00114 
00115 int
00116 main(int argc, char **argv)
00117 {
00118   try {
00119     return (run_demo());
00120   }
00121   catch (hamsterdb::error &e) {
00122     std::cerr << "run_demo() failed with unexpected error "
00123           << e.get_errno() << " ('"
00124           << e.get_string() << "')" << std::endl;
00125     return (-1);
00126   }
00127 }