rpm 5.3.7
|
00001 00005 #include "system.h" 00006 00007 #include <rpmio.h> 00008 #include <rpmcb.h> /* XXX fnpyKey */ 00009 #include <rpmtypes.h> 00010 #include <rpmtag.h> 00011 #include <rpmdb.h> 00012 00013 #include "rpmmi-py.h" 00014 #include "header-py.h" 00015 00016 #include "debug.h" 00017 00069 static PyObject * 00070 rpmmi_iter(rpmmiObject * s) 00071 /*@*/ 00072 { 00073 Py_INCREF(s); 00074 return (PyObject *)s; 00075 } 00076 00079 /*@null@*/ 00080 static PyObject * 00081 rpmmi_iternext(rpmmiObject * s) 00082 /*@globals rpmGlobalMacroContext @*/ 00083 /*@modifies s, rpmGlobalMacroContext @*/ 00084 { 00085 Header h; 00086 00087 if (s->mi == NULL || (h = rpmmiNext(s->mi)) == NULL) { 00088 s->mi = rpmmiFree(s->mi); 00089 return NULL; 00090 } 00091 return (PyObject *) hdr_Wrap(h); 00092 } 00093 00096 /*@null@*/ 00097 static PyObject * 00098 rpmmi_Next(rpmmiObject * s) 00099 /*@globals rpmGlobalMacroContext, _Py_NoneStruct @*/ 00100 /*@modifies s, rpmGlobalMacroContext, _Py_NoneStruct @*/ 00101 { 00102 PyObject * result; 00103 00104 result = rpmmi_iternext(s); 00105 00106 if (result == NULL) { 00107 Py_INCREF(Py_None); 00108 return Py_None; 00109 } 00110 return result; 00111 } 00112 00117 00120 /*@null@*/ 00121 static PyObject * 00122 rpmmi_Instance(rpmmiObject * s) 00123 /*@*/ 00124 { 00125 uint32_t hdrNum = (s->mi != NULL) ? rpmmiInstance(s->mi) : 0; 00126 return Py_BuildValue("i", hdrNum); 00127 } 00128 00131 /*@null@*/ 00132 static PyObject * 00133 rpmmi_Count(rpmmiObject * s) 00134 /*@*/ 00135 { 00136 int rc = 0; 00137 00138 if (s->mi != NULL) 00139 rc = rpmmiCount(s->mi); 00140 00141 return Py_BuildValue("i", rc); 00142 } 00143 00146 /*@null@*/ 00147 static PyObject * 00148 rpmmi_Pattern(rpmmiObject * s, PyObject * args, PyObject * kwds) 00149 /*@globals rpmGlobalMacroContext, _Py_NoneStruct @*/ 00150 /*@modifies s, rpmGlobalMacroContext, _Py_NoneStruct @*/ 00151 { 00152 PyObject *TagN = NULL; 00153 int type; 00154 char * pattern; 00155 rpmTag tag; 00156 char * kwlist[] = {"tag", "type", "pattern", NULL}; 00157 00158 if (!PyArg_ParseTupleAndKeywords(args, kwds, "Ois:Pattern", kwlist, 00159 &TagN, &type, &pattern)) 00160 return NULL; 00161 00162 if ((tag = tagNumFromPyObject (TagN)) == (rpmTag)-1) { 00163 PyErr_SetString(PyExc_TypeError, "unknown tag type"); 00164 return NULL; 00165 } 00166 00167 rpmmiAddPattern(s->mi, tag, type, pattern); 00168 00169 Py_INCREF (Py_None); 00170 return Py_None; 00171 00172 } 00173 00178 /*@-fullinitblock@*/ 00179 /*@unchecked@*/ /*@observer@*/ 00180 static struct PyMethodDef rpmmi_methods[] = { 00181 {"next", (PyCFunction) rpmmi_Next, METH_NOARGS, 00182 "mi.next() -> hdr\n\ 00183 - Retrieve next header that matches. Iterate directly in python if possible.\n" }, 00184 {"instance", (PyCFunction) rpmmi_Instance, METH_NOARGS, 00185 NULL }, 00186 {"count", (PyCFunction) rpmmi_Count, METH_NOARGS, 00187 NULL }, 00188 {"pattern", (PyCFunction) rpmmi_Pattern, METH_VARARGS|METH_KEYWORDS, 00189 "mi.pattern(TagN, mire_type, pattern)\n\ 00190 - Set a secondary match pattern on tags from retrieved header.\n" }, 00191 {NULL, NULL} /* sentinel */ 00192 }; 00193 /*@=fullinitblock@*/ 00194 00197 static void rpmmi_dealloc(/*@only@*/ /*@null@*/ rpmmiObject * s) 00198 /*@globals rpmGlobalMacroContext @*/ 00199 /*@modifies s, rpmGlobalMacroContext @*/ 00200 { 00201 if (s) { 00202 s->mi = rpmmiFree(s->mi); 00203 PyObject_Del(s); 00204 } 00205 } 00206 00207 static PyObject * rpmmi_getattro(PyObject * o, PyObject * n) 00208 /*@*/ 00209 { 00210 return PyObject_GenericGetAttr(o, n); 00211 } 00212 00213 static int rpmmi_setattro(PyObject * o, PyObject * n, PyObject * v) 00214 /*@*/ 00215 { 00216 return PyObject_GenericSetAttr(o, n, v); 00217 } 00218 00221 /*@unchecked@*/ /*@observer@*/ 00222 static char rpmmi_doc[] = 00223 ""; 00224 00227 /*@-fullinitblock@*/ 00228 PyTypeObject rpmmi_Type = { 00229 PyObject_HEAD_INIT(&PyType_Type) 00230 0, /* ob_size */ 00231 "rpm.mi", /* tp_name */ 00232 sizeof(rpmmiObject), /* tp_size */ 00233 0, /* tp_itemsize */ 00234 (destructor) rpmmi_dealloc, /* tp_dealloc */ 00235 0, /* tp_print */ 00236 (getattrfunc)0, /* tp_getattr */ 00237 0, /* tp_setattr */ 00238 0, /* tp_compare */ 00239 0, /* tp_repr */ 00240 0, /* tp_as_number */ 00241 0, /* tp_as_sequence */ 00242 0, /* tp_as_mapping */ 00243 0, /* tp_hash */ 00244 0, /* tp_call */ 00245 0, /* tp_str */ 00246 (getattrofunc) rpmmi_getattro, /* tp_getattro */ 00247 (setattrofunc) rpmmi_setattro, /* tp_setattro */ 00248 0, /* tp_as_buffer */ 00249 Py_TPFLAGS_DEFAULT, /* tp_flags */ 00250 rpmmi_doc, /* tp_doc */ 00251 #if Py_TPFLAGS_HAVE_ITER 00252 0, /* tp_traverse */ 00253 0, /* tp_clear */ 00254 0, /* tp_richcompare */ 00255 0, /* tp_weaklistoffset */ 00256 (getiterfunc) rpmmi_iter, /* tp_iter */ 00257 (iternextfunc) rpmmi_iternext, /* tp_iternext */ 00258 rpmmi_methods, /* tp_methods */ 00259 0, /* tp_members */ 00260 0, /* tp_getset */ 00261 0, /* tp_base */ 00262 0, /* tp_dict */ 00263 0, /* tp_descr_get */ 00264 0, /* tp_descr_set */ 00265 0, /* tp_dictoffset */ 00266 0, /* tp_init */ 00267 0, /* tp_alloc */ 00268 0, /* tp_new */ 00269 0, /* tp_free */ 00270 0, /* tp_is_gc */ 00271 #endif 00272 }; 00273 /*@=fullinitblock@*/ 00274 00275 rpmmiObject * rpmmi_Wrap(rpmmi mi) 00276 { 00277 rpmmiObject * mio = (rpmmiObject *) PyObject_New(rpmmiObject, &rpmmi_Type); 00278 00279 if (mio == NULL) { 00280 PyErr_SetString(pyrpmError, "out of memory creating rpmmiObject"); 00281 return NULL; 00282 } 00283 mio->mi = mi; 00284 return mio; 00285 }