hamsterdb Embedded Database 1.1.14

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