Main Page | Modules | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

rpmdb-py.c

Go to the documentation of this file.
00001 
00005 #include "system.h"
00006 
00007 #include <rpmlib.h>
00008 
00009 #include "rpmdb-py.h"
00010 #include "rpmmi-py.h"
00011 #include "header-py.h"
00012 
00013 #include "debug.h"
00014 
00015 /*@access Header @*/
00016 
00105 
00108 /*@null@*/
00109 static rpmmiObject *
00110 rpmdb_Match (rpmdbObject * s, PyObject * args)
00111         /*@globals rpmGlobalMacroContext @*/
00112         /*@modifies s, rpmGlobalMacroContext @*/
00113 {
00114     PyObject *TagN = NULL;
00115     char *key = NULL;
00116     int len = 0;
00117     int tag = RPMDBI_PACKAGES;
00118 
00119     if (!PyArg_ParseTuple(args, "|Ozi", &TagN, &key, &len))
00120         return NULL;
00121 
00122     if (TagN && (tag = tagNumFromPyObject (TagN)) == -1) {
00123         PyErr_SetString(PyExc_TypeError, "unknown tag type");
00124         return NULL;
00125     }
00126 
00127     return rpmmi_Wrap( rpmdbInitIterator(s->db, tag, key, len) );
00128 }
00129 
00132 /*@-fullinitblock@*/
00133 /*@unchecked@*/ /*@observer@*/
00134 static struct PyMethodDef rpmdb_methods[] = {
00135     {"match",       (PyCFunction) rpmdb_Match,  METH_VARARGS,
00136 "db.match([TagN, [key, [len]]]) -> mi\n\
00137 - Create an rpm db match iterator.\n" },
00138     {NULL,              NULL}           /* sentinel */
00139 };
00140 /*@=fullinitblock@*/
00141 
00144 static int
00145 rpmdb_length(rpmdbObject * s)
00146         /*@globals rpmGlobalMacroContext @*/
00147         /*@modifies s, rpmGlobalMacroContext @*/
00148 {
00149     rpmdbMatchIterator mi;
00150     int count = 0;
00151 
00152     mi = rpmdbInitIterator(s->db, RPMDBI_PACKAGES, NULL, 0);
00153     while (rpmdbNextIterator(mi) != NULL)
00154         count++;
00155     mi = rpmdbFreeIterator(mi);
00156 
00157     return count;
00158 }
00159 
00162 /*@null@*/
00163 static hdrObject *
00164 rpmdb_subscript(rpmdbObject * s, PyObject * key)
00165         /*@globals rpmGlobalMacroContext @*/
00166         /*@modifies s, rpmGlobalMacroContext @*/
00167 {
00168     int offset;
00169     hdrObject * ho;
00170     Header h;
00171     rpmdbMatchIterator mi;
00172 
00173     if (!PyInt_Check(key)) {
00174         PyErr_SetString(PyExc_TypeError, "integer expected");
00175         return NULL;
00176     }
00177 
00178     offset = (int) PyInt_AsLong(key);
00179 
00180     mi = rpmdbInitIterator(s->db, RPMDBI_PACKAGES, &offset, sizeof(offset));
00181     if (!(h = rpmdbNextIterator(mi))) {
00182         mi = rpmdbFreeIterator(mi);
00183         PyErr_SetString(pyrpmError, "cannot read rpmdb entry");
00184         return NULL;
00185     }
00186 
00187     ho = hdr_Wrap(h);
00188     h = headerFree(h);
00189 
00190     return ho;
00191 }
00192 
00195 /*@unchecked@*/ /*@observer@*/
00196 static PyMappingMethods rpmdb_as_mapping = {
00197         (inquiry) rpmdb_length,         /* mp_length */
00198         (binaryfunc) rpmdb_subscript,   /* mp_subscript */
00199         (objobjargproc)0,               /* mp_ass_subscript */
00200 };
00201 
00204 static void rpmdb_dealloc(rpmdbObject * s)
00205         /*@modifies s @*/
00206 {
00207     if (s->db != NULL)
00208         rpmdbClose(s->db);
00209     PyObject_Del(s);
00210 }
00211 
00212 static PyObject * rpmdb_getattro(PyObject * o, PyObject * n)
00213         /*@*/
00214 {
00215     return PyObject_GenericGetAttr(o, n);
00216 }
00217 
00218 static int rpmdb_setattro(PyObject * o, PyObject * n, PyObject * v)
00219         /*@*/
00220 {
00221     return PyObject_GenericSetAttr(o, n, v);
00222 }
00223 
00226 /*@unchecked@*/ /*@observer@*/
00227 static char rpmdb_doc[] =
00228 "";
00229 
00232 /*@-fullinitblock@*/
00233 PyTypeObject rpmdb_Type = {
00234         PyObject_HEAD_INIT(&PyType_Type)
00235         0,                              /* ob_size */
00236         "rpm.db",                       /* tp_name */
00237         sizeof(rpmdbObject),            /* tp_size */
00238         0,                              /* tp_itemsize */
00239         (destructor) rpmdb_dealloc,     /* tp_dealloc */
00240         0,                              /* tp_print */
00241         (getattrfunc)0,                 /* tp_getattr */
00242         0,                              /* tp_setattr */
00243         0,                              /* tp_compare */
00244         0,                              /* tp_repr */
00245         0,                              /* tp_as_number */
00246         0,                              /* tp_as_sequence */
00247         &rpmdb_as_mapping,              /* tp_as_mapping */
00248         0,                              /* tp_hash */
00249         0,                              /* tp_call */
00250         0,                              /* tp_str */
00251         (getattrofunc) rpmdb_getattro,  /* tp_getattro */
00252         (setattrofunc) rpmdb_setattro,  /* tp_setattro */
00253         0,                              /* tp_as_buffer */
00254         Py_TPFLAGS_DEFAULT,             /* tp_flags */
00255         rpmdb_doc,                      /* tp_doc */
00256 #if Py_TPFLAGS_HAVE_ITER
00257         0,                              /* tp_traverse */
00258         0,                              /* tp_clear */
00259         0,                              /* tp_richcompare */
00260         0,                              /* tp_weaklistoffset */
00261         0,                              /* tp_iter */
00262         0,                              /* tp_iternext */
00263         rpmdb_methods,                  /* tp_methods */
00264         0,                              /* tp_members */
00265         0,                              /* tp_getset */
00266         0,                              /* tp_base */
00267         0,                              /* tp_dict */
00268         0,                              /* tp_descr_get */
00269         0,                              /* tp_descr_set */
00270         0,                              /* tp_dictoffset */
00271         0,                              /* tp_init */
00272         0,                              /* tp_alloc */
00273         0,                              /* tp_new */
00274         0,                              /* tp_free */
00275         0,                              /* tp_is_gc */
00276 #endif
00277 };
00278 /*@=fullinitblock@*/
00279 
00280 #ifdef  _LEGACY_BINDINGS_TOO
00281 rpmdb dbFromDb(rpmdbObject * db)
00282 {
00283     return db->db;
00284 }
00285 
00288 rpmdbObject * rpmOpenDB(/*@unused@*/ PyObject * self, PyObject * args) {
00289     rpmdbObject * o;
00290     char * root = "";
00291     int forWrite = 0;
00292 
00293     if (!PyArg_ParseTuple(args, "|is", &forWrite, &root)) return NULL;
00294 
00295     o = PyObject_New(rpmdbObject, &rpmdb_Type);
00296     o->db = NULL;
00297 
00298     if (rpmdbOpen(root, &o->db, forWrite ? O_RDWR | O_CREAT: O_RDONLY, 0644)) {
00299         char * errmsg = "cannot open database in %s";
00300         char * errstr = NULL;
00301         int errsize;
00302 
00303         Py_DECREF(o);
00304         /* PyErr_SetString should take varargs... */
00305         errsize = strlen(errmsg) + *root == '\0' ? 15 /* "/var/lib/rpm" */ : strlen(root);
00306         errstr = alloca(errsize);
00307 /*@-formatconst@*/
00308         snprintf(errstr, errsize, errmsg, *root == '\0' ? "/var/lib/rpm" : root);
00309 /*@=formatconst@*/
00310         PyErr_SetString(pyrpmError, errstr);
00311         return NULL;
00312     }
00313 
00314     return o;
00315 }
00316 
00320 PyObject * rebuildDB (/*@unused@*/ PyObject * self, PyObject * args)
00321 {
00322     char * rootDir = "";
00323 
00324     if (!PyArg_ParseTuple(args, "s", &rootDir)) return NULL;
00325 
00326     return Py_BuildValue("i", rpmdbRebuild(rootDir, NULL, NULL));
00327 }
00328 #endif
00329 

Generated on Tue Jan 27 18:18:07 2009 for rpm by  doxygen 1.3.9.1