8a5f13185603fce44d5c1c5a69b41098e6fac107
[platform/upstream/rpm.git] / lib / rpmdb.h
1 #ifndef H_RPMDB
2 #define H_RPMDB
3
4 /** \ingroup rpmdb dbi
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 /**
17  * Tag value pattern match mode.
18  */
19 typedef enum rpmMireMode_e {
20     RPMMIRE_DEFAULT     = 0,    /*!< regex with \., .* and ^...$ added */
21     RPMMIRE_STRCMP      = 1,    /*!< strings  using strcmp(3) */
22     RPMMIRE_REGEX       = 2,    /*!< regex(7) patterns through regcomp(3) */
23     RPMMIRE_GLOB        = 3     /*!< glob(7) patterns through fnmatch(3) */
24 } rpmMireMode;
25
26 typedef enum rpmdbOpX_e {
27     RPMDB_OP_DBGET              = 1,
28     RPMDB_OP_DBPUT              = 2,
29     RPMDB_OP_DBDEL              = 3,
30     RPMDB_OP_MAX                = 4
31 } rpmdbOpX;
32
33 /** \ingroup rpmdb
34  * Retrieve operation timestamp from rpm database.
35  * @param db            rpm database
36  * @param opx           operation timestamp index
37  * @return              pointer to operation timestamp.
38  */
39 rpmop rpmdbOp(rpmdb db, rpmdbOpX opx);
40
41 /** \ingroup rpmdb
42  * Unreference a database instance.
43  * @param db            rpm database
44  * @return              NULL always
45  */
46 rpmdb rpmdbUnlink(rpmdb db);
47
48 /** \ingroup rpmdb
49  * Reference a database instance.
50  * @param db            rpm database
51  * @return              new rpm database reference
52  */
53 rpmdb rpmdbLink(rpmdb db);
54
55 /** \ingroup rpmdb
56  * Open rpm database.
57  * @param prefix        path to top of install tree
58  * @retval dbp          address of rpm database
59  * @param mode          open(2) flags:  O_RDWR or O_RDONLY (O_CREAT also)
60  * @param perms         database permissions
61  * @return              0 on success
62  */
63 int rpmdbOpen (const char * prefix, rpmdb * dbp,
64                 int mode, int perms);
65
66 /** \ingroup rpmdb
67  * Initialize database.
68  * @param prefix        path to top of install tree
69  * @param perms         database permissions
70  * @return              0 on success
71  */
72 int rpmdbInit(const char * prefix, int perms);
73
74 /** \ingroup rpmdb
75  * Verify database components.
76  * @param prefix        path to top of install tree
77  * @return              0 on success
78  */
79 int rpmdbVerify(const char * prefix);
80
81 /** \ingroup rpmdb
82  * Close all database indices and free rpmdb.
83  * @param db            rpm database
84  * @return              0 on success
85  */
86 int rpmdbClose (rpmdb db);
87
88 /** \ingroup rpmdb
89  * Sync all database indices.
90  * @param db            rpm database
91  * @return              0 on success
92  */
93 int rpmdbSync (rpmdb db);
94
95 /** \ingroup rpmdb
96  * Open all database indices.
97  * @param db            rpm database
98  * @return              0 on success
99  */
100 int rpmdbOpenAll (rpmdb db);
101
102 /** \ingroup rpmdb
103  * Return number of instances of package in rpm database.
104  * @param db            rpm database
105  * @param name          rpm package name
106  * @return              number of instances
107  */
108 int rpmdbCountPackages(rpmdb db, const char * name);
109
110 /** \ingroup rpmdb
111  * Return header join key for current position of rpm database iterator.
112  * @param mi            rpm database iterator
113  * @return              current header join key
114  */
115 unsigned int rpmdbGetIteratorOffset(rpmdbMatchIterator mi);
116
117 /** \ingroup rpmdb
118  * Return number of elements in rpm database iterator.
119  * @param mi            rpm database iterator
120  * @return              number of elements
121  */
122 int rpmdbGetIteratorCount(rpmdbMatchIterator mi);
123
124 /** \ingroup rpmdb
125  */
126 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi);
127
128 /** \ingroup rpmdb
129  * Append items to set of package instances to iterate.
130  * @param mi            rpm database iterator
131  * @param hdrNums       array of package instances
132  * @param nHdrNums      number of elements in array
133  * @return              0 on success, 1 on failure (bad args)
134  */
135 int rpmdbAppendIterator(rpmdbMatchIterator mi,
136                 const int * hdrNums, int nHdrNums);
137
138 /** \ingroup rpmdb
139  * Add pattern to iterator selector.
140  * @param mi            rpm database iterator
141  * @param tag           rpm tag
142  * @param mode          type of pattern match
143  * @param pattern       pattern to match
144  * @return              0 on success
145  */
146 int rpmdbSetIteratorRE(rpmdbMatchIterator mi, rpmTag tag,
147                 rpmMireMode mode, const char * pattern);
148
149 /** \ingroup rpmdb
150  * Prepare iterator for lazy writes.
151  * @note Must be called before rpmdbNextIterator() with CDB model database.
152  * @param mi            rpm database iterator
153  * @param rewrite       new value of rewrite
154  * @return              previous value
155  */
156 int rpmdbSetIteratorRewrite(rpmdbMatchIterator mi, int rewrite);
157
158 /** \ingroup rpmdb
159  * Modify iterator to mark header for lazy write on release.
160  * @param mi            rpm database iterator
161  * @param modified      new value of modified
162  * @return              previous value
163  */
164 int rpmdbSetIteratorModified(rpmdbMatchIterator mi, int modified);
165
166 /** \ingroup rpmdb
167  * Modify iterator to verify retrieved header blobs.
168  * @param mi            rpm database iterator
169  * @param ts            transaction set
170  * @param (*hdrchk)     headerCheck() vector
171  * @return              0 always
172  */
173 int rpmdbSetHdrChk(rpmdbMatchIterator mi, rpmts ts,
174         rpmRC (*hdrchk) (rpmts ts, const void * uh, size_t uc, char ** msg));
175
176 /** \ingroup rpmdb
177  * Return database iterator.
178  * @param db            rpm database
179  * @param rpmtag        rpm tag
180  * @param keyp          key data (NULL for sequential access)
181  * @param keylen        key data length (0 will use strlen(keyp))
182  * @return              NULL on failure
183  */
184 rpmdbMatchIterator rpmdbInitIterator(rpmdb db, rpmTag rpmtag,
185                         const void * keyp, size_t keylen);
186
187 /** \ingroup rpmdb
188  * Return next package header from iteration.
189  * @param mi            rpm database iterator
190  * @return              NULL on end of iteration.
191  */
192 Header rpmdbNextIterator(rpmdbMatchIterator mi);
193
194 /** \ingroup rpmdb
195  * Check for and exit on termination signals.
196  */
197 int rpmdbCheckSignals(void);
198
199 /** \ingroup rpmdb
200  * Check rpmdb signal handler for trapped signal and/or requested exit,
201  * clean up any open iterators and databases on termination condition.
202  * On non-zero exit any open references to rpmdb are invalid and cannot
203  * be accessed anymore, calling process should terminate immediately.
204  * @param terminate     0 to only check for signals, 1 to terminate anyway
205  * @return              0 to continue, 1 if termination cleanup was done.
206  */
207 int rpmdbCheckTerminate(int terminate);
208
209 /** \ingroup rpmdb
210  * Destroy rpm database iterator.
211  * @param mi            rpm database iterator
212  * @return              NULL always
213  */
214 rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi);
215
216 /** \ingroup rpmdb
217  * Rebuild database indices from package headers.
218  * @param prefix        path to top of install tree
219  * @param ts            transaction set (or NULL)
220  * @param (*hdrchk)     headerCheck() vector (or NULL)
221  * @return              0 on success
222  */
223 int rpmdbRebuild(const char * prefix, rpmts ts,
224                 rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg));
225
226 #ifdef __cplusplus
227 }
228 #endif
229
230 #endif  /* H_RPMDB */