1 /* $NetBSD: mtest3.c,v 1.1.1.1 2014/05/28 09:58:42 tron Exp $ */ 2 3 /* mtest3.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 sorted duplicate DBs */ 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 25 int main(int argc,char * argv[]) 26 { 27 int i = 0, j = 0, rc; 28 MDB_env *env; 29 MDB_dbi dbi; 30 MDB_val key, data; 31 MDB_txn *txn; 32 MDB_stat mst; 33 MDB_cursor *cursor; 34 int count; 35 int *values; 36 char sval[32]; 37 char kval[sizeof(int)]; 38 39 srandom(time(NULL)); 40 41 memset(sval, 0, sizeof(sval)); 42 43 count = (random()%384) + 64; 44 values = (int *)malloc(count*sizeof(int)); 45 46 for(i = 0;i<count;i++) { 47 values[i] = random()%1024; 48 } 49 50 rc = mdb_env_create(&env); 51 rc = mdb_env_set_mapsize(env, 10485760); 52 rc = mdb_env_set_maxdbs(env, 4); 53 rc = mdb_env_open(env, "./testdb", MDB_FIXEDMAP|MDB_NOSYNC, 0664); 54 rc = mdb_txn_begin(env, NULL, 0, &txn); 55 rc = mdb_open(txn, "id2", MDB_CREATE|MDB_DUPSORT, &dbi); 56 57 key.mv_size = sizeof(int); 58 key.mv_data = kval; 59 data.mv_size = sizeof(sval); 60 data.mv_data = sval; 61 62 printf("Adding %d values\n", count); 63 for (i=0;i<count;i++) { 64 if (!(i & 0x0f)) 65 sprintf(kval, "%03x", values[i]); 66 sprintf(sval, "%03x %d foo bar", values[i], values[i]); 67 rc = mdb_put(txn, dbi, &key, &data, MDB_NODUPDATA); 68 if (rc) j++; 69 } 70 if (j) printf("%d duplicates skipped\n", j); 71 rc = mdb_txn_commit(txn); 72 rc = mdb_env_stat(env, &mst); 73 74 rc = mdb_txn_begin(env, NULL, 1, &txn); 75 rc = mdb_cursor_open(txn, dbi, &cursor); 76 while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { 77 printf("key: %p %.*s, data: %p %.*s\n", 78 key.mv_data, (int) key.mv_size, (char *) key.mv_data, 79 data.mv_data, (int) data.mv_size, (char *) data.mv_data); 80 } 81 mdb_cursor_close(cursor); 82 mdb_txn_abort(txn); 83 84 j=0; 85 86 for (i= count - 1; i > -1; i-= (random()%5)) { 87 j++; 88 txn=NULL; 89 rc = mdb_txn_begin(env, NULL, 0, &txn); 90 sprintf(kval, "%03x", values[i & ~0x0f]); 91 sprintf(sval, "%03x %d foo bar", values[i], values[i]); 92 key.mv_size = sizeof(int); 93 key.mv_data = kval; 94 data.mv_size = sizeof(sval); 95 data.mv_data = sval; 96 rc = mdb_del(txn, dbi, &key, &data); 97 if (rc) { 98 j--; 99 mdb_txn_abort(txn); 100 } else { 101 rc = mdb_txn_commit(txn); 102 } 103 } 104 free(values); 105 printf("Deleted %d values\n", j); 106 107 rc = mdb_env_stat(env, &mst); 108 rc = mdb_txn_begin(env, NULL, 1, &txn); 109 rc = mdb_cursor_open(txn, dbi, &cursor); 110 printf("Cursor next\n"); 111 while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { 112 printf("key: %.*s, data: %.*s\n", 113 (int) key.mv_size, (char *) key.mv_data, 114 (int) data.mv_size, (char *) data.mv_data); 115 } 116 printf("Cursor prev\n"); 117 while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_PREV)) == 0) { 118 printf("key: %.*s, data: %.*s\n", 119 (int) key.mv_size, (char *) key.mv_data, 120 (int) data.mv_size, (char *) data.mv_data); 121 } 122 mdb_cursor_close(cursor); 123 mdb_close(env, dbi); 124 125 mdb_txn_abort(txn); 126 mdb_env_close(env); 127 128 return 0; 129 } 130