rpm  4.5
rpmdb-py.c
Go to the documentation of this file.
1 
5 #include "system.h"
6 
7 #include <rpmlib.h>
8 
9 #include "rpmdb-py.h"
10 #include "rpmmi-py.h"
11 #include "header-py.h"
12 
13 #include "debug.h"
14 
15 /*@access Header @*/
16 
105 
108 /*@null@*/
109 static rpmmiObject *
110 rpmdb_Match (rpmdbObject * s, PyObject * args, PyObject * kwds)
111  /*@globals rpmGlobalMacroContext @*/
112  /*@modifies s, rpmGlobalMacroContext @*/
113 {
114  PyObject *TagN = NULL;
115  char *key = NULL;
116  int len = 0;
117  int tag = RPMDBI_PACKAGES;
118  char * kwlist[] = {"tagNumber", "key", "len", NULL};
119 
120  if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Ozi", kwlist,
121  &TagN, &key, &len))
122  return NULL;
123 
124  if (TagN && (tag = tagNumFromPyObject (TagN)) == -1) {
125  PyErr_SetString(PyExc_TypeError, "unknown tag type");
126  return NULL;
127  }
128 
129  return rpmmi_Wrap( rpmdbInitIterator(s->db, tag, key, len), (PyObject *)s );
130 }
131 
136 /*@-fullinitblock@*/
137 /*@unchecked@*/ /*@observer@*/
138 static struct PyMethodDef rpmdb_methods[] = {
139  {"match", (PyCFunction) rpmdb_Match, METH_VARARGS|METH_KEYWORDS,
140 "db.match([TagN, [key, [len]]]) -> mi\n\
141 - Create an rpm db match iterator.\n" },
142  {NULL, NULL} /* sentinel */
143 };
144 /*@=fullinitblock@*/
145 
148 static int
150  /*@globals rpmGlobalMacroContext @*/
151  /*@modifies s, rpmGlobalMacroContext @*/
152 {
154  int count = 0;
155 
156  mi = rpmdbInitIterator(s->db, RPMDBI_PACKAGES, NULL, 0);
157  while (rpmdbNextIterator(mi) != NULL)
158  count++;
159  mi = rpmdbFreeIterator(mi);
160 
161  return count;
162 }
163 
166 /*@null@*/
167 static hdrObject *
168 rpmdb_subscript(rpmdbObject * s, PyObject * key)
169  /*@globals rpmGlobalMacroContext @*/
170  /*@modifies s, rpmGlobalMacroContext @*/
171 {
172  int offset;
173  hdrObject * ho;
174  Header h;
176 
177  if (!PyInt_Check(key)) {
178  PyErr_SetString(PyExc_TypeError, "integer expected");
179  return NULL;
180  }
181 
182  offset = (int) PyInt_AsLong(key);
183 
184  mi = rpmdbInitIterator(s->db, RPMDBI_PACKAGES, &offset, sizeof(offset));
185  if (!(h = rpmdbNextIterator(mi))) {
186  mi = rpmdbFreeIterator(mi);
187  PyErr_SetString(pyrpmError, "cannot read rpmdb entry");
188  return NULL;
189  }
190 
191  ho = hdr_Wrap(h);
192  h = headerFree(h);
193 
194  return ho;
195 }
196 
199 /*@unchecked@*/ /*@observer@*/
200 static PyMappingMethods rpmdb_as_mapping = {
201  (inquiry) rpmdb_length, /* mp_length */
202  (binaryfunc) rpmdb_subscript, /* mp_subscript */
203  (objobjargproc)0, /* mp_ass_subscript */
204 };
205 
208 static void rpmdb_dealloc(rpmdbObject * s)
209  /*@modifies s @*/
210 {
211  if (s->db != NULL)
212  rpmdbClose(s->db);
213  PyObject_Del(s);
214 }
215 
216 static PyObject * rpmdb_getattro(PyObject * o, PyObject * n)
217  /*@*/
218 {
219  return PyObject_GenericGetAttr(o, n);
220 }
221 
222 static int rpmdb_setattro(PyObject * o, PyObject * n, PyObject * v)
223  /*@*/
224 {
225  return PyObject_GenericSetAttr(o, n, v);
226 }
227 
230 /*@unchecked@*/ /*@observer@*/
231 static char rpmdb_doc[] =
232 "";
233 
236 /*@-fullinitblock@*/
237 PyTypeObject rpmdb_Type = {
238  PyObject_HEAD_INIT(&PyType_Type)
239  0, /* ob_size */
240  "rpm.db", /* tp_name */
241  sizeof(rpmdbObject), /* tp_size */
242  0, /* tp_itemsize */
243  (destructor) rpmdb_dealloc, /* tp_dealloc */
244  0, /* tp_print */
245  (getattrfunc)0, /* tp_getattr */
246  0, /* tp_setattr */
247  0, /* tp_compare */
248  0, /* tp_repr */
249  0, /* tp_as_number */
250  0, /* tp_as_sequence */
251  &rpmdb_as_mapping, /* tp_as_mapping */
252  0, /* tp_hash */
253  0, /* tp_call */
254  0, /* tp_str */
255  (getattrofunc) rpmdb_getattro, /* tp_getattro */
256  (setattrofunc) rpmdb_setattro, /* tp_setattro */
257  0, /* tp_as_buffer */
258  Py_TPFLAGS_DEFAULT, /* tp_flags */
259  rpmdb_doc, /* tp_doc */
260 #if Py_TPFLAGS_HAVE_ITER
261  0, /* tp_traverse */
262  0, /* tp_clear */
263  0, /* tp_richcompare */
264  0, /* tp_weaklistoffset */
265  0, /* tp_iter */
266  0, /* tp_iternext */
267  rpmdb_methods, /* tp_methods */
268  0, /* tp_members */
269  0, /* tp_getset */
270  0, /* tp_base */
271  0, /* tp_dict */
272  0, /* tp_descr_get */
273  0, /* tp_descr_set */
274  0, /* tp_dictoffset */
275  0, /* tp_init */
276  0, /* tp_alloc */
277  0, /* tp_new */
278  0, /* tp_free */
279  0, /* tp_is_gc */
280 #endif
281 };
282 /*@=fullinitblock@*/
283 
284 #ifdef _LEGACY_BINDINGS_TOO
285 rpmdb dbFromDb(rpmdbObject * db)
286 {
287  return db->db;
288 }
289 
292 rpmdbObject *
293 rpmOpenDB(/*@unused@*/ PyObject * self, PyObject * args, PyObject * kwds) {
294  rpmdbObject * o;
295  char * root = "";
296  int forWrite = 0;
297  char * kwlist[] = {"forWrite", "rootdir", NULL};
298 
299  if (!PyArg_ParseTupleAndKeywords(args, kwds, "|is", kwlist,
300  &forWrite, &root))
301  return NULL;
302 
303  o = PyObject_New(rpmdbObject, &rpmdb_Type);
304  o->db = NULL;
305 
306  if (rpmdbOpen(root, &o->db, forWrite ? O_RDWR | O_CREAT: O_RDONLY, 0644)) {
307  char * errmsg = "cannot open database in %s";
308  char * errstr = NULL;
309  int errsize;
310 
311  Py_DECREF(o);
312  /* PyErr_SetString should take varargs... */
313  errsize = strlen(errmsg) + *root == '\0' ? 15 /* "/var/lib/rpm" */ : strlen(root);
314  errstr = alloca(errsize);
315 /*@-formatconst@*/
316  snprintf(errstr, errsize, errmsg, *root == '\0' ? "/var/lib/rpm" : root);
317 /*@=formatconst@*/
318  PyErr_SetString(pyrpmError, errstr);
319  return NULL;
320  }
321 
322  return o;
323 }
324 
328 PyObject *
329 rebuildDB (/*@unused@*/ PyObject * self, PyObject * args, PyObject * kwds)
330 {
331  char * rootDir = "";
332  char * kwlist[] = {"rootdir", NULL};
333 
334  if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &rootDir))
335  return NULL;
336 
337  return Py_BuildValue("i", rpmdbRebuild(rootDir, NULL, NULL));
338 }
339 #endif