00001 #ifndef H_RPMDB
00002 #define H_RPMDB
00003
00004
00010 #include <assert.h>
00011 #include "rpmlib.h"
00012 #include "rpmsw.h"
00013 #include "db.h"
00014
00015
00016
00017 extern int _rpmdb_debug;
00018
00019
00020 #ifdef NOTYET
00021
00024 typedef struct rpmdb_s * rpmdb;
00025
00029 typedef struct _rpmdbMatchIterator * rpmdbMatchIterator;
00030 #endif
00031
00035 typedef enum rpmMireMode_e {
00036 RPMMIRE_DEFAULT = 0,
00037 RPMMIRE_STRCMP = 1,
00038 RPMMIRE_REGEX = 2,
00039 RPMMIRE_GLOB = 3
00040 } rpmMireMode;
00041
00044 typedef struct _dbiIndexItem * dbiIndexItem;
00045
00049 typedef struct _dbiIndexSet * dbiIndexSet;
00050
00053 typedef struct _dbiIndex * dbiIndex;
00054
00055
00061 struct _dbiIndexItem {
00062 unsigned int hdrNum;
00063 unsigned int tagNum;
00064 unsigned int fpNum;
00065 };
00066
00070 struct _dbiIndexSet {
00071 struct _dbiIndexItem * recs;
00072 int count;
00073 size_t alloced;
00074 };
00075
00079 struct _dbiVec {
00080 int dbv_major;
00081 int dbv_minor;
00082 int dbv_patch;
00090 int (*open) (rpmdb rpmdb, rpmTag rpmtag, dbiIndex * dbip)
00091
00092 ;
00093
00100 int (*close) ( dbiIndex dbi, unsigned int flags)
00101
00102 ;
00103
00110 int (*sync) (dbiIndex dbi, unsigned int flags)
00111
00112 ;
00113
00122 int (*associate) (dbiIndex dbi, dbiIndex dbisecondary,
00123 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00124 unsigned int flags)
00125
00126 ;
00127
00136 int (*join) (dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00137 unsigned int flags)
00138
00139 ;
00140
00149 int (*copen) (dbiIndex dbi, DB_TXN * txnid,
00150 DBC ** dbcp, unsigned int dbiflags)
00151
00152 ;
00153
00161 int (*cclose) (dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00162
00163 ;
00164
00173 int (*cdup) (dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00174 unsigned int flags)
00175
00176 ;
00177
00187 int (*cdel) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00188 unsigned int flags)
00189
00190 ;
00191
00201 int (*cget) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00202 unsigned int flags)
00203
00204 ;
00205
00216 int (*cpget) (dbiIndex dbi, DBC * dbcursor,
00217 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00218
00219 ;
00220
00230 int (*cput) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00231 unsigned int flags)
00232
00233 ;
00234
00243 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
00244 unsigned int * countp,
00245 unsigned int flags)
00246
00247 ;
00248
00254 int (*byteswapped) (dbiIndex dbi)
00255
00256 ;
00257
00264 int (*stat) (dbiIndex dbi, unsigned int flags)
00265
00266 ;
00267 };
00268
00272 struct _dbiIndex {
00273
00274 const char * dbi_root;
00275
00276 const char * dbi_home;
00277
00278 const char * dbi_file;
00279
00280 const char * dbi_subfile;
00281
00282 const char * dbi_tmpdir;
00284 int dbi_ecflags;
00285 int dbi_cflags;
00286 int dbi_oeflags;
00287 int dbi_eflags;
00288 int dbi_oflags;
00289 int dbi_tflags;
00291 int dbi_type;
00292 unsigned dbi_mode;
00293 int dbi_perms;
00294 long dbi_shmkey;
00295 int dbi_api;
00297 int dbi_verify_on_close;
00298 int dbi_use_dbenv;
00299 int dbi_permit_dups;
00300 int dbi_no_fsync;
00301 int dbi_no_dbsync;
00302 int dbi_lockdbfd;
00303 int dbi_temporary;
00304 int dbi_debug;
00305 int dbi_byteswapped;
00306
00307
00308 char * dbi_host;
00309 unsigned long dbi_cl_timeout;
00310 unsigned long dbi_sv_timeout;
00311
00312
00313 int dbi_lorder;
00314
00315
00316 void (*db_errcall) (void * dbenv, const char *db_errpfx, char *buffer)
00317
00318 ;
00319
00320 FILE * dbi_errfile;
00321 const char * dbi_errpfx;
00322 int dbi_verbose;
00323 int dbi_region_init;
00324 int dbi_tas_spins;
00325
00326 int dbi_mmapsize;
00327 int dbi_cachesize;
00328
00329 unsigned int dbi_lk_max;
00330 unsigned int dbi_lk_detect;
00331 int dbi_lk_nmodes;
00332 unsigned char * dbi_lk_conflicts;
00333
00334 unsigned int dbi_lg_max;
00335 unsigned int dbi_lg_bsize;
00336
00337 unsigned int dbi_tx_max;
00338 #if 0
00339 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
00340 DB_LSN *lsnp, int redo, void *info)
00341
00342 ;
00343 #endif
00344
00345 int dbi_pagesize;
00346
00347 void * (*dbi_malloc) (size_t nbytes)
00348 ;
00349
00350 unsigned int dbi_h_ffactor;
00351 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
00352 unsigned int length)
00353 ;
00354 unsigned int dbi_h_nelem;
00355 unsigned int dbi_h_flags;
00356 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00357 ;
00358
00359 int dbi_bt_flags;
00360 int dbi_bt_minkey;
00361 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
00362 ;
00363 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00364 ;
00365 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
00366 ;
00367
00368 int dbi_re_flags;
00369 int dbi_re_delim;
00370 unsigned int dbi_re_len;
00371 int dbi_re_pad;
00372 const char * dbi_re_source;
00373
00374 unsigned int dbi_q_extentsize;
00375
00376
00377 rpmdb dbi_rpmdb;
00378 rpmTag dbi_rpmtag;
00379 int dbi_jlen;
00381
00382 DB * dbi_db;
00383
00384 DB_TXN * dbi_txnid;
00385
00386 void * dbi_stats;
00388
00389 const struct _dbiVec * dbi_vec;
00391 };
00392
00396 struct rpmdb_s {
00397
00398 const char * db_root;
00399
00400 const char * db_home;
00401 int db_flags;
00402 int db_mode;
00403 int db_perms;
00404 int db_api;
00405
00406 const char * db_errpfx;
00407 int db_remove_env;
00408 int db_filter_dups;
00409 int db_chrootDone;
00410 void (*db_errcall) (const char *db_errpfx, char *buffer)
00411 ;
00412
00413 FILE * db_errfile;
00414
00415 void * (*db_malloc) (size_t nbytes)
00416 ;
00417
00418 void * (*db_realloc) ( void * ptr,
00419 size_t nbytes)
00420 ;
00421 void (*db_free) ( void * ptr)
00422 ;
00423
00424 unsigned char * db_bits;
00425 int db_nbits;
00426 rpmdb db_next;
00427 int db_opens;
00428
00429 void * db_dbenv;
00430 int db_ndbi;
00431 dbiIndex * _dbi;
00433 struct rpmop_s db_getops;
00434 struct rpmop_s db_putops;
00435 struct rpmop_s db_delops;
00436
00437
00438 int nrefs;
00439 };
00440
00441
00442
00445 enum rpmdbFlags {
00446 RPMDB_FLAG_JUSTCHECK = (1 << 0),
00447 RPMDB_FLAG_MINIMAL = (1 << 1),
00448
00449 RPMDB_FLAG_CHROOT = (1 << 2)
00450
00451 };
00452
00453 #ifdef __cplusplus
00454 extern "C" {
00455 #endif
00456
00457
00464
00465 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
00466
00467 ;
00468
00474
00475 dbiIndex db3Free( dbiIndex dbi)
00476 ;
00477
00484
00485
00486 extern const char *const prDbiOpenFlags(int dbflags, int print_dbenv_flags)
00487 ;
00488
00489
00497 dbiIndex dbiOpen( rpmdb db, rpmTag rpmtag,
00498 unsigned int flags)
00499
00500 ;
00501
00502
00511 static inline
00512 int dbiCopen(dbiIndex dbi, DB_TXN * txnid,
00513 DBC ** dbcp, unsigned int flags)
00514
00515
00516 {
00517 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
00518 }
00519
00527 static inline
00528 int dbiCclose(dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00529
00530
00531 {
00532 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
00533 }
00534
00543 static inline
00544 int dbiCdup(dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00545 unsigned int flags)
00546
00547 {
00548 return (*dbi->dbi_vec->cdup) (dbi, dbcursor, dbcp, flags);
00549 }
00550
00560 static inline
00561 int dbiDel(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00562 unsigned int flags)
00563
00564
00565 {
00566 int rc;
00567 assert(key->data != NULL && key->size > 0);
00568 (void) rpmswEnter(&dbi->dbi_rpmdb->db_delops, 0);
00569 rc = (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
00570 (void) rpmswExit(&dbi->dbi_rpmdb->db_delops, data->size);
00571 return rc;
00572 }
00573
00583 static inline
00584 int dbiGet(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00585 unsigned int flags)
00586
00587
00588 {
00589 int rc;
00590 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00591 (void) rpmswEnter(&dbi->dbi_rpmdb->db_getops, 0);
00592 rc = (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
00593 (void) rpmswExit(&dbi->dbi_rpmdb->db_getops, data->size);
00594 return rc;
00595 }
00596
00607 static inline
00608 int dbiPget(dbiIndex dbi, DBC * dbcursor,
00609 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00610
00611
00612 {
00613 int rc;
00614 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00615 (void) rpmswEnter(&dbi->dbi_rpmdb->db_getops, 0);
00616 rc = (dbi->dbi_vec->cpget) (dbi, dbcursor, key, pkey, data, flags);
00617 (void) rpmswExit(&dbi->dbi_rpmdb->db_getops, data->size);
00618 return rc;
00619 }
00620
00630 static inline
00631 int dbiPut(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00632 unsigned int flags)
00633
00634
00635 {
00636 int rc;
00637 assert(key->data != NULL && key->size > 0 && data->data != NULL && data->size > 0);
00638 (void) rpmswEnter(&dbi->dbi_rpmdb->db_putops, 0);
00639 rc = (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
00640 (void) rpmswExit(&dbi->dbi_rpmdb->db_putops, data->size);
00641 return rc;
00642 }
00643
00652 static inline
00653 int dbiCount(dbiIndex dbi, DBC * dbcursor, unsigned int * countp,
00654 unsigned int flags)
00655
00656
00657 {
00658 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
00659 }
00660
00667 static inline
00668 int dbiVerify( dbiIndex dbi, unsigned int flags)
00669
00670
00671 {
00672 dbi->dbi_verify_on_close = 1;
00673 return (*dbi->dbi_vec->close) (dbi, flags);
00674 }
00675
00682 static inline
00683 int dbiClose( dbiIndex dbi, unsigned int flags)
00684
00685
00686 {
00687 return (*dbi->dbi_vec->close) (dbi, flags);
00688 }
00689
00696 static inline
00697 int dbiSync (dbiIndex dbi, unsigned int flags)
00698
00699
00700 {
00701 return (*dbi->dbi_vec->sync) (dbi, flags);
00702 }
00703
00712 static inline
00713 int dbiAssociate(dbiIndex dbi, dbiIndex dbisecondary,
00714 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00715 unsigned int flags)
00716
00717
00718 {
00719 return (*dbi->dbi_vec->associate) (dbi, dbisecondary, callback, flags);
00720 }
00721
00730 static inline
00731 int dbiJoin(dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00732 unsigned int flags)
00733
00734
00735 {
00736 return (*dbi->dbi_vec->join) (dbi, curslist, dbcp, flags);
00737 }
00738
00744 static inline
00745 int dbiByteSwapped(dbiIndex dbi)
00746
00747 {
00748 if (dbi->dbi_byteswapped == -1)
00749 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
00750 return dbi->dbi_byteswapped;
00751 }
00758 static inline
00759 int dbiStat(dbiIndex dbi, unsigned int flags)
00760
00761 {
00762 return (*dbi->dbi_vec->stat) (dbi, flags);
00763 }
00764
00765
00766
00767
00770 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
00771 ;
00772
00778 dbiIndexSet dbiFreeIndexSet( dbiIndexSet set)
00779 ;
00780
00786 unsigned int dbiIndexSetCount(dbiIndexSet set)
00787 ;
00788
00795 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
00796 ;
00797
00804 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
00805 ;
00806
00810
00811
00812 extern int * dbiTags;
00813
00814 extern int dbiTagsMax;
00815
00816
00823
00824 rpmdb rpmdbUnlink ( rpmdb db, const char * msg)
00825 ;
00826
00828
00829
00830 rpmdb XrpmdbUnlink ( rpmdb db, const char * msg,
00831 const char * fn, unsigned ln)
00832 ;
00833
00834 #define rpmdbUnlink(_db, _msg) XrpmdbUnlink(_db, _msg, __FILE__, __LINE__)
00835
00842
00843 rpmdb rpmdbLink (rpmdb db, const char * msg)
00844 ;
00845
00847
00848 rpmdb XrpmdbLink (rpmdb db, const char * msg,
00849 const char * fn, unsigned ln)
00850 ;
00851
00852 #define rpmdbLink(_db, _msg) XrpmdbLink(_db, _msg, __FILE__, __LINE__)
00853
00862 int rpmdbOpen ( const char * prefix, rpmdb * dbp,
00863 int mode, int perms)
00864
00865 ;
00866
00873 int rpmdbInit( const char * prefix, int perms)
00874
00875 ;
00876
00882 int rpmdbVerify( const char * prefix)
00883
00884 ;
00885
00892 int rpmdbCloseDBI( rpmdb db, int rpmtag)
00893
00894 ;
00895
00901 int rpmdbClose ( rpmdb db)
00902
00903 ;
00904
00910 int rpmdbSync ( rpmdb db)
00911
00912 ;
00913
00919
00920 int rpmdbOpenAll ( rpmdb db)
00921
00922 ;
00923
00924
00931 int rpmdbCountPackages( rpmdb db, const char * name)
00932
00933 ;
00934
00940 unsigned int rpmdbGetIteratorOffset( rpmdbMatchIterator mi)
00941 ;
00942
00948 int rpmdbGetIteratorCount( rpmdbMatchIterator mi)
00949 ;
00950
00958 int rpmdbAppendIterator( rpmdbMatchIterator mi,
00959 const int * hdrNums, int nHdrNums)
00960 ;
00961
00971 int rpmdbPruneIterator( rpmdbMatchIterator mi,
00972 int * hdrNums, int nHdrNums, int sorted)
00973 ;
00974
00983 int rpmdbSetIteratorRE( rpmdbMatchIterator mi, rpmTag tag,
00984 rpmMireMode mode, const char * pattern)
00985
00986 ;
00987
00995 int rpmdbSetIteratorRewrite( rpmdbMatchIterator mi, int rewrite)
00996 ;
00997
01004 int rpmdbSetIteratorModified( rpmdbMatchIterator mi, int modified)
01005 ;
01006
01014 int rpmdbSetHdrChk( rpmdbMatchIterator mi, rpmts ts,
01015 rpmRC (*hdrchk) (rpmts ts, const void * uh, size_t uc, const char ** msg))
01016 ;
01017
01026
01027 rpmdbMatchIterator rpmdbInitIterator( rpmdb db, rpmTag rpmtag,
01028 const void * keyp, size_t keylen)
01029
01030 ;
01031
01037
01038 Header rpmdbNextIterator( rpmdbMatchIterator mi)
01039
01040 ;
01041
01045
01046 int rpmdbCheckSignals(void)
01047
01048 ;
01049
01058 int rpmdbCheckTerminate(int terminate);
01059
01065
01066 rpmdbMatchIterator rpmdbFreeIterator( rpmdbMatchIterator mi)
01067
01068 ;
01069
01079 int rpmdbAdd( rpmdb db, int iid, Header h, rpmts ts,
01080 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01081
01082 ;
01083
01093 int rpmdbRemove( rpmdb db, int rid, unsigned int hdrNum,
01094 rpmts ts,
01095 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01096
01097 ;
01098
01106 int rpmdbRebuild( const char * prefix, rpmts ts,
01107 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01108
01109 ;
01110
01111 #ifndef __APPLE__
01112
01115
01116 int mergesort(void *base, size_t nmemb, size_t size,
01117 int (*cmp) (const void *, const void *))
01118
01119 ;
01120 #else
01121
01122 #endif
01123
01124 #ifdef __cplusplus
01125 }
01126 #endif
01127
01128
01129 #endif