Sanitize python object -> tag number exception handling
[platform/upstream/rpm.git] / lib / rpmdb.h
1 #ifndef H_RPMDB
2 #define H_RPMDB
3
4 /** \ingroup rpmdb dbi db1 db3
5  * \file lib/rpmdb.h
6  * Access RPM indices using Berkeley DB interface(s).
7  */
8
9 #include <rpm/rpmtypes.h>
10 #include <rpm/rpmsw.h>
11
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15
16 extern int _rpmdb_debug;
17
18 /**
19  * Tag value pattern match mode.
20  */
21 typedef enum rpmMireMode_e {
22     RPMMIRE_DEFAULT     = 0,    /*!< regex with \., .* and ^...$ added */
23     RPMMIRE_STRCMP      = 1,    /*!< strings  using strcmp(3) */
24     RPMMIRE_REGEX       = 2,    /*!< regex(7) patterns through regcomp(3) */
25     RPMMIRE_GLOB        = 3     /*!< glob(7) patterns through fnmatch(3) */
26 } rpmMireMode;
27
28 typedef enum rpmdbOpX_e {
29     RPMDB_OP_DBGET              = 1,
30     RPMDB_OP_DBPUT              = 2,
31     RPMDB_OP_DBDEL              = 3,
32     RPMDB_OP_MAX                = 4
33 } rpmdbOpX;
34
35 /** \ingroup rpmdb
36  * Retrieve operation timestamp from rpm database.
37  * @param db            rpm database
38  * @param opx           operation timestamp index
39  * @return              pointer to operation timestamp.
40  */
41 rpmop rpmdbOp(rpmdb db, rpmdbOpX opx);
42
43 /** \ingroup rpmdb
44  * Set chrootDone flag, i.e. has chroot(2) been performed?
45  * @param db            rpm database
46  * @param chrootDone    new chrootDone flag
47  * @return              previous chrootDone flag
48  */
49 int rpmdbSetChrootDone(rpmdb db, int chrootDone);
50
51 /** \ingroup rpmdb
52  * Unreference a database instance.
53  * @param db            rpm database
54  * @param msg
55  * @return              NULL always
56  */
57 rpmdb rpmdbUnlink (rpmdb db, const char * msg);
58
59 /** \ingroup rpmdb
60  * Reference a database instance.
61  * @param db            rpm database
62  * @param msg
63  * @return              new rpm database reference
64  */
65 rpmdb rpmdbLink (rpmdb db, const char * msg);
66
67 /** \ingroup rpmdb
68  * Open rpm database.
69  * @param prefix        path to top of install tree
70  * @retval dbp          address of rpm database
71  * @param mode          open(2) flags:  O_RDWR or O_RDONLY (O_CREAT also)
72  * @param perms         database permissions
73  * @return              0 on success
74  */
75 int rpmdbOpen (const char * prefix, rpmdb * dbp,
76                 int mode, int perms);
77
78 /** \ingroup rpmdb
79  * Initialize database.
80  * @param prefix        path to top of install tree
81  * @param perms         database permissions
82  * @return              0 on success
83  */
84 int rpmdbInit(const char * prefix, int perms);
85
86 /** \ingroup rpmdb
87  * Verify database components.
88  * @param prefix        path to top of install tree
89  * @return              0 on success
90  */
91 int rpmdbVerify(const char * prefix);
92
93 /**
94  * Close a single database index.
95  * @param db            rpm database
96  * @param rpmtag        rpm tag
97  * @return              0 on success
98  */
99 int rpmdbCloseDBI(rpmdb db, rpmTag rpmtag);
100
101 /** \ingroup rpmdb
102  * Close all database indices and free rpmdb.
103  * @param db            rpm database
104  * @return              0 on success
105  */
106 int rpmdbClose (rpmdb db);
107
108 /** \ingroup rpmdb
109  * Sync all database indices.
110  * @param db            rpm database
111  * @return              0 on success
112  */
113 int rpmdbSync (rpmdb db);
114
115 /** \ingroup rpmdb
116  * Open all database indices.
117  * @param db            rpm database
118  * @return              0 on success
119  */
120 int rpmdbOpenAll (rpmdb db);
121
122 /** \ingroup rpmdb
123  * Return number of instances of package in rpm database.
124  * @param db            rpm database
125  * @param name          rpm package name
126  * @return              number of instances
127  */
128 int rpmdbCountPackages(rpmdb db, const char * name);
129
130 /** \ingroup rpmdb
131  * Return header join key for current position of rpm database iterator.
132  * @param mi            rpm database iterator
133  * @return              current header join key
134  */
135 unsigned int rpmdbGetIteratorOffset(rpmdbMatchIterator mi);
136
137 /** \ingroup rpmdb
138  * Return number of elements in rpm database iterator.
139  * @param mi            rpm database iterator
140  * @return              number of elements
141  */
142 int rpmdbGetIteratorCount(rpmdbMatchIterator mi);
143
144 /** \ingroup rpmdb
145  */
146 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi);
147
148 /** \ingroup rpmdb
149  * Append items to set of package instances to iterate.
150  * @param mi            rpm database iterator
151  * @param hdrNums       array of package instances
152  * @param nHdrNums      number of elements in array
153  * @return              0 on success, 1 on failure (bad args)
154  */
155 int rpmdbAppendIterator(rpmdbMatchIterator mi,
156                 const int * hdrNums, int nHdrNums);
157
158 /** \ingroup rpmdb
159  * Remove items from set of package instances to iterate.
160  * @note Sorted hdrNums are always passed in rpmlib.
161  * @param mi            rpm database iterator
162  * @param hdrNums       array of package instances
163  * @param nHdrNums      number of elements in array
164  * @param sorted        is the array sorted? (array will be sorted on return)
165  * @return              0 on success, 1 on failure (bad args)
166  */
167 int rpmdbPruneIterator(rpmdbMatchIterator mi,
168                 int * hdrNums, int nHdrNums, int sorted);
169
170 /** \ingroup rpmdb
171  * Add pattern to iterator selector.
172  * @param mi            rpm database iterator
173  * @param tag           rpm tag
174  * @param mode          type of pattern match
175  * @param pattern       pattern to match
176  * @return              0 on success
177  */
178 int rpmdbSetIteratorRE(rpmdbMatchIterator mi, rpmTag tag,
179                 rpmMireMode mode, const char * pattern);
180
181 /** \ingroup rpmdb
182  * Prepare iterator for lazy writes.
183  * @note Must be called before rpmdbNextIterator() with CDB model database.
184  * @param mi            rpm database iterator
185  * @param rewrite       new value of rewrite
186  * @return              previous value
187  */
188 int rpmdbSetIteratorRewrite(rpmdbMatchIterator mi, int rewrite);
189
190 /** \ingroup rpmdb
191  * Modify iterator to mark header for lazy write on release.
192  * @param mi            rpm database iterator
193  * @param modified      new value of modified
194  * @return              previous value
195  */
196 int rpmdbSetIteratorModified(rpmdbMatchIterator mi, int modified);
197
198 /** \ingroup rpmdb
199  * Modify iterator to verify retrieved header blobs.
200  * @param mi            rpm database iterator
201  * @param ts            transaction set
202  * @param (*hdrchk)     headerCheck() vector
203  * @return              0 always
204  */
205 int rpmdbSetHdrChk(rpmdbMatchIterator mi, rpmts ts,
206         rpmRC (*hdrchk) (rpmts ts, const void * uh, size_t uc, char ** msg));
207
208 /** \ingroup rpmdb
209  * Return database iterator.
210  * @param db            rpm database
211  * @param rpmtag        rpm tag
212  * @param keyp          key data (NULL for sequential access)
213  * @param keylen        key data length (0 will use strlen(keyp))
214  * @return              NULL on failure
215  */
216 rpmdbMatchIterator rpmdbInitIterator(rpmdb db, rpmTag rpmtag,
217                         const void * keyp, size_t keylen);
218
219 /** \ingroup rpmdb
220  * Return next package header from iteration.
221  * @param mi            rpm database iterator
222  * @return              NULL on end of iteration.
223  */
224 Header rpmdbNextIterator(rpmdbMatchIterator mi);
225
226 /** \ingroup rpmdb
227  * Check for and exit on termination signals.
228  */
229 int rpmdbCheckSignals(void);
230
231 /** \ingroup rpmdb
232  * Check rpmdb signal handler for trapped signal and/or requested exit,
233  * clean up any open iterators and databases on termination condition.
234  * On non-zero exit any open references to rpmdb are invalid and cannot
235  * be accessed anymore, calling process should terminate immediately.
236  * @param terminate     0 to only check for signals, 1 to terminate anyway
237  * @return              0 to continue, 1 if termination cleanup was done.
238  */
239 int rpmdbCheckTerminate(int terminate);
240
241 /** \ingroup rpmdb
242  * Destroy rpm database iterator.
243  * @param mi            rpm database iterator
244  * @return              NULL always
245  */
246 rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi);
247
248 /** \ingroup rpmdb
249  * Add package header to rpm database and indices.
250  * @param db            rpm database
251  * @param iid           install transaction id (iid = 0 or -1 to skip)
252  * @param h             header
253  * @param ts            (unused) transaction set (or NULL)
254  * @param (*hdrchk)     (unused) headerCheck() vector (or NULL)
255  * @return              0 on success
256  */
257 int rpmdbAdd(rpmdb db, int iid, Header h, rpmts ts,
258              rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg));
259
260 /** \ingroup rpmdb
261  * Remove package header from rpm database and indices.
262  * @param db            rpm database
263  * @param rid           (unused) remove transaction id (rid = 0 or -1 to skip)
264  * @param hdrNum        package instance number in database
265  * @param ts            (unused) transaction set (or NULL)
266  * @param (*hdrchk)     (unused) headerCheck() vector (or NULL)
267  * @return              0 on success
268  */
269 int rpmdbRemove(rpmdb db, int rid, unsigned int hdrNum,
270                 rpmts ts,
271                 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg));
272
273 /** \ingroup rpmdb
274  * Rebuild database indices from package headers.
275  * @param prefix        path to top of install tree
276  * @param ts            transaction set (or NULL)
277  * @param (*hdrchk)     headerCheck() vector (or NULL)
278  * @return              0 on success
279  */
280 int rpmdbRebuild(const char * prefix, rpmts ts,
281                 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg));
282
283 #ifdef __cplusplus
284 }
285 #endif
286
287 #endif  /* H_RPMDB */