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
00016
00105
00108
00109 static rpmmiObject *
00110 rpmdb_Match (rpmdbObject * s, PyObject * args, PyObject * kwds)
00111
00112
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
00137
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}
00143 };
00144
00145
00148 static int
00149 rpmdb_length(rpmdbObject * s)
00150
00151
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
00167 static hdrObject *
00168 rpmdb_subscript(rpmdbObject * s, PyObject * key)
00169
00170
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
00200 static PyMappingMethods rpmdb_as_mapping = {
00201 (inquiry) rpmdb_length,
00202 (binaryfunc) rpmdb_subscript,
00203 (objobjargproc)0,
00204 };
00205
00208 static void rpmdb_dealloc(rpmdbObject * s)
00209
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
00231 static char rpmdb_doc[] =
00232 "";
00233
00236
00237 PyTypeObject rpmdb_Type = {
00238 PyObject_HEAD_INIT(&PyType_Type)
00239 0,
00240 "rpm.db",
00241 sizeof(rpmdbObject),
00242 0,
00243 (destructor) rpmdb_dealloc,
00244 0,
00245 (getattrfunc)0,
00246 0,
00247 0,
00248 0,
00249 0,
00250 0,
00251 &rpmdb_as_mapping,
00252 0,
00253 0,
00254 0,
00255 (getattrofunc) rpmdb_getattro,
00256 (setattrofunc) rpmdb_setattro,
00257 0,
00258 Py_TPFLAGS_DEFAULT,
00259 rpmdb_doc,
00260 #if Py_TPFLAGS_HAVE_ITER
00261 0,
00262 0,
00263 0,
00264 0,
00265 0,
00266 0,
00267 rpmdb_methods,
00268 0,
00269 0,
00270 0,
00271 0,
00272 0,
00273 0,
00274 0,
00275 0,
00276 0,
00277 0,
00278 0,
00279 0,
00280 #endif
00281 };
00282
00283
00284 #ifdef _LEGACY_BINDINGS_TOO
00285 rpmdb dbFromDb(rpmdbObject * db)
00286 {
00287 return db->db;
00288 }
00289
00292 rpmdbObject *
00293 rpmOpenDB( 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
00313 errsize = strlen(errmsg) + *root == '\0' ? 15 : strlen(root);
00314 errstr = alloca(errsize);
00315
00316 snprintf(errstr, errsize, errmsg, *root == '\0' ? "/var/lib/rpm" : root);
00317
00318 PyErr_SetString(pyrpmError, errstr);
00319 return NULL;
00320 }
00321
00322 return o;
00323 }
00324
00328 PyObject *
00329 rebuildDB ( 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