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