mtest6.c revision 1.1.1.1
1/*	$NetBSD: mtest6.c,v 1.1.1.1 2014/05/28 09:58:42 tron Exp $	*/
2
3/* mtest6.c - memory-mapped database tester/toy */
4/*
5 * Copyright 2011 Howard Chu, Symas Corp.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted only as authorized by the OpenLDAP
10 * Public License.
11 *
12 * A copy of this license is available in the file LICENSE in the
13 * top-level directory of the distribution or, alternatively, at
14 * <http://www.OpenLDAP.org/license.html>.
15 */
16
17/* Tests for DB splits and merges */
18#define _XOPEN_SOURCE 500		/* srandom(), random() */
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22#include <time.h>
23#include "lmdb.h"
24
25char dkbuf[1024];
26
27int main(int argc,char * argv[])
28{
29	int i = 0, j = 0, rc;
30	MDB_env *env;
31	MDB_dbi dbi;
32	MDB_val key, data;
33	MDB_txn *txn;
34	MDB_stat mst;
35	MDB_cursor *cursor;
36	int count;
37	int *values;
38	long kval;
39	char *sval;
40
41	srandom(time(NULL));
42
43	rc = mdb_env_create(&env);
44	rc = mdb_env_set_mapsize(env, 10485760);
45	rc = mdb_env_set_maxdbs(env, 4);
46	rc = mdb_env_open(env, "./testdb", MDB_FIXEDMAP|MDB_NOSYNC, 0664);
47	rc = mdb_txn_begin(env, NULL, 0, &txn);
48	rc = mdb_open(txn, "id2", MDB_CREATE|MDB_INTEGERKEY, &dbi);
49	rc = mdb_cursor_open(txn, dbi, &cursor);
50	rc = mdb_stat(txn, dbi, &mst);
51
52	sval = calloc(1, mst.ms_psize / 4);
53	key.mv_size = sizeof(long);
54	key.mv_data = &kval;
55	data.mv_size = mst.ms_psize / 4 - 30;
56	data.mv_data = sval;
57
58	printf("Adding 12 values, should yield 3 splits\n");
59	for (i=0;i<12;i++) {
60		kval = i*5;
61		sprintf(sval, "%08x", kval);
62		rc = mdb_cursor_put(cursor, &key, &data, MDB_NOOVERWRITE);
63	}
64	printf("Adding 12 more values, should yield 3 splits\n");
65	for (i=0;i<12;i++) {
66		kval = i*5+4;
67		sprintf(sval, "%08x", kval);
68		rc = mdb_cursor_put(cursor, &key, &data, MDB_NOOVERWRITE);
69	}
70	printf("Adding 12 more values, should yield 3 splits\n");
71	for (i=0;i<12;i++) {
72		kval = i*5+1;
73		sprintf(sval, "%08x", kval);
74		rc = mdb_cursor_put(cursor, &key, &data, MDB_NOOVERWRITE);
75	}
76	rc = mdb_cursor_get(cursor, &key, &data, MDB_FIRST);
77
78	do {
79		printf("key: %p %s, data: %p %.*s\n",
80			key.mv_data,  mdb_dkey(&key, dkbuf),
81			data.mv_data, (int) data.mv_size, (char *) data.mv_data);
82	} while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0);
83	mdb_cursor_close(cursor);
84	mdb_txn_commit(txn);
85
86#if 0
87	j=0;
88
89	for (i= count - 1; i > -1; i-= (random()%5)) {
90		j++;
91		txn=NULL;
92		rc = mdb_txn_begin(env, NULL, 0, &txn);
93		sprintf(kval, "%03x", values[i & ~0x0f]);
94		sprintf(sval, "%03x %d foo bar", values[i], values[i]);
95		key.mv_size = sizeof(int);
96		key.mv_data = kval;
97		data.mv_size = sizeof(sval);
98		data.mv_data = sval;
99		rc = mdb_del(txn, dbi, &key, &data);
100		if (rc) {
101			j--;
102			mdb_txn_abort(txn);
103		} else {
104			rc = mdb_txn_commit(txn);
105		}
106	}
107	free(values);
108	printf("Deleted %d values\n", j);
109
110	rc = mdb_env_stat(env, &mst);
111	rc = mdb_txn_begin(env, NULL, 1, &txn);
112	rc = mdb_cursor_open(txn, dbi, &cursor);
113	printf("Cursor next\n");
114	while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
115		printf("key: %.*s, data: %.*s\n",
116			(int) key.mv_size,  (char *) key.mv_data,
117			(int) data.mv_size, (char *) data.mv_data);
118	}
119	printf("Cursor prev\n");
120	while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_PREV)) == 0) {
121		printf("key: %.*s, data: %.*s\n",
122			(int) key.mv_size,  (char *) key.mv_data,
123			(int) data.mv_size, (char *) data.mv_data);
124	}
125	mdb_cursor_close(cursor);
126	mdb_close(txn, dbi);
127
128	mdb_txn_abort(txn);
129#endif
130	mdb_env_close(env);
131
132	return 0;
133}
134