1 #ifndef H_RPMDB_INTERNAL
2 #define H_RPMDB_INTERNAL
3 
4 #include <assert.h>
5 
6 #include <rpm/rpmsw.h>
7 #include <rpm/rpmtypes.h>
8 #include <rpm/rpmutil.h>
9 #include "lib/backend/dbi.h"
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
15 #undef HASHTYPE
16 #undef HTKEYTYPE
17 #undef HTDATATYPE
18 #define HASHTYPE packageHash
19 #define HTKEYTYPE unsigned int
20 #define HTDATATYPE struct rpmte_s *
21 #include "rpmhash.H"
22 #undef HASHTYPE
23 #undef HTKEYTYPE
24 #undef HTDATATYPE
25 
26 enum rpmdbRebuildFlags_e {
27     RPMDB_REBUILD_FLAG_SALVAGE	= (1 << 0),
28 };
29 
30 /** \ingroup rpmdb
31  * Reference a database instance.
32  * @param db		rpm database
33  * @return		new rpm database reference
34  */
35 rpmdb rpmdbLink(rpmdb db);
36 
37 /** \ingroup rpmdb
38  * Open rpm database.
39  * @param prefix	path to top of install tree
40  * @retval dbp		address of rpm database
41  * @param mode		open(2) flags:  O_RDWR or O_RDONLY (O_CREAT also)
42  * @param perms		database permissions
43  * @return		0 on success
44  */
45 RPM_GNUC_INTERNAL
46 int rpmdbOpen (const char * prefix, rpmdb * dbp, int mode, int perms);
47 
48 /** \ingroup rpmdb
49  * Initialize database.
50  * @param prefix	path to top of install tree
51  * @param perms		database permissions
52  * @return		0 on success
53  */
54 RPM_GNUC_INTERNAL
55 int rpmdbInit(const char * prefix, int perms);
56 
57 /** \ingroup rpmdb
58  * Close all database indices and free rpmdb.
59  * @param db		rpm database
60  * @return		0 on success
61  */
62 RPM_GNUC_INTERNAL
63 int rpmdbClose (rpmdb db);
64 
65 /** \ingroup rpmdb
66  * Rebuild database indices from package headers.
67  * @param prefix	path to top of install tree
68  * @param ts		transaction set (or NULL)
69  * @param (*hdrchk)	headerCheck() vector (or NULL)
70  * @param rebuildflags	flags
71  * @return		0 on success
72  */
73 RPM_GNUC_INTERNAL
74 int rpmdbRebuild(const char * prefix, rpmts ts,
75 		rpmRC (*hdrchk) (rpmts ts, const void *uh, size_t uc, char ** msg),
76 		int rebuildflags);
77 
78 /** \ingroup rpmdb
79  * Verify database components.
80  * @param prefix	path to top of install tree
81  * @return		0 on success
82  */
83 RPM_GNUC_INTERNAL
84 int rpmdbVerify(const char * prefix);
85 
86 /** \ingroup rpmdb
87  * Add package header to rpm database and indices.
88  * @param db		rpm database
89  * @param h		header
90  * @return		0 on success
91  */
92 RPM_GNUC_INTERNAL
93 int rpmdbAdd(rpmdb db, Header h);
94 
95 /** \ingroup rpmdb
96  * Remove package header from rpm database and indices.
97  * @param db		rpm database
98  * @param hdrNum	package instance number in database
99  * @return		0 on success
100  */
101 RPM_GNUC_INTERNAL
102 int rpmdbRemove(rpmdb db, unsigned int hdrNum);
103 
104 /** \ingroup rpmdb
105  * Return rpmdb home directory (depending on chroot state)
106  * param db		rpmdb handle
107  * return		db home directory (or NULL on error)
108  */
109 RPM_GNUC_INTERNAL
110 const char *rpmdbHome(rpmdb db);
111 
112 /** \ingroup rpmdb
113  * Return database iterator.
114  * @param mi		rpm database iterator
115  * @param keyp		key data (NULL for sequential access)
116  * @param keylen	key data length (0 will use strlen(keyp))
117  * @return		0 on success
118  */
119 int rpmdbExtendIterator(rpmdbMatchIterator mi,
120 			const void * keyp, size_t keylen);
121 
122 /** \ingroup rpmdb
123  * sort the iterator by (recnum, filenum)
124  * Return database iterator.
125  * @param mi		rpm database iterator
126  */
127 void rpmdbSortIterator(rpmdbMatchIterator mi);
128 
129 /** \ingroup rpmdb
130  * uniq the iterator by recnum
131  * Return database iterator.
132  * @param mi		rpm database iterator
133  */
134 void rpmdbUniqIterator(rpmdbMatchIterator mi);
135 
136 /** \ingroup rpmdb
137  * If neg equals to zero then it leaves in iterator only packages that
138  * header numbers are in hdrNums. If neg is not zero then removes from iterator
139  * all packages that header numbers are in hdrNums.
140  * @param mi		rpm database iterator
141  * @param hdrNums	hash of package numbers
142  * @param neg		mode
143  * return		0 on success, 1 on failure (bad args)
144  */
145 int rpmdbFilterIterator(rpmdbMatchIterator mi, packageHash hdrNums, int neg);
146 
147 /** \ingroup rpmdb
148  * Remove items from set of package instances to iterate.
149  * @note Sorted hdrNums are always passed in rpmlib.
150  * @param mi		rpm database iterator
151  * @param hdrNums	hash of package instances
152  * @return		0 on success, 1 on failure (bad args)
153  */
154 int rpmdbPruneIterator(rpmdbMatchIterator mi, packageHash hdrNums);
155 
156 /** \ingroup rpmdb
157  * Create a new, empty match iterator (for purposes of extending it
158  * through other means)
159  * @param db		rpm database
160  * @param dbitag	database index tag
161  * @return		empty match iterator
162  */
163 RPM_GNUC_INTERNAL
164 rpmdbMatchIterator rpmdbNewIterator(rpmdb db, rpmDbiTagVal dbitag);
165 
166 /** \ingroup rpmdb
167  * Return database iterator that iterates over database items
168  * starting with pfx.
169  * @param db		rpm database
170  * @param rpmtag	database index tag
171  * @param pfx		prefix data
172  * @param plen		prefix data length (0 will use strlen(keyp))
173  * @return		NULL on failure
174  */
175 RPM_GNUC_INTERNAL
176 rpmdbMatchIterator rpmdbInitPrefixIterator(rpmdb db, rpmDbiTagVal rpmtag,
177 					const void * pfx, size_t plen);
178 /** \ingroup rpmdb
179  * Get package offsets of entries
180  * @param ii		index iterator
181  * @return		db offsets of pkgs
182  */
183 RPM_GNUC_INTERNAL
184 const unsigned int *rpmdbIndexIteratorPkgOffsets(rpmdbIndexIterator ii);
185 
186 /** \ingroup rpmdb
187  * Return current index (position) in iterator.
188  * @param mi		rpm database iterator
189  * @return		current index
190  */
191 RPM_GNUC_INTERNAL
192 int rpmdbGetIteratorIndex(rpmdbMatchIterator mi);
193 
194 /** \ingroup rpmdb
195  * Set iterator index.
196  * @param mi		rpm database iterator
197  * @param ix		index
198  */
199 RPM_GNUC_INTERNAL
200 void rpmdbSetIteratorIndex(rpmdbMatchIterator mi, unsigned int ix);
201 
202 /** \ingroup rpmdb
203  * Return offset of package with given index.
204  * @param mi		rpm database iterator
205  * @param ix		index
206  * @return		package offset
207  */
208 RPM_GNUC_INTERNAL
209 unsigned int rpmdbGetIteratorOffsetFor(rpmdbMatchIterator mi, unsigned int ix);
210 
211 /** \ingroup rpmdb
212  * Return header located in rpmdb at given offset.
213  * @param db		rpm database
214  * @param offset	database offset
215  * @return		header at given offset
216  */
217 RPM_GNUC_INTERNAL
218 Header rpmdbGetHeaderAt(rpmdb db, unsigned int offset);
219 
220 #ifdef __cplusplus
221 }
222 #endif
223 
224 #endif
225