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]

Reply via email to