00001 #ifndef H_RPMDB
00002 #define H_RPMDB
00003
00004
00010 #include <assert.h>
00011 #include <rpmlib.h>
00012 #include <mire.h>
00013 #if defined(WITH_DB)
00014 #include "db.h"
00015 #else
00016 #include "db_emu.h"
00017 #endif
00018
00019
00020
00021 extern int _rpmdb_debug;
00022
00023
00024 #ifdef NOTYET
00025
00028 typedef struct rpmdb_s * rpmdb;
00029
00033 typedef struct rpmdbMatchIterator_s * rpmdbMatchIterator;
00034 #endif
00035
00038 typedef struct _dbiIndexItem * dbiIndexItem;
00039
00043 typedef struct _dbiIndexSet * dbiIndexSet;
00044
00047 typedef struct _dbiIndex * dbiIndex;
00048
00049 #if defined(_RPMDB_INTERNAL)
00050 #include <rpmsw.h>
00051 #if !defined(SWIG)
00052
00057 struct _dbiIndexItem {
00058 uint32_t hdrNum;
00059 uint32_t tagNum;
00060 uint32_t fpNum;
00061 };
00062
00066 struct _dbiIndexSet {
00067 struct _dbiIndexItem * recs;
00068 int count;
00069 };
00070
00074 struct _dbiVec {
00075 int dbv_major;
00076 int dbv_minor;
00077 int dbv_patch;
00085 int (*open) (rpmdb rpmdb, rpmTag rpmtag, dbiIndex * dbip)
00086
00087 ;
00088
00095 int (*close) ( dbiIndex dbi, unsigned int flags)
00096
00097 ;
00098
00105 int (*sync) (dbiIndex dbi, unsigned int flags)
00106
00107 ;
00108
00117 int (*associate) (dbiIndex dbi, dbiIndex dbisecondary,
00118 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00119 unsigned int flags)
00120
00121 ;
00122
00131 int (*join) (dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00132 unsigned int flags)
00133
00134 ;
00135
00144 int (*copen) (dbiIndex dbi, DB_TXN * txnid,
00145 DBC ** dbcp, unsigned int dbiflags)
00146
00147 ;
00148
00156 int (*cclose) (dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00157
00158 ;
00159
00168 int (*cdup) (dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00169 unsigned int flags)
00170
00171 ;
00172
00182 int (*cdel) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00183 unsigned int flags)
00184
00185 ;
00186
00196 int (*cget) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00197 unsigned int flags)
00198
00199 ;
00200
00211 int (*cpget) (dbiIndex dbi, DBC * dbcursor,
00212 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00213
00214 ;
00215
00225 int (*cput) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00226 unsigned int flags)
00227
00228 ;
00229
00238 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
00239 unsigned int * countp,
00240 unsigned int flags)
00241
00242 ;
00243
00249 int (*byteswapped) (dbiIndex dbi)
00250
00251 ;
00252
00259 int (*stat) (dbiIndex dbi, unsigned int flags)
00260
00261 ;
00262 };
00263
00267 struct _dbiIndex {
00268
00269 const char * dbi_root;
00270
00271 const char * dbi_home;
00272
00273 const char * dbi_file;
00274
00275 const char * dbi_subfile;
00276
00277 const char * dbi_tmpdir;
00279 int dbi_ecflags;
00280 int dbi_cflags;
00281 int dbi_oeflags;
00282 int dbi_eflags;
00283 int dbi_oflags;
00284 int dbi_tflags;
00286 int dbi_type;
00287 unsigned dbi_mode;
00288 int dbi_perms;
00289 long dbi_shmkey;
00290 int dbi_api;
00292 int dbi_verify_on_close;
00293 int dbi_use_dbenv;
00294 int dbi_permit_dups;
00295 int dbi_no_fsync;
00296 int dbi_no_dbsync;
00297 int dbi_lockdbfd;
00298 int dbi_temporary;
00299 int dbi_noload;
00300 int dbi_debug;
00301 int dbi_byteswapped;
00302
00303
00304 char * dbi_host;
00305 unsigned long dbi_cl_timeout;
00306 unsigned long dbi_sv_timeout;
00307
00308
00309 int dbi_lorder;
00310
00311
00312 void (*db_errcall) (void * dbenv, const char *db_errpfx, char *buffer)
00313
00314 ;
00315
00316 FILE * dbi_errfile;
00317 const char * dbi_errpfx;
00318 int dbi_verbose;
00319 int dbi_region_init;
00320 unsigned int dbi_thread_count;
00321
00322 unsigned int dbi_lk_max_lockers;
00323 unsigned int dbi_lk_max_locks;
00324 unsigned int dbi_lk_max_objects;
00325 unsigned int dbi_lk_detect;
00326
00327 int dbi_lk_nmodes;
00328
00329 unsigned char * dbi_lk_conflicts;
00330
00331 unsigned int dbi_lg_bsize;
00332
00333 const char * dbi_lg_dir;
00334
00335 unsigned int dbi_lg_filemode;
00336 unsigned int dbi_lg_max;
00337 unsigned int dbi_lg_regionmax;
00338
00339 int dbi_mmapsize;
00340 int dbi_cachesize;
00341
00342 unsigned int dbi_mutex_align;
00343 unsigned int dbi_mutex_increment;
00344 unsigned int dbi_mutex_max;
00345 unsigned int dbi_mutex_tas_spins;
00346
00347
00348 unsigned int dbi_seq_cachesize;
00349 unsigned int dbi_seq_flags;
00350 #if 0
00351 int64_t dbi_seq_min;
00352 int64_t dbi_seq_max;
00353 #endif
00354
00355 unsigned int dbi_tx_max;
00356 #if 0
00357 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
00358 DB_LSN *lsnp, int redo, void *info)
00359
00360 ;
00361 #endif
00362
00363 int dbi_pagesize;
00364
00365 void * (*dbi_malloc) (size_t nbytes)
00366 ;
00367
00368 unsigned int dbi_h_ffactor;
00369 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
00370 unsigned int length)
00371 ;
00372 unsigned int dbi_h_nelem;
00373 unsigned int dbi_h_flags;
00374 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00375 ;
00376
00377 int dbi_bt_flags;
00378 int dbi_bt_minkey;
00379 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
00380 ;
00381 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00382 ;
00383 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
00384 ;
00385
00386 int dbi_re_flags;
00387 int dbi_re_delim;
00388 unsigned int dbi_re_len;
00389 int dbi_re_pad;
00390 const char * dbi_re_source;
00391
00392 unsigned int dbi_q_extentsize;
00393
00394
00395 rpmdb dbi_rpmdb;
00396 rpmTag dbi_rpmtag;
00397 size_t dbi_jlen;
00399
00400 DB * dbi_db;
00401
00402 DB_TXN * dbi_txnid;
00403
00404 void * dbi_stats;
00406
00407 const struct _dbiVec * dbi_vec;
00409 };
00410 #endif
00411
00415 struct rpmdb_s {
00416
00417 const char * db_root;
00418
00419 const char * db_home;
00420 int db_flags;
00421 int db_mode;
00422 int db_perms;
00423 int db_api;
00424
00425 const char * db_errpfx;
00427 int db_remove_env;
00428 int db_filter_dups;
00429 int db_verifying;
00430
00431 int db_chrootDone;
00432 void (*db_errcall) (const char * db_errpfx, char * buffer)
00433 ;
00434
00435 FILE * db_errfile;
00436
00437 void * (*db_malloc) (size_t nbytes)
00438 ;
00439
00440 void * (*db_realloc) ( void * ptr, size_t nbytes)
00441 ;
00442 void (*db_free) ( void * ptr)
00443 ;
00444
00445 int (*db_export) (rpmdb db, Header h, int adding);
00446
00447
00448 unsigned char * db_bits;
00449 int db_nbits;
00450 rpmdb db_next;
00451 int db_opens;
00452
00453 void * db_dbenv;
00454 tagStore_t db_tags;
00455 size_t db_ndbi;
00456
00457 dbiIndex * _dbi;
00459 struct rpmop_s db_getops;
00460 struct rpmop_s db_putops;
00461 struct rpmop_s db_delops;
00463
00464 int nrefs;
00465 };
00466 #endif
00467
00468
00469
00472 enum rpmdbFlags {
00473 RPMDB_FLAG_JUSTCHECK = (1 << 0),
00474 RPMDB_FLAG_MINIMAL = (1 << 1),
00475
00476 RPMDB_FLAG_CHROOT = (1 << 2)
00477
00478 };
00479
00480 #ifdef __cplusplus
00481 extern "C" {
00482 #endif
00483
00484 #if defined(_RPMDB_INTERNAL)
00485
00486 #if defined(WITH_DB) || defined(WITH_SQLITE)
00487
00493
00494 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
00495
00496 ;
00497
00503
00504 dbiIndex db3Free( dbiIndex dbi)
00505 ;
00506
00513
00514
00515 extern const char * prDbiOpenFlags(int dbflags, int print_dbenv_flags)
00516 ;
00517
00518 #endif
00519
00527 dbiIndex dbiOpen( rpmdb db, rpmTag rpmtag,
00528 unsigned int flags)
00529
00530 ;
00531
00538 void * dbiStatsAccumulator(dbiIndex dbi, int opx)
00539 ;
00540
00541 #if !defined(SWIG)
00542
00551 static inline
00552 int dbiCopen(dbiIndex dbi, DB_TXN * txnid,
00553 DBC ** dbcp, unsigned int flags)
00554
00555
00556 {
00557 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
00558 }
00559
00567 static inline
00568 int dbiCclose(dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00569
00570
00571 {
00572 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
00573 }
00574
00583 static inline
00584 int dbiCdup(dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00585 unsigned int flags)
00586
00587 {
00588 return (*dbi->dbi_vec->cdup) (dbi, dbcursor, dbcp, flags);
00589 }
00590
00600 static inline
00601 int dbiDel(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00602 unsigned int flags)
00603
00604
00605 {
00606 rpmop sw = (rpmop)dbiStatsAccumulator(dbi, 16);
00607 int rc;
00608 assert(key->data != NULL && key->size > 0);
00609 (void) rpmswEnter(sw, 0);
00610 rc = (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
00611 (void) rpmswExit(sw, data->size);
00612 return rc;
00613 }
00614
00624 static inline
00625 int dbiGet(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00626 unsigned int flags)
00627
00628
00629 {
00630 rpmop sw = (rpmop)dbiStatsAccumulator(dbi, 14);
00631 int rc;
00632 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00633 (void) rpmswEnter(sw, 0);
00634 rc = (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
00635 (void) rpmswExit(sw, data->size);
00636 return rc;
00637 }
00638
00649 static inline
00650 int dbiPget(dbiIndex dbi, DBC * dbcursor,
00651 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00652
00653
00654 {
00655 rpmop sw = (rpmop)dbiStatsAccumulator(dbi, 14);
00656 int rc;
00657 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00658 (void) rpmswEnter(sw, 0);
00659 rc = (dbi->dbi_vec->cpget) (dbi, dbcursor, key, pkey, data, flags);
00660 (void) rpmswExit(sw, data->size);
00661 return rc;
00662 }
00663
00673 static inline
00674 int dbiPut(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00675 unsigned int flags)
00676
00677
00678 {
00679 rpmop sw = (rpmop)dbiStatsAccumulator(dbi, 15);
00680 int rc;
00681 assert(key->data != NULL && key->size > 0 && data->data != NULL && data->size > 0);
00682 (void) rpmswEnter(sw, 0);
00683 rc = (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
00684 (void) rpmswExit(sw, data->size);
00685 return rc;
00686 }
00687
00696 static inline
00697 int dbiCount(dbiIndex dbi, DBC * dbcursor, unsigned int * countp,
00698 unsigned int flags)
00699
00700
00701 {
00702 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
00703 }
00704
00711 static inline
00712 int dbiVerify( dbiIndex dbi, unsigned int flags)
00713
00714
00715 {
00716 dbi->dbi_verify_on_close = 1;
00717 return (*dbi->dbi_vec->close) (dbi, flags);
00718 }
00719
00726 static inline
00727 int dbiClose( dbiIndex dbi, unsigned int flags)
00728
00729
00730 {
00731 return (*dbi->dbi_vec->close) (dbi, flags);
00732 }
00733
00740 static inline
00741 int dbiSync (dbiIndex dbi, unsigned int flags)
00742
00743
00744 {
00745 return (*dbi->dbi_vec->sync) (dbi, flags);
00746 }
00747
00756 static inline
00757 int dbiAssociate(dbiIndex dbi, dbiIndex dbisecondary,
00758 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00759 unsigned int flags)
00760
00761
00762 {
00763 return (*dbi->dbi_vec->associate) (dbi, dbisecondary, callback, flags);
00764 }
00765
00774 static inline
00775 int dbiJoin(dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00776 unsigned int flags)
00777
00778
00779 {
00780 return (*dbi->dbi_vec->join) (dbi, curslist, dbcp, flags);
00781 }
00782
00788 static inline
00789 int dbiByteSwapped(dbiIndex dbi)
00790
00791 {
00792 if (dbi->dbi_byteswapped == -1)
00793 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
00794 return dbi->dbi_byteswapped;
00795 }
00796
00803 static inline
00804 int dbiStat(dbiIndex dbi, unsigned int flags)
00805
00806 {
00807 return (*dbi->dbi_vec->stat) (dbi, flags);
00808 }
00809
00815 static inline
00816 DB_TXN * dbiTxnid(dbiIndex dbi)
00817
00818 {
00819 return dbi->dbi_txnid;
00820 }
00821
00822 #endif
00823
00824
00825
00831
00832 dbiIndexSet dbiFreeIndexSet( dbiIndexSet set)
00833 ;
00834
00840 unsigned int dbiIndexSetCount(dbiIndexSet set)
00841 ;
00842
00849 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
00850 ;
00851
00858 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
00859 ;
00860 #endif
00861
00868
00869 rpmdb rpmdbUnlink ( rpmdb db, const char * msg)
00870 ;
00871
00873
00874
00875 rpmdb XrpmdbUnlink ( rpmdb db, const char * msg,
00876 const char * fn, unsigned ln)
00877 ;
00878
00879 #define rpmdbUnlink(_db, _msg) XrpmdbUnlink(_db, _msg, __FILE__, __LINE__)
00880
00887
00888 rpmdb rpmdbLink (rpmdb db, const char * msg)
00889 ;
00890
00892
00893 rpmdb XrpmdbLink (rpmdb db, const char * msg,
00894 const char * fn, unsigned ln)
00895 ;
00896
00897 #define rpmdbLink(_db, _msg) XrpmdbLink(_db, _msg, __FILE__, __LINE__)
00898
00901
00902 rpmdb rpmdbNew( const char * root,
00903 const char * home,
00904 int mode, int perms, int flags);
00905
00908 int rpmdbOpenDatabase( const char * prefix,
00909 const char * dbpath,
00910 int _dbapi, rpmdb *dbp,
00911 int mode, int perms, int flags)
00912
00913
00914
00915 ;
00916
00925 int rpmdbOpen ( const char * prefix, rpmdb * dbp,
00926 int mode, int perms)
00927
00928 ;
00929
00936 int rpmdbInit( const char * prefix, int perms)
00937
00938 ;
00939
00945 int rpmdbVerifyAllDBI(rpmdb db)
00946
00947 ;
00948
00954 int rpmdbVerify( const char * prefix)
00955
00956 ;
00957
00964 int rpmdbBlockDBI( rpmdb db, int rpmtag)
00965 ;
00966
00973 int rpmdbCloseDBI( rpmdb db, int rpmtag)
00974
00975 ;
00976
00982 int rpmdbClose ( rpmdb db)
00983
00984 ;
00985
00991 int rpmdbSync ( rpmdb db)
00992
00993 ;
00994
01000
01001 int rpmdbOpenAll ( rpmdb db)
01002
01003 ;
01004
01005
01012 int rpmdbCountPackages( rpmdb db, const char * name)
01013
01014 ;
01015
01021 unsigned int rpmdbGetIteratorOffset( rpmdbMatchIterator mi)
01022 ;
01023
01028 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
01029 ;
01030
01036 int rpmdbGetIteratorCount( rpmdbMatchIterator mi)
01037 ;
01038
01046 int rpmdbAppendIterator( rpmdbMatchIterator mi,
01047 const int * hdrNums, int nHdrNums)
01048 ;
01049
01059 int rpmdbPruneIterator( rpmdbMatchIterator mi,
01060 int * hdrNums, int nHdrNums, int sorted)
01061 ;
01062
01071 int rpmdbSetIteratorRE( rpmdbMatchIterator mi, rpmTag tag,
01072 rpmMireMode mode, const char * pattern)
01073
01074 ;
01075
01083 int rpmdbSetIteratorRewrite( rpmdbMatchIterator mi, int rewrite)
01084 ;
01085
01092 int rpmdbSetIteratorModified( rpmdbMatchIterator mi, int modified)
01093 ;
01094
01101 int rpmdbSetHdrChk( rpmdbMatchIterator mi, rpmts ts)
01102 ;
01103
01112
01113 rpmdbMatchIterator rpmdbInitIterator( rpmdb db, rpmTag rpmtag,
01114 const void * keyp, size_t keylen)
01115
01116 ;
01117
01123
01124 Header rpmdbNextIterator( rpmdbMatchIterator mi)
01125
01126 ;
01127
01137
01138 int rpmdbCheckTerminate(int terminate)
01139
01140 ;
01141
01145
01146 int rpmdbCheckSignals(void)
01147
01148 ;
01149
01155
01156 rpmdbMatchIterator rpmdbFreeIterator( rpmdbMatchIterator mi)
01157
01158 ;
01159
01168 int rpmdbAdd( rpmdb db, int iid, Header h, rpmts ts)
01169
01170
01171 ;
01172
01181 int rpmdbRemove( rpmdb db, int rid, unsigned int hdrNum,
01182 rpmts ts)
01183
01184
01185 ;
01186
01193 int rpmdbRebuild( const char * prefix, rpmts ts)
01194
01195 ;
01196
01200
01201 int rpm_mergesort(void *base, size_t nmemb, size_t size,
01202 int (*cmp) (const void *, const void *))
01203
01204 ;
01205
01206 #ifdef __cplusplus
01207 }
01208 #endif
01209
01210
01211 #endif