00001 #ifndef H_RPMDB
00002 #define H_RPMDB
00003
00004
00010 #include <assert.h>
00011 #include "rpmlib.h"
00012 #include "db.h"
00013
00014
00015
00016 extern int _rpmdb_debug;
00017
00018
00019 #ifdef NOTYET
00020
00023 typedef struct rpmdb_s * rpmdb;
00024
00028 typedef struct _rpmdbMatchIterator * rpmdbMatchIterator;
00029 #endif
00030
00034 typedef enum rpmMireMode_e {
00035 RPMMIRE_DEFAULT = 0,
00036 RPMMIRE_STRCMP = 1,
00037 RPMMIRE_REGEX = 2,
00038 RPMMIRE_GLOB = 3
00039 } rpmMireMode;
00040
00043 typedef struct _dbiIndexItem * dbiIndexItem;
00044
00048 typedef struct _dbiIndexSet * dbiIndexSet;
00049
00052 typedef struct _dbiIndex * dbiIndex;
00053
00054
00060 struct _dbiIndexItem {
00061 unsigned int hdrNum;
00062 unsigned int tagNum;
00063 unsigned int fpNum;
00064 };
00065
00069 struct _dbiIndexSet {
00070 struct _dbiIndexItem * recs;
00071 int count;
00072 };
00073
00077 struct _dbiVec {
00078 int dbv_major;
00079 int dbv_minor;
00080 int dbv_patch;
00088 int (*open) (rpmdb rpmdb, rpmTag rpmtag, dbiIndex * dbip)
00089
00090 ;
00091
00098 int (*close) ( dbiIndex dbi, unsigned int flags)
00099
00100 ;
00101
00108 int (*sync) (dbiIndex dbi, unsigned int flags)
00109
00110 ;
00111
00120 int (*associate) (dbiIndex dbi, dbiIndex dbisecondary,
00121 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00122 unsigned int flags)
00123
00124 ;
00125
00134 int (*join) (dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00135 unsigned int flags)
00136
00137 ;
00138
00147 int (*copen) (dbiIndex dbi, DB_TXN * txnid,
00148 DBC ** dbcp, unsigned int dbiflags)
00149
00150 ;
00151
00159 int (*cclose) (dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00160
00161 ;
00162
00171 int (*cdup) (dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00172 unsigned int flags)
00173
00174 ;
00175
00185 int (*cdel) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00186 unsigned int flags)
00187
00188 ;
00189
00199 int (*cget) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00200 unsigned int flags)
00201
00202 ;
00203
00214 int (*cpget) (dbiIndex dbi, DBC * dbcursor,
00215 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00216
00217 ;
00218
00228 int (*cput) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00229 unsigned int flags)
00230
00231 ;
00232
00241 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
00242 unsigned int * countp,
00243 unsigned int flags)
00244
00245 ;
00246
00252 int (*byteswapped) (dbiIndex dbi)
00253
00254 ;
00255
00262 int (*stat) (dbiIndex dbi, unsigned int flags)
00263
00264 ;
00265
00266 };
00267
00271 struct _dbiIndex {
00272
00273 const char * dbi_root;
00274
00275 const char * dbi_home;
00276
00277 const char * dbi_file;
00278
00279 const char * dbi_subfile;
00280
00281 const char * dbi_tmpdir;
00283 int dbi_ecflags;
00284 int dbi_cflags;
00285 int dbi_oeflags;
00286 int dbi_eflags;
00287 int dbi_oflags;
00288 int dbi_tflags;
00290 int dbi_type;
00291 unsigned dbi_mode;
00292 int dbi_perms;
00293 long dbi_shmkey;
00294 int dbi_api;
00296 int dbi_verify_on_close;
00297 int dbi_use_dbenv;
00298 int dbi_permit_dups;
00299 int dbi_no_fsync;
00300 int dbi_no_dbsync;
00301 int dbi_lockdbfd;
00302 int dbi_temporary;
00303 int dbi_debug;
00304 int dbi_byteswapped;
00305
00306
00307 char * dbi_host;
00308 unsigned long dbi_cl_timeout;
00309 unsigned long dbi_sv_timeout;
00310
00311
00312 int dbi_lorder;
00313
00314 void (*db_errcall) (const char *db_errpfx, char *buffer)
00315
00316 ;
00317
00318 FILE * dbi_errfile;
00319 const char * dbi_errpfx;
00320 int dbi_verbose;
00321 int dbi_region_init;
00322 int dbi_tas_spins;
00323
00324 int dbi_mmapsize;
00325 int dbi_cachesize;
00326
00327 unsigned int dbi_lk_max;
00328 unsigned int dbi_lk_detect;
00329 int dbi_lk_nmodes;
00330 unsigned char * dbi_lk_conflicts;
00331
00332 unsigned int dbi_lg_max;
00333 unsigned int dbi_lg_bsize;
00334
00335 unsigned int dbi_tx_max;
00336 #if 0
00337 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
00338 DB_LSN *lsnp, int redo, void *info)
00339
00340 ;
00341 #endif
00342
00343 int dbi_pagesize;
00344
00345 void * (*dbi_malloc) (size_t nbytes)
00346 ;
00347
00348 unsigned int dbi_h_ffactor;
00349 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
00350 unsigned int length)
00351 ;
00352 unsigned int dbi_h_nelem;
00353 unsigned int dbi_h_flags;
00354 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00355 ;
00356
00357 int dbi_bt_flags;
00358 int dbi_bt_minkey;
00359 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
00360 ;
00361 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00362 ;
00363 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
00364 ;
00365
00366 int dbi_re_flags;
00367 int dbi_re_delim;
00368 unsigned int dbi_re_len;
00369 int dbi_re_pad;
00370 const char * dbi_re_source;
00371
00372 unsigned int dbi_q_extentsize;
00373
00374
00375 rpmdb dbi_rpmdb;
00376 rpmTag dbi_rpmtag;
00377 int dbi_jlen;
00379
00380 DB * dbi_db;
00381
00382 DB_TXN * dbi_txnid;
00383
00384 void * dbi_stats;
00386
00387 const struct _dbiVec * dbi_vec;
00389 };
00390
00394 struct rpmdb_s {
00395
00396 const char * db_root;
00397
00398 const char * db_home;
00399 int db_flags;
00400 int db_mode;
00401 int db_perms;
00402 int db_api;
00403
00404 const char * db_errpfx;
00405 int db_remove_env;
00406 int db_filter_dups;
00407 int db_chrootDone;
00408 void (*db_errcall) (const char *db_errpfx, char *buffer)
00409 ;
00410
00411 FILE * db_errfile;
00412
00413 void * (*db_malloc) (size_t nbytes)
00414 ;
00415
00416 void * (*db_realloc) ( void * ptr,
00417 size_t nbytes)
00418 ;
00419 void (*db_free) ( void * ptr)
00420 ;
00421
00422 unsigned char * db_bits;
00423 int db_nbits;
00424 rpmdb db_next;
00425 int db_opens;
00426
00427 void * db_dbenv;
00428 int db_ndbi;
00429 dbiIndex * _dbi;
00431
00432 int nrefs;
00433 };
00434
00435
00436
00439 enum rpmdbFlags {
00440 RPMDB_FLAG_JUSTCHECK = (1 << 0),
00441 RPMDB_FLAG_MINIMAL = (1 << 1),
00442
00443 RPMDB_FLAG_CHROOT = (1 << 2)
00444
00445 };
00446
00447 #ifdef __cplusplus
00448 extern "C" {
00449 #endif
00450
00451
00458
00459 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
00460
00461 ;
00462
00468
00469 dbiIndex db3Free( dbiIndex dbi)
00470 ;
00471
00478
00479
00480 extern const char *const prDbiOpenFlags(int dbflags, int print_dbenv_flags)
00481 ;
00482
00483
00491 dbiIndex dbiOpen( rpmdb db, rpmTag rpmtag,
00492 unsigned int flags)
00493
00494 ;
00495
00496
00505 static inline
00506 int dbiCopen(dbiIndex dbi, DB_TXN * txnid,
00507 DBC ** dbcp, unsigned int flags)
00508
00509
00510 {
00511 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
00512 }
00513
00521 static inline
00522 int dbiCclose(dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00523
00524
00525 {
00526 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
00527 }
00528
00537 static inline
00538 int dbiCdup(dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00539 unsigned int flags)
00540
00541 {
00542 return (*dbi->dbi_vec->cdup) (dbi, dbcursor, dbcp, flags);
00543 }
00544
00554 static inline
00555 int dbiDel(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00556 unsigned int flags)
00557
00558
00559 {
00560 assert(key->data != NULL && key->size > 0);
00561 return (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
00562 }
00563
00573 static inline
00574 int dbiGet(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00575 unsigned int flags)
00576
00577
00578 {
00579 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00580 return (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
00581 }
00582
00593 static inline
00594 int dbiPget(dbiIndex dbi, DBC * dbcursor,
00595 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00596
00597
00598 {
00599 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00600 return (dbi->dbi_vec->cpget) (dbi, dbcursor, key, pkey, data, flags);
00601 }
00602
00612 static inline
00613 int dbiPut(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00614 unsigned int flags)
00615
00616
00617 {
00618 assert(key->data != NULL && key->size > 0 && data->data != NULL && data->size > 0);
00619 return (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
00620 }
00621
00630 static inline
00631 int dbiCount(dbiIndex dbi, DBC * dbcursor, unsigned int * countp,
00632 unsigned int flags)
00633
00634
00635 {
00636 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
00637 }
00638
00645 static inline
00646 int dbiVerify( dbiIndex dbi, unsigned int flags)
00647
00648
00649 {
00650 dbi->dbi_verify_on_close = 1;
00651 return (*dbi->dbi_vec->close) (dbi, flags);
00652 }
00653
00660 static inline
00661 int dbiClose( dbiIndex dbi, unsigned int flags)
00662
00663
00664 {
00665 return (*dbi->dbi_vec->close) (dbi, flags);
00666 }
00667
00674 static inline
00675 int dbiSync (dbiIndex dbi, unsigned int flags)
00676
00677
00678 {
00679 return (*dbi->dbi_vec->sync) (dbi, flags);
00680 }
00681
00690 static inline
00691 int dbiAssociate(dbiIndex dbi, dbiIndex dbisecondary,
00692 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00693 unsigned int flags)
00694
00695
00696 {
00697 return (*dbi->dbi_vec->associate) (dbi, dbisecondary, callback, flags);
00698 }
00699
00708 static inline
00709 int dbiJoin(dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00710 unsigned int flags)
00711
00712
00713 {
00714 return (*dbi->dbi_vec->join) (dbi, curslist, dbcp, flags);
00715 }
00716
00722 static inline
00723 int dbiByteSwapped(dbiIndex dbi)
00724
00725 {
00726 if (dbi->dbi_byteswapped == -1)
00727 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
00728 return dbi->dbi_byteswapped;
00729 }
00736 static inline
00737 int dbiStat(dbiIndex dbi, unsigned int flags)
00738
00739 {
00740 return (*dbi->dbi_vec->stat) (dbi, flags);
00741 }
00742
00743
00744
00745
00748 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
00749 ;
00750
00756 dbiIndexSet dbiFreeIndexSet( dbiIndexSet set)
00757 ;
00758
00764 unsigned int dbiIndexSetCount(dbiIndexSet set)
00765 ;
00766
00773 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
00774 ;
00775
00782 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
00783 ;
00784
00788
00789
00790 extern int * dbiTags;
00791
00792 extern int dbiTagsMax;
00793
00794
00801
00802 rpmdb rpmdbUnlink ( rpmdb db, const char * msg)
00803 ;
00804
00806
00807
00808 rpmdb XrpmdbUnlink ( rpmdb db, const char * msg,
00809 const char * fn, unsigned ln)
00810 ;
00811
00812 #define rpmdbUnlink(_db, _msg) XrpmdbUnlink(_db, _msg, __FILE__, __LINE__)
00813
00820
00821 rpmdb rpmdbLink (rpmdb db, const char * msg)
00822 ;
00823
00825
00826 rpmdb XrpmdbLink (rpmdb db, const char * msg,
00827 const char * fn, unsigned ln)
00828 ;
00829
00830 #define rpmdbLink(_db, _msg) XrpmdbLink(_db, _msg, __FILE__, __LINE__)
00831
00840 int rpmdbOpen ( const char * prefix, rpmdb * dbp,
00841 int mode, int perms)
00842
00843 ;
00844
00851 int rpmdbInit( const char * prefix, int perms)
00852
00853 ;
00854
00860 int rpmdbVerify( const char * prefix)
00861
00862 ;
00863
00870 int rpmdbCloseDBI( rpmdb db, int rpmtag)
00871
00872 ;
00873
00879 int rpmdbClose ( rpmdb db)
00880
00881 ;
00882
00888 int rpmdbSync ( rpmdb db)
00889
00890 ;
00891
00897
00898 int rpmdbOpenAll ( rpmdb db)
00899
00900 ;
00901
00902
00909 int rpmdbCountPackages( rpmdb db, const char * name)
00910
00911 ;
00912
00918 unsigned int rpmdbGetIteratorOffset( rpmdbMatchIterator mi)
00919 ;
00920
00926 int rpmdbGetIteratorCount( rpmdbMatchIterator mi)
00927 ;
00928
00936 int rpmdbAppendIterator( rpmdbMatchIterator mi,
00937 const int * hdrNums, int nHdrNums)
00938 ;
00939
00949 int rpmdbPruneIterator( rpmdbMatchIterator mi,
00950 int * hdrNums, int nHdrNums, int sorted)
00951 ;
00952
00961 int rpmdbSetIteratorRE( rpmdbMatchIterator mi, rpmTag tag,
00962 rpmMireMode mode, const char * pattern)
00963
00964 ;
00965
00973 int rpmdbSetIteratorRewrite( rpmdbMatchIterator mi, int rewrite)
00974 ;
00975
00982 int rpmdbSetIteratorModified( rpmdbMatchIterator mi, int modified)
00983 ;
00984
00992 int rpmdbSetHdrChk( rpmdbMatchIterator mi, rpmts ts,
00993 rpmRC (*hdrchk) (rpmts ts, const void * uh, size_t uc, const char ** msg))
00994 ;
00995
01004
01005 rpmdbMatchIterator rpmdbInitIterator( rpmdb db, rpmTag rpmtag,
01006 const void * keyp, size_t keylen)
01007
01008 ;
01009
01015
01016 Header rpmdbNextIterator( rpmdbMatchIterator mi)
01017
01018 ;
01019
01023
01024 int rpmdbCheckSignals(void)
01025
01026 ;
01027
01033
01034 rpmdbMatchIterator rpmdbFreeIterator( rpmdbMatchIterator mi)
01035
01036 ;
01037
01047 int rpmdbAdd( rpmdb db, int iid, Header h, rpmts ts,
01048 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01049
01050 ;
01051
01061 int rpmdbRemove( rpmdb db, int rid, unsigned int hdrNum,
01062 rpmts ts,
01063 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01064
01065 ;
01066
01074 int rpmdbRebuild( const char * prefix, rpmts ts,
01075 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01076
01077 ;
01078
01082
01083 int mergesort(void *base, size_t nmemb, size_t size,
01084 int (*cmp) (const void *, const void *))
01085
01086 ;
01087
01088 #ifdef __cplusplus
01089 }
01090 #endif
01091
01092
01093 #endif