[CVS] RPM: rpm-5_4: rpm/rpmdb/ lmdb.c

2017-07-22 Thread Jeff Johnson
  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 ? >locked_excl : 
>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 ? >locked_excl : 
>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)
  -{
  -return 

[CVS] RPM: rpm-5_4: rpm/rpmdb/ lmdb.c

2017-07-22 Thread Jeff Johnson
  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, );
  +SPEW("\t rc(%d) mdb_txn_begin(%p,%p,0x%x,) 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, >dbi);
  +MDB_dbi lmdbdbi_dbi = 0;
  +rc = mdb_dbi_open(txn, path, oflags, _dbi);
  +SPEW("\t rc(%d) mdb_dbi_open(%p,%s,0x%x,) 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, ));
  -E(mdb_dbi_open(txn, NULL, 0, ));
  +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, >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_KEYEXIST, mdb_put(txn, dbi, , , 

[CVS] RPM: rpm-5_4: rpm/rpmdb/ lmdb.c

2017-07-22 Thread Jeff Johnson
  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, >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/ Makefile.am lmdb.c

2017-07-22 Thread Jeff Johnson
  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