rpmdb/dbconfig.c

Go to the documentation of this file.
00001 
00005 #include "system.h"
00006 
00007 #if defined(__LCLINT__)
00008 /*@-redef@*/
00009 typedef unsigned int u_int32_t;
00010 typedef unsigned short u_int16_t;
00011 typedef unsigned char u_int8_t;
00012 /*@-incondefs@*/        /* LCLint 3.0.0.15 */
00013 typedef int int32_t;
00014 /*@=incondefs@*/
00015 /*@=redef@*/
00016 #endif
00017 
00018 #include <db3/db.h>
00019 
00020 #include <rpmlib.h>
00021 #include <rpmmacro.h>
00022 
00023 #include "rpmdb.h"
00024 #include "debug.h"
00025 
00026 /*@access rpmdb@*/
00027 /*@access dbiIndex@*/
00028 /*@access dbiIndexSet@*/
00029 
00030 #if (DB_VERSION_MAJOR == 3) || (DB_VERSION_MAJOR == 4)
00031 #define __USE_DB3       1
00032 
00033 /*@-exportlocal -exportheadervar@*/
00034 /*@unchecked@*/
00035 struct _dbiIndex db3dbi;
00036 /*@=exportlocal =exportheadervar@*/
00037 
00041 struct dbOption {
00042 /*@observer@*/ /*@null@*/const char * longName; /* may be NULL */
00043     const char shortName;       /* may be '\0' */
00044     int argInfo;
00045 /*@null@*/ void * arg;          /* depends on argInfo */
00046     int val;                    /* 0 means don't return, just update flag */
00047 /*@observer@*/ /*@null@*/ const char * descrip; 
00048 /*@observer@*/ /*@null@*/ const char * argDescrip; 
00049 };
00050 
00051 /*@-compmempass -immediatetrans -exportlocal -exportheadervar@*/
00054 /*@unchecked@*/
00055 struct dbOption rdbOptions[] = {
00056  /* XXX DB_CXX_NO_EXCEPTIONS */
00057  { "client",    0,POPT_BIT_SET, &db3dbi.dbi_ecflags, DB_CLIENT,
00058         NULL, NULL },
00059 
00060  { "xa_create", 0,POPT_BIT_SET, &db3dbi.dbi_cflags, DB_XA_CREATE,
00061         NULL, NULL },
00062 
00063  { "create",    0,POPT_BIT_SET, &db3dbi.dbi_oeflags, DB_CREATE,
00064         NULL, NULL },
00065  { "thread",    0,POPT_BIT_SET, &db3dbi.dbi_oeflags, DB_THREAD,
00066         NULL, NULL },
00067 
00068  { "force",     0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_FORCE,
00069         NULL, NULL },
00070  { "cdb",       0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_CDB,
00071         NULL, NULL },
00072  { "lock",      0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_LOCK,
00073         NULL, NULL },
00074  { "log",       0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_LOG,
00075         NULL, NULL },
00076  { "mpool",     0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_MPOOL,
00077         NULL, NULL },
00078  { "txn",       0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_TXN,
00079         NULL, NULL },
00080  { "joinenv",   0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_JOINENV,
00081         NULL, NULL },
00082  { "recover",   0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_RECOVER,
00083         NULL, NULL },
00084  { "recover_fatal", 0,POPT_BIT_SET,     &db3dbi.dbi_eflags, DB_RECOVER_FATAL,
00085         NULL, NULL },
00086  { "shared",    0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_SYSTEM_MEM,
00087         NULL, NULL },
00088  { "txn_nosync", 0,POPT_BIT_SET,        &db3dbi.dbi_eflags, DB_TXN_NOSYNC,
00089         NULL, NULL },
00090  { "use_environ_root", 0,POPT_BIT_SET,  &db3dbi.dbi_eflags, DB_USE_ENVIRON_ROOT,
00091         NULL, NULL },
00092  { "use_environ", 0,POPT_BIT_SET,       &db3dbi.dbi_eflags, DB_USE_ENVIRON,
00093         NULL, NULL },
00094  { "lockdown",  0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_LOCKDOWN,
00095         NULL, NULL },
00096  { "private",   0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_PRIVATE,
00097         NULL, NULL },
00098 
00099  { "txn_sync",  0,POPT_BIT_SET, &db3dbi.dbi_tflags, DB_TXN_SYNC,
00100         NULL, NULL },
00101  { "txn_nowait",0,POPT_BIT_SET, &db3dbi.dbi_tflags, DB_TXN_NOWAIT,
00102         NULL, NULL },
00103 
00104  { "excl",      0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_EXCL,
00105         NULL, NULL },
00106  { "nommap",    0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_NOMMAP,
00107         NULL, NULL },
00108  { "rdonly",    0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_RDONLY,
00109         NULL, NULL },
00110  { "truncate",  0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_TRUNCATE,
00111         NULL, NULL },
00112  { "fcntl_locking",0,POPT_BIT_SET,      &db3dbi.dbi_oflags, DB_FCNTL_LOCKING,
00113         NULL, NULL },
00114 
00115  { "btree",     0,POPT_ARG_VAL,         &db3dbi.dbi_type, DB_BTREE,
00116         NULL, NULL },
00117  { "hash",      0,POPT_ARG_VAL,         &db3dbi.dbi_type, DB_HASH,
00118         NULL, NULL },
00119  { "recno",     0,POPT_ARG_VAL,         &db3dbi.dbi_type, DB_RECNO,
00120         NULL, NULL },
00121  { "queue",     0,POPT_ARG_VAL,         &db3dbi.dbi_type, DB_QUEUE,
00122         NULL, NULL },
00123  { "unknown",   0,POPT_ARG_VAL,         &db3dbi.dbi_type, DB_UNKNOWN,
00124         NULL, NULL },
00125 
00126  { "root",      0,POPT_ARG_STRING,      &db3dbi.dbi_root, 0,
00127         NULL, NULL },
00128  { "home",      0,POPT_ARG_STRING,      &db3dbi.dbi_home, 0,
00129         NULL, NULL },
00130  { "file",      0,POPT_ARG_STRING,      &db3dbi.dbi_file, 0,
00131         NULL, NULL },
00132  { "subfile",   0,POPT_ARG_STRING,      &db3dbi.dbi_subfile, 0,
00133         NULL, NULL },
00134  { "mode",      0,POPT_ARG_INT,         &db3dbi.dbi_mode, 0,
00135         NULL, NULL },
00136  { "perms",     0,POPT_ARG_INT,         &db3dbi.dbi_perms, 0,
00137         NULL, NULL },
00138  { "shmkey",    0,POPT_ARG_LONG,        &db3dbi.dbi_shmkey, 0,
00139         NULL, NULL },
00140  { "tmpdir",    0,POPT_ARG_STRING,      &db3dbi.dbi_tmpdir, 0,
00141         NULL, NULL },
00142 
00143  { "host",      0,POPT_ARG_STRING,      &db3dbi.dbi_host, 0,
00144         NULL, NULL },
00145  { "server",    0,POPT_ARG_STRING,      &db3dbi.dbi_host, 0,
00146         NULL, NULL },
00147  { "cl_timeout", 0,POPT_ARG_LONG,       &db3dbi.dbi_cl_timeout, 0,
00148         NULL, NULL },
00149  { "sv_timeout", 0,POPT_ARG_LONG,       &db3dbi.dbi_sv_timeout, 0,
00150         NULL, NULL },
00151 
00152  { "verify",    0,POPT_ARG_NONE,        &db3dbi.dbi_verify_on_close, 0,
00153         NULL, NULL },
00154  { "teardown",  0,POPT_ARG_NONE,        &db3dbi.dbi_tear_down, 0,
00155         NULL, NULL },
00156  { "usecursors",0,POPT_ARG_NONE,        &db3dbi.dbi_use_cursors, 0,
00157         NULL, NULL },
00158  { "usedbenv",  0,POPT_ARG_NONE,        &db3dbi.dbi_use_dbenv, 0,
00159         NULL, NULL },
00160  { "rmwcursor", 0,POPT_ARG_NONE,        &db3dbi.dbi_get_rmw_cursor, 0,
00161         NULL, NULL },
00162  { "nofsync",   0,POPT_ARG_NONE,        &db3dbi.dbi_no_fsync, 0,
00163         NULL, NULL },
00164  { "nodbsync",  0,POPT_ARG_NONE,        &db3dbi.dbi_no_dbsync, 0,
00165         NULL, NULL },
00166  { "lockdbfd",  0,POPT_ARG_NONE,        &db3dbi.dbi_lockdbfd, 0,
00167         NULL, NULL },
00168  { "temporary", 0,POPT_ARG_NONE,        &db3dbi.dbi_temporary, 0,
00169         NULL, NULL },
00170  { "debug",     0,POPT_ARG_NONE,        &db3dbi.dbi_debug, 0,
00171         NULL, NULL },
00172 
00173  { "cachesize", 0,POPT_ARG_INT,         &db3dbi.dbi_cachesize, 0,
00174         NULL, NULL },
00175  { "errpfx",    0,POPT_ARG_STRING,      &db3dbi.dbi_errpfx, 0,
00176         NULL, NULL },
00177  { "region_init", 0,POPT_ARG_VAL,       &db3dbi.dbi_region_init, 1,
00178         NULL, NULL },
00179  { "tas_spins", 0,POPT_ARG_INT,         &db3dbi.dbi_tas_spins, 0,
00180         NULL, NULL },
00181 
00182  { "chkpoint",  0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_CHKPOINT,
00183         NULL, NULL },
00184  { "deadlock",  0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_DEADLOCK,
00185         NULL, NULL },
00186  { "recovery",  0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_RECOVERY,
00187         NULL, NULL },
00188  { "waitsfor",  0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_WAITSFOR,
00189         NULL, NULL },
00190  { "verbose",   0,POPT_ARG_VAL,         &db3dbi.dbi_verbose, -1,
00191         NULL, NULL },
00192 
00193  { "lk_oldest", 0,POPT_ARG_VAL,         &db3dbi.dbi_lk_detect, DB_LOCK_OLDEST,
00194         NULL, NULL },
00195  { "lk_random", 0,POPT_ARG_VAL,         &db3dbi.dbi_lk_detect, DB_LOCK_RANDOM,
00196         NULL, NULL },
00197  { "lk_youngest",0, POPT_ARG_VAL,       &db3dbi.dbi_lk_detect, DB_LOCK_YOUNGEST,
00198         NULL, NULL },
00199 /* XXX lk_conflicts matrix */
00200  { "lk_max",    0,POPT_ARG_INT,         &db3dbi.dbi_lk_max, 0,
00201         NULL, NULL },
00202 
00203  { "lg_bsize",  0,POPT_ARG_INT,         &db3dbi.dbi_lg_bsize, 0,
00204         NULL, NULL },
00205  { "lg_max",    0,POPT_ARG_INT,         &db3dbi.dbi_lg_max, 0,
00206         NULL, NULL },
00207 
00208 /* XXX tx_recover */
00209  { "tx_max",    0,POPT_ARG_INT,         &db3dbi.dbi_tx_max, 0,
00210         NULL, NULL },
00211 
00212  { "lorder",    0,POPT_ARG_INT,         &db3dbi.dbi_lorder, 0,
00213         NULL, NULL },
00214 
00215  { "mp_mmapsize", 0,POPT_ARG_INT,       &db3dbi.dbi_mp_mmapsize, 0,
00216         NULL, NULL },
00217  { "mp_size",   0,POPT_ARG_INT,         &db3dbi.dbi_mp_size, 0,
00218         NULL, NULL },
00219  { "pagesize",  0,POPT_ARG_INT,         &db3dbi.dbi_pagesize, 0,
00220         NULL, NULL },
00221 
00222 /* XXX bt_minkey */
00223 /* XXX bt_compare */
00224 /* XXX bt_dup_compare */
00225 /* XXX bt_prefix */
00226  { "bt_dup",    0,POPT_BIT_SET, &db3dbi.dbi_bt_flags, DB_DUP,
00227         NULL, NULL },
00228  { "bt_dupsort",0,POPT_BIT_SET, &db3dbi.dbi_bt_flags, DB_DUPSORT,
00229         NULL, NULL },
00230  { "bt_recnum", 0,POPT_BIT_SET, &db3dbi.dbi_bt_flags, DB_RECNUM,
00231         NULL, NULL },
00232  { "bt_revsplitoff", 0,POPT_BIT_SET,    &db3dbi.dbi_bt_flags, DB_REVSPLITOFF,
00233         NULL, NULL },
00234 
00235  { "h_dup",     0,POPT_BIT_SET, &db3dbi.dbi_h_flags, DB_DUP,
00236         NULL, NULL },
00237  { "h_dupsort", 0,POPT_BIT_SET, &db3dbi.dbi_h_flags, DB_DUPSORT,
00238         NULL, NULL },
00239  { "h_ffactor", 0,POPT_ARG_INT,         &db3dbi.dbi_h_ffactor, 0,
00240         NULL, NULL },
00241  { "h_nelem",   0,POPT_ARG_INT,         &db3dbi.dbi_h_nelem, 0,
00242         NULL, NULL },
00243 
00244  { "re_renumber", 0,POPT_BIT_SET,       &db3dbi.dbi_re_flags, DB_RENUMBER,
00245         NULL, NULL },
00246  { "re_snapshot",0,POPT_BIT_SET,        &db3dbi.dbi_re_flags, DB_SNAPSHOT,
00247         NULL, NULL },
00248  { "re_delim",  0,POPT_ARG_INT,         &db3dbi.dbi_re_delim, 0,
00249         NULL, NULL },
00250  { "re_len",    0,POPT_ARG_INT,         &db3dbi.dbi_re_len, 0,
00251         NULL, NULL },
00252  { "re_pad",    0,POPT_ARG_INT,         &db3dbi.dbi_re_pad, 0,
00253         NULL, NULL },
00254  { "re_source", 0,POPT_ARG_STRING,      &db3dbi.dbi_re_source, 0,
00255         NULL, NULL },
00256 
00257  { "q_extentsize", 0,POPT_ARG_INT,      &db3dbi.dbi_q_extentsize, 0,
00258         NULL, NULL },
00259 
00260  { NULL, 0,0, NULL, 0, NULL, NULL }
00261 };
00262 /*@=compmempass =immediatetrans =exportlocal =exportheadervar@*/
00263 
00264 static int dbSaveLong(const struct dbOption * opt, int argInfo, long aLong)
00265         /*@modifies opt->arg @*/
00266 {
00267     if (argInfo & POPT_ARGFLAG_NOT)
00268         aLong = ~aLong;
00269     if (opt->arg != NULL)
00270     switch (argInfo & POPT_ARGFLAG_LOGICALOPS) {
00271     case 0:
00272         *((long *) opt->arg) = aLong;
00273         break;
00274     case POPT_ARGFLAG_OR:
00275         *((long *) opt->arg) |= aLong;
00276         break;
00277     case POPT_ARGFLAG_AND:
00278         *((long *) opt->arg) &= aLong;
00279         break;
00280     case POPT_ARGFLAG_XOR:
00281         *((long *) opt->arg) ^= aLong;
00282         break;
00283     default:
00284         return POPT_ERROR_BADOPERATION;
00285         /*@notreached@*/ break;
00286     }
00287     return 0;
00288 }
00289 
00290 static int dbSaveInt(const struct dbOption * opt, int argInfo, long aLong)
00291         /*@modifies opt->arg @*/
00292 {
00293     if (argInfo & POPT_ARGFLAG_NOT)
00294         aLong = ~aLong;
00295     if (opt->arg != NULL)
00296     switch (argInfo & POPT_ARGFLAG_LOGICALOPS) {
00297     case 0:
00298         *((int *) opt->arg) = aLong;
00299         break;
00300     case POPT_ARGFLAG_OR:
00301         *((int *) opt->arg) |= aLong;
00302         break;
00303     case POPT_ARGFLAG_AND:
00304         *((int *) opt->arg) &= aLong;
00305         break;
00306     case POPT_ARGFLAG_XOR:
00307         *((int *) opt->arg) ^= aLong;
00308         break;
00309     default:
00310         return POPT_ERROR_BADOPERATION;
00311         /*@notreached@*/ break;
00312     }
00313     return 0;
00314 }
00315 
00316 dbiIndex db3Free(dbiIndex dbi)
00317 {
00318     if (dbi) {
00319         dbi->dbi_root = _free(dbi->dbi_root);
00320         dbi->dbi_home = _free(dbi->dbi_home);
00321         dbi->dbi_file = _free(dbi->dbi_file);
00322         dbi->dbi_subfile = _free(dbi->dbi_subfile);
00323         dbi->dbi_host = _free(dbi->dbi_host);
00324         dbi->dbi_errpfx = _free(dbi->dbi_errpfx);
00325         dbi->dbi_re_source = _free(dbi->dbi_re_source);
00326         dbi->dbi_stats = _free(dbi->dbi_stats);
00327         dbi = _free(dbi);
00328     }
00329     return dbi;
00330 }
00331 
00333 /*@observer@*/ /*@unchecked@*/
00334 static const char *db3_config_default =
00335     "db3:hash:mpool:cdb:usecursors:verbose:mp_mmapsize=8Mb:mp_size=512Kb:pagesize=512:perms=0644";
00336 
00337 dbiIndex db3New(rpmdb rpmdb, int rpmtag)
00338 {
00339     dbiIndex dbi = xcalloc(1, sizeof(*dbi));
00340     char dbiTagMacro[128];
00341     char * dbOpts;
00342 
00343     sprintf(dbiTagMacro, "%%{_dbi_config_%s}", tagName(rpmtag));
00344     /*@-nullpass@*/
00345     dbOpts = rpmExpand(dbiTagMacro, NULL);
00346     /*@=nullpass@*/
00347     if (!(dbOpts && *dbOpts && *dbOpts != '%')) {
00348         dbOpts = _free(dbOpts);
00349         /*@-nullpass@*/
00350         dbOpts = rpmExpand("%{_dbi_config}", NULL);
00351         /*@=nullpass@*/
00352         if (!(dbOpts && *dbOpts && *dbOpts != '%')) {
00353             /*@-nullpass@*/
00354             dbOpts = rpmExpand(db3_config_default, NULL);
00355             /*@=nullpass@*/
00356         }
00357     }
00358 
00359     /* Parse the options for the database element(s). */
00360     /*@-branchstate@*/
00361     if (dbOpts && *dbOpts && *dbOpts != '%') {
00362         char *o, *oe;
00363         char *p, *pe;
00364 
00365         memset(&db3dbi, 0, sizeof(db3dbi));
00366         for (o = dbOpts; o && *o; o = oe) {
00367             struct dbOption *opt;
00368             const char * tok;
00369             int argInfo;
00370 
00371             /* Skip leading white space. */
00372             while (*o && xisspace(*o))
00373                 o++;
00374 
00375             /* Find and terminate next key=value pair. Save next start point. */
00376             for (oe = o; oe && *oe; oe++) {
00377                 if (xisspace(*oe))
00378                     /*@innerbreak@*/ break;
00379                 if (oe[0] == ':' && !(oe[1] == '/' && oe[2] == '/'))
00380                     /*@innerbreak@*/ break;
00381             }
00382             if (oe && *oe)
00383                 *oe++ = '\0';
00384             if (*o == '\0')
00385                 continue;
00386 
00387             /* Separate key from value, save value start (if any). */
00388             for (pe = o; pe && *pe && *pe != '='; pe++)
00389                 {};
00390             p = (pe ? *pe++ = '\0', pe : NULL);
00391 
00392             /* Skip over negation at start of token. */
00393             for (tok = o; *tok == '!'; tok++)
00394                 {};
00395 
00396             /* Find key in option table. */
00397             for (opt = rdbOptions; opt->longName != NULL; opt++) {
00398                 if (strcmp(tok, opt->longName))
00399                     /*@innercontinue@*/ continue;
00400                 /*@innerbreak@*/ break;
00401             }
00402             if (opt->longName == NULL) {
00403                 rpmError(RPMERR_DBCONFIG,
00404                         _("unrecognized db option: \"%s\" ignored.\n"), o);
00405                 continue;
00406             }
00407 
00408             /* Toggle the flags for negated tokens, if necessary. */
00409             argInfo = opt->argInfo;
00410             if (argInfo == POPT_BIT_SET && *o == '!' && ((tok - o) % 2))
00411                 argInfo = POPT_BIT_CLR;
00412 
00413             /* Save value in template as appropriate. */
00414             switch (argInfo & POPT_ARG_MASK) {
00415 
00416             case POPT_ARG_NONE:
00417                 (void) dbSaveInt(opt, argInfo, 1L);
00418                 /*@switchbreak@*/ break;
00419             case POPT_ARG_VAL:
00420                 (void) dbSaveInt(opt, argInfo, (long)opt->val);
00421                 /*@switchbreak@*/ break;
00422             case POPT_ARG_STRING:
00423             {   const char ** t = opt->arg;
00424                 /*@-mods@*/
00425                 if (t) {
00426                     *t = _free(*t);
00427                     *t = xstrdup( (p ? p : "") );
00428                 }
00429                 /*@=mods@*/
00430             }   /*@switchbreak@*/ break;
00431 
00432             case POPT_ARG_INT:
00433             case POPT_ARG_LONG:
00434               { long aLong = strtol(p, &pe, 0);
00435                 if (pe) {
00436                     if (!xstrncasecmp(pe, "Mb", 2))
00437                         aLong *= 1024 * 1024;
00438                     else if (!xstrncasecmp(pe, "Kb", 2))
00439                         aLong *= 1024;
00440                     else if (*pe != '\0') {
00441                         rpmError(RPMERR_DBCONFIG,
00442                                 _("%s has invalid numeric value, skipped\n"),
00443                                 opt->longName);
00444                         continue;
00445                     }
00446                 }
00447 
00448                 if ((argInfo & POPT_ARG_MASK) == POPT_ARG_LONG) {
00449                     if (aLong == LONG_MIN || aLong == LONG_MAX) {
00450                         rpmError(RPMERR_DBCONFIG,
00451                                 _("%s has too large or too small long value, skipped\n"),
00452                                 opt->longName);
00453                         continue;
00454                     }
00455                     (void) dbSaveLong(opt, argInfo, aLong);
00456                     /*@switchbreak@*/ break;
00457                 } else {
00458                     if (aLong > INT_MAX || aLong < INT_MIN) {
00459                         rpmError(RPMERR_DBCONFIG,
00460                                 _("%s has too large or too small integer value, skipped\n"),
00461                                 opt->longName);
00462                         continue;
00463                     }
00464                     (void) dbSaveInt(opt, argInfo, aLong);
00465                 }
00466               } /*@switchbreak@*/ break;
00467             default:
00468                 /*@switchbreak@*/ break;
00469             }
00470         }
00471     }
00472     /*@=branchstate@*/
00473 
00474     dbOpts = _free(dbOpts);
00475 
00476     /*@-assignexpose@*/
00477 /*@i@*/ *dbi = db3dbi;  /* structure assignment */
00478     /*@=assignexpose@*/
00479     memset(&db3dbi, 0, sizeof(db3dbi));
00480 
00481     if (!(dbi->dbi_perms & 0600))
00482         dbi->dbi_perms = 0644;
00483     dbi->dbi_mode = rpmdb->db_mode;
00484     /*@-keeptrans@*/
00485 /*@i@*/ dbi->dbi_rpmdb = rpmdb;
00486     /*@=keeptrans@*/
00487     dbi->dbi_rpmtag = rpmtag;
00488     
00489     /*
00490      * Inverted lists have join length of 2, primary data has join length of 1.
00491      */
00492     /*@-sizeoftype@*/
00493     switch (rpmtag) {
00494     case RPMDBI_PACKAGES:
00495     case RPMDBI_DEPENDS:
00496         dbi->dbi_jlen = 1 * sizeof(int_32);
00497         break;
00498     default:
00499         dbi->dbi_jlen = 2 * sizeof(int_32);
00500         break;
00501     }
00502     /*@=sizeoftype@*/
00503 
00504     dbi->dbi_use_cursors = 1;           /* db3 cursors are always used now. */
00505 
00506     if (!dbi->dbi_use_dbenv) {          /* db3 dbenv is always used now. */
00507         dbi->dbi_use_dbenv = 1;
00508         dbi->dbi_eflags |= (DB_INIT_MPOOL|DB_JOINENV);
00509         dbi->dbi_mp_mmapsize = 8 * 1024 * 1024;
00510         dbi->dbi_mp_size = 512 * 1024;
00511         dbi->dbi_tear_down = 1;
00512     }
00513 
00514     if ((dbi->dbi_bt_flags | dbi->dbi_h_flags) & DB_DUP)
00515         dbi->dbi_permit_dups = 1;
00516 
00517     /*@-globstate@*/ /* FIX: *(rdbOptions->arg) reachable */
00518     return dbi;
00519     /*@=globstate@*/
00520 }
00521 
00522 const char *const prDbiOpenFlags(int dbflags, int print_dbenv_flags)
00523 {
00524     static char buf[256];
00525     struct dbOption *opt;
00526     char * oe;
00527 
00528     oe = buf;
00529     *oe = '\0';
00530     for (opt = rdbOptions; opt->longName != NULL; opt++) {
00531         if (opt->argInfo != POPT_BIT_SET)
00532             continue;
00533         if (print_dbenv_flags) {
00534             if (!(opt->arg == &db3dbi.dbi_oeflags ||
00535                   opt->arg == &db3dbi.dbi_eflags))
00536                 continue;
00537         } else {
00538             if (!(opt->arg == &db3dbi.dbi_oeflags ||
00539                   opt->arg == &db3dbi.dbi_oflags))
00540                 continue;
00541         }
00542         if ((dbflags & opt->val) != opt->val)
00543             continue;
00544         if (oe != buf)
00545             *oe++ = ':';
00546         oe = stpcpy(oe, opt->longName);
00547         dbflags &= ~opt->val;
00548     }
00549     if (dbflags) {
00550         if (oe != buf)
00551             *oe++ = ':';
00552             sprintf(oe, "0x%x", (unsigned)dbflags);
00553     }
00554     return buf;
00555 }
00556 
00557 #endif

Generated on Wed Oct 25 12:57:56 2006 for rpm by  doxygen 1.4.7