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)
00111
00112
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
00133
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}
00139 };
00140
00141
00144 static int
00145 rpmdb_length(rpmdbObject * s)
00146
00147
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
00163 static hdrObject *
00164 rpmdb_subscript(rpmdbObject * s, PyObject * key)
00165
00166
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
00196 static PyMappingMethods rpmdb_as_mapping = {
00197 (inquiry) rpmdb_length,
00198 (binaryfunc) rpmdb_subscript,
00199 (objobjargproc)0,
00200 };
00201
00204 static void rpmdb_dealloc(rpmdbObject * s)
00205
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
00227 static char rpmdb_doc[] =
00228 "";
00229
00232
00233 PyTypeObject rpmdb_Type = {
00234 PyObject_HEAD_INIT(&PyType_Type)
00235 0,
00236 "rpm.db",
00237 sizeof(rpmdbObject),
00238 0,
00239 (destructor) rpmdb_dealloc,
00240 0,
00241 (getattrfunc)0,
00242 0,
00243 0,
00244 0,
00245 0,
00246 0,
00247 &rpmdb_as_mapping,
00248 0,
00249 0,
00250 0,
00251 (getattrofunc) rpmdb_getattro,
00252 (setattrofunc) rpmdb_setattro,
00253 0,
00254 Py_TPFLAGS_DEFAULT,
00255 rpmdb_doc,
00256 #if Py_TPFLAGS_HAVE_ITER
00257 0,
00258 0,
00259 0,
00260 0,
00261 0,
00262 0,
00263 rpmdb_methods,
00264 0,
00265 0,
00266 0,
00267 0,
00268 0,
00269 0,
00270 0,
00271 0,
00272 0,
00273 0,
00274 0,
00275 0,
00276 #endif
00277 };
00278
00279
00280 #ifdef _LEGACY_BINDINGS_TOO
00281 rpmdb dbFromDb(rpmdbObject * db)
00282 {
00283 return db->db;
00284 }
00285
00288 rpmdbObject * rpmOpenDB( 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
00305 errsize = strlen(errmsg) + *root == '\0' ? 15 : strlen(root);
00306 errstr = alloca(errsize);
00307
00308 snprintf(errstr, errsize, errmsg, *root == '\0' ? "/var/lib/rpm" : root);
00309
00310 PyErr_SetString(pyrpmError, errstr);
00311 return NULL;
00312 }
00313
00314 return o;
00315 }
00316
00320 PyObject * rebuildDB ( 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