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: 05-Oct-2009 16:21:40 Branch: HEAD Handle: 2009100514214000 Modified files: rpm/rpmdb db3.c dbconfig.c rpmdb.h Log: - dbi: wire up DB_SEQUENCE configuration. Summary: Revision Changes Path 1.114 +89 -1 rpm/rpmdb/db3.c 1.72 +8 -3 rpm/rpmdb/dbconfig.c 1.104 +11 -7 rpm/rpmdb/rpmdb.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/rpmdb/db3.c ============================================================================ $ cvs diff -u -r1.113 -r1.114 db3.c --- rpm/rpmdb/db3.c 5 Oct 2009 03:42:29 -0000 1.113 +++ rpm/rpmdb/db3.c 5 Oct 2009 14:21:40 -0000 1.114 @@ -1175,6 +1175,7 @@ const char * dbfile; const char * dbsubfile; DB * db = dbi->dbi_db; + DB_SEQUENCE * seq = dbi->dbi_seq; const char * dbiBN = mapTagName(rpmdb, dbi); int _printit; int rc = 0, xx; @@ -1210,6 +1211,16 @@ #endif } + if (seq) { + rc = seq->close(seq, 0); + rc = cvtdberr(dbi, "seq->close", rc, _debug); + seq = dbi->dbi_seq = NULL; + + rpmlog(RPMLOG_DEBUG, D_("closed db seqno %s/%s\n"), + dbhome, (dbfile ? dbfile : dbiBN)); + + } + if (db) { rc = db->close(db, 0); /* XXX ignore not found error messages. */ @@ -1598,6 +1609,74 @@ return rc; } +static int seqid_init(dbiIndex dbi, const char * keyp, size_t keylen, + DB_SEQUENCE ** seqp) +{ + DB * db = dbi->dbi_db; + DBT k = {0}; + DB_TXN * txnid = NULL; + DB_SEQUENCE * seq = NULL; + db_seq_t _rangemin = -922337203685477600LL; + db_seq_t _rangemax = 922337203685477600LL; + db_seq_t _value = 0; + int32_t _cachesize = 0; + uint32_t _flags = DB_SEQ_INC; + uint32_t _oflags = DB_CREATE; + int rc; + +assert(db != NULL); + if (seqp) *seqp = NULL; + + rc = db_sequence_create(&seq, db, 0); + rc = cvtdberr(dbi, "db_sequence_create", rc, _debug); + if (rc) goto exit; + + if (dbi->dbi_seq_cachesize) { + _cachesize = dbi->dbi_seq_cachesize; + rc = seq->set_cachesize(seq, _cachesize); + rc = cvtdberr(dbi, "seq->set_cachesize", rc, _debug); + if (rc) goto exit; + } + + if (dbi->dbi_seq_initial) + _value = dbi->dbi_seq_initial; + rc = seq->initial_value(seq, _value); + rc = cvtdberr(dbi, "seq->initial_value", rc, _debug); + if (rc) goto exit; + + if (dbi->dbi_seq_min) + _rangemin = dbi->dbi_seq_min; + if (dbi->dbi_seq_max) + _rangemin = dbi->dbi_seq_max; + rc = seq->set_range(seq, _rangemin, _rangemax); + rc = cvtdberr(dbi, "seq->set_range", rc, _debug); + if (rc) goto exit; + + if (dbi->dbi_seq_flags) + _flags = dbi->dbi_seq_flags; + rc = seq->set_flags(seq, _flags); + rc = cvtdberr(dbi, "seq->set_flags", rc, _debug); + if (rc) goto exit; + + k.data = (void *)keyp; + k.size = (u_int32_t) (keylen > 0 ? keylen : strlen(keyp)); + rc = seq->open(seq, txnid, &k, _oflags); + rc = cvtdberr(dbi, "seq->open", rc, _debug); + if (rc) goto exit; + +exit: + if (rc == 0 && seqp != NULL) + *seqp = seq; + else { + int xx = seq->close(seq, 0); + xx = cvtdberr(dbi, "seq->close", xx, _debug); + } + +DBIDEBUG(dbi, (stderr, "<-- %s(%p,%p[%u],%p) seq %p rc %d\n", __FUNCTION__, dbi, keyp, keylen, seqp, (seqp ? *seqp : NULL), rc)); + + return rc; +} + /** * Return handle for an index database. * @param rpmdb rpm database @@ -2157,7 +2236,16 @@ int (*_callback)(DB *, const DBT *, const DBT *, DBT *) = db3Acallback; int _flags = 0; - (void) db3associate(rpmdb->_dbi[0], dbi, _callback, _flags); + xx = db3associate(rpmdb->_dbi[0], dbi, _callback, _flags); + } + if (dbi->dbi_seq_id) { + char * end = NULL; + uint32_t u = (uint32_t) strtoll(dbi->dbi_seq_id, &end, 0); + + if (*end == '\0') + xx = seqid_init(dbi,(const char *)&u, sizeof(u), &dbi->dbi_seq); + else + xx = seqid_init(dbi, dbi->dbi_seq_id, 0, &dbi->dbi_seq); } } else { dbi->dbi_verify_on_close = 0; @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/dbconfig.c ============================================================================ $ cvs diff -u -r1.71 -r1.72 dbconfig.c --- rpm/rpmdb/dbconfig.c 4 Oct 2009 17:42:14 -0000 1.71 +++ rpm/rpmdb/dbconfig.c 5 Oct 2009 14:21:40 -0000 1.72 @@ -358,6 +358,8 @@ /* ==== Sequences: */ #if defined(WITH_DB) + { "seq_id", 0,POPT_ARG_STRING, &db3dbi.dbi_seq_id, 0, + NULL, NULL }, /* XXX DB_SEQUENCE->set_cachesize */ /* XXX DB_SEQUENCE->get_cachesize */ { "seq_cachesize", 0,POPT_ARG_INT, &db3dbi.dbi_seq_cachesize, 0, @@ -377,12 +379,15 @@ { "seq_wrap", 0,POPT_BIT_SET, &db3dbi.dbi_seq_flags, DB_SEQ_WRAP, NULL, NULL }, #endif +#if defined(WITH_DB) +/* XXX DB_SEQUENCE->initial_value */ + { "seq_initial", 0,POPT_ARG_LONG, &db3dbi.dbi_seq_initial, 0, + NULL, NULL }, /* XXX DB_SEQUENCE->set_range */ /* XXX DB_SEQUENCE->get_range */ -#if defined(WITH_DB) && defined(NOTYET) /* needs signed 64bit type */ - { "seq_min", 0,POPT_ARG_INT, &db3dbi.dbi_seq_min, 0, + { "seq_min", 0,POPT_ARG_LONG, &db3dbi.dbi_seq_min, 0, NULL, NULL }, - { "seq_max", 0,POPT_ARG_INT, &db3dbi.dbi_seq_max, 0, + { "seq_max", 0,POPT_ARG_LONG, &db3dbi.dbi_seq_max, 0, NULL, NULL }, #endif @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.h ============================================================================ $ cvs diff -u -r1.103 -r1.104 rpmdb.h --- rpm/rpmdb/rpmdb.h 5 Oct 2009 02:13:44 -0000 1.103 +++ rpm/rpmdb/rpmdb.h 5 Oct 2009 14:21:40 -0000 1.104 @@ -356,13 +356,15 @@ /* mpool sub-system parameters */ /* mutex sub-system parameters */ /* replication sub-system parameters */ + /* sequences sub-system parameters */ + const char * dbi_seq_id; unsigned int dbi_seq_cachesize; unsigned int dbi_seq_flags; -#if 0 /* needs signed 64 bit type */ + int64_t dbi_seq_initial; int64_t dbi_seq_min; int64_t dbi_seq_max; -#endif + /* transaction sub-system parameters */ #if 0 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec, @@ -410,11 +412,13 @@ rpmTag dbi_rpmtag; /*!< rpm tag used for index */ size_t dbi_jlen; /*!< size of join key */ -/*...@only@*//*...@relnull@*/ - DB * dbi_db; /*!< Berkeley DB * handle */ -/*...@only@*//*...@null@*/ - DB_TXN * dbi_txnid; /*!< Bekerley DB_TXN * transaction id */ -/*...@only@*//*...@null@*/ +/*...@only@*/ /*...@relnull@*/ + DB_SEQUENCE * dbi_seq; /*!< Berkeley DB_SEQUENCE handle */ +/*...@only@*/ /*...@relnull@*/ + DB * dbi_db; /*!< Berkeley DB handle */ +/*...@only@*/ /*...@null@*/ + DB_TXN * dbi_txnid; /*!< Berkeley DB_TXN handle */ +/*...@only@*/ /*...@null@*/ void * dbi_stats; /*!< Berkeley DB statistics */ /*...@observer@*/ @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org