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