rpm
4.5
|
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