00001 #include "db_cxx.h" 00002 #include "stdlib.h" 00003 00004 void test1() 00005 { 00006 int numberOfKeysToWrite= 10000; 00007 Db db(0,DB_CXX_NO_EXCEPTIONS); 00008 db.set_pagesize(512); 00009 int err= db.open(0, "test1.db", 0, DB_BTREE, DB_CREATE, 0); 00010 { 00011 int i= 0; 00012 Dbt key(&i,sizeof(i)); 00013 Dbt data(&i,sizeof(i)); 00014 for(;i<numberOfKeysToWrite;++i) 00015 { 00016 db.put(0,&key,&data,0); 00017 } 00018 } 00019 00020 { 00021 Dbc *dbc; 00022 err= db.cursor(0,&dbc,0); 00023 00024 char *check= (char*)calloc(numberOfKeysToWrite,1); 00025 char buffer[8192]; 00026 int numberOfKeysRead= 0; 00027 Dbt multikey(&numberOfKeysRead,sizeof(numberOfKeysRead)); 00028 Dbt multidata(&buffer,sizeof(buffer)); 00029 multidata.set_flags(DB_DBT_USERMEM); 00030 multidata.set_ulen(sizeof(buffer)); 00031 err= 0; 00032 while(err==0) 00033 { 00034 err= dbc->get(&multikey,&multidata,DB_NEXT|DB_MULTIPLE_KEY); 00035 if(err==0) 00036 { 00037 Dbt key, data; 00038 DbMultipleKeyDataIterator i(multidata); 00039 while(err==0 && i.next(key,data)) 00040 { 00041 int actualKey= *((int*)key.get_data()); 00042 int actualData= *((int*)data.get_data()); 00043 if(actualKey!=actualData) 00044 { 00045 std::cout << "Error: key/data mismatch. " << actualKey << "!=" << actualData << std::endl; 00046 err= -1; 00047 } 00048 else 00049 { 00050 check[actualKey]++; 00051 } 00052 numberOfKeysRead++; 00053 } 00054 } else if(err!=DB_NOTFOUND) 00055 std::cout << "Error: dbc->get: " << db_strerror(err) << std::endl; 00056 } 00057 if(numberOfKeysRead!=numberOfKeysToWrite) 00058 { 00059 std::cout << "Error: key count mismatch. " << numberOfKeysRead << "!=" << numberOfKeysToWrite << std::endl; 00060 } 00061 for(int n=0;n<numberOfKeysToWrite;++n) 00062 { 00063 if(check[n]!=1) 00064 { 00065 std::cout << "Error: key " << n << " was written to the database, but not read back." << std::endl; 00066 } 00067 } 00068 free(check); 00069 dbc->close(); 00070 } 00071 00072 db.close(0); 00073 } 00074 00075 void test2() 00076 { 00077 int numberOfKeysToWrite= 10000; 00078 Db db(0,DB_CXX_NO_EXCEPTIONS); 00079 db.set_flags(DB_DUP); 00080 db.set_pagesize(512); 00081 int err= db.open(0, "test2.db", 0, DB_BTREE, DB_CREATE, 0); 00082 00083 { 00084 int i= 0; 00085 int k= 0; 00086 Dbt key(&k,sizeof(k)); 00087 Dbt data(&i,sizeof(i)); 00088 for(;i<numberOfKeysToWrite;++i) 00089 { 00090 err= db.put(0,&key,&data,0); 00091 } 00092 } 00093 00094 { 00095 Dbc *dbc; 00096 err= db.cursor(0,&dbc,0); 00097 00098 char buffer[8192]; 00099 int numberOfKeysRead= 0; 00100 Dbt multikey(&numberOfKeysRead,sizeof(numberOfKeysRead)); 00101 Dbt multidata(&buffer,sizeof(buffer)); 00102 multidata.set_flags(DB_DBT_USERMEM); 00103 multidata.set_ulen(sizeof(buffer)); 00104 err= 0; 00105 while(err==0) 00106 { 00107 err= dbc->get(&multikey,&multidata,DB_NEXT|DB_MULTIPLE); 00108 if(err==0) 00109 { 00110 Dbt data; 00111 DbMultipleDataIterator i(multidata); 00112 while(err==0 && i.next(data)) 00113 { 00114 int actualData= *((int*)data.get_data()); 00115 if(numberOfKeysRead!=actualData) 00116 { 00117 std::cout << "Error: key/data mismatch. " << numberOfKeysRead << "!=" << actualData << std::endl; 00118 err= -1; 00119 } 00120 numberOfKeysRead++; 00121 } 00122 } else if(err!=DB_NOTFOUND) 00123 std::cout << "Error: dbc->get: " << db_strerror(err) << std::endl; 00124 } 00125 if(numberOfKeysRead!=numberOfKeysToWrite) 00126 { 00127 std::cout << "Error: key count mismatch. " << numberOfKeysRead << "!=" << numberOfKeysToWrite << std::endl; 00128 } 00129 dbc->close(); 00130 } 00131 db.close(0); 00132 } 00133 00134 void test3() 00135 { 00136 int numberOfKeysToWrite= 10000; 00137 Db db(0,DB_CXX_NO_EXCEPTIONS); 00138 db.set_pagesize(512); 00139 int err= db.open(0, "test3.db", 0, DB_RECNO, DB_CREATE, 0); 00140 00141 { 00142 int i= 0; 00143 Dbt key; 00144 Dbt data(&i,sizeof(i)); 00145 for(;i<numberOfKeysToWrite;++i) 00146 { 00147 err= db.put(0,&key,&data,DB_APPEND); 00148 } 00149 } 00150 00151 { 00152 Dbc *dbc; 00153 err= db.cursor(0,&dbc,0); 00154 00155 char buffer[8192]; 00156 int numberOfKeysRead= 0; 00157 Dbt multikey(&numberOfKeysRead,sizeof(numberOfKeysRead)); 00158 Dbt multidata(&buffer,sizeof(buffer)); 00159 multidata.set_flags(DB_DBT_USERMEM); 00160 multidata.set_ulen(sizeof(buffer)); 00161 err= 0; 00162 while(err==0) 00163 { 00164 err= dbc->get(&multikey,&multidata,DB_NEXT|DB_MULTIPLE_KEY); 00165 if(err==0) 00166 { 00167 u_int32_t recno= 0; 00168 Dbt data; 00169 DbMultipleRecnoDataIterator i(multidata); 00170 while(err==0 && i.next(recno,data)) 00171 { 00172 int actualData= *((int*)data.get_data()); 00173 if(recno!=actualData+1) 00174 { 00175 std::cout << "Error: recno/data mismatch. " << recno << "!=" << actualData << "+1" << std::endl; 00176 err= -1; 00177 } 00178 numberOfKeysRead++; 00179 } 00180 } else if(err!=DB_NOTFOUND) 00181 std::cout << "Error: dbc->get: " << db_strerror(err) << std::endl; 00182 } 00183 if(numberOfKeysRead!=numberOfKeysToWrite) 00184 { 00185 std::cout << "Error: key count mismatch. " << numberOfKeysRead << "!=" << numberOfKeysToWrite << std::endl; 00186 } 00187 dbc->close(); 00188 } 00189 00190 db.close(0); 00191 } 00192 00193 int main() 00194 { 00195 test1(); 00196 test2(); 00197 test3(); 00198 return (0); 00199 } 00200