0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include <stdio.h>
0018 #include <stdlib.h>
0019 #include <time.h>
0020 #include <unistd.h>
0021
0022 #include "exdb.h"
0023
0024 #define E(expr) CHECK((rc = (expr)) == EDB_SUCCESS, #expr)
0025 #define RES(err, expr) ((rc = expr) == (err) || (CHECK(!rc, #expr), 0))
0026 #define CHECK(test, msg) ((test) ? (void)0 : ((void)fprintf(stderr, \
0027 "%s:%d: %s: %s\n", __FILE__, __LINE__, msg, edb_strerror(rc)), abort()))
0028
0029 int main(int argc, char **argv)
0030 {
0031 int i = 0, j = 0, rc;
0032 EDB_env *env;
0033 EDB_dbi dbi;
0034 EDB_val key, data;
0035 EDB_txn *txn;
0036 EDB_stat mst;
0037 EDB_cursor *cursor;
0038 int count;
0039 int *values;
0040 char sval[32] = "";
0041 int sleeps;
0042
0043 if (argc < 2)
0044 {
0045 fprintf(stderr, "usage: %s <sync_seconds_sleeps> [R]\n where R - start with RO tran\n", argv[0]);
0046 exit(1);
0047 }
0048 sleeps = atoi(argv[1]);
0049
0050 srand(time(NULL));
0051
0052 count = (rand()%384) + 64;
0053 values = (int *)malloc(count*sizeof(int));
0054
0055 for(i = 0;i<count;i++) {
0056 values[i] = rand()%1024;
0057 }
0058
0059 E(edb_env_create(&env));
0060 E(edb_env_set_maxreaders(env, 2));
0061 E(edb_env_set_mapsize(env, 10485760));
0062 E(edb_env_set_maxdbs(env, 4));
0063 E(edb_env_open(env, "./testdb", 0, 0664));
0064
0065 if (2==argc)
0066 {
0067 fprintf(stderr, "About to begin RW....\n");
0068 E(edb_txn_begin(env, NULL, 0, &txn));
0069 fprintf(stderr, "After begin RW....\n");
0070 E(edb_dbi_open(txn, "id1", EDB_CREATE, &dbi));
0071 }
0072 else
0073 {
0074 fprintf(stderr, "About to begin RO (env)....\n");
0075 E(edb_txn_begin(env, NULL, EDB_RDONLY, &txn));
0076 fprintf(stderr, "After begin RO (env)....\n");
0077 E(edb_dbi_open(txn, "id1", 0, &dbi));
0078 }
0079
0080 fprintf(stderr, "About to commit (env)....\n");
0081 E(edb_txn_commit(txn));
0082 fprintf(stderr, "About commit (env)....\n");
0083
0084
0085 key.mv_size = sizeof(int);
0086 key.mv_data = sval;
0087
0088
0089
0090
0091 if (2==argc)
0092 {
0093 fprintf(stderr, "About to begin RW....\n");
0094 E(edb_txn_begin(env, NULL, 0, &txn));
0095 fprintf(stderr, "After begin RW....\n");
0096 fprintf(stderr, "Adding %d values -> about to sleep (2) %d sec\n", count, sleeps);
0097 sleep(atoi(argv[1]));
0098
0099 fprintf(stderr, "COUNT=%d, After sleep (1) %d sec\n", count, sleeps);
0100 for (i=0;i<count;i++) {
0101 sprintf(sval, "%03x %d foo bar %d", values[i], values[i], sleeps);
0102 data.mv_size = sizeof(sval);
0103 data.mv_data = sval;
0104 if (RES(EDB_KEYEXIST, edb_put(txn, dbi, &key, &data, EDB_NOOVERWRITE)))
0105 j++;
0106 }
0107
0108 if (j) fprintf(stderr, "%d duplicates skipped\n", j);
0109
0110 fprintf(stderr, "About to begin RW COMMIT....\n");
0111 E(edb_txn_commit(txn));
0112 fprintf(stderr, "After RW COMMIT....\n");
0113 }
0114
0115 E(edb_env_stat(env, &mst));
0116
0117
0118 fprintf(stderr, "About to begin RO TRAN....\n");
0119 E(edb_txn_begin(env, NULL, EDB_RDONLY, &txn));
0120 fprintf(stderr, "After RO TRAN....\n");
0121
0122 E(edb_cursor_open(txn, dbi, &cursor));
0123 while ((rc = edb_cursor_get(cursor, &key, &data, EDB_NEXT)) == 0) {
0124 fprintf(stderr, "key: %p %.*s, data: %p %.*s\n",
0125 key.mv_data, (int) key.mv_size, (char *) key.mv_data,
0126 data.mv_data, (int) data.mv_size, (char *) data.mv_data);
0127 }
0128 CHECK(rc == EDB_NOTFOUND, "edb_cursor_get");
0129 edb_cursor_close(cursor);
0130 edb_txn_abort(txn);
0131
0132 j=0;
0133 key.mv_data = sval;
0134 for (i= count - 1; i > -1; i-= (rand()%5)) {
0135 j++;
0136 txn=NULL;
0137
0138 fprintf(stderr, "About to begin RW TRAN....\n");
0139 E(edb_txn_begin(env, NULL, 0, &txn));
0140 fprintf(stderr, "After begin RW TRAN....\n");
0141
0142 sprintf(sval, "%03x ", values[i]);
0143 if (RES(EDB_NOTFOUND, edb_del(txn, dbi, &key, NULL))) {
0144 j--;
0145 fprintf(stderr, "About to ABORT RW TRAN....\n");
0146 edb_txn_abort(txn);
0147 fprintf(stderr, "After ABORT RW TRAN....\n");
0148 } else {
0149 fprintf(stderr, "About to COMMIT RW TRAN....\n");
0150 E(edb_txn_commit(txn));
0151 fprintf(stderr, "After COMMIT RW TRAN....\n");
0152 }
0153 }
0154 free(values);
0155 fprintf(stderr, "Deleted %d values\n", j);
0156
0157 E(edb_env_stat(env, &mst));
0158 E(edb_txn_begin(env, NULL, EDB_RDONLY, &txn));
0159 E(edb_cursor_open(txn, dbi, &cursor));
0160 fprintf(stderr, "Cursor next\n");
0161 while ((rc = edb_cursor_get(cursor, &key, &data, EDB_NEXT)) == 0) {
0162 fprintf(stderr, "key: %.*s, data: %.*s\n",
0163 (int) key.mv_size, (char *) key.mv_data,
0164 (int) data.mv_size, (char *) data.mv_data);
0165 }
0166 CHECK(rc == EDB_NOTFOUND, "edb_cursor_get");
0167 fprintf(stderr, "Cursor prev\n");
0168 while ((rc = edb_cursor_get(cursor, &key, &data, EDB_PREV)) == 0) {
0169 fprintf(stderr, "key: %.*s, data: %.*s\n",
0170 (int) key.mv_size, (char *) key.mv_data,
0171 (int) data.mv_size, (char *) data.mv_data);
0172 }
0173 CHECK(rc == EDB_NOTFOUND, "edb_cursor_get");
0174 edb_cursor_close(cursor);
0175 edb_txn_abort(txn);
0176
0177 edb_dbi_close(env, dbi);
0178 edb_env_close(env);
0179 return 0;
0180 }
0181