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 #ifdef NOTYET
00021
00024 typedef struct rpmdb_s * rpmdb;
00025
00029 typedef struct _rpmdbMatchIterator * rpmdbMatchIterator;
00030 #endif
00031
00034 typedef struct _dbiIndexItem * dbiIndexItem;
00035
00039 typedef struct _dbiIndexSet * dbiIndexSet;
00040
00043 typedef struct _dbiIndex * dbiIndex;
00044
00045 #if defined(_RPMDB_INTERNAL)
00046 #include "rpmsw.h"
00047 #if !defined(SWIG)
00048
00053 struct _dbiIndexItem {
00054 unsigned int hdrNum;
00055 unsigned int tagNum;
00056 unsigned int fpNum;
00057 };
00058
00062 struct _dbiIndexSet {
00063 struct _dbiIndexItem * recs;
00064 int count;
00065 };
00066
00070 struct _dbiVec {
00071 int dbv_major;
00072 int dbv_minor;
00073 int dbv_patch;
00081 int (*open) (rpmdb rpmdb, rpmTag rpmtag, dbiIndex * dbip)
00082
00083 ;
00084
00091 int (*close) ( dbiIndex dbi, unsigned int flags)
00092
00093 ;
00094
00101 int (*sync) (dbiIndex dbi, unsigned int flags)
00102
00103 ;
00104
00113 int (*associate) (dbiIndex dbi, dbiIndex dbisecondary,
00114 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00115 unsigned int flags)
00116
00117 ;
00118
00127 int (*join) (dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00128 unsigned int flags)
00129
00130 ;
00131
00140 int (*copen) (dbiIndex dbi, DB_TXN * txnid,
00141 DBC ** dbcp, unsigned int dbiflags)
00142
00143 ;
00144
00152 int (*cclose) (dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00153
00154 ;
00155
00164 int (*cdup) (dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00165 unsigned int flags)
00166
00167 ;
00168
00178 int (*cdel) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00179 unsigned int flags)
00180
00181 ;
00182
00192 int (*cget) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00193 unsigned int flags)
00194
00195 ;
00196
00207 int (*cpget) (dbiIndex dbi, DBC * dbcursor,
00208 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00209
00210 ;
00211
00221 int (*cput) (dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00222 unsigned int flags)
00223
00224 ;
00225
00234 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
00235 unsigned int * countp,
00236 unsigned int flags)
00237
00238 ;
00239
00245 int (*byteswapped) (dbiIndex dbi)
00246
00247 ;
00248
00255 int (*stat) (dbiIndex dbi, unsigned int flags)
00256
00257 ;
00258 };
00259
00263 struct _dbiIndex {
00264
00265 const char * dbi_root;
00266
00267 const char * dbi_home;
00268
00269 const char * dbi_file;
00270
00271 const char * dbi_subfile;
00272
00273 const char * dbi_tmpdir;
00275 int dbi_ecflags;
00276 int dbi_cflags;
00277 int dbi_oeflags;
00278 int dbi_eflags;
00279 int dbi_oflags;
00280 int dbi_tflags;
00282 int dbi_type;
00283 unsigned dbi_mode;
00284 int dbi_perms;
00285 long dbi_shmkey;
00286 int dbi_api;
00288 int dbi_verify_on_close;
00289 int dbi_use_dbenv;
00290 int dbi_permit_dups;
00291 int dbi_no_fsync;
00292 int dbi_no_dbsync;
00293 int dbi_lockdbfd;
00294 int dbi_temporary;
00295 int dbi_debug;
00296 int dbi_byteswapped;
00297
00298
00299 char * dbi_host;
00300 unsigned long dbi_cl_timeout;
00301 unsigned long dbi_sv_timeout;
00302
00303
00304 int dbi_lorder;
00305
00306
00307 void (*db_errcall) (void * dbenv, const char *db_errpfx, char *buffer)
00308
00309 ;
00310
00311 FILE * dbi_errfile;
00312 const char * dbi_errpfx;
00313 int dbi_verbose;
00314 int dbi_region_init;
00315 unsigned int dbi_thread_count;
00316
00317 unsigned int dbi_lk_max_lockers;
00318 unsigned int dbi_lk_max_locks;
00319 unsigned int dbi_lk_max_objects;
00320 unsigned int dbi_lk_detect;
00321
00322 int dbi_lk_nmodes;
00323
00324 unsigned char * dbi_lk_conflicts;
00325
00326 unsigned int dbi_lg_bsize;
00327
00328 const char * dbi_lg_dir;
00329
00330 unsigned int dbi_lg_filemode;
00331 unsigned int dbi_lg_max;
00332 unsigned int dbi_lg_regionmax;
00333
00334 int dbi_mmapsize;
00335 int dbi_cachesize;
00336
00337 unsigned int dbi_mutex_align;
00338 unsigned int dbi_mutex_increment;
00339 unsigned int dbi_mutex_max;
00340 unsigned int dbi_mutex_tas_spins;
00341
00342
00343 unsigned int dbi_seq_cachesize;
00344 unsigned int dbi_seq_flags;
00345 #if 0
00346 int64_t dbi_seq_min;
00347 int64_t dbi_seq_max;
00348 #endif
00349
00350 unsigned int dbi_tx_max;
00351 #if 0
00352 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
00353 DB_LSN *lsnp, int redo, void *info)
00354
00355 ;
00356 #endif
00357
00358 int dbi_pagesize;
00359
00360 void * (*dbi_malloc) (size_t nbytes)
00361 ;
00362
00363 unsigned int dbi_h_ffactor;
00364 unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
00365 unsigned int length)
00366 ;
00367 unsigned int dbi_h_nelem;
00368 unsigned int dbi_h_flags;
00369 int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00370 ;
00371
00372 int dbi_bt_flags;
00373 int dbi_bt_minkey;
00374 int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *)
00375 ;
00376 int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *)
00377 ;
00378 size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *)
00379 ;
00380
00381 int dbi_re_flags;
00382 int dbi_re_delim;
00383 unsigned int dbi_re_len;
00384 int dbi_re_pad;
00385 const char * dbi_re_source;
00386
00387 unsigned int dbi_q_extentsize;
00388
00389
00390 rpmdb dbi_rpmdb;
00391 rpmTag dbi_rpmtag;
00392 int dbi_jlen;
00394
00395 DB * dbi_db;
00396
00397 DB_TXN * dbi_txnid;
00398
00399 void * dbi_stats;
00401
00402 const struct _dbiVec * dbi_vec;
00404 };
00405 #endif
00406
00410 struct rpmdb_s {
00411
00412 const char * db_root;
00413
00414 const char * db_home;
00415 int db_flags;
00416 int db_mode;
00417 int db_perms;
00418 int db_api;
00419
00420 const char * db_errpfx;
00422 int db_remove_env;
00423 int db_filter_dups;
00424 int db_verifying;
00425
00426 int db_chrootDone;
00427 void (*db_errcall) (const char * db_errpfx, char * buffer)
00428 ;
00429
00430 FILE * db_errfile;
00431
00432 void * (*db_malloc) (size_t nbytes)
00433 ;
00434
00435 void * (*db_realloc) ( void * ptr, size_t nbytes)
00436 ;
00437 void (*db_free) ( void * ptr)
00438 ;
00439
00440 int (*db_export) (rpmdb db, Header h, int adding);
00441
00442
00443 unsigned char * db_bits;
00444 int db_nbits;
00445 rpmdb db_next;
00446 int db_opens;
00447
00448 void * db_dbenv;
00449 int * db_tagn;
00450 int db_ndbi;
00451
00452 dbiIndex * _dbi;
00454 struct rpmop_s db_getops;
00455 struct rpmop_s db_putops;
00456 struct rpmop_s db_delops;
00458
00459 int nrefs;
00460 };
00461 #endif
00462
00463
00464
00467 enum rpmdbFlags {
00468 RPMDB_FLAG_JUSTCHECK = (1 << 0),
00469 RPMDB_FLAG_MINIMAL = (1 << 1),
00470
00471 RPMDB_FLAG_CHROOT = (1 << 2)
00472
00473 };
00474
00475 #ifdef __cplusplus
00476 extern "C" {
00477 #endif
00478
00479 #if defined(_RPMDB_INTERNAL)
00480
00487
00488 dbiIndex db3New(rpmdb rpmdb, rpmTag rpmtag)
00489
00490 ;
00491
00497
00498 dbiIndex db3Free( dbiIndex dbi)
00499 ;
00500
00507
00508
00509 extern const char * prDbiOpenFlags(int dbflags, int print_dbenv_flags)
00510 ;
00511
00512
00520 dbiIndex dbiOpen( rpmdb db, rpmTag rpmtag,
00521 unsigned int flags)
00522
00523 ;
00524
00531 void * dbiStatsAccumulator(dbiIndex dbi, int opx)
00532 ;
00533
00534 #if !defined(SWIG)
00535
00544 static inline
00545 int dbiCopen(dbiIndex dbi, DB_TXN * txnid,
00546 DBC ** dbcp, unsigned int flags)
00547
00548
00549 {
00550 return (*dbi->dbi_vec->copen) (dbi, txnid, dbcp, flags);
00551 }
00552
00560 static inline
00561 int dbiCclose(dbiIndex dbi, DBC * dbcursor, unsigned int flags)
00562
00563
00564 {
00565 return (*dbi->dbi_vec->cclose) (dbi, dbcursor, flags);
00566 }
00567
00576 static inline
00577 int dbiCdup(dbiIndex dbi, DBC * dbcursor, DBC ** dbcp,
00578 unsigned int flags)
00579
00580 {
00581 return (*dbi->dbi_vec->cdup) (dbi, dbcursor, dbcp, flags);
00582 }
00583
00593 static inline
00594 int dbiDel(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00595 unsigned int flags)
00596
00597
00598 {
00599 rpmop sw = (rpmop)dbiStatsAccumulator(dbi, 16);
00600 int rc;
00601 assert(key->data != NULL && key->size > 0);
00602 (void) rpmswEnter(sw, 0);
00603 rc = (dbi->dbi_vec->cdel) (dbi, dbcursor, key, data, flags);
00604 (void) rpmswExit(sw, data->size);
00605 return rc;
00606 }
00607
00617 static inline
00618 int dbiGet(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00619 unsigned int flags)
00620
00621
00622 {
00623 rpmop sw = (rpmop)dbiStatsAccumulator(dbi, 14);
00624 int rc;
00625 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00626 (void) rpmswEnter(sw, 0);
00627 rc = (dbi->dbi_vec->cget) (dbi, dbcursor, key, data, flags);
00628 (void) rpmswExit(sw, data->size);
00629 return rc;
00630 }
00631
00642 static inline
00643 int dbiPget(dbiIndex dbi, DBC * dbcursor,
00644 DBT * key, DBT * pkey, DBT * data, unsigned int flags)
00645
00646
00647 {
00648 rpmop sw = (rpmop)dbiStatsAccumulator(dbi, 14);
00649 int rc;
00650 assert((flags == DB_NEXT) || (key->data != NULL && key->size > 0));
00651 (void) rpmswEnter(sw, 0);
00652 rc = (dbi->dbi_vec->cpget) (dbi, dbcursor, key, pkey, data, flags);
00653 (void) rpmswExit(sw, data->size);
00654 return rc;
00655 }
00656
00666 static inline
00667 int dbiPut(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
00668 unsigned int flags)
00669
00670
00671 {
00672 rpmop sw = (rpmop)dbiStatsAccumulator(dbi, 15);
00673 int rc;
00674 assert(key->data != NULL && key->size > 0 && data->data != NULL && data->size > 0);
00675 (void) rpmswEnter(sw, 0);
00676 rc = (dbi->dbi_vec->cput) (dbi, dbcursor, key, data, flags);
00677 (void) rpmswExit(sw, data->size);
00678 return rc;
00679 }
00680
00689 static inline
00690 int dbiCount(dbiIndex dbi, DBC * dbcursor, unsigned int * countp,
00691 unsigned int flags)
00692
00693
00694 {
00695 return (*dbi->dbi_vec->ccount) (dbi, dbcursor, countp, flags);
00696 }
00697
00704 static inline
00705 int dbiVerify( dbiIndex dbi, unsigned int flags)
00706
00707
00708 {
00709 dbi->dbi_verify_on_close = 1;
00710 return (*dbi->dbi_vec->close) (dbi, flags);
00711 }
00712
00719 static inline
00720 int dbiClose( dbiIndex dbi, unsigned int flags)
00721
00722
00723 {
00724 return (*dbi->dbi_vec->close) (dbi, flags);
00725 }
00726
00733 static inline
00734 int dbiSync (dbiIndex dbi, unsigned int flags)
00735
00736
00737 {
00738 return (*dbi->dbi_vec->sync) (dbi, flags);
00739 }
00740
00749 static inline
00750 int dbiAssociate(dbiIndex dbi, dbiIndex dbisecondary,
00751 int (*callback) (DB *, const DBT *, const DBT *, DBT *),
00752 unsigned int flags)
00753
00754
00755 {
00756 return (*dbi->dbi_vec->associate) (dbi, dbisecondary, callback, flags);
00757 }
00758
00767 static inline
00768 int dbiJoin(dbiIndex dbi, DBC ** curslist, DBC ** dbcp,
00769 unsigned int flags)
00770
00771
00772 {
00773 return (*dbi->dbi_vec->join) (dbi, curslist, dbcp, flags);
00774 }
00775
00781 static inline
00782 int dbiByteSwapped(dbiIndex dbi)
00783
00784 {
00785 if (dbi->dbi_byteswapped == -1)
00786 dbi->dbi_byteswapped = (*dbi->dbi_vec->byteswapped) (dbi);
00787 return dbi->dbi_byteswapped;
00788 }
00789
00796 static inline
00797 int dbiStat(dbiIndex dbi, unsigned int flags)
00798
00799 {
00800 return (*dbi->dbi_vec->stat) (dbi, flags);
00801 }
00802
00808 static inline
00809 DB_TXN * dbiTxnid(dbiIndex dbi)
00810
00811 {
00812 return dbi->dbi_txnid;
00813 }
00814
00815 #endif
00816
00817
00818
00821 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
00822 ;
00823
00829
00830 dbiIndexSet dbiFreeIndexSet( dbiIndexSet set)
00831 ;
00832
00838 unsigned int dbiIndexSetCount(dbiIndexSet set)
00839 ;
00840
00847 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
00848 ;
00849
00856 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)
00857 ;
00858 #endif
00859
00866
00867 rpmdb rpmdbUnlink ( rpmdb db, const char * msg)
00868 ;
00869
00871
00872
00873 rpmdb XrpmdbUnlink ( rpmdb db, const char * msg,
00874 const char * fn, unsigned ln)
00875 ;
00876
00877 #define rpmdbUnlink(_db, _msg) XrpmdbUnlink(_db, _msg, __FILE__, __LINE__)
00878
00885
00886 rpmdb rpmdbLink (rpmdb db, const char * msg)
00887 ;
00888
00890
00891 rpmdb XrpmdbLink (rpmdb db, const char * msg,
00892 const char * fn, unsigned ln)
00893 ;
00894
00895 #define rpmdbLink(_db, _msg) XrpmdbLink(_db, _msg, __FILE__, __LINE__)
00896
00905 int rpmdbOpen ( const char * prefix, rpmdb * dbp,
00906 int mode, int perms)
00907
00908 ;
00909
00916 int rpmdbInit( const char * prefix, int perms)
00917
00918 ;
00919
00925 int rpmdbVerifyAllDBI(rpmdb db)
00926
00927 ;
00928
00934 int rpmdbVerify( const char * prefix)
00935
00936 ;
00937
00944 int rpmdbBlockDBI( rpmdb db, int rpmtag)
00945 ;
00946
00953 int rpmdbCloseDBI( rpmdb db, int rpmtag)
00954
00955 ;
00956
00962 int rpmdbClose ( rpmdb db)
00963
00964 ;
00965
00971 int rpmdbSync ( rpmdb db)
00972
00973 ;
00974
00980
00981 int rpmdbOpenAll ( rpmdb db)
00982
00983 ;
00984
00985
00994 int rpmdbCount( rpmdb db, rpmTag tag,
00995 const void * keyp, size_t keylen)
00996
00997 ;
00998
01005 int rpmdbCountPackages( rpmdb db, const char * name)
01006
01007 ;
01008
01014 unsigned int rpmdbGetIteratorOffset( rpmdbMatchIterator mi)
01015 ;
01016
01022 int rpmdbGetIteratorCount( rpmdbMatchIterator mi)
01023 ;
01024
01032 int rpmdbAppendIterator( rpmdbMatchIterator mi,
01033 const int * hdrNums, int nHdrNums)
01034 ;
01035
01045 int rpmdbPruneIterator( rpmdbMatchIterator mi,
01046 int * hdrNums, int nHdrNums, int sorted)
01047 ;
01048
01057 int rpmdbSetIteratorRE( rpmdbMatchIterator mi, rpmTag tag,
01058 rpmMireMode mode, const char * pattern)
01059
01060 ;
01061
01069 int rpmdbSetIteratorRewrite( rpmdbMatchIterator mi, int rewrite)
01070 ;
01071
01078 int rpmdbSetIteratorModified( rpmdbMatchIterator mi, int modified)
01079 ;
01080
01088 int rpmdbSetHdrChk( rpmdbMatchIterator mi, rpmts ts,
01089 rpmRC (*hdrchk) (rpmts ts, const void * uh, size_t uc, const char ** msg))
01090 ;
01091
01100
01101 rpmdbMatchIterator rpmdbInitIterator( rpmdb db, rpmTag rpmtag,
01102 const void * keyp, size_t keylen)
01103
01104 ;
01105
01111
01112 Header rpmdbNextIterator( rpmdbMatchIterator mi)
01113
01114 ;
01115
01125
01126 int rpmdbCheckTerminate(int terminate)
01127
01128 ;
01129
01133
01134 int rpmdbCheckSignals(void)
01135
01136 ;
01137
01143
01144 rpmdbMatchIterator rpmdbFreeIterator( rpmdbMatchIterator mi)
01145
01146 ;
01147
01157 int rpmdbAdd( rpmdb db, int iid, Header h, rpmts ts,
01158 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01159
01160 ;
01161
01171 int rpmdbRemove( rpmdb db, int rid, unsigned int hdrNum,
01172 rpmts ts,
01173 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01174
01175 ;
01176
01184 int rpmdbRebuild( const char * prefix, rpmts ts,
01185 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, const char ** msg))
01186
01187 ;
01188
01189 #ifndef __APPLE__
01190
01193
01194 int mergesort(void *base, size_t nmemb, size_t size,
01195 int (*cmp) (const void *, const void *))
01196
01197 ;
01198 #else
01199
01200 #endif
01201
01202 #ifdef __cplusplus
01203 }
01204 #endif
01205
01206
01207 #endif