4 /** \ingroup rpmdb dbi db1 db3
6 * Access RPM indices using Berkeley DB interface(s).
13 typedef /*@abstract@*/ struct _dbiIndexItem * dbiIndexItem;
14 typedef /*@abstract@*/ struct _dbiIndex * dbiIndex;
16 /* this will break if sizeof(int) != 4 */
18 * A single item from an index database (i.e. the "data returned").
19 * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
20 * and was identical to the "data saved" structure below.
22 struct _dbiIndexItem {
23 unsigned int hdrNum; /*!< header instance in db */
24 unsigned int tagNum; /*!< tag index in header */
25 unsigned int fpNum; /*!< finger print index */
26 unsigned int dbNum; /*!< database index */
30 * A single item in an index database (i.e. the "data saved").
33 /*@unused@*/ unsigned int recOffset; /*!< byte offset of header in db */
34 /*@unused@*/ unsigned int fileNumber; /*!< file array index */
37 typedef struct _dbiIR * DBIR_t;
41 * Items retrieved from the index database.
44 /*@owned@*/ struct _dbiIndexItem * recs; /*!< array of records */
45 int count; /*!< number of records */
48 /* XXX hack to get prototypes correct */
49 #if !defined(DB_VERSION_MAJOR)
57 * Private methods for accessing an index database.
60 int dbv_major; /*!< Berkeley db version major */
61 int dbv_minor; /*!< Berkeley db version minor */
62 int dbv_patch; /*!< Berkeley db version patch */
65 * Return handle for an index database.
66 * @param rpmdb rpm database
67 * @param rpmtag rpm tag
68 * @return 0 on success
70 int (*open) (rpmdb rpmdb, int rpmtag, /*@out@*/ dbiIndex * dbip)
71 /*@modifies *dbip @*/;
74 * Close index database, and destroy database handle.
75 * @param dbi index database handle
76 * @param flags (unused)
77 * @return 0 on success
79 int (*close) (/*@only@*/ dbiIndex dbi, unsigned int flags)
80 /*@modifies dbi, fileSystem @*/;
83 * Flush pending operations to disk.
84 * @param dbi index database handle
85 * @param flags (unused)
86 * @return 0 on success
88 int (*sync) (dbiIndex dbi, unsigned int flags)
89 /*@modifies fileSystem @*/;
92 * Open database cursor.
93 * @param dbi index database handle
94 * @param dbcp address of database cursor
95 * @param flags (unused)
97 int (*copen) (dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int flags)
98 /*@modifies dbi, *dbcp @*/;
101 * Close database cursor.
102 * @param dbi index database handle
103 * @param dbcursor database cursor
104 * @param flags (unused)
106 int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
107 /*@modifies dbi, *dbcursor @*/;
110 * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
111 * @param dbi index database handle
112 * @param dbcursor database cursor
113 * @param keyp key data
114 * @param keylen key data length
115 * @param flags (unused)
116 * @return 0 on success
118 int (*cdel) (dbiIndex dbi, DBC * dbcursor,
119 const void * keyp, size_t keylen, unsigned int flags)
120 /*@modifies *dbcursor, fileSystem @*/;
123 * Retrieve (key,data) pair using db->get or dbcursor->c_get.
124 * @param dbi index database handle
125 * @param dbcursor database cursor
126 * @param keypp address of key data
127 * @param keylenp address of key data length
128 * @param datapp address of data pointer
129 * @param datalenp address of data length
130 * @param flags (unused)
131 * @return 0 on success
133 int (*cget) (dbiIndex dbi, DBC * dbcursor,
134 /*@out@*/ void ** keypp, /*@out@*/ size_t * keylenp,
135 /*@out@*/ void ** datapp, /*@out@*/ size_t * datalenp,
137 /*@modifies *dbcursor, *keypp, *keylenp, *datapp, *datalenp,
141 * Store (key,data) pair using db->put or dbcursor->c_put.
142 * @param dbi index database handle
143 * @param dbcursor database cursor
144 * @param keyp key data
145 * @param keylen key data length
146 * @param datap data pointer
147 * @param datalen data length
148 * @param flags (unused)
149 * @return 0 on success
151 int (*cput) (dbiIndex dbi, DBC * dbcursor,
152 const void * keyp, size_t keylen,
153 const void * datap, size_t datalen,
155 /*@modifies *dbcursor, fileSystem @*/;
158 * Retrieve count of (possible) duplicate items using dbcursor->c_count.
159 * @param dbi index database handle
160 * @param dbcursor database cursor
161 * @param countp address of count
162 * @param flags (unused)
163 * @return 0 on success
165 int (*ccount) (dbiIndex dbi, DBC * dbcursor,
166 /*@out@*/ unsigned int * countp,
168 /*@modifies *dbcursor @*/;
171 * Is database byte swapped?
172 * @param dbi index database handle
175 int (*byteswapped) (dbiIndex dbi)
179 * Save statistics in database handle.
180 * @param dbi index database handle
181 * @param flags retrieve statistics that don't require traversal?
182 * @return 0 on success
184 int (*stat) (dbiIndex dbi, unsigned int flags)
190 * Describes an index database (implemented on Berkeley db3 functionality).
193 /*@null@*/ const char * dbi_root;
194 /*@null@*/ const char * dbi_home;
195 /*@null@*/ const char * dbi_file;
196 /*@null@*/ const char * dbi_subfile;
198 int dbi_ecflags; /*!< db_env_create flags */
199 int dbi_cflags; /*!< db_create flags */
200 int dbi_oeflags; /*!< common (db,dbenv}->open flags */
201 int dbi_eflags; /*!< dbenv->open flags */
202 int dbi_oflags; /*!< db->open flags */
203 int dbi_tflags; /*!< dbenv->txn_begin flags */
205 int dbi_type; /*!< db index type */
206 unsigned dbi_mode; /*!< mode to use on open */
207 int dbi_perms; /*!< file permission to use on open */
208 long dbi_shmkey; /*!< shared memory base key */
209 int dbi_api; /*!< Berkeley API type */
211 int dbi_verify_on_close;
212 int dbi_tear_down; /*!< tear down dbenv on close */
213 int dbi_use_cursors;/*!< access with cursors? (always) */
214 int dbi_use_dbenv; /*!< use db environment? */
215 int dbi_get_rmw_cursor;
216 int dbi_no_fsync; /*!< no-op fsync for db */
217 int dbi_no_dbsync; /*!< don't call dbiSync */
218 int dbi_lockdbfd; /*!< do fcntl lock on db fd */
219 int dbi_temporary; /*!< non-persistent */
222 /*@null@*/ char * dbi_host;
226 /* dbenv parameters */
228 /*@unused@*/ /*@null@*/ void (*db_errcall) (const char *db_errpfx, char *buffer)
229 /*@modifies fileSystem @*/;
230 /*@unused@*/ /*@shared@*/ FILE * dbi_errfile;
231 const char * dbi_errpfx;
235 /* mpool sub-system parameters */
236 int dbi_mp_mmapsize; /*!< (10Mb) */
237 int dbi_mp_size; /*!< (128Kb) */
238 /* lock sub-system parameters */
239 unsigned int dbi_lk_max;
240 unsigned int dbi_lk_detect;
241 /*@unused@*/ int dbi_lk_nmodes;
242 /*@unused@*/ unsigned char * dbi_lk_conflicts;
243 /* log sub-system parameters */
244 unsigned int dbi_lg_max;
245 unsigned int dbi_lg_bsize;
246 /* transaction sub-system parameters */
247 unsigned int dbi_tx_max;
249 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec,
250 DB_LSN *lsnp, int redo, void *info)
251 /*@modifies fileSystem @*/;
253 /* dbinfo parameters */
254 int dbi_cachesize; /*!< */
255 int dbi_pagesize; /*!< (fs blksize) */
256 /*@unused@*/ /*@null@*/ void * (*dbi_malloc) (size_t nbytes)
258 /* hash access parameters */
259 unsigned int dbi_h_ffactor; /*!< */
260 /*@unused@*/ /*@null@*/ unsigned int (*dbi_h_hash_fcn) (const void *bytes, unsigned int length)
261 /*@modifies internalState @*/;
262 unsigned int dbi_h_nelem; /*!< */
263 unsigned int dbi_h_flags; /*!< DB_DUP, DB_DUPSORT */
264 /*@unused@*/ /*@null@*/ int (*dbi_h_dup_compare_fcn) (const DBT *, const DBT *)
265 /*@modifies internalState @*/;
266 /* btree access parameters */
268 /*@unused@*/ int dbi_bt_minkey;
269 /*@unused@*/ /*@null@*/ int (*dbi_bt_compare_fcn) (const DBT *, const DBT *)
270 /*@modifies internalState @*/;
271 /*@unused@*/ /*@null@*/ int (*dbi_bt_dup_compare_fcn) (const DBT *, const DBT *)
272 /*@modifies internalState @*/;
273 /*@unused@*/ /*@null@*/ size_t (*dbi_bt_prefix_fcn) (const DBT *, const DBT *)
274 /*@modifies internalState @*/;
275 /* recno access parameters */
278 unsigned int dbi_re_len;
280 const char * dbi_re_source;
281 /* queue access parameters */
282 unsigned int dbi_q_extentsize;
284 /*@kept@*/ rpmdb dbi_rpmdb;
285 int dbi_rpmtag; /*!< rpm tag used for index */
286 int dbi_jlen; /*!< size of join key */
288 unsigned int dbi_lastoffset; /*!< db1 with falloc.c needs this */
290 /*@only@*//*@null@*/ void * dbi_db; /*!< dbi handle */
291 /*@only@*//*@null@*/ void * dbi_dbenv; /*!< */
292 /*@only@*//*@null@*/ void * dbi_dbinfo; /*!< */
293 /*@only@*//*@null@*/ void * dbi_rmw; /*!< db cursor (with DB_WRITECURSOR) */
294 /*@only@*//*@null@*/ void * dbi_stats; /*!< */
296 /*@observer@*/ const struct _dbiVec * dbi_vec; /*!< private methods */
301 * Describes the collection of index databases used by rpm.
304 /*@owned@*/ const char *db_root; /*!< path prefix */
305 /*@owned@*/ const char *db_home; /*!< directory path */
307 int db_mode; /*!< open mode */
308 int db_perms; /*!< open permissions */
309 int db_api; /*!< Berkeley API type */
312 /*@owned@*/ const char *db_errpfx;
313 void (*db_errcall) (const char *db_errpfx, char *buffer)
315 /*@shared@*/ FILE * db_errfile;
316 /*@only@*/ void * (*db_malloc) (size_t nbytes)
318 /*@only@*/ void * (*db_realloc) (/*@only@*//*@null@*/ void * ptr,
321 void (*db_free) (/*@only@*/ void * ptr)
322 /*@modifies *ptr @*/;
327 /* for RPM's internal use only */
332 RPMDB_FLAG_JUSTCHECK = (1 << 0),
333 RPMDB_FLAG_MINIMAL = (1 << 1),
335 RPMDB_FLAG_CHROOT = (1 << 2)
345 * Return new configured index database handle instance.
346 * @param rpmdb rpm database
348 /*@only@*/ /*@null@*/ dbiIndex db3New(/*@keep@*/ rpmdb rpmdb, int rpmtag)
352 * Destroy index database handle instance.
353 * @param dbi index database handle
354 * @return NULL always
356 /*@null@*/ dbiIndex db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi)
360 * Format db3 open flags for debugging print.
361 * @param dbflags db open flags
362 * @param print_dbenv_flags format db env flags instead?
363 * @return formatted flags (static buffer)
366 /*@exposed@*/ extern const char *const prDbiOpenFlags(int dbflags,
367 int print_dbenv_flags)
372 * Return handle for an index database.
373 * @param db rpm database
374 * @param rpmtag rpm tag
375 * @param flags (unused)
376 * @return index database handle
378 /*@only@*/ /*@null@*/ dbiIndex dbiOpen(/*@null@*/ rpmdb db, int rpmtag,
383 * @param dbi index database handle
384 * @param dbiflags DBI_WRITECURSOR or DBI_ITERATOR
386 int dbiCopen(dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int dbiflags)
387 /*@modifies dbi, *dbcp @*/;
388 int XdbiCopen(dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int dbiflags,
389 const char *f, unsigned int l)
390 /*@modifies dbi, *dbcp @*/;
391 #define dbiCopen(_a,_b,_c) \
392 XdbiCopen(_a, _b, _c, __FILE__, __LINE__)
394 #define DBI_WRITECURSOR (1 << 0)
395 #define DBI_ITERATOR (1 << 1)
398 * @param dbi index database handle
399 * @param flags (unused)
401 int dbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags)
403 int XdbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags,
404 const char *f, unsigned int l)
405 /*@modifies dbi, *dbcursor @*/;
406 #define dbiCclose(_a,_b,_c) \
407 XdbiCclose(_a, _b, _c, __FILE__, __LINE__)
410 * Delete (key,data) pair(s) from index database.
411 * @param dbi index database handle
412 * @param keyp key data
413 * @param keylen key data length
414 * @param flags (unused)
415 * @return 0 on success
417 int dbiDel(dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
419 /*@modifies *dbcursor, fileSystem @*/;
422 * Retrieve (key,data) pair from index database.
423 * @param dbi index database handle
424 * @param keypp address of key data
425 * @param keylenp address of key data length
426 * @param datapp address of data pointer
427 * @param datalenp address of data length
428 * @param flags (unused)
429 * @return 0 on success
431 int dbiGet(dbiIndex dbi, DBC * dbcursor, void ** keypp,
432 /*@null@*/ size_t * keylenp,
433 /*@null@*/ void ** datapp,
434 /*@null@*/ size_t * datalenp,
436 /*@modifies *dbcursor, **keypp, *keylenp, **datapp, *datalenp,
440 * Store (key,data) pair in index database.
441 * @param dbi index database handle
442 * @param keyp key data
443 * @param keylen key data length
444 * @param datap data pointer
445 * @param datalen data length
446 * @param flags (unused)
447 * @return 0 on success
449 int dbiPut(dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
450 const void * datap, size_t datalen, unsigned int flags)
451 /*@modifies *dbcursor, fileSystem @*/;
454 * Retrieve count of (possible) duplicate items.
455 * @param dbi index database handle
456 * @param dbcursor database cursor
457 * @param countp address of count
458 * @param flags (unused)
459 * @return 0 on success
462 int dbiCount(dbiIndex dbi, DBC * dbcursor, /*@out@*/ unsigned int * countp,
464 /*@modifies *dbcursor, fileSystem @*/;
467 * Verify (and close) index database.
468 * @param dbi index database handle
469 * @param flags (unused)
470 * @return 0 on success
472 int dbiVerify(/*@only@*/ dbiIndex dbi, unsigned int flags)
473 /*@modifies dbi, fileSystem @*/;
476 * Close index database.
477 * @param dbi index database handle
478 * @param flags (unused)
479 * @return 0 on success
481 int dbiClose(/*@only@*/ dbiIndex dbi, unsigned int flags)
482 /*@modifies dbi, fileSystem @*/;
485 * Flush pending operations to disk.
486 * @param dbi index database handle
487 * @param flags (unused)
488 * @return 0 on success
490 int dbiSync (dbiIndex dbi, unsigned int flags)
491 /*@modifies fileSystem @*/;
494 * Is database byte swapped?
495 * @param dbi index database handle
498 int dbiByteSwapped(dbiIndex dbi)
502 * Return base file name for db1 database (legacy).
503 * @param rpmtag rpm tag
504 * @return base file name of db1 database
506 char * db1basename(int rpmtag)
513 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi)
517 * @param db rpm database
519 int rpmdbFindFpList(/*@null@*/ rpmdb db, fingerPrint * fpList,
520 /*@out@*/dbiIndexSet * matchList, int numItems)
521 /*@modifies db, *matchList @*/;
524 * Destroy set of index database items.
525 * @param set set of index database items
527 void dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set)
531 * Count items in index database set.
532 * @param set set of index database items
533 * @return number of items
535 unsigned int dbiIndexSetCount(dbiIndexSet set)
539 * Return record offset of header from element in index database set.
540 * @param set set of index database items
541 * @param recno index of item in set
542 * @return record offset of header
544 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno)
548 * Return file index from element in index database set.
549 * @param set set of index database items
550 * @param recno index of item in set
553 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno)