rpm  5.4.15
rpmdb-py.c
Go to the documentation of this file.
1 
5 #include "system-py.h"
6 
7 #include <rpmio.h>
8 #include <rpmcb.h> /* XXX fnpyKey */
9 #include <rpmtypes.h>
10 #include <rpmtag.h>
11 
12 #include "rpmdb-py.h"
13 #include "rpmmi-py.h"
14 #include "header-py.h"
15 
16 #include "debug.h"
17 
18 /*@access Header @*/
19 
108 
111 /*@null@*/
112 static rpmmiObject *
113 rpmdb_Match (rpmdbObject * s, PyObject * args, PyObject * kwds)
114  /*@globals rpmGlobalMacroContext @*/
115  /*@modifies s, rpmGlobalMacroContext @*/
116 {
117  PyObject *TagN = NULL;
118  char *key = NULL;
119  int len = 0;
120  int tag = RPMDBI_PACKAGES;
121  char * kwlist[] = {"tagNumber", "key", "len", NULL};
122 
123  if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Ozi", kwlist,
124  &TagN, &key, &len))
125  return NULL;
126 
127  if (TagN && (tag = tagNumFromPyObject (TagN)) == -1) {
128  PyErr_SetString(PyExc_TypeError, "unknown tag type");
129  return NULL;
130  }
131 
132  return rpmmi_Wrap( rpmmiInit(s->db, tag, key, len) );
133 }
134 
139 /*@-fullinitblock@*/
140 /*@unchecked@*/ /*@observer@*/
141 static struct PyMethodDef rpmdb_methods[] = {
142  {"match", (PyCFunction) rpmdb_Match, METH_VARARGS|METH_KEYWORDS,
143 "db.match([TagN, [key, [len]]]) -> mi\n\
144 - Create an rpm db match iterator.\n" },
145  {NULL, NULL} /* sentinel */
146 };
147 /*@=fullinitblock@*/
148 
151 static int
153  /*@globals rpmGlobalMacroContext @*/
154  /*@modifies s, rpmGlobalMacroContext @*/
155 {
156  rpmmi mi;
157  int count = 0;
158 
159  mi = rpmmiInit(s->db, RPMDBI_PACKAGES, NULL, 0);
160  while (rpmmiNext(mi) != NULL)
161  count++;
162  mi = rpmmiFree(mi);
163 
164  return count;
165 }
166 
169 /*@null@*/
170 static hdrObject *
172  /*@globals rpmGlobalMacroContext @*/
173  /*@modifies s, rpmGlobalMacroContext @*/
174 {
175  int offset;
176  hdrObject * ho;
177  Header h;
178  rpmmi mi;
179 
180  if (!PyInt_Check(key)) {
181  PyErr_SetString(PyExc_TypeError, "integer expected");
182  return NULL;
183  }
184 
185  offset = (int) PyInt_AsLong(key);
186 
187  mi = rpmmiInit(s->db, RPMDBI_PACKAGES, &offset, sizeof(offset));
188  if (!(h = rpmmiNext(mi))) {
189  mi = rpmmiFree(mi);
190  PyErr_SetString(pyrpmError, "cannot read rpmdb entry");
191  return NULL;
192  }
193 
194  ho = hdr_Wrap(h);
195  (void)headerFree(h);
196  h = NULL;
197 
198  return ho;
199 }
200 
203 /*@unchecked@*/ /*@observer@*/
204 static PyMappingMethods rpmdb_as_mapping = {
205  (lenfunc) rpmdb_length, /* mp_length */
206  (binaryfunc) rpmdb_subscript, /* mp_subscript */
207  (objobjargproc)0, /* mp_ass_subscript */
208 };
209 
212 static void rpmdb_dealloc(rpmdbObject * s)
213  /*@modifies s @*/
214 {
215  if (s->db != NULL)
216  rpmdbClose(s->db);
217  PyObject_Del(s);
218 }
219 
222 /*@unchecked@*/ /*@observer@*/
223 static char rpmdb_doc[] =
224 "";
225 
228 /*@-fullinitblock@*/
229 PyTypeObject rpmdb_Type = {
230  PyVarObject_HEAD_INIT(&PyType_Type, 0)
231  "rpm.db", /* tp_name */
232  sizeof(rpmdbObject), /* tp_size */
233  0, /* tp_itemsize */
234  (destructor) rpmdb_dealloc, /* tp_dealloc */
235  0, /* tp_print */
236  (getattrfunc)0, /* tp_getattr */
237  0, /* tp_setattr */
238  0, /* tp_compare */
239  0, /* tp_repr */
240  0, /* tp_as_number */
241  0, /* tp_as_sequence */
242  &rpmdb_as_mapping, /* tp_as_mapping */
243  0, /* tp_hash */
244  0, /* tp_call */
245  0, /* tp_str */
246  PyObject_GenericGetAttr, /* tp_getattro */
247  PyObject_GenericSetAttr, /* tp_setattro */
248  0, /* tp_as_buffer */
249  Py_TPFLAGS_DEFAULT, /* tp_flags */
250  rpmdb_doc, /* tp_doc */
251 #if Py_TPFLAGS_HAVE_ITER
252  0, /* tp_traverse */
253  0, /* tp_clear */
254  0, /* tp_richcompare */
255  0, /* tp_weaklistoffset */
256  0, /* tp_iter */
257  0, /* tp_iternext */
258  rpmdb_methods, /* tp_methods */
259  0, /* tp_members */
260  0, /* tp_getset */
261  0, /* tp_base */
262  0, /* tp_dict */
263  0, /* tp_descr_get */
264  0, /* tp_descr_set */
265  0, /* tp_dictoffset */
266  0, /* tp_init */
267  0, /* tp_alloc */
268  0, /* tp_new */
269  0, /* tp_free */
270  0, /* tp_is_gc */
271 #endif
272 };
273 /*@=fullinitblock@*/
274 
275 #ifdef _LEGACY_BINDINGS_TOO
276 rpmdb dbFromDb(rpmdbObject * db)
277 {
278  return db->db;
279 }
280 
283 rpmdbObject *
284 rpmOpenDB(/*@unused@*/ PyObject * self, PyObject * args, PyObject * kwds) {
285  rpmdbObject * o;
286  char * root = "";
287  int forWrite = 0;
288  char * kwlist[] = {"forWrite", "rootdir", NULL};
289 
290  if (!PyArg_ParseTupleAndKeywords(args, kwds, "|is", kwlist,
291  &forWrite, &root))
292  return NULL;
293 
294  o = PyObject_New(rpmdbObject, &rpmdb_Type);
295  o->db = NULL;
296 
297  if (rpmdbOpen(root, &o->db, forWrite ? O_RDWR | O_CREAT: O_RDONLY, (mode_t)0644)) {
298  char * errmsg = "cannot open database in %s";
299  char * errstr = NULL;
300  int errsize;
301 
302  Py_XDECREF(o);
303  /* PyErr_SetString should take varargs... */
304  errsize = strlen(errmsg) + *root == '\0' ? 15 /* "/var/lib/rpm" */ : strlen(root);
305  errstr = alloca(errsize);
306 /*@-formatconst@*/
307  snprintf(errstr, errsize, errmsg, *root == '\0' ? "/var/lib/rpm" : root);
308 /*@=formatconst@*/
309  PyErr_SetString(pyrpmError, errstr);
310  return NULL;
311  }
312 
313  return o;
314 }
315 #endif
rpmTag tagNumFromPyObject(PyObject *item)
Definition: header-py.c:362
hdrObject * hdr_Wrap(Header h)
Definition: header-py.c:678
mongo_error_t const char * errstr
Definition: mongo.h:922
const char const char size_t len
Definition: bson.h:823
The Header data structure.
Definition: rpmdb.c:436
static hdrObject * rpmdb_subscript(rpmdbObject *s, PyObject *key)
Definition: rpmdb-py.c:171
rpmmiObject * rpmmi_Wrap(rpmmi mi)
Definition: rpmmi-py.c:260
static PyMappingMethods rpmdb_as_mapping
Definition: rpmdb-py.c:204
rpmmi rpmmiInit(rpmdb db, rpmTag tag, const void *keyp, size_t keylen)
Return database iterator.
Definition: rpmdb.c:2495
char * alloca()
int rpmdbOpen(const char *prefix, rpmdb *dbp, int mode, mode_t perms)
Open rpm database.
Definition: rpmdb.c:1179
static void rpmdb_dealloc(rpmdbObject *s)
Definition: rpmdb-py.c:212
struct rpmdb_s * rpmdb
Database of headers and tag value indices.
Definition: rpmtypes.h:43
rpmdb db
Definition: rpmdb-py.h:22
Header headerFree(Header h)
Dereference a header instance.
rpmmi rpmmiFree(rpmmi mi)
Destroy rpm database iterator.
static int snprintf(char *buf, int nb, const char *fmt,...)
Definition: rpmps.c:220
const char const bson * key
Definition: mongo.h:717
Header rpmmiNext(rpmmi mi)
Return next package header from iteration.
Definition: rpmdb.c:2252
struct rpmdbObject_s rpmdbObject
Definition: rpmdb-py.h:15
const char * db
Definition: mongo.h:697
static rpmmiObject * rpmdb_Match(rpmdbObject *s, PyObject *args, PyObject *kwds)
Definition: rpmdb-py.c:113
PyObject * pyrpmError
Definition: rpmmodule.c:51
static char rpmdb_doc[]
Definition: rpmdb-py.c:223
int rpmdbClose(rpmdb db)
Close all database indices and free rpmdb.
Definition: rpmdb.c:870
PyTypeObject rpmdb_Type
Definition: rpmdb-py.c:229
static int rpmdb_length(rpmdbObject *s)
Definition: rpmdb-py.c:152
static struct PyMethodDef rpmdb_methods[]
Definition: rpmdb-py.c:141
#define RPMDBI_PACKAGES
Pseudo-tags used by the rpmdb and rpmgi iterator API's.
Definition: rpmtag.h:479