1 /* $NetBSD: mtest5.c,v 1.1.1.1 2014/05/28 09:58:42 tron Exp $ */ 2 3 /* mtest5.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 using cursor_put */ 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 rc = mdb_cursor_open(txn, dbi, &cursor); 57 58 key.mv_size = sizeof(int); 59 key.mv_data = kval; 60 data.mv_size = sizeof(sval); 61 data.mv_data = sval; 62 63 printf("Adding %d values\n", count); 64 for (i=0;i<count;i++) { 65 if (!(i & 0x0f)) 66 sprintf(kval, "%03x", values[i]); 67 sprintf(sval, "%03x %d foo bar", values[i], values[i]); 68 rc = mdb_cursor_put(cursor, &key, &data, MDB_NODUPDATA); 69 if (rc) j++; 70 } 71 if (j) printf("%d duplicates skipped\n", j); 72 mdb_cursor_close(cursor); 73 rc = mdb_txn_commit(txn); 74 rc = mdb_env_stat(env, &mst); 75 76 rc = mdb_txn_begin(env, NULL, 1, &txn); 77 rc = mdb_cursor_open(txn, dbi, &cursor); 78 while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { 79 printf("key: %p %.*s, data: %p %.*s\n", 80 key.mv_data, (int) key.mv_size, (char *) key.mv_data, 81 data.mv_data, (int) data.mv_size, (char *) data.mv_data); 82 } 83 mdb_cursor_close(cursor); 84 mdb_txn_abort(txn); 85 86 j=0; 87 88 for (i= count - 1; i > -1; i-= (random()%5)) { 89 j++; 90 txn=NULL; 91 rc = mdb_txn_begin(env, NULL, 0, &txn); 92 sprintf(kval, "%03x", values[i & ~0x0f]); 93 sprintf(sval, "%03x %d foo bar", values[i], values[i]); 94 key.mv_size = sizeof(int); 95 key.mv_data = kval; 96 data.mv_size = sizeof(sval); 97 data.mv_data = sval; 98 rc = mdb_del(txn, dbi, &key, &data); 99 if (rc) { 100 j--; 101 mdb_txn_abort(txn); 102 } else { 103 rc = mdb_txn_commit(txn); 104 } 105 } 106 free(values); 107 printf("Deleted %d values\n", j); 108 109 rc = mdb_env_stat(env, &mst); 110 rc = mdb_txn_begin(env, NULL, 1, &txn); 111 rc = mdb_cursor_open(txn, dbi, &cursor); 112 printf("Cursor next\n"); 113 while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { 114 printf("key: %.*s, data: %.*s\n", 115 (int) key.mv_size, (char *) key.mv_data, 116 (int) data.mv_size, (char *) data.mv_data); 117 } 118 printf("Cursor prev\n"); 119 while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_PREV)) == 0) { 120 printf("key: %.*s, data: %.*s\n", 121 (int) key.mv_size, (char *) key.mv_data, 122 (int) data.mv_size, (char *) data.mv_data); 123 } 124 mdb_cursor_close(cursor); 125 mdb_close(env, dbi); 126 127 mdb_txn_abort(txn); 128 mdb_env_close(env); 129 130 return 0; 131 } 132