00001
00005 #include "system.h"
00006
00007 #include <popt.h>
00008 #include <rpmtag.h>
00009 #include <rpmio.h>
00010 #include <rpmlog.h>
00011 #include <rpmmacro.h>
00012
00013 #define _RPMDB_INTERNAL
00014 #include "rpmdb.h"
00015 #include "debug.h"
00016
00017
00018
00019
00020
00021 #if defined(WITH_DB) || defined(WITH_SQLITE)
00022
00023
00024
00025 struct _dbiIndex db3dbi;
00026
00027
00028
00029 #if defined(WITH_DB)
00030 static int dbi_use_cursors;
00031 #endif
00032
00033
00034 #if defined(WITH_DB)
00035 static int dbi_tear_down;
00036 #endif
00037
00038
00041
00042 struct poptOption rdbOptions[] = {
00043
00044 #if defined(WITH_DB) && defined(DB_CLIENT)
00045 { "client", 0,POPT_BIT_SET, &db3dbi.dbi_ecflags, DB_CLIENT,
00046 NULL, NULL },
00047 #endif
00048 #if defined(WITH_DB) && defined(DB_RPCCLIENT)
00049 { "client", 0,POPT_BIT_SET, &db3dbi.dbi_ecflags, DB_RPCCLIENT,
00050 NULL, NULL },
00051 { "rpcclient", 0,POPT_BIT_SET, &db3dbi.dbi_ecflags, DB_RPCCLIENT,
00052 NULL, NULL },
00053 #endif
00054
00055 #if defined(WITH_DB) && defined(DB_XA_CREATE)
00056 { "xa_create", 0,POPT_BIT_SET, &db3dbi.dbi_cflags, DB_XA_CREATE,
00057 NULL, NULL },
00058 #endif
00059
00060
00061 #if defined(WITH_DB) && defined(DB_AUTO_COMMIT)
00062 { "auto_commit", 0,POPT_BIT_SET, &db3dbi.dbi_oeflags, DB_AUTO_COMMIT,
00063 NULL, NULL },
00064 #endif
00065 #if defined(WITH_DB) && defined(DB_CREATE)
00066 { "create", 0,POPT_BIT_SET, &db3dbi.dbi_oeflags, DB_CREATE,
00067 NULL, NULL },
00068 #endif
00069 #if defined(WITH_DB) && defined(DB_MULTIVERSION)
00070 { "multiversion", 0,POPT_BIT_SET, &db3dbi.dbi_oeflags, DB_MULTIVERSION,
00071 NULL, NULL },
00072 #endif
00073 #if defined(WITH_DB) && defined(DB_NOMMAP)
00074 { "nommap", 0,POPT_BIT_SET, &db3dbi.dbi_oeflags, DB_NOMMAP,
00075 NULL, NULL },
00076 #endif
00077 #if defined(WITH_DB) && defined(DB_THREAD)
00078 { "thread", 0,POPT_BIT_SET, &db3dbi.dbi_oeflags, DB_THREAD,
00079 NULL, NULL },
00080 #endif
00081
00082 #if defined(WITH_DB) && defined(DB_FORCE)
00083 { "force", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_FORCE,
00084 NULL, NULL },
00085 #endif
00086
00087
00088
00089 #if defined(WITH_DB) && defined(DB_INIT_CDB)
00090 { "cdb", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_CDB,
00091 NULL, NULL },
00092 #endif
00093 #if defined(WITH_DB) && defined(DB_INIT_LOCK)
00094 { "lock", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_LOCK,
00095 NULL, NULL },
00096 #endif
00097 #if defined(WITH_DB) && defined(DB_INIT_LOG)
00098 { "log", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_LOG,
00099 NULL, NULL },
00100 #endif
00101 #if defined(WITH_DB) && defined(DB_INIT_MPOOL)
00102 { "mpool", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_MPOOL,
00103 NULL, NULL },
00104 #endif
00105 #if defined(WITH_DB) && defined(DB_INIT_REP)
00106 { "rep", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_REP,
00107 NULL, NULL },
00108 #endif
00109 #if defined(WITH_DB) && defined(DB_INIT_TXN)
00110 { "txn", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_INIT_TXN,
00111 NULL, NULL },
00112 #endif
00113
00114 #ifdef DYING
00115 { "joinenv", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_JOINENV,
00116 NULL, NULL },
00117 #endif
00118 #if defined(WITH_DB) && defined(DB_LOCKDOWN)
00119 { "lockdown", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_LOCKDOWN,
00120 NULL, NULL },
00121 #endif
00122 #if (defined(WITH_DB) || defined(WITH_SQLITE)) && defined(DB_PRIVATE)
00123 { "private", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_PRIVATE,
00124 NULL, NULL },
00125 #endif
00126 #if defined(WITH_DB) && defined(DB_RECOVER)
00127 { "recover", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_RECOVER,
00128 NULL, NULL },
00129 #endif
00130 #if defined(WITH_DB) && defined(DB_RECOVER_FATAL)
00131 { "recover_fatal", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_RECOVER_FATAL,
00132 NULL, NULL },
00133 #endif
00134 #if defined(WITH_DB) && defined(DB_REGISTER)
00135 { "register", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_REGISTER,
00136 NULL, NULL },
00137 #endif
00138 #if defined(WITH_DB) && defined(DB_SYSTEM_MEM)
00139 { "shared", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_SYSTEM_MEM,
00140 NULL, NULL },
00141 #endif
00142 #if defined(WITH_DB) && defined(DB_TXN_NOSYNC)
00143 { "txn_nosync", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_TXN_NOSYNC,
00144 NULL, NULL },
00145 #endif
00146 #if defined(WITH_DB) && defined(DB_USE_ENVIRON_ROOT)
00147 { "use_environ_root", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_USE_ENVIRON_ROOT,
00148 NULL, NULL },
00149 #endif
00150 #if defined(WITH_DB) && defined(DB_USE_ENVIRON)
00151 { "use_environ", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_USE_ENVIRON,
00152 NULL, NULL },
00153 #endif
00154 #if defined(WITH_DB) && defined(DB_IGNORE_LEASE)
00155 { "ignore_lease", 0,POPT_BIT_SET, &db3dbi.dbi_eflags, DB_IGNORE_LEASE,
00156 NULL, NULL },
00157 #endif
00158
00159 #if defined(WITH_DB) && defined(DB_TXN_SYNC)
00160 { "txn_sync", 0,POPT_BIT_SET, &db3dbi.dbi_tflags, DB_TXN_SYNC,
00161 NULL, NULL },
00162 #endif
00163 #if defined(WITH_DB) && defined(DB_TXN_NOWAIT)
00164 { "txn_nowait",0,POPT_BIT_SET, &db3dbi.dbi_tflags, DB_TXN_NOWAIT,
00165 NULL, NULL },
00166 #endif
00167 #if defined(WITH_DB) && defined(DB_TXN_WAIT)
00168 { "txn_wait",0,POPT_BIT_SET, &db3dbi.dbi_tflags, DB_TXN_WAIT,
00169 NULL, NULL },
00170 #endif
00171
00172 #if defined(WITH_DB) && defined(NOTYET)
00173 DB_AUTO_COMMIT
00174 DB_CDB_ALLDB
00175 DB_DIRECT_DB
00176 DB_DIRECT_LOG
00177 DB_DSYNC_DB
00178 DB_DSYNC_LOG
00179 DB_LOG_AUTOREMOVE
00180 DB_LOG_BUFFER_FULL ???
00181 DB_LOG_INMEMORY
00182 DB_NOLOCKING
00183 DB_MULTIVERSION
00184 DB_NOMMAP
00185 DB_NOPANIC
00186 DB_OVERWRITE
00187 DB_PANIC_ENVIRONMENT
00188 DB_REGION_INIT
00189 DB_TIME_NOTGRANTED
00190 DB_TXN_NOSYNC
00191 DB_TXN_SNAPSHOT
00192 DB_WRITE_NOSYNC
00193 DB_YIELDCPU
00194 #endif
00195
00196
00197
00198 #if defined(WITH_DB) && defined(NOTYET)
00199 DB_CHKSUM
00200 DB_ENCRYPT
00201 DB_TXN_NOT_DURABLE
00202
00203 DB_DUP BTREE HASH
00204 DB_DUPSORT BTREE HASH
00205 DB_RECNUM BTREE
00206 DB_REVSPLITOFF BTREE
00207
00208 DB_INORDER QUEUE
00209 DB_RENUMBER RECNO
00210 DB_SNAPSHOT RECNO
00211 #endif
00212
00213
00214 #if (defined(WITH_DB) || defined(WITH_SQLITE)) && defined(DB_EXCL)
00215 { "excl", 0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_EXCL,
00216 NULL, NULL },
00217 #endif
00218 #if defined(WITH_DB) && defined(DB_FCNTL_LOCKING)
00219 { "fcntl_locking",0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_FCNTL_LOCKING,
00220 NULL, NULL },
00221 #endif
00222 #if defined(WITH_DB) && defined(DB_NO_AUTO_COMMIT) && defined(NOTYET)
00223 { "noautocommit", 0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_NO_AUTO_COMMIT,
00224 NULL, NULL },
00225 #endif
00226 #if defined(WITH_DB) && defined(DB_RDONLY)
00227 { "rdonly", 0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_RDONLY,
00228 NULL, NULL },
00229 #endif
00230 #if defined(WITH_DB) && defined(DB_RDWRMASTER) && defined(NOTYET)
00231 { "rdwrmaster", 0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_RDWRMASTER,
00232 NULL, NULL },
00233 #endif
00234 #if defined(WITH_DB) && defined(NOTYET)
00235 DB_READ_UNCOMITTED
00236 #endif
00237 #if defined(WITH_DB) && defined(DB_TRUNCATE)
00238 { "truncate", 0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_TRUNCATE,
00239 NULL, NULL },
00240 #endif
00241 #if defined(WITH_DB) && defined(DB_WRITEOPEN)
00242 { "writeopen", 0,POPT_BIT_SET, &db3dbi.dbi_oflags, DB_WRITEOPEN,
00243 NULL, NULL },
00244 #endif
00245
00246 #if defined(WITH_DB)
00247 { "btree", 0,POPT_ARG_VAL, &db3dbi.dbi_type, DB_BTREE,
00248 NULL, NULL },
00249 { "hash", 0,POPT_ARG_VAL, &db3dbi.dbi_type, DB_HASH,
00250 NULL, NULL },
00251 { "recno", 0,POPT_ARG_VAL, &db3dbi.dbi_type, DB_RECNO,
00252 NULL, NULL },
00253 { "queue", 0,POPT_ARG_VAL, &db3dbi.dbi_type, DB_QUEUE,
00254 NULL, NULL },
00255 { "unknown", 0,POPT_ARG_VAL, &db3dbi.dbi_type, DB_UNKNOWN,
00256 NULL, NULL },
00257 #endif
00258
00259 { "root", 0,POPT_ARG_STRING, &db3dbi.dbi_root, 0,
00260 NULL, NULL },
00261 { "home", 0,POPT_ARG_STRING, &db3dbi.dbi_home, 0,
00262 NULL, NULL },
00263 { "file", 0,POPT_ARG_STRING, &db3dbi.dbi_file, 0,
00264 NULL, NULL },
00265 { "subfile", 0,POPT_ARG_STRING, &db3dbi.dbi_subfile, 0,
00266 NULL, NULL },
00267 #if defined(WITH_DB)
00268 { "mode", 0,POPT_ARG_INT, &db3dbi.dbi_mode, 0,
00269 NULL, NULL },
00270 #endif
00271 { "perms", 0,POPT_ARG_INT, &db3dbi.dbi_perms, 0,
00272 NULL, NULL },
00273 #if defined(WITH_DB)
00274 { "shmkey", 0,POPT_ARG_LONG, &db3dbi.dbi_shmkey, 0,
00275 NULL, NULL },
00276 #endif
00277 { "tmpdir", 0,POPT_ARG_STRING, &db3dbi.dbi_tmpdir, 0,
00278 NULL, NULL },
00279
00280 #if defined(WITH_DB)
00281 { "host", 0,POPT_ARG_STRING, &db3dbi.dbi_host, 0,
00282 NULL, NULL },
00283 { "server", 0,POPT_ARG_STRING, &db3dbi.dbi_host, 0,
00284 NULL, NULL },
00285 { "cl_timeout", 0,POPT_ARG_LONG, &db3dbi.dbi_cl_timeout, 0,
00286 NULL, NULL },
00287 { "sv_timeout", 0,POPT_ARG_LONG, &db3dbi.dbi_sv_timeout, 0,
00288 NULL, NULL },
00289 #endif
00290
00291 #if defined(WITH_DB)
00292 { "verify", 0,POPT_ARG_NONE, &db3dbi.dbi_verify_on_close, 0,
00293 NULL, NULL },
00294 { "teardown", 0,POPT_ARG_NONE, &dbi_tear_down, 0,
00295 NULL, NULL },
00296 { "usecursors",0,POPT_ARG_NONE, &dbi_use_cursors, 0,
00297 NULL, NULL },
00298 { "usedbenv", 0,POPT_ARG_NONE, &db3dbi.dbi_use_dbenv, 0,
00299 NULL, NULL },
00300 #endif
00301 { "nofsync", 0,POPT_ARG_NONE, &db3dbi.dbi_no_fsync, 0,
00302 NULL, NULL },
00303 #if defined(WITH_DB)
00304 { "nodbsync", 0,POPT_ARG_NONE, &db3dbi.dbi_no_dbsync, 0,
00305 NULL, NULL },
00306 { "lockdbfd", 0,POPT_ARG_NONE, &db3dbi.dbi_lockdbfd, 0,
00307 NULL, NULL },
00308 #endif
00309 { "noload", 0,POPT_ARG_NONE, &db3dbi.dbi_noload, 0,
00310 NULL, NULL },
00311 { "temporary", 0,POPT_ARG_NONE, &db3dbi.dbi_temporary, 0,
00312 NULL, NULL },
00313 #if defined(WITH_DB)
00314 { "debug", 0,POPT_ARG_NONE, &db3dbi.dbi_debug, 0,
00315 NULL, NULL },
00316 #endif
00317
00318
00319 { "cachesize", 0,POPT_ARG_INT, &db3dbi.dbi_cachesize, 0,
00320 NULL, NULL },
00321 #if defined(WITH_DB)
00322
00323
00324 { "errpfx", 0,POPT_ARG_STRING, &db3dbi.dbi_errpfx, 0,
00325 NULL, NULL },
00326
00327 { "lorder", 0,POPT_ARG_INT, &db3dbi.dbi_lorder, 0,
00328 NULL, NULL },
00329 #endif
00330 { "pagesize", 0,POPT_ARG_INT, &db3dbi.dbi_pagesize, 0,
00331 NULL, NULL },
00332
00333 #if defined(WITH_DB)
00334 { "region_init", 0,POPT_ARG_VAL, &db3dbi.dbi_region_init, 1,
00335 NULL, NULL },
00336
00337 { "thread_count", 0,POPT_ARG_INT, &db3dbi.dbi_thread_count, 0,
00338 NULL, NULL },
00339 #endif
00340
00341 #if defined(WITH_DB) && defined(DB_VERB_CHKPOINT)
00342 { "chkpoint", 0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_CHKPOINT,
00343 NULL, NULL },
00344 #endif
00345 #if defined(WITH_DB) && defined(DB_VERB_DEADLOCK)
00346 { "deadlock", 0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_DEADLOCK,
00347 NULL, NULL },
00348 #endif
00349 #if defined(WITH_DB) && defined(DB_VERB_RECOVERY)
00350 { "recovery", 0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_RECOVERY,
00351 NULL, NULL },
00352 #endif
00353 #if defined(WITH_DB) && defined(DB_VERB_REGISTER)
00354 { "register", 0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_REGISTER,
00355 NULL, NULL },
00356 #endif
00357 #if defined(WITH_DB) && defined(DB_VERB_REPLICATION)
00358 { "replication", 0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_REPLICATION,
00359 NULL, NULL },
00360 #endif
00361 #if defined(WITH_DB) && defined(DB_VERB_WAITSFOR)
00362 { "waitsfor", 0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_WAITSFOR,
00363 NULL, NULL },
00364 #endif
00365 #if defined(WITH_DB) && defined(DB_VERB_FILEOPS)
00366 { "fileops", 0,POPT_BIT_SET, &db3dbi.dbi_verbose, DB_VERB_FILEOPS,
00367 NULL, NULL },
00368 #endif
00369 #if defined(WITH_DB) && defined(DB_VERB_FILEOPS_ALL)
00370 { "fileops_all",0,POPT_BIT_SET,&db3dbi.dbi_verbose, DB_VERB_FILEOPS_ALL,
00371 NULL, NULL },
00372 #endif
00373 #if defined(WITH_DB)
00374 { "verbose", 0,POPT_ARG_VAL, &db3dbi.dbi_verbose, -1,
00375 NULL, NULL },
00376 #endif
00377
00378
00379
00380
00381
00382 #if defined(WITH_DB) && defined(DB_LOCK_DEFAULT)
00383 { "lk_default",0,POPT_ARG_VAL, &db3dbi.dbi_lk_detect, DB_LOCK_DEFAULT,
00384 NULL, NULL },
00385 #endif
00386 #if defined(WITH_DB) && defined(DB_LOCK_EXPIRE)
00387 { "lk_expire", 0,POPT_ARG_VAL, &db3dbi.dbi_lk_detect, DB_LOCK_EXPIRE,
00388 NULL, NULL },
00389 #endif
00390 #if defined(WITH_DB) && defined(DB_LOCK_MAXLOCKS)
00391 { "lk_maxlocks", 0,POPT_ARG_VAL, &db3dbi.dbi_lk_detect, DB_LOCK_MAXLOCKS,
00392 NULL, NULL },
00393 #endif
00394 #if defined(WITH_DB) && defined(DB_LOCK_MAXWRITE)
00395 { "lk_maxwrite", 0,POPT_ARG_VAL, &db3dbi.dbi_lk_detect, DB_LOCK_MAXWRITE,
00396 NULL, NULL },
00397 #endif
00398 #if defined(WITH_DB) && defined(DB_LOCK_MINLOCKS)
00399 { "lk_minlocks", 0,POPT_ARG_VAL, &db3dbi.dbi_lk_detect, DB_LOCK_MINLOCKS,
00400 NULL, NULL },
00401 #endif
00402 #if defined(WITH_DB) && defined(DB_LOCK_MINWRITE)
00403 { "lk_minwrite", 0,POPT_ARG_VAL, &db3dbi.dbi_lk_detect, DB_LOCK_MINWRITE,
00404 NULL, NULL },
00405 #endif
00406 #if defined(WITH_DB) && defined(DB_LOCK_OLDEST)
00407 { "lk_oldest", 0,POPT_ARG_VAL, &db3dbi.dbi_lk_detect, DB_LOCK_OLDEST,
00408 NULL, NULL },
00409 #endif
00410 #if defined(WITH_DB) && defined(DB_LOCK_RANDOM)
00411 { "lk_random", 0,POPT_ARG_VAL, &db3dbi.dbi_lk_detect, DB_LOCK_RANDOM,
00412 NULL, NULL },
00413 #endif
00414 #if defined(WITH_DB) && defined(DB_LOCK_YOUNGEST)
00415 { "lk_youngest",0, POPT_ARG_VAL, &db3dbi.dbi_lk_detect, DB_LOCK_YOUNGEST,
00416 NULL, NULL },
00417 #endif
00418
00419
00420
00421
00422 #if defined(WITH_DB) && defined(NOTYET)
00423 DB_LOCK_NOWAIT
00424
00425 DB_LOCK_READ
00426 DB_LOCK_WRITE
00427 DB_LOCK_IWRITE
00428 DB_LOCK_IREAD
00429 DB_LOCK_IWR
00430 #endif
00431
00432 #if defined(WITH_DB)
00433
00434
00435 { "lk_max_lockers", 0,POPT_ARG_INT, &db3dbi.dbi_lk_max_lockers, 0,
00436 NULL, NULL },
00437
00438
00439 { "lk_max_locks", 0,POPT_ARG_INT, &db3dbi.dbi_lk_max_locks, 0,
00440 NULL, NULL },
00441
00442
00443 { "lk_max_objects", 0,POPT_ARG_INT, &db3dbi.dbi_lk_max_objects, 0,
00444 NULL, NULL },
00445 #endif
00446
00447
00448 #if defined(WITH_DB) && defined(NOTYET)
00449 DB_SET_LOCK_TIMEOUT
00450 DB_SET_TXN_NOW
00451 DB_SET_TXN_TIMEOUT
00452 #endif
00453
00454
00455
00456 #if defined(WITH_DB)
00457
00458
00459 { "lg_bsize", 0,POPT_ARG_INT, &db3dbi.dbi_lg_bsize, 0,
00460 NULL, NULL },
00461
00462
00463 { "lg_dir", 0,POPT_ARG_STRING, &db3dbi.dbi_lg_dir, 0,
00464 NULL, NULL },
00465
00466
00467 { "lg_filemode", 0,POPT_ARG_INT, &db3dbi.dbi_lg_filemode, 0,
00468 NULL, NULL },
00469
00470
00471 { "lg_max", 0,POPT_ARG_INT, &db3dbi.dbi_lg_max, 0,
00472 NULL, NULL },
00473
00474
00475 { "lg_regionmax", 0,POPT_ARG_INT, &db3dbi.dbi_lg_regionmax, 0,
00476 NULL, NULL },
00477 #endif
00478
00479
00480 #if defined(WITH_DB)
00481 { "mp_size", 0,POPT_ARG_INT, &db3dbi.dbi_cachesize, 0,
00482 NULL, NULL },
00483
00484
00485 { "mmapsize", 0,POPT_ARG_INT, &db3dbi.dbi_mmapsize, 0,
00486 NULL, NULL },
00487 { "mp_mmapsize", 0,POPT_ARG_INT, &db3dbi.dbi_mmapsize, 0,
00488 NULL, NULL },
00489
00490
00491
00492
00493
00494
00495
00496 #endif
00497
00498
00499 #if defined(WITH_DB) && defined(NOTYET)
00500 DB_MUTEX_PROCESS_ONLY mutex_alloc
00501 DB_MUTEX_SELF_BLOCK mutex_alloc
00502 DB_STAT_CLEAR mutex_stat*
00503 #endif
00504 #if defined(WITH_DB)
00505
00506
00507 { "mutex_align", 0,POPT_ARG_INT, &db3dbi.dbi_mutex_align, 0,
00508 NULL, NULL },
00509
00510
00511 { "mutex_increment", 0,POPT_ARG_INT, &db3dbi.dbi_mutex_increment, 0,
00512 NULL, NULL },
00513
00514
00515 { "mutex_max", 0,POPT_ARG_INT, &db3dbi.dbi_mutex_max, 0,
00516 NULL, NULL },
00517
00518
00519 { "mutex_tas_spins", 0,POPT_ARG_INT, &db3dbi.dbi_mutex_tas_spins, 0,
00520 NULL, NULL },
00521 #endif
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532 #if defined(WITH_DB)
00533
00534
00535 { "seq_cachesize", 0,POPT_ARG_INT, &db3dbi.dbi_seq_cachesize, 0,
00536 NULL, NULL },
00537 #endif
00538
00539
00540 #if defined(WITH_DB) && defined(DB_SEQ_DEC)
00541 { "seq_dec", 0,POPT_BIT_SET, &db3dbi.dbi_seq_flags, DB_SEQ_DEC,
00542 NULL, NULL },
00543 #endif
00544 #if defined(WITH_DB) && defined(DB_SEQ_INC)
00545 { "seq_inc", 0,POPT_BIT_SET, &db3dbi.dbi_seq_flags, DB_SEQ_INC,
00546 NULL, NULL },
00547 #endif
00548 #if defined(WITH_DB) && defined(DB_SEQ_WRAP)
00549 { "seq_wrap", 0,POPT_BIT_SET, &db3dbi.dbi_seq_flags, DB_SEQ_WRAP,
00550 NULL, NULL },
00551 #endif
00552
00553
00554 #if defined(WITH_DB) && defined(NOTYET)
00555 { "seq_min", 0,POPT_ARG_INT, &db3dbi.dbi_seq_min, 0,
00556 NULL, NULL },
00557 { "seq_max", 0,POPT_ARG_INT, &db3dbi.dbi_seq_max, 0,
00558 NULL, NULL },
00559 #endif
00560
00561
00562
00563
00564
00565
00566
00567 #if defined(WITH_DB)
00568 { "tx_max", 0,POPT_ARG_INT, &db3dbi.dbi_tx_max, 0,
00569 NULL, NULL },
00570 #endif
00571
00572
00573
00574
00575
00576
00577
00578 #if defined(WITH_DB) && defined(DB_DUP)
00579 { "bt_dup", 0,POPT_BIT_SET, &db3dbi.dbi_bt_flags, DB_DUP,
00580 NULL, NULL },
00581 #endif
00582 #if defined(WITH_DB) && defined(DB_DUPSORT)
00583 { "bt_dupsort",0,POPT_BIT_SET, &db3dbi.dbi_bt_flags, DB_DUPSORT,
00584 NULL, NULL },
00585 #endif
00586 #if defined(WITH_DB) && defined(DB_RECNUM)
00587 { "bt_recnum", 0,POPT_BIT_SET, &db3dbi.dbi_bt_flags, DB_RECNUM,
00588 NULL, NULL },
00589 #endif
00590 #if defined(WITH_DB) && defined(DB_REVSPLITOFF)
00591 { "bt_revsplitoff", 0,POPT_BIT_SET, &db3dbi.dbi_bt_flags, DB_REVSPLITOFF,
00592 NULL, NULL },
00593 #endif
00594
00595 #if defined(WITH_DB) && defined(DB_DUP)
00596 { "h_dup", 0,POPT_BIT_SET, &db3dbi.dbi_h_flags, DB_DUP,
00597 NULL, NULL },
00598 #endif
00599 #if defined(WITH_DB) && defined(DB_SUPSORT)
00600 { "h_dupsort", 0,POPT_BIT_SET, &db3dbi.dbi_h_flags, DB_DUPSORT,
00601 NULL, NULL },
00602 #endif
00603 #if defined(WITH_DB)
00604 { "h_ffactor", 0,POPT_ARG_INT, &db3dbi.dbi_h_ffactor, 0,
00605 NULL, NULL },
00606 { "h_nelem", 0,POPT_ARG_INT, &db3dbi.dbi_h_nelem, 0,
00607 NULL, NULL },
00608 #endif
00609
00610 #if defined(WITH_DB) && defined(DB_RENUMBER)
00611 { "re_renumber", 0,POPT_BIT_SET, &db3dbi.dbi_re_flags, DB_RENUMBER,
00612 NULL, NULL },
00613 #endif
00614 #if defined(WITH_DB) && defined(DB_SNAPSHOT)
00615 { "re_snapshot",0,POPT_BIT_SET, &db3dbi.dbi_re_flags, DB_SNAPSHOT,
00616 NULL, NULL },
00617 #endif
00618 #if defined(WITH_DB)
00619 { "re_delim", 0,POPT_ARG_INT, &db3dbi.dbi_re_delim, 0,
00620 NULL, NULL },
00621 { "re_len", 0,POPT_ARG_INT, &db3dbi.dbi_re_len, 0,
00622 NULL, NULL },
00623 { "re_pad", 0,POPT_ARG_INT, &db3dbi.dbi_re_pad, 0,
00624 NULL, NULL },
00625 { "re_source", 0,POPT_ARG_STRING, &db3dbi.dbi_re_source, 0,
00626 NULL, NULL },
00627
00628 { "q_extentsize", 0,POPT_ARG_INT, &db3dbi.dbi_q_extentsize, 0,
00629 NULL, NULL },
00630 #endif
00631
00632 POPT_TABLEEND
00633 };
00634
00635
00636 dbiIndex db3Free(dbiIndex dbi)
00637 {
00638 if (dbi) {
00639 dbi->dbi_root = _free(dbi->dbi_root);
00640 dbi->dbi_home = _free(dbi->dbi_home);
00641 dbi->dbi_file = _free(dbi->dbi_file);
00642 dbi->dbi_subfile = _free(dbi->dbi_subfile);
00643 dbi->dbi_tmpdir = _free(dbi->dbi_tmpdir);
00644 dbi->dbi_host = _free(dbi->dbi_host);
00645 dbi->dbi_errpfx = _free(dbi->dbi_errpfx);
00646 dbi->dbi_re_source = _free(dbi->dbi_re_source);
00647 dbi->dbi_stats = _free(dbi->dbi_stats);
00648 dbi = _free(dbi);
00649 }
00650 return dbi;
00651 }
00652
00653
00654 static const char *db3_config_default =
00655 "hash tmpdir=/var/tmp create cdb mpool mp_mmapsize=16Mb mp_size=1Mb perms=0644";
00656
00657 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
00658 {
00659 dbiIndex dbi = xcalloc(1, sizeof(*dbi));
00660 char dbiTagMacro[128];
00661 char * dbOpts;
00662
00663 sprintf(dbiTagMacro, "%%{_dbi_config_%s}", tagName(rpmtag));
00664 dbOpts = rpmExpand(dbiTagMacro, NULL);
00665 if (!(dbOpts && *dbOpts && *dbOpts != '%')) {
00666 dbOpts = _free(dbOpts);
00667 dbOpts = rpmExpand("%{_dbi_config}", NULL);
00668 if (!(dbOpts && *dbOpts && *dbOpts != '%')) {
00669 dbOpts = rpmExpand(db3_config_default, NULL);
00670 }
00671 }
00672
00673
00674 if (dbOpts && *dbOpts && *dbOpts != '%') {
00675 char *o, *oe;
00676 char *p, *pe;
00677
00678 memset(&db3dbi, 0, sizeof(db3dbi));
00679
00680 for (o = dbOpts; o && *o; o = oe) {
00681 struct poptOption *opt;
00682 const char * tok;
00683 int argInfo;
00684
00685
00686 while (*o && xisspace((int)*o))
00687 o++;
00688
00689
00690 for (oe = o; oe && *oe; oe++) {
00691 if (xisspace((int)*oe))
00692 break;
00693 if (oe[0] == ':' && !(oe[1] == '/' && oe[2] == '/'))
00694 break;
00695 }
00696 if (oe && *oe)
00697 *oe++ = '\0';
00698 if (*o == '\0')
00699 continue;
00700
00701
00702 for (pe = o; pe && *pe && *pe != '='; pe++)
00703 {};
00704 p = (pe ? *pe++ = '\0', pe : NULL);
00705
00706
00707 for (tok = o; *tok == '!'; tok++)
00708 {};
00709
00710
00711 for (opt = rdbOptions; opt->longName != NULL; opt++) {
00712 if (strcmp(tok, opt->longName))
00713 continue;
00714 break;
00715 }
00716 if (opt->longName == NULL) {
00717 rpmlog(RPMLOG_ERR,
00718 _("unrecognized db option: \"%s\" ignored.\n"), o);
00719 continue;
00720 }
00721
00722
00723 argInfo = opt->argInfo;
00724 if (argInfo == POPT_BIT_SET && *o == '!' && ((tok - o) % 2))
00725 argInfo = POPT_BIT_CLR;
00726
00727
00728 switch (argInfo & POPT_ARG_MASK) {
00729
00730 case POPT_ARG_NONE:
00731 (void) poptSaveInt((int *)opt->arg, argInfo, 1L);
00732 break;
00733 case POPT_ARG_VAL:
00734 (void) poptSaveInt((int *)opt->arg, argInfo, (long)opt->val);
00735 break;
00736 case POPT_ARG_STRING:
00737 { const char ** t = opt->arg;
00738
00739 if (t) {
00740
00741 *t = _free(*t);
00742
00743 *t = xstrdup( (p ? p : "") );
00744 }
00745
00746 } break;
00747
00748 case POPT_ARG_INT:
00749 case POPT_ARG_LONG:
00750 { long aLong = strtol(p, &pe, 0);
00751 if (pe) {
00752 if (!xstrncasecmp(pe, "Mb", 2))
00753 aLong *= 1024 * 1024;
00754 else if (!xstrncasecmp(pe, "Kb", 2))
00755 aLong *= 1024;
00756 else if (*pe != '\0') {
00757 rpmlog(RPMLOG_ERR,
00758 _("%s has invalid numeric value, skipped\n"),
00759 opt->longName);
00760 continue;
00761 }
00762 }
00763
00764 if ((argInfo & POPT_ARG_MASK) == POPT_ARG_LONG) {
00765 if (aLong == LONG_MIN || aLong == LONG_MAX) {
00766 rpmlog(RPMLOG_ERR,
00767 _("%s has too large or too small long value, skipped\n"),
00768 opt->longName);
00769 continue;
00770 }
00771 (void) poptSaveLong((long *)opt->arg, argInfo, aLong);
00772 break;
00773 } else {
00774 if (aLong > INT_MAX || aLong < INT_MIN) {
00775 rpmlog(RPMLOG_ERR,
00776 _("%s has too large or too small integer value, skipped\n"),
00777 opt->longName);
00778 continue;
00779 }
00780 (void) poptSaveInt((int *)opt->arg, argInfo, aLong);
00781 }
00782 } break;
00783 default:
00784 break;
00785 }
00786 }
00787
00788 }
00789
00790 dbOpts = _free(dbOpts);
00791
00792
00793 *dbi = db3dbi;
00794
00795 memset(&db3dbi, 0, sizeof(db3dbi));
00796
00797 if (!(dbi->dbi_perms & 0600))
00798 dbi->dbi_perms = 0644;
00799 dbi->dbi_mode = rpmdb->db_mode;
00800
00801 dbi->dbi_rpmdb = rpmdb;
00802
00803 dbi->dbi_rpmtag = rpmtag;
00804
00805
00806
00807
00808
00809 switch (rpmtag) {
00810 case RPMDBI_PACKAGES:
00811 case RPMDBI_DEPENDS:
00812 dbi->dbi_jlen = 1 * sizeof(uint32_t);
00813 break;
00814 default:
00815 dbi->dbi_jlen = 2 * sizeof(uint32_t);
00816 break;
00817 }
00818
00819
00820 dbi->dbi_byteswapped = -1;
00821
00822 #if defined(WITH_DB)
00823 if (!dbi->dbi_use_dbenv) {
00824 dbi->dbi_use_dbenv = 1;
00825 dbi->dbi_eflags |= (DB_INIT_MPOOL|DB_JOINENV);
00826 dbi->dbi_mmapsize = 16 * 1024 * 1024;
00827 dbi->dbi_cachesize = 1 * 1024 * 1024;
00828 }
00829
00830 if ((dbi->dbi_bt_flags | dbi->dbi_h_flags) & DB_DUP)
00831 dbi->dbi_permit_dups = 1;
00832 #endif
00833
00834
00835 return dbi;
00836
00837 }
00838
00839 const char * prDbiOpenFlags(int dbflags, int print_dbenv_flags)
00840 {
00841 static char buf[256];
00842 struct poptOption *opt;
00843 char * oe;
00844
00845 oe = buf;
00846 *oe = '\0';
00847 for (opt = rdbOptions; opt->longName != NULL; opt++) {
00848 if (opt->argInfo != POPT_BIT_SET)
00849 continue;
00850 if (print_dbenv_flags) {
00851 if (!(opt->arg == &db3dbi.dbi_oeflags ||
00852 opt->arg == &db3dbi.dbi_eflags))
00853 continue;
00854 } else {
00855 if (!(opt->arg == &db3dbi.dbi_oeflags ||
00856 opt->arg == &db3dbi.dbi_oflags))
00857 continue;
00858 }
00859 if ((dbflags & opt->val) != opt->val)
00860 continue;
00861 if (oe != buf)
00862 *oe++ = ':';
00863 oe = stpcpy(oe, opt->longName);
00864 dbflags &= ~opt->val;
00865 }
00866 if (dbflags) {
00867 if (oe != buf)
00868 *oe++ = ':';
00869 sprintf(oe, "0x%x", (unsigned)dbflags);
00870 }
00871 return buf;
00872 }
00873
00874 #endif