[CVS] RPM: rpm-5_4: rpm/rpmdb/ lmdb.c
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: RevisionChanges 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 - 1.1.2.4 +++ rpm/rpmdb/lmdb.c 23 Jul 2017 01:56:17 - 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 in each iteration, since MDB_NOOVERWRITE may modify it */ data.mv_size = sizeof(sval); data.mv_data = sval; - if (RES(MDB_KEY
[CVS] RPM: rpm-5_4: rpm/rpmdb/ lmdb.c
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: RevisionChanges Path 1.1.2.4 +128 -28rpm/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 - 1.1.2.3 +++ rpm/rpmdb/lmdb.c 22 Jul 2017 21:49:24 - 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;
[CVS] RPM: rpm-5_4: rpm/rpmdb/ lmdb.c
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 22:11:05 Branch: rpm-5_4 Handle: 2017072220110500 Modified files: (Branch: rpm-5_4) rpm/rpmdb lmdb.c Log: - lmdb: WIP. Summary: RevisionChanges Path 1.1.2.3 +391 -365 rpm/rpmdb/lmdb.c patch -p0 <<'@@ .' Index: rpm/rpmdb/lmdb.c $ cvs diff -u -r1.1.2.2 -r1.1.2.3 lmdb.c --- rpm/rpmdb/lmdb.c 22 Jul 2017 14:19:33 - 1.1.2.2 +++ rpm/rpmdb/lmdb.c 22 Jul 2017 20:11:05 - 1.1.2.3 @@ -55,9 +55,18 @@ struct rpmdbOps_s; -/** \ingroup rpmdb - * Describes the collection of index databases used by rpm. - */ +struct dbiIndex_s { +rpmdb dbi_rpmdb;/*!< the parent rpm database */ +dbiIndexType dbi_type; /*! Type of dbi (primary / index) */ +const char * dbi_file; /*!< file component of path */ +int dbi_flags; +int dbi_byteswapped; + +struct dbiConfig_s cfg; + +void * dbi_db; /*!< Backend private handle */ +}; + struct rpmdb_s { char * db_root;/*!< path prefix */ char * db_home;/*!< directory path */ @@ -176,6 +185,37 @@ } } +/* XXX assumes hdrNum is first int in dbiIndexItem */ +static int hdrNumCmp(const void * one, const void * two) +{ +const unsigned int * a = one, * b = two; +return (*a - *b); +} + +int dbiIndexSetAppendSet(dbiIndexSet dest, dbiIndexSet src, int sortset) +{ +if (dest == NULL || src == NULL || src->count == 0) + return 1; + +dbiIndexSetGrow(dest, src->count); +memcpy(dest->recs + dest->count, +src->recs, src->count * sizeof(*src->recs)); +dest->count += src->count; + +if (sortset && dest->count > 1) + qsort(dest->recs, dest->count, sizeof(*(dest->recs)), hdrNumCmp); +return 0; +} + +dbiIndexSet dbiIndexSetFree(dbiIndexSet set) +{ +if (set) { + free(set->recs); + free(set); +} +return NULL; +} + dbiIndexSet dbiIndexSetNew(unsigned int sizehint) { dbiIndexSet set = xcalloc(1, sizeof(*set)); @@ -197,154 +237,7 @@ } /*==*/ -typedef struct rpmpkgdb_s * rpmpkgdb; - -RPM_GNUC_CONST -void rpmpkgClose(rpmpkgdb pkgdb) -{ -} - -RPM_GNUC_CONST -int rpmpkgOpen(rpmpkgdb *pkgdbp, const char *filename, int flags, int mode) -{ -return RPMRC_FAIL; -} - -static int rpmpkgGetLock(rpmpkgdb pkgdb, int type) -{ -#ifdef NOTYET -if (!pkgdb->fd) - return RPMRC_FAIL; -for (;;) { - if (flock(pkgdb->fd, type)) { - return RPMRC_FAIL; - } - if (!is_correct_db(pkgdb)) { - if (reopen_db(pkgdb)) { - return RPMRC_FAIL; - } - continue; - } - break; -} -#endif -return RPMRC_OK; -} - -RPM_GNUC_CONST -int rpmpkgLock(rpmpkgdb pkgdb, int excl) -{ -#ifdef NOTYET -unsigned int *lockcntp = excl ? &pkgdb->locked_excl : &pkgdb->locked_shared; -if (*lockcntp > 0 || (!excl && pkgdb->locked_excl)) { - (*lockcntp)++; - return RPMRC_OK; -} -pkgdb->header_ok = 0; -if (rpmpkgGetLock(pkgdb, excl ? LOCK_EX : LOCK_SH)) { - return RPMRC_FAIL; -} -(*lockcntp)++; -#endif -return RPMRC_OK; -} - -RPM_GNUC_CONST -int rpmpkgUnlock(rpmpkgdb pkgdb, int excl) -{ -#ifdef NOTYET -unsigned int *lockcntp = excl ? &pkgdb->locked_excl : &pkgdb->locked_shared; -if (*lockcntp == 0) { - return RPMRC_FAIL; -} -if (*lockcntp > 1 || (!excl && pkgdb->locked_excl)) { - (*lockcntp)--; - return RPMRC_OK; -} -if (excl && pkgdb->locked_shared) { - /* excl -> shared switch */ - if (rpmpkgGetLock(pkgdb, LOCK_SH)) { - return RPMRC_FAIL; - } - (*lockcntp)--; - return RPMRC_OK; -} -flock(pkgdb->fd, LOCK_UN); -(*lockcntp)--; -pkgdb->header_ok = 0; -#endif -return RPMRC_OK; -} - -RPM_GNUC_CONST -int rpmpkgGet(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char **blobp, unsigned int *bloblp) -{ -return RPMRC_FAIL; -} - -RPM_GNUC_CONST -int rpmpkgPut(rpmpkgdb pkgdb, unsigned int pkgidx, unsigned char *blob, unsigned int blobl) -{ -return RPMRC_FAIL; -} - -RPM_GNUC_CONST -int rpmpkgDel(rpmpkgdb pkgdb, unsigned int pkgidx)
[CVS] RPM: rpm-5_4: rpm/rpmdb/ Makefile.am lmdb.c
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 16:19:33 Branch: rpm-5_4 Handle: 2017072214193300 Modified files: (Branch: rpm-5_4) rpm/rpmdb Makefile.am lmdb.c Log: - lmdb: stub-in the rpm.org lib/backend/ndb/glue.c layer. Summary: RevisionChanges Path 1.134.2.38 +6 -0 rpm/rpmdb/Makefile.am 1.1.2.2 +905 -6 rpm/rpmdb/lmdb.c patch -p0 <<'@@ .' Index: rpm/rpmdb/Makefile.am $ cvs diff -u -r1.134.2.37 -r1.134.2.38 Makefile.am --- rpm/rpmdb/Makefile.am 21 Jul 2017 15:14:23 - 1.134.2.37 +++ rpm/rpmdb/Makefile.am 22 Jul 2017 14:19:33 - 1.134.2.38 @@ -329,9 +329,15 @@ logio_SOURCES = logio.c logio.h logio_LDADD = $(mylibs) +lmdb_CFLAGS = -I/X/src/rpm/include -I/X/src/rpm lmdb_SOURCES = lmdb.c lmdb_LDADD = $(mylibs) +ltest: lmdb + rm -rf testdb && mkdir testdb + ./lmdb + ls -al testdb + #libsqldb_la_SOURCES = libsqldb.c # sqlite.c #libsqldb_la_LIBADD = $(RPMIO_LDADD_COMMON) @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/lmdb.c $ cvs diff -u -r1.1.2.1 -r1.1.2.2 lmdb.c --- rpm/rpmdb/lmdb.c 21 Jul 2017 15:14:23 - 1.1.2.1 +++ rpm/rpmdb/lmdb.c 22 Jul 2017 14:19:33 - 1.1.2.2 @@ -1,16 +1,909 @@ -#include -#include -#include +#include "system.h" + +#include +#include +#include +#include + #include "lmdb.h" +#include "debug.h" + +static int _debug = -1; + #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())) +/*==*/ + +#define H_RPMSW + +#define _RPMTYPES_H +typedef struct headerToken_s * Header; +typedef int32_t rpm_tag_t; +typedef uint32_trpm_tagtype_t; +typedef uint32_trpm_count_t; +typedef rpm_tag_t rpmTagVal; + +typedef struct rpmts_s * rpmts; +typedef void * rpmDbiTag; + +typedef rpm_tag_t rpmDbiTagVal; + +typedef struct dbiIndex_s * dbiIndex; +typedef struct dbiCursor_s * dbiCursor; +typedef struct dbiIndexSet_s * dbiIndexSet; + +typedef struct rpmdb_s * rpmdb; + +#ifdef REFERENCE +struct dbConfig_s { +int db_mmapsize;/*!< (10Mb) */ +int db_cachesize; /*!< (128Kb) */ +int db_verbose; +int db_no_fsync;/*!< no-op fsync for db */ +int db_eflags; /*!< obsolete */ +}; + +struct dbiConfig_s { +int dbi_oflags; /*!< open flags */ +int dbi_no_dbsync; /*!< don't call dbiSync */ +int dbi_lockdbfd; /*!< do fcntl lock on db fd */ +}; + +struct rpmdbOps_s; + +/** \ingroup rpmdb + * Describes the collection of index databases used by rpm. + */ +struct rpmdb_s { +char * db_root;/*!< path prefix */ +char * db_home;/*!< directory path */ +char * db_fullpath; /*!< full db path including prefix */ +int db_flags; +int db_mode;/*!< open mode */ +int db_perms; /*!< open permissions */ +char * db_descr; /*!< db backend description (for error msgs) */ +struct dbChk_s * db_checked;/*!< headerCheck()'ed package instances */ +rpmdbdb_next; +int db_opens; +dbiIndex db_pkgs;/*!< Package db */ +const rpmDbiTag * db_tags; +int db_ndbi;/*!< No. of tag indices. */ +dbiIndex * db_indexes; /*!< Tag indices. */ +int db_buildindex; /*!< Index rebuild indicator */ + +struct rpmdbOps_s * db_ops; /*!< backend ops */ + +/* dbenv and related parameters */ +void * db_dbenv; /*!< Backend private handle */ +struct dbConfig_s cfg; +int db_remove_env; + +struct rpmop_s db_getops; +struct rpmop_s db_putops; +struct rpmop_s db_delops; + +int nrefs; /*!< Reference count. */ +}; +#endif /* REFERENCE */ + +typedef struct miRE_s * miRE; + +typedef struct rpmdbMatchIterator_s * rpmdbMatchIterator; +struct rpmdbMatchIte