|
hamsterdb Embedded Database
2.1.1
|
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 }
1.7.6.1