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:   22-Jul-2017 23:49:24
  Branch: rpm-5_4                          Handle: 2017072221492400

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

  Log:
    - lmdb: WIP.

  Summary:
    Revision    Changes     Path
    1.1.2.4     +128 -28    rpm/rpmdb/lmdb.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/lmdb.c
  ============================================================================
  $ cvs diff -u -r1.1.2.3 -r1.1.2.4 lmdb.c
  --- rpm/rpmdb/lmdb.c  22 Jul 2017 20:11:05 -0000      1.1.2.3
  +++ rpm/rpmdb/lmdb.c  22 Jul 2017 21:49:24 -0000      1.1.2.4
  @@ -10,6 +10,10 @@
   #include "debug.h"
   
   static int _debug = -1;
  +#define SPEW(_fmt, ...) \
  +    if (_debug) \
  +     fprintf(stderr, _fmt, __VA_ARGS__)
  +
   
   #define E(expr) CHECK((rc = (expr)) == MDB_SUCCESS, #expr)
   #define RES(err, expr) ((rc = expr) == (err) || (CHECK(!rc, #expr), 0))
  @@ -153,9 +157,15 @@
       dbi->dbi_rpmdb = rdb;
   #ifdef       NOTYET
       dbi->dbi_file = rpmTagGetName(rpmtag);
  +#else
  +    dbi->dbi_file = "Packages";
   #endif
       dbi->dbi_type = (rpmtag == RPMDBI_PACKAGES) ? DBI_PRIMARY : 
DBI_SECONDARY;
  -    dbi->dbi_byteswapped = -1;  /* -1 unknown, 0 native order, 1 alien order 
*/
  +#ifdef       NOTYET
  +    dbi->dbi_byteswapped = -1;       /* -1 unknown, 0 native order, 1 alien 
order */
  +#else
  +    dbi->dbi_byteswapped = 0;        /* -1 unknown, 0 native order, 1 alien 
order */
  +#endif
       return dbi;
   }
   
  @@ -294,6 +304,8 @@
   static void closeEnv(rpmdb rdb)
   {
       struct lmdbEnv_s *lmdbenv = rdb->db_dbenv;
  +SPEW("--> %s(%p) lmdbenv %p env %p\n", __FUNCTION__, rdb, lmdbenv, 
lmdbenv->env);
  +
       if (--lmdbenv->refs <= 0) {
        const char *dbhome = rpmdbHome(rdb);
        MDB_env * env = (MDB_env *) lmdbenv->env;
  @@ -373,6 +385,7 @@
   
        rdb->db_dbenv = lmdbenv = xcalloc(1, sizeof(struct lmdbEnv_s));
        lmdbenv->env = env;
  +SPEW("<-- %s(%p) lmdbenv %p env %p\n", __FUNCTION__, rdb, lmdbenv, 
lmdbenv->env);
       }
       lmdbenv->refs++;
       return lmdbenv;
  @@ -380,6 +393,7 @@
   
   static int lmdb_Close(dbiIndex dbi, unsigned int flags)
   {
  +    int rc = 0;
       rpmdb rdb = dbi->dbi_rpmdb;
       struct lmdbEnv_s * lmdbenv = rdb->db_dbenv;
       struct lmdbDbi_s * lmdbdbi = (struct lmdbDbi_s *) dbi->dbi_db;
  @@ -389,20 +403,22 @@
       if (rdb->db_dbenv)
        closeEnv(rdb);
       dbi->dbi_db = NULL;
  -    return 0;
  +SPEW("<-- %s(%p, 0x%x) rc %d\n", __FUNCTION__, dbi, flags, rc);
  +    dbi = dbiFree(dbi);
  +    return rc;
   }
   
   static int lmdb_Open(rpmdb rdb, rpmDbiTagVal rpmtag, dbiIndex * dbip, int 
flags)
   {
       const char *dbhome = rpmdbHome(rdb);
       dbiIndex dbi;
  -    int rc = -1;
  +    int rc = 1;
   
       if (dbip)
        *dbip = NULL;
   
       if ((dbi = dbiNew(rdb, rpmtag)) == NULL)
  -     return 1;
  +     goto exit;
   
       struct lmdbDbi_s * lmdbdbi = (struct lmdbDbi_s *) xcalloc(1, 
sizeof(*lmdbdbi));
       struct lmdbEnv_s * lmdbenv = openEnv(rdb);
  @@ -456,7 +472,7 @@
        break;
       }
       if (rc)
  -     return rc;
  +     goto exit;
   
       rc = mdb_dbi_open(txn, path, oflags, &lmdbdbi->dbi);
       switch (rc) {
  @@ -470,28 +486,63 @@
        break;
       }
       if (rc)
  -     return rc;
  +     goto exit;
   
  -    if (dbip != NULL)
  +    rc = mdb_txn_commit(txn);
  +    txn = NULL;
  +    switch (rc) {
  +    case MDB_SUCCESS:
  +     break;
  +    case EINVAL:
  +    case ENOSPC:
  +    case EIO:
  +    case ENOMEM:
  +    default:
  +     goto exit;
  +     break;
  +    }
  +
  +    dbi->dbi_flags = 0;
  +#ifdef       NOTYET
  +    if (oflags & DB_CREATE)
  +     dbi->dbi_flags |= DBI_CREATED;
  +    if (oflags & DB_RDONLY)
  +     dbi->dbi_flags |= DBI_RDONLY;
  +#endif
  +
  +exit:
  +    if (rc == 0 && dbip != NULL)
        *dbip = dbi;
  -    else
  -     lmdb_Close(dbi, 0);
  +    else {
  +     if (txn)
  +         mdb_txn_abort(txn);
  +     txn = NULL;
  +     if (dbi)
  +         lmdb_Close(dbi, 0);
  +     dbi = NULL;
  +    }
   
  +SPEW("<-- %s(%p,%p,0x%x) rc %d dbi %p\n", __FUNCTION__, rdb, dbip, flags, 
rc, dbi);
       return rc;
   }
   
   static int lmdb_Verify(dbiIndex dbi, unsigned int flags)
   {
  -    return 1;
  +    int rc = 1;
  +SPEW("<-- %s(%p,0x%x) rc %d\n", __FUNCTION__, dbi, flags, rc);
  +    return rc;
   }
   
   static void lmdb_SetFSync(rpmdb rdb, int enable)
   {
  +SPEW("<-- %s(%p,%d)\n", __FUNCTION__, rdb, enable);
   }
   
   static int lmdb_Ctrl(rpmdb rdb, dbCtrlOp ctrl)
   {
  -    return 0;
  +    int rc = 0;
  +SPEW("<-- %s(%p,%d) rc %d\n", __FUNCTION__, rdb, ctrl, rc);
  +    return rc;
   }
   
   static dbiCursor lmdb_CursorInit(dbiIndex dbi, unsigned int flags)
  @@ -499,11 +550,13 @@
       dbiCursor dbc = xcalloc(1, sizeof(*dbc));
       dbc->dbi = dbi;
       dbc->flags = flags;
  +SPEW("<-- %s(%p,0x%x) dbc %p\n", __FUNCTION__, dbi, flags, dbc);
       return dbc;
   }
   
   static dbiCursor lmdb_CursorFree(dbiIndex dbi, dbiCursor dbc)
   {
  +SPEW("--> %s(%p,%p)\n", __FUNCTION__, dbi, dbc);
       if (dbc)
        free(dbc);
       return NULL;
  @@ -548,6 +601,7 @@
        break;
       }
   
  +SPEW("<-- %s(%p,%p, 0x%x, %p[%u]) rc %d\n", __FUNCTION__, dbi, dbc, hdrNum, 
hdrBlob, hdrLen, rc);
       return rc;
   }
   
  @@ -599,6 +653,7 @@
        }
       }
   
  +SPEW("<-- %s(%p,%p, 0x%x) rc %d\n", __FUNCTION__, dbi, dbc, hdrNum, rc);
       return rc;
   }
   
  @@ -632,6 +687,7 @@
       }
   #endif
   
  +SPEW("<-- %s(%p,%p,%p,%p) rc %d\n", __FUNCTION__, dbi, dbc, hdrBlob, hdrLen, 
rc);
       return rc;
   }
   
  @@ -673,6 +729,7 @@
        break;
       }
   
  +SPEW("<-- %s(%p,%p, 0x%x, %p,%p) rc %d\n", __FUNCTION__, dbi, dbc, hdrNum, 
hdrBlob, hdrLen, rc);
       return rc;
   }
   
  @@ -745,6 +802,7 @@
       }
   #endif
   
  +SPEW("<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, dbi, dbc, set, rc);
       return rc;
   }
   
  @@ -753,8 +811,10 @@
       int rc = RPMRC_FAIL;
       unsigned int *pkglist = 0, pkglistn = 0;
   
  -    if (!keyp)
  -     return lmdb_idxdbIter(dbi, dbc, set);
  +    if (!keyp) {
  +     rc = lmdb_idxdbIter(dbi, dbc, set);
  +     goto exit;
  +    }
   
       if (searchType == DBC_PREFIX_SEARCH) {
        unsigned int *list = 0, nlist = 0, i = 0;
  @@ -762,7 +822,7 @@
        int rrc = RPMRC_NOTFOUND;
        rc = rpmidxList(dbc->dbi->dbi_db, &list, &nlist, &listdata);
        if (rc)
  -         return rc;
  +         goto exit;
        for (i = 0; i < nlist && !rc; i += 2) {
            unsigned char *k = listdata + list[i];
            unsigned int kl = list[i + 1];
  @@ -778,12 +838,17 @@
            free(list);
        if (listdata)
            free(listdata);
  -     return rc ? rc : rrc;
  +     if (!rc)
  +         rc = rrc;
  +     goto exit;
       }
   
       rc = rpmidxGet(dbc->dbi->dbi_db, (const unsigned char *)keyp, keylen, 
&pkglist, &pkglistn);
       if (!rc)
        addtoset(set, pkglist, pkglistn);
  +
  +exit:
  +SPEW("<-- %s(%p,%p,%p[%u],%p,0x%x) rc %d\n", __FUNCTION__, dbi, dbc, keyp, 
(unsigned)keylen, set, searchType, rc);
       return rc;
   }
   
  @@ -791,6 +856,7 @@
   {
       int rc = RPMRC_FAIL;
       rc = rpmidxPut(dbc->dbi->dbi_db, (const unsigned char *)keyp, keylen, 
rec->hdrNum, rec->tagNum);
  +SPEW("<-- %s(%p,%p,%p[%u],%p) rc %d\n", __FUNCTION__, dbi, dbc, keyp, 
(unsigned)keylen, rec, rc);
       return rc;
   }
   
  @@ -798,6 +864,7 @@
   {
       int rc = RPMRC_FAIL;
       rc = rpmidxDel(dbc->dbi->dbi_db, (const unsigned char *)keyp, keylen, 
rec->hdrNum, rec->tagNum);
  +SPEW("<-- %s(%p,%p,%p[%u],%p) rc %d\n", __FUNCTION__, dbi, dbc, keyp, 
(unsigned)keylen, rec, rc);
       return rc;
   }
   
  @@ -805,6 +872,7 @@
   {
       if (dbc->key && keylen)
        *keylen = dbc->keylen;
  +SPEW("<-- %s(%p,%p,%p) key %p\n", __FUNCTION__, dbi, dbc, keylen, dbc->key);
       return dbc->key;
   }
   
  @@ -814,6 +882,7 @@
           return 0;
       unsigned int hdrNum = 0;
       memcpy(&hdrNum, dbc->key, sizeof(hdrNum));
  +SPEW("<-- %s(%p,%p) hdrNum 0x%x\n", __FUNCTION__, dbi, dbc, hdrNum);
       return hdrNum;   /* XXX byteswap */
   
   }
  @@ -872,19 +941,20 @@
       }
   #endif
       
  +SPEW("<-- %s(%p,%d) hdrNum 0x%x\n", __FUNCTION__, dbi, alloc, hdrNum);
       return hdrNum;
   }
   
   static rpmRC lmdb_pkgdbNew(dbiIndex dbi, dbiCursor dbc,  unsigned int 
*hdrNum)
   {
       unsigned int num = 0;
  -    if (dbc == NULL)
  -     return RPMRC_FAIL;
  -    num = pkgInstance(dbc->dbi, 1);
  -    if (!num)
  -     return RPMRC_FAIL;
  -    *hdrNum = num;
  -    return RPMRC_OK;
  +    int rc = RPMRC_FAIL;
  +    if (dbc && (num = pkgInstance(dbc->dbi, 1)) != 0) {
  +     *hdrNum = num;
  +     rc = RPMRC_OK;
  +    }
  +SPEW("<-- %s(%p,%p,%p) rc %d\n", __FUNCTION__, dbi, dbc, hdrNum, rc);
  +    return rc;
   }
   
   struct rpmdbOps_s lmdb_dbops = {
  @@ -923,7 +993,38 @@
     POPT_TABLEEND
   };
   
  -struct rpmdb_s _rpmdb;
  +struct rpmdb_s _rpmdb = {
  +
  +    .db_root = "/",                          /*!< path prefix */
  +    .db_home = "/X/src/wdj54/testdb",        /*!< directory path */
  +    .db_fullpath = "/X/src/wdj54/rpmdb/testdb",      /*!< full db path 
including prefix */
  +    .db_flags        = 0,
  +    .db_mode = O_RDWR,       /*!< open mode */
  +    .db_perms        = 0644,         /*!< open permissions */
  +    .db_descr        = "lmdb",       /*!< db backend description (for error 
msgs) */
  +    .db_checked      = NULL,         /*!< headerCheck()'ed package instances 
*/
  +    .db_next = NULL,
  +    .db_opens        = 0,
  +    .db_pkgs = NULL,         /*!< Package db */
  +    .db_tags = NULL,
  +    .db_ndbi = 0,            /*!< No. of tag indices. */
  +    .db_indexes      = NULL,         /*!< Tag indices. */
  +    .db_buildindex = 0,              /*!< Index rebuild indicator */
  +
  +    .db_ops  = &lmdb_dbops,  /*!< backend ops */
  +
  +    /* dbenv and related parameters */
  +    .db_dbenv        = NULL,         /*!< Backend private handle */
  +    .cfg     = {},
  +    .db_remove_env = 0,
  +
  +    .db_getops       = {},
  +    .db_putops       = {},
  +    .db_delops       = {},
  +
  +    .nrefs   = 0,            /*!< Reference count. */
  +};
  +
   rpmdb rdb = &_rpmdb;
   
   int main(int argc, char *argv[])
  @@ -952,10 +1053,8 @@
       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));
  +    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));
  @@ -1081,7 +1180,8 @@
       mdb_txn_abort(txn);
   
       mdb_dbi_close(env, dbi);
  -    mdb_env_close(env);
  +
  +    closeEnv(rdb);
   
       con = rpmioFini(con);
   
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to