Import BSDDB 4.7.25 (as of svn r89086)
This commit is contained in:
200
test/scr025/TestMulti.cpp
Normal file
200
test/scr025/TestMulti.cpp
Normal file
@@ -0,0 +1,200 @@
|
||||
#include "db_cxx.h"
|
||||
#include "stdlib.h"
|
||||
|
||||
void test1()
|
||||
{
|
||||
int numberOfKeysToWrite= 10000;
|
||||
Db db(0,DB_CXX_NO_EXCEPTIONS);
|
||||
db.set_pagesize(512);
|
||||
int err= db.open(0, "test1.db", 0, DB_BTREE, DB_CREATE, 0);
|
||||
{
|
||||
int i= 0;
|
||||
Dbt key(&i,sizeof(i));
|
||||
Dbt data(&i,sizeof(i));
|
||||
for(;i<numberOfKeysToWrite;++i)
|
||||
{
|
||||
db.put(0,&key,&data,0);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
Dbc *dbc;
|
||||
err= db.cursor(0,&dbc,0);
|
||||
|
||||
char *check= (char*)calloc(numberOfKeysToWrite,1);
|
||||
char buffer[8192];
|
||||
int numberOfKeysRead= 0;
|
||||
Dbt multikey(&numberOfKeysRead,sizeof(numberOfKeysRead));
|
||||
Dbt multidata(&buffer,sizeof(buffer));
|
||||
multidata.set_flags(DB_DBT_USERMEM);
|
||||
multidata.set_ulen(sizeof(buffer));
|
||||
err= 0;
|
||||
while(err==0)
|
||||
{
|
||||
err= dbc->get(&multikey,&multidata,DB_NEXT|DB_MULTIPLE_KEY);
|
||||
if(err==0)
|
||||
{
|
||||
Dbt key, data;
|
||||
DbMultipleKeyDataIterator i(multidata);
|
||||
while(err==0 && i.next(key,data))
|
||||
{
|
||||
int actualKey= *((int*)key.get_data());
|
||||
int actualData= *((int*)data.get_data());
|
||||
if(actualKey!=actualData)
|
||||
{
|
||||
std::cout << "Error: key/data mismatch. " << actualKey << "!=" << actualData << std::endl;
|
||||
err= -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
check[actualKey]++;
|
||||
}
|
||||
numberOfKeysRead++;
|
||||
}
|
||||
} else if(err!=DB_NOTFOUND)
|
||||
std::cout << "Error: dbc->get: " << db_strerror(err) << std::endl;
|
||||
}
|
||||
if(numberOfKeysRead!=numberOfKeysToWrite)
|
||||
{
|
||||
std::cout << "Error: key count mismatch. " << numberOfKeysRead << "!=" << numberOfKeysToWrite << std::endl;
|
||||
}
|
||||
for(int n=0;n<numberOfKeysToWrite;++n)
|
||||
{
|
||||
if(check[n]!=1)
|
||||
{
|
||||
std::cout << "Error: key " << n << " was written to the database, but not read back." << std::endl;
|
||||
}
|
||||
}
|
||||
free(check);
|
||||
dbc->close();
|
||||
}
|
||||
|
||||
db.close(0);
|
||||
}
|
||||
|
||||
void test2()
|
||||
{
|
||||
int numberOfKeysToWrite= 10000;
|
||||
Db db(0,DB_CXX_NO_EXCEPTIONS);
|
||||
db.set_flags(DB_DUP);
|
||||
db.set_pagesize(512);
|
||||
int err= db.open(0, "test2.db", 0, DB_BTREE, DB_CREATE, 0);
|
||||
|
||||
{
|
||||
int i= 0;
|
||||
int k= 0;
|
||||
Dbt key(&k,sizeof(k));
|
||||
Dbt data(&i,sizeof(i));
|
||||
for(;i<numberOfKeysToWrite;++i)
|
||||
{
|
||||
err= db.put(0,&key,&data,0);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
Dbc *dbc;
|
||||
err= db.cursor(0,&dbc,0);
|
||||
|
||||
char buffer[8192];
|
||||
int numberOfKeysRead= 0;
|
||||
Dbt multikey(&numberOfKeysRead,sizeof(numberOfKeysRead));
|
||||
Dbt multidata(&buffer,sizeof(buffer));
|
||||
multidata.set_flags(DB_DBT_USERMEM);
|
||||
multidata.set_ulen(sizeof(buffer));
|
||||
err= 0;
|
||||
while(err==0)
|
||||
{
|
||||
err= dbc->get(&multikey,&multidata,DB_NEXT|DB_MULTIPLE);
|
||||
if(err==0)
|
||||
{
|
||||
Dbt data;
|
||||
DbMultipleDataIterator i(multidata);
|
||||
while(err==0 && i.next(data))
|
||||
{
|
||||
int actualData= *((int*)data.get_data());
|
||||
if(numberOfKeysRead!=actualData)
|
||||
{
|
||||
std::cout << "Error: key/data mismatch. " << numberOfKeysRead << "!=" << actualData << std::endl;
|
||||
err= -1;
|
||||
}
|
||||
numberOfKeysRead++;
|
||||
}
|
||||
} else if(err!=DB_NOTFOUND)
|
||||
std::cout << "Error: dbc->get: " << db_strerror(err) << std::endl;
|
||||
}
|
||||
if(numberOfKeysRead!=numberOfKeysToWrite)
|
||||
{
|
||||
std::cout << "Error: key count mismatch. " << numberOfKeysRead << "!=" << numberOfKeysToWrite << std::endl;
|
||||
}
|
||||
dbc->close();
|
||||
}
|
||||
db.close(0);
|
||||
}
|
||||
|
||||
void test3()
|
||||
{
|
||||
int numberOfKeysToWrite= 10000;
|
||||
Db db(0,DB_CXX_NO_EXCEPTIONS);
|
||||
db.set_pagesize(512);
|
||||
int err= db.open(0, "test3.db", 0, DB_RECNO, DB_CREATE, 0);
|
||||
|
||||
{
|
||||
int i= 0;
|
||||
Dbt key;
|
||||
Dbt data(&i,sizeof(i));
|
||||
for(;i<numberOfKeysToWrite;++i)
|
||||
{
|
||||
err= db.put(0,&key,&data,DB_APPEND);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
Dbc *dbc;
|
||||
err= db.cursor(0,&dbc,0);
|
||||
|
||||
char buffer[8192];
|
||||
int numberOfKeysRead= 0;
|
||||
Dbt multikey(&numberOfKeysRead,sizeof(numberOfKeysRead));
|
||||
Dbt multidata(&buffer,sizeof(buffer));
|
||||
multidata.set_flags(DB_DBT_USERMEM);
|
||||
multidata.set_ulen(sizeof(buffer));
|
||||
err= 0;
|
||||
while(err==0)
|
||||
{
|
||||
err= dbc->get(&multikey,&multidata,DB_NEXT|DB_MULTIPLE_KEY);
|
||||
if(err==0)
|
||||
{
|
||||
u_int32_t recno= 0;
|
||||
Dbt data;
|
||||
DbMultipleRecnoDataIterator i(multidata);
|
||||
while(err==0 && i.next(recno,data))
|
||||
{
|
||||
int actualData= *((int*)data.get_data());
|
||||
if(recno!=actualData+1)
|
||||
{
|
||||
std::cout << "Error: recno/data mismatch. " << recno << "!=" << actualData << "+1" << std::endl;
|
||||
err= -1;
|
||||
}
|
||||
numberOfKeysRead++;
|
||||
}
|
||||
} else if(err!=DB_NOTFOUND)
|
||||
std::cout << "Error: dbc->get: " << db_strerror(err) << std::endl;
|
||||
}
|
||||
if(numberOfKeysRead!=numberOfKeysToWrite)
|
||||
{
|
||||
std::cout << "Error: key count mismatch. " << numberOfKeysRead << "!=" << numberOfKeysToWrite << std::endl;
|
||||
}
|
||||
dbc->close();
|
||||
}
|
||||
|
||||
db.close(0);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test1();
|
||||
test2();
|
||||
test3();
|
||||
return (0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user