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