1#include "db_cxx.h" 2#include "stdlib.h" 3 4void test1() 5{ 6 int numberOfKeysToWrite= 10000; 7 Db db(0,DB_CXX_NO_EXCEPTIONS); 8 db.set_pagesize(512); 9 int err= db.open(0, "test1.db", 0, DB_BTREE, DB_CREATE, 0); 10 { 11 int i= 0; 12 Dbt key(&i,sizeof(i)); 13 Dbt data(&i,sizeof(i)); 14 for(;i<numberOfKeysToWrite;++i) 15 { 16 db.put(0,&key,&data,0); 17 } 18 } 19 20 { 21 Dbc *dbc; 22 err= db.cursor(0,&dbc,0); 23 24 char *check= (char*)calloc(numberOfKeysToWrite,1); 25 char buffer[8192]; 26 int numberOfKeysRead= 0; 27 Dbt multikey(&numberOfKeysRead,sizeof(numberOfKeysRead)); 28 Dbt multidata(&buffer,sizeof(buffer)); 29 multidata.set_flags(DB_DBT_USERMEM); 30 multidata.set_ulen(sizeof(buffer)); 31 err= 0; 32 while(err==0) 33 { 34 err= dbc->get(&multikey,&multidata,DB_NEXT|DB_MULTIPLE_KEY); 35 if(err==0) 36 { 37 Dbt key, data; 38 DbMultipleKeyDataIterator i(multidata); 39 while(err==0 && i.next(key,data)) 40 { 41 int actualKey= *((int*)key.get_data()); 42 int actualData= *((int*)data.get_data()); 43 if(actualKey!=actualData) 44 { 45 std::cout << "Error: key/data mismatch. " << actualKey << "!=" << actualData << std::endl; 46 err= -1; 47 } 48 else 49 { 50 check[actualKey]++; 51 } 52 numberOfKeysRead++; 53 } 54 } else if(err!=DB_NOTFOUND) 55 std::cout << "Error: dbc->get: " << db_strerror(err) << std::endl; 56 } 57 if(numberOfKeysRead!=numberOfKeysToWrite) 58 { 59 std::cout << "Error: key count mismatch. " << numberOfKeysRead << "!=" << numberOfKeysToWrite << std::endl; 60 } 61 for(int n=0;n<numberOfKeysToWrite;++n) 62 { 63 if(check[n]!=1) 64 { 65 std::cout << "Error: key " << n << " was written to the database, but not read back." << std::endl; 66 } 67 } 68 free(check); 69 dbc->close(); 70 } 71 72 db.close(0); 73} 74 75void test2() 76{ 77 int numberOfKeysToWrite= 10000; 78 Db db(0,DB_CXX_NO_EXCEPTIONS); 79 db.set_flags(DB_DUP); 80 db.set_pagesize(512); 81 int err= db.open(0, "test2.db", 0, DB_BTREE, DB_CREATE, 0); 82 83 { 84 int i= 0; 85 int k= 0; 86 Dbt key(&k,sizeof(k)); 87 Dbt data(&i,sizeof(i)); 88 for(;i<numberOfKeysToWrite;++i) 89 { 90 err= db.put(0,&key,&data,0); 91 } 92 } 93 94 { 95 Dbc *dbc; 96 err= db.cursor(0,&dbc,0); 97 98 char buffer[8192]; 99 int numberOfKeysRead= 0; 100 Dbt multikey(&numberOfKeysRead,sizeof(numberOfKeysRead)); 101 Dbt multidata(&buffer,sizeof(buffer)); 102 multidata.set_flags(DB_DBT_USERMEM); 103 multidata.set_ulen(sizeof(buffer)); 104 err= 0; 105 while(err==0) 106 { 107 err= dbc->get(&multikey,&multidata,DB_NEXT|DB_MULTIPLE); 108 if(err==0) 109 { 110 Dbt data; 111 DbMultipleDataIterator i(multidata); 112 while(err==0 && i.next(data)) 113 { 114 int actualData= *((int*)data.get_data()); 115 if(numberOfKeysRead!=actualData) 116 { 117 std::cout << "Error: key/data mismatch. " << numberOfKeysRead << "!=" << actualData << std::endl; 118 err= -1; 119 } 120 numberOfKeysRead++; 121 } 122 } else if(err!=DB_NOTFOUND) 123 std::cout << "Error: dbc->get: " << db_strerror(err) << std::endl; 124 } 125 if(numberOfKeysRead!=numberOfKeysToWrite) 126 { 127 std::cout << "Error: key count mismatch. " << numberOfKeysRead << "!=" << numberOfKeysToWrite << std::endl; 128 } 129 dbc->close(); 130 } 131 db.close(0); 132} 133 134void test3() 135{ 136 int numberOfKeysToWrite= 10000; 137 Db db(0,DB_CXX_NO_EXCEPTIONS); 138 db.set_pagesize(512); 139 int err= db.open(0, "test3.db", 0, DB_RECNO, DB_CREATE, 0); 140 141 { 142 int i= 0; 143 Dbt key; 144 Dbt data(&i,sizeof(i)); 145 for(;i<numberOfKeysToWrite;++i) 146 { 147 err= db.put(0,&key,&data,DB_APPEND); 148 } 149 } 150 151 { 152 Dbc *dbc; 153 err= db.cursor(0,&dbc,0); 154 155 char buffer[8192]; 156 int numberOfKeysRead= 0; 157 Dbt multikey(&numberOfKeysRead,sizeof(numberOfKeysRead)); 158 Dbt multidata(&buffer,sizeof(buffer)); 159 multidata.set_flags(DB_DBT_USERMEM); 160 multidata.set_ulen(sizeof(buffer)); 161 err= 0; 162 while(err==0) 163 { 164 err= dbc->get(&multikey,&multidata,DB_NEXT|DB_MULTIPLE_KEY); 165 if(err==0) 166 { 167 u_int32_t recno= 0; 168 Dbt data; 169 DbMultipleRecnoDataIterator i(multidata); 170 while(err==0 && i.next(recno,data)) 171 { 172 int actualData= *((int*)data.get_data()); 173 if(recno!=actualData+1) 174 { 175 std::cout << "Error: recno/data mismatch. " << recno << "!=" << actualData << "+1" << std::endl; 176 err= -1; 177 } 178 numberOfKeysRead++; 179 } 180 } else if(err!=DB_NOTFOUND) 181 std::cout << "Error: dbc->get: " << db_strerror(err) << std::endl; 182 } 183 if(numberOfKeysRead!=numberOfKeysToWrite) 184 { 185 std::cout << "Error: key count mismatch. " << numberOfKeysRead << "!=" << numberOfKeysToWrite << std::endl; 186 } 187 dbc->close(); 188 } 189 190 db.close(0); 191} 192 193int main() 194{ 195 test1(); 196 test2(); 197 test3(); 198 return (0); 199} 200 201