apply some patch for pythons rpm from opensource
[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  * RPM database API.
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 typedef enum rpmdbCtrlOp_e {
34     RPMDB_CTRL_LOCK_RO         = 1,
35     RPMDB_CTRL_UNLOCK_RO       = 2,
36     RPMDB_CTRL_LOCK_RW         = 3,
37     RPMDB_CTRL_UNLOCK_RW       = 4,
38     RPMDB_CTRL_INDEXSYNC       = 5
39 } rpmdbCtrlOp;
40
41 /** \ingroup rpmdb
42  * Retrieve operation timestamp from rpm database.
43  * @param db            rpm database
44  * @param opx           operation timestamp index
45  * @return              pointer to operation timestamp.
46  */
47 rpmop rpmdbOp(rpmdb db, rpmdbOpX opx);
48
49 /** \ingroup rpmdb
50  * Open all database indices.
51  * @param db            rpm database
52  * @return              0 on success
53  */
54 int rpmdbOpenAll (rpmdb db);
55
56 /** \ingroup rpmdb
57  * Return number of instances of package in rpm database.
58  * @param db            rpm database
59  * @param name          rpm package name
60  * @return              number of instances
61  */
62 int rpmdbCountPackages(rpmdb db, const char * name);
63
64 /** \ingroup rpmdb
65  * Return header join key for current position of rpm database iterator.
66  * @param mi            rpm database iterator
67  * @return              current header join key
68  */
69 unsigned int rpmdbGetIteratorOffset(rpmdbMatchIterator mi);
70
71 /** \ingroup rpmdb
72  * Return number of elements in rpm database iterator.
73  * @param mi            rpm database iterator
74  * @return              number of elements
75  */
76 int rpmdbGetIteratorCount(rpmdbMatchIterator mi);
77
78 /** \ingroup rpmdb
79  */
80 unsigned int rpmdbGetIteratorFileNum(rpmdbMatchIterator mi);
81
82 /** \ingroup rpmdb
83  * Append items to set of package instances to iterate.
84  * @param mi            rpm database iterator
85  * @param hdrNums       array of package instances
86  * @param nHdrNums      number of elements in array
87  * @return              0 on success, 1 on failure (bad args)
88  */
89 int rpmdbAppendIterator(rpmdbMatchIterator mi,
90                         const unsigned int * hdrNums, unsigned int nHdrNums);
91
92 /** \ingroup rpmdb
93  * Add pattern to iterator selector.
94  * @param mi            rpm database iterator
95  * @param tag           rpm tag
96  * @param mode          type of pattern match
97  * @param pattern       pattern to match
98  * @return              0 on success
99  */
100 int rpmdbSetIteratorRE(rpmdbMatchIterator mi, rpmTagVal tag,
101                 rpmMireMode mode, const char * pattern);
102
103 /** \ingroup rpmdb
104  * Prepare iterator for lazy writes.
105  * @note Must be called before rpmdbNextIterator() with CDB model database.
106  * @param mi            rpm database iterator
107  * @param rewrite       new value of rewrite
108  * @return              previous value
109  */
110 int rpmdbSetIteratorRewrite(rpmdbMatchIterator mi, int rewrite);
111
112 /** \ingroup rpmdb
113  * Modify iterator to mark header for lazy write on release.
114  * @param mi            rpm database iterator
115  * @param modified      new value of modified
116  * @return              previous value
117  */
118 int rpmdbSetIteratorModified(rpmdbMatchIterator mi, int modified);
119
120 /** \ingroup rpmdb
121  * Modify iterator to verify retrieved header blobs.
122  * @param mi            rpm database iterator
123  * @param ts            transaction set
124  * @param (*hdrchk)     headerCheck() vector
125  * @return              0 always
126  */
127 int rpmdbSetHdrChk(rpmdbMatchIterator mi, rpmts ts,
128         rpmRC (*hdrchk) (rpmts ts, const void * uh, size_t uc, char ** msg));
129
130 /** \ingroup rpmdb
131  * Return database iterator.
132  * @param db            rpm database
133  * @param rpmtag        database index tag
134  * @param keyp          key data (NULL for sequential access)
135  * @param keylen        key data length (0 will use strlen(keyp))
136  * @return              NULL on failure
137  */
138 rpmdbMatchIterator rpmdbInitIterator(rpmdb db, rpmDbiTagVal rpmtag,
139                         const void * keyp, size_t keylen);
140
141 /** \ingroup rpmdb
142  * Return next package header from iteration.
143  * @param mi            rpm database iterator
144  * @return              NULL on end of iteration.
145  */
146 Header rpmdbNextIterator(rpmdbMatchIterator mi);
147
148 /** \ingroup rpmdb
149  * Destroy rpm database iterator.
150  * @param mi            rpm database iterator
151  * @return              NULL always
152  */
153 rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi);
154
155 /** \ingroup rpmdb
156  * Get an iterator for an index
157  * @param db            rpm database
158  * @param rpmtag        the index to iterate over
159  * @return              the index iterator
160  */
161 rpmdbIndexIterator rpmdbIndexIteratorInit(rpmdb db, rpmDbiTag rpmtag);
162
163 /** \ingroup rpmdb
164  * Get the next key - Warning! Keys are not zero terminated!
165  * Binary tags may even contain zero bytes
166  * @param ii            index iterator
167  * @param key           address to save the pointer to the key
168  * @param keylen        address to save the length of the key to
169  * @return              0 on success; != 0 on error or end of index
170  */
171 int rpmdbIndexIteratorNext(rpmdbIndexIterator ii, const void ** key, size_t * keylen);
172
173 /** \ingroup rpmdb
174  * Get the next key into a tag data container.
175  * Caller is responsible for calling rpmtdFreeData() to freeing the
176  * data returned in keytd once done with it.
177  * @param ii            index iterator
178  * @param keytd         tag container to store the key in
179  * @return              0 on success; != 0 on error or end of index
180  */
181 int rpmdbIndexIteratorNextTd(rpmdbIndexIterator ii, rpmtd keytd);
182
183 /** \ingroup rpmdb
184  * Get number of entries for current key
185  * @param ii            index iterator
186  * @return              number of entries. 0 on error.
187  */
188 unsigned int rpmdbIndexIteratorNumPkgs(rpmdbIndexIterator ii);
189
190 /** \ingroup rpmdb
191  * Get package offset of entry
192  * @param ii            index iterator
193  * @param nr            number of the entry
194  * @return              db offset of pkg
195  */
196 unsigned int rpmdbIndexIteratorPkgOffset(rpmdbIndexIterator ii, unsigned int nr);
197
198 /** \ingroup rpmdb
199  * Get tag number of entry
200  * @param ii            index iterator
201  * @param nr            number of the entry
202  * @return              number of tag within the package
203  */
204 unsigned int rpmdbIndexIteratorTagNum(rpmdbIndexIterator ii, unsigned int nr);
205
206 /** \ingroup rpmdb
207  * Free index iterator
208  * @param ii            index iterator
209  * return               NULL
210  */
211 rpmdbIndexIterator rpmdbIndexIteratorFree(rpmdbIndexIterator ii);
212
213 /** \ingroup rpmdb
214  * manipulate the rpm database
215  * @param db            rpm database
216  * @param ctrl          operation
217  * @return              0 on success; != 0 on error
218  */
219 int rpmdbCtrl(rpmdb db, rpmdbCtrlOp ctrl);
220
221 #ifdef __cplusplus
222 }
223 #endif
224
225 #endif  /* H_RPMDB */