00001
00005 #include "system.h"
00006
00007 #include <rpmio.h>
00008 #include <rpmcb.h>
00009 #include <rpmlib.h>
00010
00011 #include "rpmdb-py.h"
00012 #include "rpmmi-py.h"
00013 #include "header-py.h"
00014
00015 #include "debug.h"
00016
00017
00018
00107
00110
00111 static rpmmiObject *
00112 rpmdb_Match (rpmdbObject * s, PyObject * args, PyObject * kwds)
00113
00114
00115 {
00116 PyObject *TagN = NULL;
00117 char *key = NULL;
00118 int len = 0;
00119 int tag = RPMDBI_PACKAGES;
00120 char * kwlist[] = {"tagNumber", "key", "len", NULL};
00121
00122 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Ozi", kwlist,
00123 &TagN, &key, &len))
00124 return NULL;
00125
00126 if (TagN && (tag = tagNumFromPyObject (TagN)) == -1) {
00127 PyErr_SetString(PyExc_TypeError, "unknown tag type");
00128 return NULL;
00129 }
00130
00131 return rpmmi_Wrap( rpmdbInitIterator(s->db, tag, key, len) );
00132 }
00133
00138
00139
00140 static struct PyMethodDef rpmdb_methods[] = {
00141 {"match", (PyCFunction) rpmdb_Match, METH_VARARGS|METH_KEYWORDS,
00142 "db.match([TagN, [key, [len]]]) -> mi\n\
00143 - Create an rpm db match iterator.\n" },
00144 {NULL, NULL}
00145 };
00146
00147
00150 static int
00151 rpmdb_length(rpmdbObject * s)
00152
00153
00154 {
00155 rpmdbMatchIterator mi;
00156 int count = 0;
00157
00158 mi = rpmdbInitIterator(s->db, RPMDBI_PACKAGES, NULL, 0);
00159 while (rpmdbNextIterator(mi) != NULL)
00160 count++;
00161 mi = rpmdbFreeIterator(mi);
00162
00163 return count;
00164 }
00165
00168
00169 static hdrObject *
00170 rpmdb_subscript(rpmdbObject * s, PyObject * key)
00171
00172
00173 {
00174 int offset;
00175 hdrObject * ho;
00176 Header h;
00177 rpmdbMatchIterator mi;
00178
00179 if (!PyInt_Check(key)) {
00180 PyErr_SetString(PyExc_TypeError, "integer expected");
00181 return NULL;
00182 }
00183
00184 offset = (int) PyInt_AsLong(key);
00185
00186 mi = rpmdbInitIterator(s->db, RPMDBI_PACKAGES, &offset, sizeof(offset));
00187 if (!(h = rpmdbNextIterator(mi))) {
00188 mi = rpmdbFreeIterator(mi);
00189 PyErr_SetString(pyrpmError, "cannot read rpmdb entry");
00190 return NULL;
00191 }
00192
00193 ho = hdr_Wrap(h);
00194 h = headerFree(h);
00195
00196 return ho;
00197 }
00198
00201
00202 static PyMappingMethods rpmdb_as_mapping = {
00203 (inquiry) rpmdb_length,
00204 (binaryfunc) rpmdb_subscript,
00205 (objobjargproc)0,
00206 };
00207
00210 static void rpmdb_dealloc(rpmdbObject * s)
00211
00212 {
00213 if (s->db != NULL)
00214 rpmdbClose(s->db);
00215 PyObject_Del(s);
00216 }
00217
00218 static PyObject * rpmdb_getattro(PyObject * o, PyObject * n)
00219
00220 {
00221 return PyObject_GenericGetAttr(o, n);
00222 }
00223
00224 static int rpmdb_setattro(PyObject * o, PyObject * n, PyObject * v)
00225
00226 {
00227 return PyObject_GenericSetAttr(o, n, v);
00228 }
00229
00232
00233 static char rpmdb_doc[] =
00234 "";
00235
00238
00239 PyTypeObject rpmdb_Type = {
00240 PyObject_HEAD_INIT(&PyType_Type)
00241 0,
00242 "rpm.db",
00243 sizeof(rpmdbObject),
00244 0,
00245 (destructor) rpmdb_dealloc,
00246 0,
00247 (getattrfunc)0,
00248 0,
00249 0,
00250 0,
00251 0,
00252 0,
00253 &rpmdb_as_mapping,
00254 0,
00255 0,
00256 0,
00257 (getattrofunc) rpmdb_getattro,
00258 (setattrofunc) rpmdb_setattro,
00259 0,
00260 Py_TPFLAGS_DEFAULT,
00261 rpmdb_doc,
00262 #if Py_TPFLAGS_HAVE_ITER
00263 0,
00264 0,
00265 0,
00266 0,
00267 0,
00268 0,
00269 rpmdb_methods,
00270 0,
00271 0,
00272 0,
00273 0,
00274 0,
00275 0,
00276 0,
00277 0,
00278 0,
00279 0,
00280 0,
00281 0,
00282 #endif
00283 };
00284
00285
00286 #ifdef _LEGACY_BINDINGS_TOO
00287 rpmdb dbFromDb(rpmdbObject * db)
00288 {
00289 return db->db;
00290 }
00291
00294 rpmdbObject *
00295 rpmOpenDB( PyObject * self, PyObject * args, PyObject * kwds) {
00296 rpmdbObject * o;
00297 char * root = "";
00298 int forWrite = 0;
00299 char * kwlist[] = {"forWrite", "rootdir", NULL};
00300
00301 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|is", kwlist,
00302 &forWrite, &root))
00303 return NULL;
00304
00305 o = PyObject_New(rpmdbObject, &rpmdb_Type);
00306 o->db = NULL;
00307
00308 if (rpmdbOpen(root, &o->db, forWrite ? O_RDWR | O_CREAT: O_RDONLY, 0644)) {
00309 char * errmsg = "cannot open database in %s";
00310 char * errstr = NULL;
00311 int errsize;
00312
00313 Py_DECREF(o);
00314
00315 errsize = strlen(errmsg) + *root == '\0' ? 15 : strlen(root);
00316 errstr = alloca(errsize);
00317
00318 snprintf(errstr, errsize, errmsg, *root == '\0' ? "/var/lib/rpm" : root);
00319
00320 PyErr_SetString(pyrpmError, errstr);
00321 return NULL;
00322 }
00323
00324 return o;
00325 }
00326
00330 PyObject *
00331 rebuildDB ( PyObject * self, PyObject * args, PyObject * kwds)
00332 {
00333 char * rootDir = "";
00334 char * kwlist[] = {"rootdir", NULL};
00335
00336 if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &rootDir))
00337 return NULL;
00338
00339 return Py_BuildValue("i", rpmdbRebuild(rootDir, NULL, NULL));
00340 }
00341 #endif