5 * Access RPM indices using Berkeley db[123] interface.
12 typedef /*@abstract@*/ struct _dbiIndexItem * dbiIndexItem;
13 typedef /*@abstract@*/ struct _dbiIndex * dbiIndex;
15 /* this will break if sizeof(int) != 4 */
17 * A single item from an index database (i.e. the "data returned").
18 * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
19 * and was identical to the "data saved" structure below.
21 struct _dbiIndexItem {
22 unsigned int hdrNum; /*!< header instance in db */
23 unsigned int tagNum; /*!< tag index in header */
24 unsigned int fpNum; /*!< finger print index */
25 unsigned int dbNum; /*!< database index */
29 * A single item in an index database (i.e. the "data saved").
32 unsigned int recOffset; /*!< byte offset of header in db */
33 unsigned int fileNumber; /*!< file array index */
35 typedef struct _dbiIR * DBIR_t;
38 * Items retrieved from the index database.
41 /*@owned@*/ struct _dbiIndexItem * recs; /*!< array of records */
42 int count; /*!< number of records */
45 /* XXX hack to get prototypes correct */
46 #if !defined(DB_VERSION_MAJOR)
54 * Private methods for accessing an index database.
57 int dbv_major; /*!< Berkeley db version major */
58 int dbv_minor; /*!< Berkeley db version minor */
59 int dbv_patch; /*!< Berkeley db version patch */
62 * Return handle for an index database.
63 * @param rpmdb rpm database
64 * @param rpmtag rpm tag
65 * @return 0 on success
67 int (*open) (rpmdb rpmdb, int rpmtag, /*@out@*/ dbiIndex * dbip);
70 * Close index database.
71 * @param dbi index database handle
72 * @param flags (unused)
73 * @return 0 on success
75 int (*close) (/*@only@*/ dbiIndex dbi, unsigned int flags);
78 * Flush pending operations to disk.
79 * @param dbi index database handle
80 * @param flags (unused)
81 * @return 0 on success
83 int (*sync) (dbiIndex dbi, unsigned int flags);
86 * Open database cursor.
87 * @param dbi index database handle
88 * @param dbcp address of database cursor
89 * @param flags (unused)
91 int (*copen) (dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int flags);
94 * Close database cursor.
95 * @param dbi index database handle
96 * @param dbcursor database cursor
97 * @param flags (unused)
99 int (*cclose) (dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags);
102 * Delete (key,data) pair(s) using db->del or dbcursor->c_del.
103 * @param dbi index database handle
104 * @param dbcursor database cursor
105 * @param keyp key data
106 * @param keylen key data length
107 * @param flags (unused)
108 * @return 0 on success
110 int (*cdel) (dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen, unsigned int flags);
113 * Retrieve (key,data) pair using db->get or dbcursor->c_get.
114 * @param dbi index database handle
115 * @param dbcursor database cursor
116 * @param keypp address of key data
117 * @param keylenp address of key data length
118 * @param datapp address of data pointer
119 * @param datalenp address of data length
120 * @param flags (unused)
121 * @return 0 on success
123 int (*cget) (dbiIndex dbi, DBC * dbcursor,
124 /*@out@*/ void ** keypp, /*@out@*/ size_t * keylenp,
125 /*@out@*/ void ** datapp, /*@out@*/ size_t * datalenp,
129 * Store (key,data) pair using db->put or dbcursor->c_put.
130 * @param dbi index database handle
131 * @param dbcursor database cursor
132 * @param keyp key data
133 * @param keylen key data length
134 * @param datap data pointer
135 * @param datalen data length
136 * @param flags (unused)
137 * @return 0 on success
139 int (*cput) (dbiIndex dbi, DBC * dbcursor,
140 const void * keyp, size_t keylen,
141 const void * datap, size_t datalen,
145 * Is database byte swapped?
146 * @param dbi index database handle
149 int (*byteswapped) (dbiIndex dbi);
154 * Describes an index database (implemented on Berkeley db[123] API).
157 const char * dbi_root;
158 const char * dbi_home;
159 const char * dbi_file;
160 const char * dbi_subfile;
162 int dbi_cflags; /*!< db_create/db_env_create flags */
163 int dbi_oeflags; /*!< common (db,dbenv}->open flags */
164 int dbi_eflags; /*!< dbenv->open flags */
165 int dbi_oflags; /*!< db->open flags */
166 int dbi_tflags; /*!< dbenv->txn_begin flags */
168 int dbi_type; /*!< db index type */
169 int dbi_mode; /*!< mode to use on open */
170 int dbi_perms; /*!< file permission to use on open */
171 int dbi_api; /*!< Berkeley API type */
176 int dbi_get_rmw_cursor;
177 int dbi_no_fsync; /*!< no-op fsync for db */
178 int dbi_no_dbsync; /*!< don't call dbiSync */
179 int dbi_lockdbfd; /*!< do fcntl lock on db fd */
180 int dbi_temporary; /*!< non-persistent */
183 /* dbenv parameters */
185 void (*db_errcall) (const char *db_errpfx, char *buffer);
187 const char * dbi_errpfx;
191 /* mpool sub-system parameters */
192 int dbi_mp_mmapsize; /*!< (10Mb) */
193 int dbi_mp_size; /*!< (128Kb) */
194 /* lock sub-system parameters */
195 unsigned int dbi_lk_max;
196 unsigned int dbi_lk_detect;
198 unsigned char *dbi_lk_conflicts;
199 /* log sub-system parameters */
200 unsigned int dbi_lg_max;
201 unsigned int dbi_lg_bsize;
202 /* transaction sub-system parameters */
203 unsigned int dbi_tx_max;
205 int (*dbi_tx_recover) (DB_ENV *dbenv, DBT *log_rec, DB_LSN *lsnp, int redo, void *info);
207 /* dbinfo parameters */
208 int dbi_cachesize; /*!< */
209 int dbi_pagesize; /*!< (fs blksize) */
210 void * (*dbi_malloc) (size_t nbytes);
211 /* hash access parameters */
212 unsigned int dbi_h_ffactor; /*!< */
213 unsigned int (*dbi_h_hash_fcn) (const void *bytes, unsigned int length);
214 unsigned int dbi_h_nelem; /*!< */
215 unsigned int dbi_h_flags; /*!< DB_DUP, DB_DUPSORT */
216 int (*dbi_h_dup_compare_fcn) (const DBT *, const DBT *);
217 /* btree access parameters */
220 int (*dbi_bt_compare_fcn)(const DBT *, const DBT *);
221 int (*dbi_bt_dup_compare_fcn) (const DBT *, const DBT *);
222 size_t (*dbi_bt_prefix_fcn) (const DBT *, const DBT *);
223 /* recno access parameters */
226 unsigned int dbi_re_len;
228 const char * dbi_re_source;
231 int dbi_rpmtag; /*!< rpm tag used for index */
232 int dbi_jlen; /*!< size of join key */
234 unsigned int dbi_lastoffset; /*!< db1 with falloc.c needs this */
236 void * dbi_db; /*!< dbi handle */
239 void * dbi_rmw; /*!< db cursor (with DB_WRITECURSOR) */
241 /*@observer@*/ const struct _dbiVec * dbi_vec; /*!< private methods */
246 * Describes the collection of index databases used by rpm.
249 const char * db_root; /*!< path prefix */
250 const char * db_home; /*!< directory path */
253 int db_mode; /*!< open mode */
254 int db_perms; /*!< open permissions */
256 int db_api; /*!< Berkeley API type */
261 const char * db_errpfx;
263 void (*db_errcall) (const char *db_errpfx, char *buffer);
265 void * (*db_malloc) (size_t nbytes);
271 /* for RPM's internal use only */
273 #define RPMDB_FLAG_JUSTCHECK (1 << 0)
274 #define RPMDB_FLAG_MINIMAL (1 << 1)
275 #define RPMDB_FLAG_CHROOT (1 << 2)
282 * Return new configured index database handle instance.
283 * @param rpmdb rpm database
285 /*@only@*/ /*@null@*/ dbiIndex db3New(/*@keep@*/ rpmdb rpmdb, int rpmtag);
288 * Destroy index database handle instance.
289 * @param dbi index database handle
291 void db3Free( /*@only@*/ /*@null@*/ dbiIndex dbi);
294 * Return handle for an index database.
295 * @param rpmdb rpm database
296 * @param rpmtag rpm tag
297 * @param flags (unused)
298 * @return index database handle
300 /*@only@*/ /*@null@*/ dbiIndex dbiOpen(rpmdb rpmdb, int rpmtag,
304 * @param dbi index database handle
305 * @param flags (unused)
307 int dbiCopen(dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int flags);
308 int XdbiCopen(dbiIndex dbi, /*@out@*/ DBC ** dbcp, unsigned int flags, const char *f, unsigned int l);
309 #define dbiCopen(_a,_b,_c) \
310 XdbiCopen(_a, _b, _c, __FILE__, __LINE__)
313 * @param dbi index database handle
314 * @param flags (unused)
316 int dbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags);
317 int XdbiCclose(dbiIndex dbi, /*@only@*/ DBC * dbcursor, unsigned int flags, const char *f, unsigned int l);
318 #define dbiCclose(_a,_b,_c) \
319 XdbiCclose(_a, _b, _c, __FILE__, __LINE__)
322 * Delete (key,data) pair(s) from index database.
323 * @param dbi index database handle
324 * @param keyp key data
325 * @param keylen key data length
326 * @param flags (unused)
327 * @return 0 on success
329 int dbiDel(dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
333 * Retrieve (key,data) pair from index database.
334 * @param dbi index database handle
335 * @param keypp address of key data
336 * @param keylenp address of key data length
337 * @param datapp address of data pointer
338 * @param datalenp address of data length
339 * @param flags (unused)
340 * @return 0 on success
342 int dbiGet(dbiIndex dbi, DBC * dbcursor, void ** keypp, size_t * keylenp,
343 void ** datapp, size_t * datalenp, unsigned int flags);
346 * Store (key,data) pair in index database.
347 * @param dbi index database handle
348 * @param keyp key data
349 * @param keylen key data length
350 * @param datap data pointer
351 * @param datalen data length
352 * @param flags (unused)
353 * @return 0 on success
355 int dbiPut(dbiIndex dbi, DBC * dbcursor, const void * keyp, size_t keylen,
356 const void * datap, size_t datalen, unsigned int flags);
359 * Close index database.
360 * @param dbi index database handle
361 * @param flags (unused)
362 * @return 0 on success
364 int dbiClose(/*@only@*/ dbiIndex dbi, unsigned int flags);
367 * Flush pending operations to disk.
368 * @param dbi index database handle
369 * @param flags (unused)
370 * @return 0 on success
372 int dbiSync (dbiIndex dbi, unsigned int flags);
375 * Is database byte swapped?
376 * @param dbi index database handle
379 int dbiByteSwapped(dbiIndex dbi);
382 * Return base file name for index database (legacy).
383 * @param rpmtag rpm tag
384 * @return base file name
386 char * db1basename(int rpmtag);
390 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi);
393 * @param rpmdb rpm database
395 int rpmdbFindFpList(rpmdb rpmdb, fingerPrint * fpList, /*@out@*/dbiIndexSet * matchList,
399 * Destroy set of index database items.
400 * @param set set of index database items
402 void dbiFreeIndexSet(/*@only@*/ /*@null@*/ dbiIndexSet set);
405 * Count items in index database set.
406 * @param set set of index database items
407 * @return number of items
409 unsigned int dbiIndexSetCount(dbiIndexSet set);
412 * Return record offset of header from element in index database set.
413 * @param set set of index database items
414 * @param recno index of item in set
415 * @return record offset of header
417 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno);
420 * Return file index from element in index database set.
421 * @param set set of index database items
422 * @param recno index of item in set
425 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno);