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

python/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, PyObject * kwds)
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     char * kwlist[] = {"tagNumber", "key", "len", NULL};
00119 
00120     if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Ozi", kwlist,
00121             &TagN, &key, &len))
00122         return NULL;
00123 
00124     if (TagN && (tag = tagNumFromPyObject (TagN)) == -1) {
00125         PyErr_SetString(PyExc_TypeError, "unknown tag type");
00126         return NULL;
00127     }
00128 
00129     return rpmmi_Wrap( rpmdbInitIterator(s->db, tag, key, len), (PyObject *)s );
00130 }
00131 
00136 /*@-fullinitblock@*/
00137 /*@unchecked@*/ /*@observer@*/
00138 static struct PyMethodDef rpmdb_methods[] = {
00139     {"match",       (PyCFunction) rpmdb_Match,  METH_VARARGS|METH_KEYWORDS,
00140 "db.match([TagN, [key, [len]]]) -> mi\n\
00141 - Create an rpm db match iterator.\n" },
00142     {NULL,              NULL}           /* sentinel */
00143 };
00144 /*@=fullinitblock@*/
00145 
00148 static int
00149 rpmdb_length(rpmdbObject * s)
00150         /*@globals rpmGlobalMacroContext @*/
00151         /*@modifies s, rpmGlobalMacroContext @*/
00152 {
00153     rpmdbMatchIterator mi;
00154     int count = 0;
00155 
00156     mi = rpmdbInitIterator(s->db, RPMDBI_PACKAGES, NULL, 0);
00157     while (rpmdbNextIterator(mi) != NULL)
00158         count++;
00159     mi = rpmdbFreeIterator(mi);
00160 
00161     return count;
00162 }
00163 
00166 /*@null@*/
00167 static hdrObject *
00168 rpmdb_subscript(rpmdbObject * s, PyObject * key)
00169         /*@globals rpmGlobalMacroContext @*/
00170         /*@modifies s, rpmGlobalMacroContext @*/
00171 {
00172     int offset;
00173     hdrObject * ho;
00174     Header h;
00175     rpmdbMatchIterator mi;
00176 
00177     if (!PyInt_Check(key)) {
00178         PyErr_SetString(PyExc_TypeError, "integer expected");
00179         return NULL;
00180     }
00181 
00182     offset = (int) PyInt_AsLong(key);
00183 
00184     mi = rpmdbInitIterator(s->db, RPMDBI_PACKAGES, &offset, sizeof(offset));
00185     if (!(h = rpmdbNextIterator(mi))) {
00186         mi = rpmdbFreeIterator(mi);
00187         PyErr_SetString(pyrpmError, "cannot read rpmdb entry");
00188         return NULL;
00189     }
00190 
00191     ho = hdr_Wrap(h);
00192     h = headerFree(h);
00193 
00194     return ho;
00195 }
00196 
00199 /*@unchecked@*/ /*@observer@*/
00200 static PyMappingMethods rpmdb_as_mapping = {
00201         (inquiry) rpmdb_length,         /* mp_length */
00202         (binaryfunc) rpmdb_subscript,   /* mp_subscript */
00203         (objobjargproc)0,               /* mp_ass_subscript */
00204 };
00205 
00208 static void rpmdb_dealloc(rpmdbObject * s)
00209         /*@modifies s @*/
00210 {
00211     if (s->db != NULL)
00212         rpmdbClose(s->db);
00213     PyObject_Del(s);
00214 }
00215 
00216 static PyObject * rpmdb_getattro(PyObject * o, PyObject * n)
00217         /*@*/
00218 {
00219     return PyObject_GenericGetAttr(o, n);
00220 }
00221 
00222 static int rpmdb_setattro(PyObject * o, PyObject * n, PyObject * v)
00223         /*@*/
00224 {
00225     return PyObject_GenericSetAttr(o, n, v);
00226 }
00227 
00230 /*@unchecked@*/ /*@observer@*/
00231 static char rpmdb_doc[] =
00232 "";
00233 
00236 /*@-fullinitblock@*/
00237 PyTypeObject rpmdb_Type = {
00238         PyObject_HEAD_INIT(&PyType_Type)
00239         0,                              /* ob_size */
00240         "rpm.db",                       /* tp_name */
00241         sizeof(rpmdbObject),            /* tp_size */
00242         0,                              /* tp_itemsize */
00243         (destructor) rpmdb_dealloc,     /* tp_dealloc */
00244         0,                              /* tp_print */
00245         (getattrfunc)0,                 /* tp_getattr */
00246         0,                              /* tp_setattr */
00247         0,                              /* tp_compare */
00248         0,                              /* tp_repr */
00249         0,                              /* tp_as_number */
00250         0,                              /* tp_as_sequence */
00251         &rpmdb_as_mapping,              /* tp_as_mapping */
00252         0,                              /* tp_hash */
00253         0,                              /* tp_call */
00254         0,                              /* tp_str */
00255         (getattrofunc) rpmdb_getattro,  /* tp_getattro */
00256         (setattrofunc) rpmdb_setattro,  /* tp_setattro */
00257         0,                              /* tp_as_buffer */
00258         Py_TPFLAGS_DEFAULT,             /* tp_flags */
00259         rpmdb_doc,                      /* tp_doc */
00260 #if Py_TPFLAGS_HAVE_ITER
00261         0,                              /* tp_traverse */
00262         0,                              /* tp_clear */
00263         0,                              /* tp_richcompare */
00264         0,                              /* tp_weaklistoffset */
00265         0,                              /* tp_iter */
00266         0,                              /* tp_iternext */
00267         rpmdb_methods,                  /* tp_methods */
00268         0,                              /* tp_members */
00269         0,                              /* tp_getset */
00270         0,                              /* tp_base */
00271         0,                              /* tp_dict */
00272         0,                              /* tp_descr_get */
00273         0,                              /* tp_descr_set */
00274         0,                              /* tp_dictoffset */
00275         0,                              /* tp_init */
00276         0,                              /* tp_alloc */
00277         0,                              /* tp_new */
00278         0,                              /* tp_free */
00279         0,                              /* tp_is_gc */
00280 #endif
00281 };
00282 /*@=fullinitblock@*/
00283 
00284 #ifdef  _LEGACY_BINDINGS_TOO
00285 rpmdb dbFromDb(rpmdbObject * db)
00286 {
00287     return db->db;
00288 }
00289 
00292 rpmdbObject *
00293 rpmOpenDB(/*@unused@*/ PyObject * self, PyObject * args, PyObject * kwds) {
00294     rpmdbObject * o;
00295     char * root = "";
00296     int forWrite = 0;
00297     char * kwlist[] = {"forWrite", "rootdir", NULL};
00298 
00299     if (!PyArg_ParseTupleAndKeywords(args, kwds, "|is", kwlist,
00300             &forWrite, &root))
00301         return NULL;
00302 
00303     o = PyObject_New(rpmdbObject, &rpmdb_Type);
00304     o->db = NULL;
00305 
00306     if (rpmdbOpen(root, &o->db, forWrite ? O_RDWR | O_CREAT: O_RDONLY, 0644)) {
00307         char * errmsg = "cannot open database in %s";
00308         char * errstr = NULL;
00309         int errsize;
00310 
00311         Py_DECREF(o);
00312         /* PyErr_SetString should take varargs... */
00313         errsize = strlen(errmsg) + *root == '\0' ? 15 /* "/var/lib/rpm" */ : strlen(root);
00314         errstr = alloca(errsize);
00315 /*@-formatconst@*/
00316         snprintf(errstr, errsize, errmsg, *root == '\0' ? "/var/lib/rpm" : root);
00317 /*@=formatconst@*/
00318         PyErr_SetString(pyrpmError, errstr);
00319         return NULL;
00320     }
00321 
00322     return o;
00323 }
00324 
00328 PyObject *
00329 rebuildDB (/*@unused@*/ PyObject * self, PyObject * args, PyObject * kwds)
00330 {
00331     char * rootDir = "";
00332     char * kwlist[] = {"rootdir", NULL};
00333 
00334     if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &rootDir))
00335         return NULL;
00336 
00337     return Py_BuildValue("i", rpmdbRebuild(rootDir, NULL, NULL));
00338 }
00339 #endif

Generated on Mon Aug 23 10:18:29 2010 for rpm by  doxygen 1.4.4