00001 #ifndef H_RPMDB
00002 #define H_RPMDB
00003
00004
00010 #include <assert.h>
00011 #include <rpmlib.h>
00012 #include <mire.h>
00013 #include "db.h"
00014
00015
00016
00017 extern int _rpmdb_debug;
00018
00019
00020
00021 extern int _rsegfault;
00022
00023 extern int _wsegfault;
00024
00025 #if defined(__LCLINT__)
00026 #define RSEGFAULT
00027 #define WSEGFAULT
00028 #else
00029 #define RSEGFAULT { if (_rsegfault > 0) assert(--_rsegfault); }
00030 #define WSEGFAULT { if (_wsegfault > 0) assert(--_wsegfault); }
00031 #endif
00032
00033 #ifdef NOTYET
00034
00037 typedef struct rpmdb_s * rpmdb;
00038
00042 typedef struct _rpmdbMatchIterator * rpmdbMatchIterator;
00043 #endif
00044
00047 typedef struct _dbiIndexItem * dbiIndexItem;
00048
00052 typedef struct _dbiIndexSet * dbiIndexSet;
00053
00056 typedef struct _dbiIndex * dbiIndex;
00057
00058 #if defined(_RPMDB_INTERNAL)
00059 #include "rpmsw.h"
00060 #if !defined(SWIG)
00061
00066 struct _dbiIndexItem {
00067 unsigned int hdrNum;
00068 unsigned int tagNum;
00069 unsigned int fpNum;
00070 };
00071
00075 struct _dbiIndexSet {
00076 struct _dbiIndexItem * recs;
00077 int count;
00078 };
00079
00083 struct _dbiVec {
00084 int dbv_major;
00085 int dbv_minor;
00086 int dbv_patch;
00094 int (*open) (rpmdb rpmdb, rpmTag rpmtag, dbiIndex * dbip)
00095
00096 ;
00097
00104 int (*close) ( dbiIndex dbi, unsigned int flags)
00105
00106 ;
00107
00114 int (*sync) (dbiIndex dbi, unsigned int flags)
00115
00116 ;
00117
00126 int (*associate) (dbiIndex dbi, dbiIndex dbisecondary,
00127 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00128 unsigned int flags)
00129
00130 ;
00131
00140 int (*join) (dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00141 unsigned int flags)
00142
00143 ;
00144
00153 int (*copen) (dbiIndex dbi, DB_TXN * txnid,
00154 DBC ** dbcp, unsigned int dbiflags)
00155
00156 ;
00157
00165 int (*cclose) (dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00166
00167 ;
00168
00177 int (*cdup) (dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00178 unsigned int flags)
00179
00180 ;
00181
00191 int (*cdel) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00192 unsigned int flags)
00193
00194 ;
00195
00205 int (*cget) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00206 unsigned int flags)
00207
00208 ;
00209
00220 int (*cpget) (dbiIndex dbi, DBC * dbcursor,
00221 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00222
00223 ;
00224
00234 int (*cput) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00235 unsigned int flags)
00236
00237 ;
00238
00247 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
00248 unsigned int * countp,
00249 unsigned int flags)
00250
00251 ;
00252
00258 int (*byteswapped) (dbiIndex dbi)
00259
00260 ;
00261
00268 int (*stat) (dbiIndex dbi, unsigned int flags)
00269
00270 ;
00271 };
00272
00276 struct _dbiIndex {
00277
00278 const char * dbi_root;
00279
00280 const char * dbi_home;
00281
00282 const char * dbi_file;
00283
00284 const char * dbi_subfile;
00285
00286 const char * dbi_tmpdir;
00288 int dbi_ecflags;
00289 int dbi_cflags;
00290 int dbi_oeflags;
00291 int dbi_eflags;
00292 int dbi_oflags;
00293 int dbi_tflags;
00295 int dbi_type;
00296 unsigned dbi_mode;
00297 int dbi_perms;
00298 long dbi_shmkey;
00299 int dbi_api;
00301 int dbi_verify_on_close;
00302 int dbi_use_dbenv;
00303 int dbi_permit_dups;
00304 int dbi_no_fsync;
00305 int dbi_no_dbsync;
00306 int dbi_lockdbfd;
00307 int dbi_temporary;
00308 int dbi_debug;
00309 int dbi_byteswapped;
00310
00311
00312 char * dbi_host;
00313 unsigned long dbi_cl_timeout;
00314 unsigned long dbi_sv_timeout;
00315
00316
00317 int dbi_lorder;
00318
00319
00320 void (*db_errcall) (void * dbenv, const char *db_errpfx, char *buffer)
00321
00322 ;
00323
00324 FILE * dbi_errfile;
00325 const char * dbi_errpfx;
00326 int dbi_verbose;
00327 int dbi_region_init;
00328 unsigned int dbi_thread_count;
00329
00330 unsigned int dbi_lk_max_lockers;
00331 unsigned int dbi_lk_max_locks;
00332 unsigned int dbi_lk_max_objects;
00333 unsigned int dbi_lk_detect;
00334
00335 int dbi_lk_nmodes;
00336
00337 unsigned char * dbi_lk_conflicts;
00338
00339 unsigned int dbi_lg_bsize;
00340
00341 const char * dbi_lg_dir;
00342
00343 unsigned int dbi_lg_filemode;
00344 unsigned int dbi_lg_max;
00345 unsigned int dbi_lg_regionmax;
00346
00347 int dbi_mmapsize;
00348 int dbi_cachesize;
00349
00350 unsigned int dbi_mutex_align;
00351 unsigned int dbi_mutex_increment;
00352 unsigned int dbi_mutex_max;
00353 unsigned int dbi_mutex_tas_spins;
00354
00355
00356 unsigned int dbi_seq_cachesize;
00357 unsigned int dbi_seq_flags;
00358 #if 0
00359 int64_t dbi_seq_min;
00360 int64_t dbi_seq_max;
00361 #endif
00362
00363 unsigned int dbi_tx_max;
00364 #if 0
00365 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
00366 DB_LSN *lsnp, int redo, void *info)
00367
00368 ;
00369 #endif
00370
00371 int dbi_pagesize;
00372
00373 void * (*dbi_malloc) (size_t nbytes)
00374 ;
00375
00376 unsigned int dbi_h_ffactor;
00377 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
00378 unsigned int length)
00379 ;
00380 unsigned int dbi_h_nelem;
00381 unsigned int dbi_h_flags;
00382 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00383 ;
00384
00385 int dbi_bt_flags;
00386 int dbi_bt_minkey;
00387 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
00388 ;
00389 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00390 ;
00391 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
00392 ;
00393
00394 int dbi_re_flags;
00395 int dbi_re_delim;
00396 unsigned int dbi_re_len;
00397 int dbi_re_pad;
00398 const char * dbi_re_source;
00399
00400 unsigned int dbi_q_extentsize;
00401
00402
00403 rpmdb dbi_rpmdb;
00404 rpmTag dbi_rpmtag;
00405 int dbi_jlen;
00407
00408 DB * dbi_db;
00409
00410 DB_TXN * dbi_txnid;
00411
00412 void * dbi_stats;
00414
00415 const struct _dbiVec * dbi_vec;
00417 };
00418 #endif
00419
00423 struct rpmdb_s {
00424
00425 const char * db_root;
00426
00427 const char * db_home;
00428 int db_flags;
00429 int db_mode;
00430 int db_perms;
00431 int db_api;
00432
00433 const char * db_errpfx;
00435 int db_remove_env;
00436 int db_filter_dups;
00437 int db_verifying;
00438
00439 int db_chrootDone;
00440 void (*db_errcall) (const char * db_errpfx, char * buffer)
00441 ;
00442
00443 FILE * db_errfile;
00444
00445 void * (*db_malloc) (size_t nbytes)
00446 ;
00447
00448 void * (*db_realloc) ( void * ptr, size_t nbytes)
00449 ;
00450 void (*db_free) ( void * ptr)
00451 ;
00452
00453 int (*db_export) (rpmdb db, Header h, int adding);
00454
00455
00456 unsigned char * db_bits;
00457 int db_nbits;
00458 rpmdb db_next;
00459 int db_opens;
00460
00461 void * db_dbenv;
00462 int * db_tagn;
00463 int db_ndbi;
00464
00465 dbiIndex * _dbi;
00467 struct rpmop_s db_getops;
00468 struct rpmop_s db_putops;
00469 struct rpmop_s db_delops;
00471
00472 int nrefs;
00473 };
00474 #endif
00475
00476
00477
00480 enum rpmdbFlags {
00481 RPMDB_FLAG_JUSTCHECK = (1 << 0),
00482 RPMDB_FLAG_MINIMAL = (1 << 1),
00483
00484 RPMDB_FLAG_CHROOT = (1 << 2)
00485
00486 };
00487
00488 #ifdef __cplusplus
00489 extern "C" {
00490 #endif
00491
00492 #if defined(_RPMDB_INTERNAL)
00493
00500
00501 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
00502
00503 ;
00504
00510
00511 dbiIndex db3Free( dbiIndex dbi)
00512 ;
00513
00520
00521
00522 extern const char * prDbiOpenFlags(int dbflags, int print_dbenv_flags)
00523 ;
00524
00525
00533 dbiIndex dbiOpen( rpmdb db, rpmTag rpmtag,
00534 unsigned int flags)
00535
00536 ;
00537
00544 void * dbiStatsAccumulator(dbiIndex dbi, int opx)
00545 ;
00546
00547 #if !defined(SWIG)
00548
00557 static inline
00558 int dbiCopen(dbiIndex dbi, DB_TXN * txnid,
00559 DBC ** dbcp, unsigned int flags)
00560
00561
00562 {
00563 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
00564 }
00565
00573 static inline
00574 int dbiCclose(dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00575
00576
00577 {
00578 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
00579 }
00580
00589 static inline
00590 int dbiCdup(dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00591 unsigned int flags)
00592
00593 {
00594 return (*dbi->dbi_vec->cdup) (dbi, dbcursor, dbcp, flags);
00595 }
00596
00606 static inline
00607 int dbiDel(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00608 unsigned int flags)
00609
00610
00611 {
00612 void * sw = dbiStatsAccumulator(dbi, 16);
00613 int rc;
00614 assert(key->data != NULL && key->size > 0);
00615 (void) rpmswEnter(sw, 0);
00616 rc = (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
00617 (void) rpmswExit(sw, data->size);
00618 WSEGFAULT;
00619 return rc;
00620 }
00621
00631 static inline
00632 int dbiGet(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00633 unsigned int flags)
00634
00635
00636 {
00637 void * sw = dbiStatsAccumulator(dbi, 14);
00638 int rc;
00639 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00640 (void) rpmswEnter(sw, 0);
00641 rc = (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
00642 (void) rpmswExit(sw, data->size);
00643 RSEGFAULT;
00644 return rc;
00645 }
00646
00657 static inline
00658 int dbiPget(dbiIndex dbi, DBC * dbcursor,
00659 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00660
00661
00662 {
00663 void * sw = dbiStatsAccumulator(dbi, 14);
00664 int rc;
00665 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00666 (void) rpmswEnter(sw, 0);
00667 rc = (dbi->dbi_vec->cpget) (dbi, dbcursor, key, pkey, data, flags);
00668 (void) rpmswExit(sw, data->size);
00669 return rc;
00670 }
00671
00681 static inline
00682 int dbiPut(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00683 unsigned int flags)
00684
00685
00686 {
00687 void * sw = dbiStatsAccumulator(dbi, 15);
00688 int rc;
00689 assert(key->data != NULL && key->size > 0 && data->data != NULL && data->size > 0);
00690 (void) rpmswEnter(sw, 0);
00691 rc = (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
00692 (void) rpmswExit(sw, data->size);
00693 WSEGFAULT;
00694 return rc;
00695 }
00696
00705 static inline
00706 int dbiCount(dbiIndex dbi, DBC * dbcursor, unsigned int * countp,
00707 unsigned int flags)
00708
00709
00710 {
00711 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
00712 }
00713
00720 static inline
00721 int dbiVerify( dbiIndex dbi, unsigned int flags)
00722
00723
00724 {
00725 dbi->dbi_verify_on_close = 1;
00726 return (*dbi->dbi_vec->close) (dbi, flags);
00727 }
00728
00735 static inline
00736 int dbiClose( dbiIndex dbi, unsigned int flags)
00737
00738
00739 {
00740 return (*dbi->dbi_vec->close) (dbi, flags);
00741 }
00742
00749 static inline
00750 int dbiSync (dbiIndex dbi, unsigned int flags)
00751
00752
00753 {
00754 return (*dbi->dbi_vec->sync) (dbi, flags);
00755 }
00756
00765 static inline
00766 int dbiAssociate(dbiIndex dbi, dbiIndex dbisecondary,
00767 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00768 unsigned int flags)
00769
00770
00771 {
00772 return (*dbi->dbi_vec->associate) (dbi, dbisecondary, callback, flags);
00773 }
00774
00783 static inline
00784 int dbiJoin(dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00785 unsigned int flags)
00786
00787
00788 {
00789 return (*dbi->dbi_vec->join) (dbi, curslist, dbcp, flags);
00790 }
00791
00797 static inline
00798 int dbiByteSwapped(dbiIndex dbi)
00799
00800 {
00801 if (dbi->dbi_byteswapped == -1)
00802 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
00803 return dbi->dbi_byteswapped;
00804 }
00805
00812 static inline
00813 int dbiStat(dbiIndex dbi, unsigned int flags)
00814
00815 {
00816 return (*dbi->dbi_vec->stat) (dbi, flags);
00817 }
00818
00824 static inline
00825 DB_TXN * dbiTxnid(dbiIndex dbi)
00826
00827 {
00828 return dbi->dbi_txnid;
00829 }
00830
00831 #endif
00832
00833
00834
00837 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
00838 ;
00839
00845
00846 dbiIndexSet dbiFreeIndexSet( dbiIndexSet set)
00847 ;
00848
00854 unsigned int dbiIndexSetCount(dbiIndexSet set)
00855 ;
00856
00863 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
00864 ;
00865
00872 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
00873 ;
00874 #endif
00875
00882
00883 rpmdb rpmdbUnlink ( rpmdb db, const char * msg)
00884 ;
00885
00887
00888
00889 rpmdb XrpmdbUnlink ( rpmdb db, const char * msg,
00890 const char * fn, unsigned ln)
00891 ;
00892
00893 #define rpmdbUnlink(_db, _msg) XrpmdbUnlink(_db, _msg, __FILE__, __LINE__)
00894
00901
00902 rpmdb rpmdbLink (rpmdb db, const char * msg)
00903 ;
00904
00906
00907 rpmdb XrpmdbLink (rpmdb db, const char * msg,
00908 const char * fn, unsigned ln)
00909 ;
00910
00911 #define rpmdbLink(_db, _msg) XrpmdbLink(_db, _msg, __FILE__, __LINE__)
00912
00921 int rpmdbOpen ( const char * prefix, rpmdb * dbp,
00922 int mode, int perms)
00923
00924 ;
00925
00932 int rpmdbInit( const char * prefix, int perms)
00933
00934 ;
00935
00941 int rpmdbVerifyAllDBI(rpmdb db)
00942
00943 ;
00944
00950 int rpmdbVerify( const char * prefix)
00951
00952 ;
00953
00960 int rpmdbBlockDBI( rpmdb db, int rpmtag)
00961 ;
00962
00969 int rpmdbCloseDBI( rpmdb db, int rpmtag)
00970
00971 ;
00972
00978 int rpmdbClose ( rpmdb db)
00979
00980 ;
00981
00987 int rpmdbSync ( rpmdb db)
00988
00989 ;
00990
00996
00997 int rpmdbOpenAll ( rpmdb db)
00998
00999 ;
01000
01001
01008 int rpmdbCountPackages( rpmdb db, const char * name)
01009
01010 ;
01011
01017 unsigned int rpmdbGetIteratorOffset( rpmdbMatchIterator mi)
01018 ;
01019
01025 int rpmdbGetIteratorCount( rpmdbMatchIterator mi)
01026 ;
01027
01035 int rpmdbAppendIterator( rpmdbMatchIterator mi,
01036 const int * hdrNums, int nHdrNums)
01037 ;
01038
01048 int rpmdbPruneIterator( rpmdbMatchIterator mi,
01049 int * hdrNums, int nHdrNums, int sorted)
01050 ;
01051
01060 int rpmdbSetIteratorRE( rpmdbMatchIterator mi, rpmTag tag,
01061 rpmMireMode mode, const char * pattern)
01062
01063 ;
01064
01072 int rpmdbSetIteratorRewrite( rpmdbMatchIterator mi, int rewrite)
01073 ;
01074
01081 int rpmdbSetIteratorModified( rpmdbMatchIterator mi, int modified)
01082 ;
01083
01091 int rpmdbSetHdrChk( rpmdbMatchIterator mi, rpmts ts,
01092 rpmRC (*hdrchk) (rpmts ts, const void * uh, size_t uc, const char ** msg))
01093 ;
01094
01103
01104 rpmdbMatchIterator rpmdbInitIterator( rpmdb db, rpmTag rpmtag,
01105 const void * keyp, size_t keylen)
01106
01107 ;
01108
01114
01115 Header rpmdbNextIterator( rpmdbMatchIterator mi)
01116
01117 ;
01118
01122
01123 int rpmdbCheckSignals(void)
01124
01125 ;
01126
01132
01133 rpmdbMatchIterator rpmdbFreeIterator( rpmdbMatchIterator mi)
01134
01135 ;
01136
01146 int rpmdbAdd( rpmdb db, int iid, Header h, rpmts ts,
01147 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01148
01149 ;
01150
01160 int rpmdbRemove( rpmdb db, int rid, unsigned int hdrNum,
01161 rpmts ts,
01162 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01163
01164 ;
01165
01173 int rpmdbRebuild( const char * prefix, rpmts ts,
01174 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01175
01176 ;
01177
01178 #ifndef __APPLE__
01179
01182
01183 int mergesort(void *base, size_t nmemb, size_t size,
01184 int (*cmp) (const void *, const void *))
01185
01186 ;
01187 #else
01188
01189 #endif
01190
01191 #ifdef __cplusplus
01192 }
01193 #endif
01194
01195
01196 #endif