Lose shmkey + shared BDB config options
[platform/upstream/rpm.git] / lib / rpmdb_internal.h
1 #ifndef H_RPMDB_INTERNAL
2 #define H_RPMDB_INTERNAL
3
4 #include <assert.h>
5 #include <db.h>
6
7 #include <rpm/rpmsw.h>
8 #include <rpm/rpmtypes.h>
9 #include <rpm/rpmutil.h>
10
11 /**
12  */
13 typedef struct _dbiIndexItem * dbiIndexItem;
14
15 /** \ingroup rpmdb
16  * A single element (i.e. inverted list from tag values) of a database.
17  */
18 typedef struct _dbiIndexSet * dbiIndexSet;
19
20 /**
21  */
22 typedef struct _dbiIndex * dbiIndex;
23
24 /* this will break if sizeof(int) != 4 */
25 /** \ingroup dbi
26  * A single item from an index database (i.e. the "data returned").
27  * Note: In rpm-3.0.4 and earlier, this structure was passed by value,
28  * and was identical to the "data saved" structure below.
29  */
30 struct _dbiIndexItem {
31     unsigned int hdrNum;                /*!< header instance in db */
32     unsigned int tagNum;                /*!< tag index in header */
33 };
34
35 /** \ingroup dbi
36  * Items retrieved from the index database.
37  */
38 struct _dbiIndexSet {
39     struct _dbiIndexItem * recs;        /*!< array of records */
40     unsigned int count;                 /*!< number of records */
41     size_t alloced;                     /*!< alloced size */
42 };
43
44 /** \ingroup dbi
45  * Describes an index database (implemented on Berkeley db functionality).
46  */
47 struct _dbiIndex {
48     char * dbi_file;            /*!< file component of path */
49
50     int dbi_ecflags;            /*!< db_env_create flags */
51     int dbi_cflags;             /*!< db_create flags */
52     int dbi_oeflags;            /*!< common (db,dbenv}->open flags */
53     int dbi_eflags;             /*!< dbenv->open flags */
54     int dbi_oflags;             /*!< db->open flags */
55     int dbi_tflags;             /*!< dbenv->txn_begin flags */
56
57     int dbi_type;               /*!< db index type */
58     unsigned dbi_mode;          /*!< mode to use on open */
59     int dbi_perms;              /*!< file permission to use on open */
60
61     int dbi_verify_on_close;
62     int dbi_use_dbenv;          /*!< use db environment? */
63     int dbi_permit_dups;        /*!< permit duplicate entries? */
64     int dbi_no_fsync;           /*!< no-op fsync for db */
65     int dbi_no_dbsync;          /*!< don't call dbiSync */
66     int dbi_lockdbfd;           /*!< do fcntl lock on db fd */
67     int dbi_byteswapped;
68
69         /* dbenv parameters */
70     int dbi_lorder;
71     /* XXX db-4.3.14 adds dbenv as 1st arg. */
72     int dbi_verbose;
73         /* mpool sub-system parameters */
74     int dbi_mmapsize;   /*!< (10Mb) */
75     int dbi_cachesize;  /*!< (128Kb) */
76         /* dbinfo parameters */
77     int dbi_pagesize;           /*!< (fs blksize) */
78         /* hash access parameters */
79     unsigned int dbi_h_ffactor; /*!< */
80     unsigned int (*dbi_h_hash_fcn) (DB *, const void *bytes,
81                                 unsigned int length);
82     unsigned int dbi_h_nelem;   /*!< */
83     unsigned int dbi_h_flags;   /*!< DB_DUP, DB_DUPSORT */
84     int (*dbi_h_dup_compare_fcn) (DB *, const DBT *, const DBT *);
85         /* btree access parameters */
86     int dbi_bt_flags;
87     int dbi_bt_minkey;
88     int (*dbi_bt_compare_fcn) (DB *, const DBT *, const DBT *);
89     int (*dbi_bt_dup_compare_fcn) (DB *, const DBT *, const DBT *);
90     size_t (*dbi_bt_prefix_fcn) (DB *, const DBT *, const DBT *);
91         /* recno access parameters */
92     int dbi_re_flags;
93     int dbi_re_delim;
94     unsigned int dbi_re_len;
95     int dbi_re_pad;
96     char * dbi_re_source;
97         /* queue access parameters */
98     unsigned int dbi_q_extentsize;
99
100     rpmdb dbi_rpmdb;            /*!< the parent rpm database */
101     rpmTag dbi_rpmtag;  /*!< rpm tag used for index */
102     int dbi_jlen;               /*!< size of join key */
103
104     DB * dbi_db;                /*!< Berkeley DB * handle */
105     DB_TXN * dbi_txnid;         /*!< Bekerley DB_TXN * transaction id */
106     void * dbi_stats;           /*!< Berkeley db statistics */
107 };
108
109 /** \ingroup rpmdb
110  * Describes the collection of index databases used by rpm.
111  */
112 struct rpmdb_s {
113     char        * db_root;/*!< path prefix */
114     char        * db_home;/*!< directory path */
115     char        * db_fullpath;  /*!< full db path including prefix */
116     int         db_flags;
117     int         db_mode;        /*!< open mode */
118     int         db_perms;       /*!< open permissions */
119     int         db_api;         /*!< Berkeley API type */
120     char        * db_errpfx;
121     int         db_remove_env;
122     int         db_chrootDone;  /*!< If chroot(2) done, ignore db_root. */
123     int         db_mkdirDone;   /*!< Has db_home been created? */
124     unsigned char * db_bits;    /*!< package instance bit mask. */
125     int         db_nbits;       /*!< no. of bits in mask. */
126     rpmdb       db_next;
127     int         db_opens;
128     void *      db_dbenv;       /*!< Berkeley DB_ENV handle. */
129     int         db_ndbi;        /*!< No. of tag indices. */
130     dbiIndex * _dbi;            /*!< Tag indices. */
131
132     struct rpmop_s db_getops;
133     struct rpmop_s db_putops;
134     struct rpmop_s db_delops;
135
136     int nrefs;                  /*!< Reference count. */
137 };
138
139 /* for RPM's internal use only */
140
141 /** \ingroup rpmdb
142  */
143 enum rpmdbFlags {
144         RPMDB_FLAG_JUSTCHECK    = (1 << 0),
145         RPMDB_FLAG_MINIMAL      = (1 << 1),
146         RPMDB_FLAG_CHROOT       = (1 << 2)
147 };
148
149 #ifdef __cplusplus
150 extern "C" {
151 #endif
152
153 /** \ingroup dbi
154  * Return new configured index database handle instance.
155  * @param rpmdb         rpm database
156  * @param rpmtag        rpm tag
157  * @return              index database handle
158  */
159 RPM_GNUC_INTERNAL
160 dbiIndex dbiNew(rpmdb rpmdb, rpmTag rpmtag);
161
162 /** \ingroup dbi
163  * Destroy index database handle instance.
164  * @param dbi           index database handle
165  * @return              NULL always
166  */
167 RPM_GNUC_INTERNAL
168 dbiIndex dbiFree( dbiIndex dbi);
169
170 /** \ingroup dbi
171  * Format dbi open flags for debugging print.
172  * @param dbflags               db open flags
173  * @param print_dbenv_flags     format db env flags instead?
174  * @return                      formatted flags (malloced)
175  */
176 RPM_GNUC_INTERNAL
177 char * prDbiOpenFlags(int dbflags, int print_dbenv_flags);
178
179 /** \ingroup dbi
180  * Return handle for an index database.
181  * @param db            rpm database
182  * @param rpmtag        rpm tag
183  * @param flags         (unused)
184  * @return              index database handle
185  */
186 RPM_GNUC_INTERNAL
187 dbiIndex dbiOpen(rpmdb db, rpmTag rpmtag,
188                 unsigned int flags);
189
190
191 /** \ingroup dbi
192  * Actually open the database of the index.
193  * @param db            rpm database
194  * @param rpmtag        rpm tag
195  * @param dbiIndex      address of index database handle
196  * @return              0 on success
197  */
198 RPM_GNUC_INTERNAL
199 int dbiOpenDB(rpmdb rpmdb, rpmTag rpmtag, dbiIndex * dbip);
200
201
202 /* FIX: vector annotations */
203 /** \ingroup dbi
204  * Open a database cursor.
205  * @param dbi           index database handle
206  * @param txnid         database transaction handle
207  * @retval dbcp         returned database cursor
208  * @param flags         DB_WRITECURSOR if writing, or 0
209  * @return              0 on success
210  */
211 RPM_GNUC_INTERNAL
212 int dbiCopen(dbiIndex dbi, DB_TXN * txnid,
213              DBC ** dbcp, unsigned int flags);
214
215 /** \ingroup dbi
216  * Close a database cursor.
217  * @param dbi           index database handle
218  * @param dbcursor      database cursor
219  * @param flags         (unused)
220  * @return              0 on success
221  */
222 RPM_GNUC_INTERNAL
223 int dbiCclose(dbiIndex dbi, DBC * dbcursor, unsigned int flags);
224
225 /** \ingroup dbi
226  * Delete (key,data) pair(s) from index database.
227  * @param dbi           index database handle
228  * @param dbcursor      database cursor (NULL will use db->del)
229  * @param key           delete key value/length/flags
230  * @param data          delete data value/length/flags
231  * @param flags         (unused)
232  * @return              0 on success
233  */
234 RPM_GNUC_INTERNAL
235 int dbiDel(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
236            unsigned int flags);
237
238 /** \ingroup dbi
239  * Retrieve (key,data) pair from index database.
240  * @param dbi           index database handle
241  * @param dbcursor      database cursor (NULL will use db->get)
242  * @param key           retrieve key value/length/flags
243  * @param data          retrieve data value/length/flags
244  * @param flags         (unused)
245  * @return              0 on success
246  */
247 RPM_GNUC_INTERNAL
248 int dbiGet(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
249            unsigned int flags);
250
251 /** \ingroup dbi
252  * Store (key,data) pair in index database.
253  * @param dbi           index database handle
254  * @param dbcursor      database cursor (NULL will use db->put)
255  * @param key           store key value/length/flags
256  * @param data          store data value/length/flags
257  * @param flags         (unused)
258  * @return              0 on success
259  */
260 RPM_GNUC_INTERNAL
261 int dbiPut(dbiIndex dbi, DBC * dbcursor, DBT * key, DBT * data,
262            unsigned int flags);
263
264 /** \ingroup dbi
265  * Retrieve count of (possible) duplicate items.
266  * @param dbi           index database handle
267  * @param dbcursor      database cursor
268  * @param countp        address of count
269  * @param flags         (unused)
270  * @return              0 on success
271  */
272 int dbiCount(dbiIndex dbi, DBC * dbcursor, unsigned int * countp,
273              unsigned int flags);
274
275 /** \ingroup dbi
276  * Close index database.
277  * @param dbi           index database handle
278  * @param flags         (unused)
279  * @return              0 on success
280  */
281 int dbiClose(dbiIndex dbi, unsigned int flags);
282
283 /** \ingroup dbi
284  * Flush pending operations to disk.
285  * @param dbi           index database handle
286  * @param flags         (unused)
287  * @return              0 on success
288  */
289 int dbiSync (dbiIndex dbi, unsigned int flags);
290
291 /** \ingroup dbi
292  * Verify (and close) index database.
293  * @param dbi           index database handle
294  * @param flags         (unused)
295  * @return              0 on success
296  */
297 static inline
298 int dbiVerify(dbiIndex dbi, unsigned int flags)
299 {
300     dbi->dbi_verify_on_close = 1;
301     return dbiClose(dbi, flags);
302 }
303
304
305 /** \ingroup dbi
306  * Is database byte swapped?
307  * @param dbi           index database handle
308  * @return              0 same order, 1 swapped order
309  */
310 int dbiByteSwapped(dbiIndex dbi);
311
312 /** \ingroup dbi
313  * Is database byte swapped?
314  * @param dbi           index database handle
315  * @param flags         DB_FAST_STAT or 0
316  * @return              0 on success
317  */
318 int dbiStat(dbiIndex dbi, unsigned int flags);
319
320 /** \ingroup dbi
321  * Destroy set of index database items.
322  * @param set   set of index database items
323  * @return      NULL always
324  */
325 RPM_GNUC_INTERNAL
326 dbiIndexSet dbiFreeIndexSet(dbiIndexSet set);
327
328 /** \ingroup dbi
329  * Count items in index database set.
330  * @param set   set of index database items
331  * @return      number of items
332  */
333 RPM_GNUC_INTERNAL
334 unsigned int dbiIndexSetCount(dbiIndexSet set);
335
336 /** \ingroup dbi
337  * Return record offset of header from element in index database set.
338  * @param set   set of index database items
339  * @param recno index of item in set
340  * @return      record offset of header
341  */
342 RPM_GNUC_INTERNAL
343 unsigned int dbiIndexRecordOffset(dbiIndexSet set, int recno);
344
345 /** \ingroup dbi
346  * Return file index from element in index database set.
347  * @param set   set of index database items
348  * @param recno index of item in set
349  * @return      file index
350  */
351 RPM_GNUC_INTERNAL
352 unsigned int dbiIndexRecordFileNumber(dbiIndexSet set, int recno);
353
354 /** \ingroup rpmdb
355  * Return rpmdb home directory (depending on chroot state)
356  * param db             rpmdb handle
357  * return               db home directory (or NULL on error)
358  */
359 RPM_GNUC_INTERNAL
360 const char *rpmdbHome(rpmdb db);
361
362 /** \ingroup rpmdb
363  * Return database iterator.
364  * @param mi            rpm database iterator
365  * @param keyp          key data (NULL for sequential access)
366  * @param keylen        key data length (0 will use strlen(keyp))
367  * @return              0 on success
368  */
369 int rpmdbExtendIterator(rpmdbMatchIterator mi,
370                         const void * keyp, size_t keylen);
371
372 /** \ingroup rpmdb
373  * sort the iterator by (recnum, filenum)
374  * Return database iterator.
375  * @param mi            rpm database iterator
376  */
377 void rpmdbSortIterator(rpmdbMatchIterator mi);
378
379 #ifndef __APPLE__
380 /**
381  *  * Mergesort, same arguments as qsort(2).
382  *   */
383 RPM_GNUC_INTERNAL
384 int mergesort(void *base, size_t nmemb, size_t size,
385                 int (*cmp) (const void *, const void *));
386 #else
387 /* mergesort is defined in stdlib.h on Mac OS X */
388 #endif /* __APPLE__ */
389
390 #endif