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

Reply via email to