RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  j...@rpm5.org
  Module: rpm                              Date:   23-Jul-2017 03:56:17
  Branch: rpm-5_4                          Handle: 2017072301561700

  Modified files:           (Branch: rpm-5_4)
    rpm/rpmdb               lmdb.c

  Log:
    - lmdb: WIP.

  Summary:
    Revision    Changes     Path
    1.1.2.5     +72 -55     rpm/rpmdb/lmdb.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/lmdb.c
  ============================================================================
  $ cvs diff -u -r1.1.2.4 -r1.1.2.5 lmdb.c
  --- rpm/rpmdb/lmdb.c  22 Jul 2017 21:49:24 -0000      1.1.2.4
  +++ rpm/rpmdb/lmdb.c  23 Jul 2017 01:56:17 -0000      1.1.2.5
  @@ -298,6 +298,7 @@
   
   struct lmdbEnv_s {
       MDB_env * env;
  +    MDB_txn * txn;
       int refs;
   };
   
  @@ -364,7 +365,7 @@
        );
        flags |= MDB_FIXEDMAP;
   
  -     mode_t mode = 0644;
  +     mdb_mode_t mode = 0644;
   
        rpmlog(RPMLOG_DEBUG, "opening  db environment %s flags 0x%x mode 
0%o\n", path, flags, mode);
   
  @@ -385,6 +386,7 @@
   
        rdb->db_dbenv = lmdbenv = xcalloc(1, sizeof(struct lmdbEnv_s));
        lmdbenv->env = env;
  +     lmdbenv->txn = NULL;
   SPEW("<-- %s(%p) lmdbenv %p env %p\n", __FUNCTION__, rdb, lmdbenv, 
lmdbenv->env);
       }
       lmdbenv->refs++;
  @@ -414,13 +416,13 @@
       dbiIndex dbi;
       int rc = 1;
   
  +SPEW("--> %s(%p,%p,0x%x)\n", __FUNCTION__, rdb, dbip, flags);
       if (dbip)
        *dbip = NULL;
   
       if ((dbi = dbiNew(rdb, rpmtag)) == NULL)
        goto exit;
   
  -    struct lmdbDbi_s * lmdbdbi = (struct lmdbDbi_s *) xcalloc(1, 
sizeof(*lmdbdbi));
       struct lmdbEnv_s * lmdbenv = openEnv(rdb);
       MDB_env * env = lmdbenv->env;
       char * path;
  @@ -448,7 +450,7 @@
        oflags |= MDB_DUPSORT;
       }
   
  -    MDB_txn * parent = NULL;
  +    MDB_txn * parent = lmdbenv->txn;
       int tflags = (
   #ifdef       REF
        MDB_RDONLY |
  @@ -459,6 +461,7 @@
       );
       MDB_txn * txn = NULL;
       rc = mdb_txn_begin(env, parent, tflags, &txn);
  +SPEW("\t rc(%d) mdb_txn_begin(%p,%p,0x%x,&txn) MDB_txn %p\n", rc, env, 
parent, tflags, txn);
       switch (rc) {
       case MDB_SUCCESS:
        rc = RPMRC_OK;
  @@ -474,7 +477,9 @@
       if (rc)
        goto exit;
   
  -    rc = mdb_dbi_open(txn, path, oflags, &lmdbdbi->dbi);
  +    MDB_dbi lmdbdbi_dbi = 0;
  +    rc = mdb_dbi_open(txn, path, oflags, &lmdbdbi_dbi);
  +SPEW("\t rc(%d) mdb_dbi_open(%p,%s,0x%x,&dbi) MDB_dbi %u\n", rc, txn, path, 
oflags, lmdbdbi_dbi);
       switch (rc) {
       case MDB_SUCCESS:
        rc = RPMRC_OK;
  @@ -489,6 +494,7 @@
        goto exit;
   
       rc = mdb_txn_commit(txn);
  +SPEW("\t rc(%d) mdb_txn_commit(%p)\n", rc, txn);
       txn = NULL;
       switch (rc) {
       case MDB_SUCCESS:
  @@ -501,6 +507,9 @@
        goto exit;
        break;
       }
  +    struct lmdbDbi_s * lmdbdbi = (struct lmdbDbi_s *) xcalloc(1, 
sizeof(*lmdbdbi));
  +    lmdbdbi->dbi = lmdbdbi_dbi;
  +    dbi->dbi_db = lmdbdbi;
   
       dbi->dbi_flags = 0;
   #ifdef       NOTYET
  @@ -522,7 +531,7 @@
        dbi = NULL;
       }
   
  -SPEW("<-- %s(%p,%p,0x%x) rc %d dbi %p\n", __FUNCTION__, rdb, dbip, flags, 
rc, dbi);
  +SPEW("<-- %s(%p,%p,0x%x) rc %d dbi %p lmdbdbi %p MDB_dbi %u\n", 
__FUNCTION__, rdb, dbip, flags, rc, dbi, (dbi ? dbi->dbi_db : NULL), (dbi && 
dbi->dbi_db ? ((struct lmdbDbi_s *)dbi->dbi_db)->dbi : 54321));
       return rc;
   }
   
  @@ -1031,10 +1040,10 @@
   {
       poptContext con = rpmioInit(argc, argv, lmdbOptionsTable);
       int ec = 0;
  -    MDB_env *env;
  +
       MDB_dbi dbi;
  +
       MDB_val key, data;
  -    MDB_txn *txn;
       MDB_stat mst;
       MDB_cursor *cursor, *cur2;
       MDB_cursor_op op;
  @@ -1053,11 +1062,15 @@
       for (i = 0; i < count; i++)
        values[i] = rand() % 1024;
   
  -    struct lmdbEnv_s * lmdbenv = openEnv(rdb);
  -    env = lmdbenv->env;
  -
  -    E(mdb_txn_begin(env, NULL, 0, &txn));
  -    E(mdb_dbi_open(txn, NULL, 0, &dbi));
  +    dbiIndex __dbi = NULL;
  +    rc = lmdb_Open(rdb, RPMDBI_PACKAGES, &__dbi, 0);
  +assert(!rc);
  +    struct lmdbEnv_s * lmdbenv = (struct lmdbEnv_s *) rdb->db_dbenv;
  +    E(mdb_txn_begin(lmdbenv->env, NULL, 0, &lmdbenv->txn));
  +
  +    struct lmdbDbi_s * lmdbdbi = (struct lmdbDbi_s *) __dbi->dbi_db;
  +    dbi = lmdbdbi->dbi;
  +SPEW("*** %s: MDB_env %p MDB_dbi %u\n", __FUNCTION__, lmdbenv->env, dbi);
   
       key.mv_size = sizeof(int);
       key.mv_data = sval;
  @@ -1069,7 +1082,7 @@
        /* 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))) 
{
  +     if (RES(MDB_KEYEXIST, mdb_put(lmdbenv->txn, dbi, &key, &data, 
MDB_NOOVERWRITE))) {
            j++;
            data.mv_size = sizeof(sval);
            data.mv_data = sval;
  @@ -1077,45 +1090,47 @@
       }
       if (j)
        printf("%d duplicates skipped\n", j);
  -    E(mdb_txn_commit(txn));
  -    E(mdb_env_stat(env, &mst));
  +    E(mdb_txn_commit(lmdbenv->txn));
  +    lmdbenv->txn = NULL;
  +    E(mdb_env_stat(lmdbenv->env, &mst));
   
  -    E(mdb_txn_begin(env, NULL, MDB_RDONLY, &txn));
  -    E(mdb_cursor_open(txn, dbi, &cursor));
  +    E(mdb_txn_begin(lmdbenv->env, NULL, MDB_RDONLY, &lmdbenv->txn));
  +    E(mdb_cursor_open(lmdbenv->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);
  +//   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);
  +    mdb_txn_abort(lmdbenv->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));
  +     lmdbenv->txn = NULL;
  +     E(mdb_txn_begin(lmdbenv->env, NULL, 0, &lmdbenv->txn));
        sprintf(sval, "%03x ", values[i]);
  -     if (RES(MDB_NOTFOUND, mdb_del(txn, dbi, &key, NULL))) {
  +     if (RES(MDB_NOTFOUND, mdb_del(lmdbenv->txn, dbi, &key, NULL))) {
            j--;
  -         mdb_txn_abort(txn);
  +         mdb_txn_abort(lmdbenv->txn);
        } else {
  -         E(mdb_txn_commit(txn));
  +         E(mdb_txn_commit(lmdbenv->txn));
        }
  +     lmdbenv->txn = NULL;
       }
       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));
  +    E(mdb_env_stat(lmdbenv->env, &mst));
  +    E(mdb_txn_begin(lmdbenv->env, NULL, MDB_RDONLY, &lmdbenv->txn));
  +    E(mdb_cursor_open(lmdbenv->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);
  +//   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");
  @@ -1125,9 +1140,9 @@
           (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);
  +//   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");
  @@ -1141,47 +1156,49 @@
           (int) data.mv_size, (char *) data.mv_data);
   
       mdb_cursor_close(cursor);
  -    mdb_txn_abort(txn);
  +    mdb_txn_abort(lmdbenv->txn);
  +    lmdbenv->txn = NULL;
   
       printf("Deleting with cursor\n");
  -    E(mdb_txn_begin(env, NULL, 0, &txn));
  -    E(mdb_cursor_open(txn, dbi, &cur2));
  +    E(mdb_txn_begin(lmdbenv->env, NULL, 0, &lmdbenv->txn));
  +    E(mdb_cursor_open(lmdbenv->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("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(lmdbenv->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);
  +//   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));
  +    E(mdb_txn_commit(lmdbenv->txn));
  +    lmdbenv->txn = NULL;
   
       printf("Restarting cursor outside txn\n");
  -    E(mdb_txn_begin(env, NULL, 0, &txn));
  -    E(mdb_cursor_open(txn, dbi, &cursor));
  +    E(mdb_txn_begin(lmdbenv->env, NULL, 0, &lmdbenv->txn));
  +    E(mdb_cursor_open(lmdbenv->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);
  +//   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_txn_abort(lmdbenv->txn);
  +    lmdbenv->txn = NULL;
   
  -    closeEnv(rdb);
  +    rc = lmdb_Close(__dbi, 0);
  +assert(!rc);
   
       con = rpmioFini(con);
   
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to