RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [email protected] Module: rpm Date: 21-Jul-2017 17:14:23 Branch: rpm-5_4 Handle: 2017072115142300 Added files: (Branch: rpm-5_4) rpm/rpmdb lmdb.c Modified files: (Branch: rpm-5_4) rpm/rpmdb .cvsignore Makefile.am Log: - lmdb: swipe mtest.c. Summary: Revision Changes Path 1.17.4.6 +2 -0 rpm/rpmdb/.cvsignore 1.134.2.37 +4 -1 rpm/rpmdb/Makefile.am 1.1.2.1 +164 -0 rpm/rpmdb/lmdb.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmdb/.cvsignore ============================================================================ $ cvs diff -u -r1.17.4.5 -r1.17.4.6 .cvsignore --- rpm/rpmdb/.cvsignore 16 Jul 2017 18:59:15 -0000 1.17.4.5 +++ rpm/rpmdb/.cvsignore 21 Jul 2017 15:14:23 -0000 1.17.4.6 @@ -30,6 +30,8 @@ tqf.[ch] HOME rpmdb +testdb +lmdb .libs *.gcda *.gcno @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/Makefile.am ============================================================================ $ cvs diff -u -r1.134.2.36 -r1.134.2.37 Makefile.am --- rpm/rpmdb/Makefile.am 25 Jun 2016 08:32:58 -0000 1.134.2.36 +++ rpm/rpmdb/Makefile.am 21 Jul 2017 15:14:23 -0000 1.134.2.37 @@ -37,7 +37,7 @@ logio_rec.c logio_auto.c logio_autop.c logio_auto.h \ _rpmhash.C _rpmhash.H -EXTRA_PROGRAMS = json qfcalc qfgraph logio tjfn tqf tprintf # tbdb +EXTRA_PROGRAMS = json qfcalc qfgraph logio tjfn tqf tprintf lmdb # tbdb noinst_PROGRAMS = RPMMISC_LDADD_COMMON = \ @@ -329,6 +329,9 @@ logio_SOURCES = logio.c logio.h logio_LDADD = $(mylibs) +lmdb_SOURCES = lmdb.c +lmdb_LDADD = $(mylibs) + #libsqldb_la_SOURCES = libsqldb.c # sqlite.c #libsqldb_la_LIBADD = $(RPMIO_LDADD_COMMON) @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/lmdb.c ============================================================================ $ cvs diff -u -r0 -r1.1.2.1 lmdb.c --- /dev/null 2017-07-21 17:11:00.000000000 +0200 +++ lmdb.c 2017-07-21 17:14:23.819135311 +0200 @@ -0,0 +1,164 @@ +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include "lmdb.h" + +#define E(expr) CHECK((rc = (expr)) == MDB_SUCCESS, #expr) +#define RES(err, expr) ((rc = expr) == (err) || (CHECK(!rc, #expr), 0)) +#define CHECK(test, msg) ((test) ? (void)0 : ((void)fprintf(stderr, \ + "%s:%d: %s: %s\n", __FILE__, __LINE__, msg, mdb_strerror(rc)), abort())) + +int main(int argc, char *argv[]) +{ + int i = 0, j = 0, rc; + MDB_env *env; + MDB_dbi dbi; + MDB_val key, data; + MDB_txn *txn; + MDB_stat mst; + MDB_cursor *cursor, *cur2; + MDB_cursor_op op; + int count; + int *values; + char sval[32] = ""; + + srand(time(NULL)); + + count = (rand() % 384) + 64; + values = (int *) malloc(count * sizeof(int)); + + for (i = 0; i < count; i++) + values[i] = rand() % 1024; + + E(mdb_env_create(&env)); + E(mdb_env_set_maxreaders(env, 1)); + E(mdb_env_set_mapsize(env, 10485760)); + E(mdb_env_open(env, "./testdb", MDB_FIXEDMAP /*|MDB_NOSYNC */ , 0664)); + + E(mdb_txn_begin(env, NULL, 0, &txn)); + E(mdb_dbi_open(txn, NULL, 0, &dbi)); + + key.mv_size = sizeof(int); + key.mv_data = sval; + + printf("Adding %d values\n", count); + for (i = 0; i < count; i++) { + sprintf(sval, "%03x %d foo bar", values[i], values[i]); + /* Set <data> in each iteration, since MDB_NOOVERWRITE may modify it */ + data.mv_size = sizeof(sval); + data.mv_data = sval; + if (RES(MDB_KEYEXIST, mdb_put(txn, dbi, &key, &data, MDB_NOOVERWRITE))) { + j++; + data.mv_size = sizeof(sval); + data.mv_data = sval; + } + } + if (j) + printf("%d duplicates skipped\n", j); + E(mdb_txn_commit(txn)); + E(mdb_env_stat(env, &mst)); + + E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn)); + E(mdb_cursor_open(txn, dbi, &cursor)); + while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { + printf("key: %p %.*s, data: %p %.*s\n", + key.mv_data, (int) key.mv_size, (char *) key.mv_data, + data.mv_data, (int) data.mv_size, (char *) data.mv_data); + } + CHECK(rc == MDB_NOTFOUND, "mdb_cursor_get"); + mdb_cursor_close(cursor); + mdb_txn_abort(txn); + + j = 0; + key.mv_data = sval; + for (i = count - 1; i > -1; i -= (rand() % 5)) { + j++; + txn = NULL; + E(mdb_txn_begin(env, NULL, 0, &txn)); + sprintf(sval, "%03x ", values[i]); + if (RES(MDB_NOTFOUND, mdb_del(txn, dbi, &key, NULL))) { + j--; + mdb_txn_abort(txn); + } else { + E(mdb_txn_commit(txn)); + } + } + free(values); + printf("Deleted %d values\n", j); + + E(mdb_env_stat(env, &mst)); + E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn)); + E(mdb_cursor_open(txn, dbi, &cursor)); + printf("Cursor next\n"); + while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { + printf("key: %.*s, data: %.*s\n", + (int) key.mv_size, (char *) key.mv_data, + (int) data.mv_size, (char *) data.mv_data); + } + CHECK(rc == MDB_NOTFOUND, "mdb_cursor_get"); + printf("Cursor last\n"); + E(mdb_cursor_get(cursor, &key, &data, MDB_LAST)); + printf("key: %.*s, data: %.*s\n", + (int) key.mv_size, (char *) key.mv_data, + (int) data.mv_size, (char *) data.mv_data); + printf("Cursor prev\n"); + while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_PREV)) == 0) { + printf("key: %.*s, data: %.*s\n", + (int) key.mv_size, (char *) key.mv_data, + (int) data.mv_size, (char *) data.mv_data); + } + CHECK(rc == MDB_NOTFOUND, "mdb_cursor_get"); + printf("Cursor last/prev\n"); + E(mdb_cursor_get(cursor, &key, &data, MDB_LAST)); + printf("key: %.*s, data: %.*s\n", + (int) key.mv_size, (char *) key.mv_data, + (int) data.mv_size, (char *) data.mv_data); + E(mdb_cursor_get(cursor, &key, &data, MDB_PREV)); + printf("key: %.*s, data: %.*s\n", + (int) key.mv_size, (char *) key.mv_data, + (int) data.mv_size, (char *) data.mv_data); + + mdb_cursor_close(cursor); + mdb_txn_abort(txn); + + printf("Deleting with cursor\n"); + E(mdb_txn_begin(env, NULL, 0, &txn)); + E(mdb_cursor_open(txn, dbi, &cur2)); + for (i = 0; i < 50; i++) { + if (RES(MDB_NOTFOUND, mdb_cursor_get(cur2, &key, &data, MDB_NEXT))) + break; + printf("key: %p %.*s, data: %p %.*s\n", + key.mv_data, (int) key.mv_size, (char *) key.mv_data, + data.mv_data, (int) data.mv_size, (char *) data.mv_data); + E(mdb_del(txn, dbi, &key, NULL)); + } + + printf("Restarting cursor in txn\n"); + for (op = MDB_FIRST, i = 0; i <= 32; op = MDB_NEXT, i++) { + if (RES(MDB_NOTFOUND, mdb_cursor_get(cur2, &key, &data, op))) + break; + printf("key: %p %.*s, data: %p %.*s\n", + key.mv_data, (int) key.mv_size, (char *) key.mv_data, + data.mv_data, (int) data.mv_size, (char *) data.mv_data); + } + mdb_cursor_close(cur2); + E(mdb_txn_commit(txn)); + + printf("Restarting cursor outside txn\n"); + E(mdb_txn_begin(env, NULL, 0, &txn)); + E(mdb_cursor_open(txn, dbi, &cursor)); + for (op = MDB_FIRST, i = 0; i <= 32; op = MDB_NEXT, i++) { + if (RES(MDB_NOTFOUND, mdb_cursor_get(cursor, &key, &data, op))) + break; + printf("key: %p %.*s, data: %p %.*s\n", + key.mv_data, (int) key.mv_size, (char *) key.mv_data, + data.mv_data, (int) data.mv_size, (char *) data.mv_data); + } + mdb_cursor_close(cursor); + mdb_txn_abort(txn); + + mdb_dbi_close(env, dbi); + mdb_env_close(env); + + return 0; +} @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository [email protected]
