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_mp_mmapsize;
00325 int dbi_mp_size;
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_cachesize;
00344 int dbi_pagesize;
00345
00346 void * (*dbi_malloc) (size_t nbytes)
00347 ;
00348
00349 unsigned int dbi_h_ffactor;
00350 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
00351 unsigned int length)
00352 ;
00353 unsigned int dbi_h_nelem;
00354 unsigned int dbi_h_flags;
00355 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00356 ;
00357
00358 int dbi_bt_flags;
00359 int dbi_bt_minkey;
00360 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
00361 ;
00362 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00363 ;
00364 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
00365 ;
00366
00367 int dbi_re_flags;
00368 int dbi_re_delim;
00369 unsigned int dbi_re_len;
00370 int dbi_re_pad;
00371 const char * dbi_re_source;
00372
00373 unsigned int dbi_q_extentsize;
00374
00375
00376 rpmdb dbi_rpmdb;
00377 rpmTag dbi_rpmtag;
00378 int dbi_jlen;
00380
00381 DB * dbi_db;
00382
00383 DB_TXN * dbi_txnid;
00384
00385 void * dbi_stats;
00387
00388 const struct _dbiVec * dbi_vec;
00390 };
00391
00395 struct rpmdb_s {
00396
00397 const char * db_root;
00398
00399 const char * db_home;
00400 int db_flags;
00401 int db_mode;
00402 int db_perms;
00403 int db_api;
00404
00405 const char * db_errpfx;
00406 int db_remove_env;
00407 int db_filter_dups;
00408 int db_chrootDone;
00409 void (*db_errcall) (const char *db_errpfx, char *buffer)
00410 ;
00411
00412 FILE * db_errfile;
00413
00414 void * (*db_malloc) (size_t nbytes)
00415 ;
00416
00417 void * (*db_realloc) ( void * ptr,
00418 size_t nbytes)
00419 ;
00420 void (*db_free) ( void * ptr)
00421 ;
00422
00423 unsigned char * db_bits;
00424 int db_nbits;
00425 rpmdb db_next;
00426 int db_opens;
00427
00428 void * db_dbenv;
00429 int db_ndbi;
00430 dbiIndex * _dbi;
00432
00433 int nrefs;
00434 };
00435
00436
00437
00440 enum rpmdbFlags {
00441 RPMDB_FLAG_JUSTCHECK = (1 << 0),
00442 RPMDB_FLAG_MINIMAL = (1 << 1),
00443
00444 RPMDB_FLAG_CHROOT = (1 << 2)
00445
00446 };
00447
00448 #ifdef __cplusplus
00449 extern "C" {
00450 #endif
00451
00452
00459
00460 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
00461
00462 ;
00463
00469
00470 dbiIndex db3Free( dbiIndex dbi)
00471 ;
00472
00479
00480
00481 extern const char *const prDbiOpenFlags(int dbflags, int print_dbenv_flags)
00482 ;
00483
00484
00492 dbiIndex dbiOpen( rpmdb db, rpmTag rpmtag,
00493 unsigned int flags)
00494
00495 ;
00496
00497
00506 static inline
00507 int dbiCopen(dbiIndex dbi, DB_TXN * txnid,
00508 DBC ** dbcp, unsigned int flags)
00509
00510
00511 {
00512 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
00513 }
00514
00522 static inline
00523 int dbiCclose(dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00524
00525
00526 {
00527 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
00528 }
00529
00538 static inline
00539 int dbiCdup(dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00540 unsigned int flags)
00541
00542 {
00543 return (*dbi->dbi_vec->cdup) (dbi, dbcursor, dbcp, flags);
00544 }
00545
00555 static inline
00556 int dbiDel(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00557 unsigned int flags)
00558
00559
00560 {
00561 assert(key->data != NULL && key->size > 0);
00562 return (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
00563 }
00564
00574 static inline
00575 int dbiGet(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00576 unsigned int flags)
00577
00578
00579 {
00580 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00581 return (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
00582 }
00583
00594 static inline
00595 int dbiPget(dbiIndex dbi, DBC * dbcursor,
00596 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00597
00598
00599 {
00600 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00601 return (dbi->dbi_vec->cpget) (dbi, dbcursor, key, pkey, data, flags);
00602 }
00603
00613 static inline
00614 int dbiPut(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00615 unsigned int flags)
00616
00617
00618 {
00619 assert(key->data != NULL && key->size > 0 && data->data != NULL && data->size > 0);
00620 return (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
00621 }
00622
00631 static inline
00632 int dbiCount(dbiIndex dbi, DBC * dbcursor, unsigned int * countp,
00633 unsigned int flags)
00634
00635
00636 {
00637 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
00638 }
00639
00646 static inline
00647 int dbiVerify( dbiIndex dbi, unsigned int flags)
00648
00649
00650 {
00651 dbi->dbi_verify_on_close = 1;
00652 return (*dbi->dbi_vec->close) (dbi, flags);
00653 }
00654
00661 static inline
00662 int dbiClose( dbiIndex dbi, unsigned int flags)
00663
00664
00665 {
00666 return (*dbi->dbi_vec->close) (dbi, flags);
00667 }
00668
00675 static inline
00676 int dbiSync (dbiIndex dbi, unsigned int flags)
00677
00678
00679 {
00680 return (*dbi->dbi_vec->sync) (dbi, flags);
00681 }
00682
00691 static inline
00692 int dbiAssociate(dbiIndex dbi, dbiIndex dbisecondary,
00693 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00694 unsigned int flags)
00695
00696
00697 {
00698 return (*dbi->dbi_vec->associate) (dbi, dbisecondary, callback, flags);
00699 }
00700
00709 static inline
00710 int dbiJoin(dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00711 unsigned int flags)
00712
00713
00714 {
00715 return (*dbi->dbi_vec->join) (dbi, curslist, dbcp, flags);
00716 }
00717
00723 static inline
00724 int dbiByteSwapped(dbiIndex dbi)
00725
00726 {
00727 if (dbi->dbi_byteswapped == -1)
00728 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
00729 return dbi->dbi_byteswapped;
00730 }
00737 static inline
00738 int dbiStat(dbiIndex dbi, unsigned int flags)
00739
00740 {
00741 return (*dbi->dbi_vec->stat) (dbi, flags);
00742 }
00743
00744
00745
00746
00749 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
00750 ;
00751
00757 dbiIndexSet dbiFreeIndexSet( dbiIndexSet set)
00758 ;
00759
00765 unsigned int dbiIndexSetCount(dbiIndexSet set)
00766 ;
00767
00774 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
00775 ;
00776
00783 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
00784 ;
00785
00789
00790
00791 extern int * dbiTags;
00792
00793 extern int dbiTagsMax;
00794
00795
00802
00803 rpmdb rpmdbUnlink ( rpmdb db, const char * msg)
00804 ;
00805
00807
00808
00809 rpmdb XrpmdbUnlink ( rpmdb db, const char * msg,
00810 const char * fn, unsigned ln)
00811 ;
00812
00813 #define rpmdbUnlink(_db, _msg) XrpmdbUnlink(_db, _msg, __FILE__, __LINE__)
00814
00821
00822 rpmdb rpmdbLink (rpmdb db, const char * msg)
00823 ;
00824
00826
00827 rpmdb XrpmdbLink (rpmdb db, const char * msg,
00828 const char * fn, unsigned ln)
00829 ;
00830
00831 #define rpmdbLink(_db, _msg) XrpmdbLink(_db, _msg, __FILE__, __LINE__)
00832
00841 int rpmdbOpen ( const char * prefix, rpmdb * dbp,
00842 int mode, int perms)
00843
00844 ;
00845
00852 int rpmdbInit( const char * prefix, int perms)
00853
00854 ;
00855
00861 int rpmdbVerify( const char * prefix)
00862
00863 ;
00864
00871 int rpmdbCloseDBI( rpmdb db, int rpmtag)
00872
00873 ;
00874
00880 int rpmdbClose ( rpmdb db)
00881
00882 ;
00883
00889 int rpmdbSync ( rpmdb db)
00890
00891 ;
00892
00898
00899 int rpmdbOpenAll ( rpmdb db)
00900
00901 ;
00902
00903
00910 int rpmdbCountPackages( rpmdb db, const char * name)
00911
00912 ;
00913
00919 unsigned int rpmdbGetIteratorOffset( rpmdbMatchIterator mi)
00920 ;
00921
00927 int rpmdbGetIteratorCount( rpmdbMatchIterator mi)
00928 ;
00929
00937 int rpmdbAppendIterator( rpmdbMatchIterator mi,
00938 const int * hdrNums, int nHdrNums)
00939 ;
00940
00950 int rpmdbPruneIterator( rpmdbMatchIterator mi,
00951 int * hdrNums, int nHdrNums, int sorted)
00952 ;
00953
00962 int rpmdbSetIteratorRE( rpmdbMatchIterator mi, rpmTag tag,
00963 rpmMireMode mode, const char * pattern)
00964
00965 ;
00966
00974 int rpmdbSetIteratorRewrite( rpmdbMatchIterator mi, int rewrite)
00975 ;
00976
00983 int rpmdbSetIteratorModified( rpmdbMatchIterator mi, int modified)
00984 ;
00985
00993 int rpmdbSetHdrChk( rpmdbMatchIterator mi, rpmts ts,
00994 rpmRC (*hdrchk) (rpmts ts, const void * uh, size_t uc, const char ** msg))
00995 ;
00996
01005
01006 rpmdbMatchIterator rpmdbInitIterator( rpmdb db, rpmTag rpmtag,
01007 const void * keyp, size_t keylen)
01008
01009 ;
01010
01016
01017 Header rpmdbNextIterator( rpmdbMatchIterator mi)
01018
01019 ;
01020
01024
01025 int rpmdbCheckSignals(void)
01026
01027 ;
01028
01034
01035 rpmdbMatchIterator rpmdbFreeIterator( rpmdbMatchIterator mi)
01036
01037 ;
01038
01048 int rpmdbAdd( rpmdb db, int iid, Header h, rpmts ts,
01049 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01050
01051 ;
01052
01062 int rpmdbRemove( rpmdb db, int rid, unsigned int hdrNum,
01063 rpmts ts,
01064 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01065
01066 ;
01067
01075 int rpmdbRebuild( const char * prefix, rpmts ts,
01076 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01077
01078 ;
01079
01083
01084 int mergesort(void *base, size_t nmemb, size_t size,
01085 int (*cmp) (const void *, const void *))
01086
01087 ;
01088
01089 #ifdef __cplusplus
01090 }
01091 #endif
01092
01093
01094 #endif