00001
00005 #include "system.h"
00006
00007 #include <rpmio.h>
00008 #include <rpmcb.h>
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
00080 static PyObject *
00081 rpmmi_iternext(rpmmiObject * s)
00082
00083
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
00097 static PyObject *
00098 rpmmi_Next(rpmmiObject * s)
00099
00100
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
00121 static PyObject *
00122 rpmmi_Instance(rpmmiObject * s)
00123
00124 {
00125 int rc = 0;
00126
00127 if (s->mi != NULL)
00128 rc = rpmmiInstance(s->mi);
00129
00130 return Py_BuildValue("i", rc);
00131 }
00132
00135
00136 static PyObject *
00137 rpmmi_Count(rpmmiObject * s)
00138
00139 {
00140 int rc = 0;
00141
00142 if (s->mi != NULL)
00143 rc = rpmmiCount(s->mi);
00144
00145 return Py_BuildValue("i", rc);
00146 }
00147
00150
00151 static PyObject *
00152 rpmmi_Pattern(rpmmiObject * s, PyObject * args, PyObject * kwds)
00153
00154
00155 {
00156 PyObject *TagN = NULL;
00157 int type;
00158 char * pattern;
00159 rpmTag tag;
00160 char * kwlist[] = {"tag", "type", "pattern", NULL};
00161
00162 if (!PyArg_ParseTupleAndKeywords(args, kwds, "Ois:Pattern", kwlist,
00163 &TagN, &type, &pattern))
00164 return NULL;
00165
00166 if ((tag = tagNumFromPyObject (TagN)) == (rpmTag)-1) {
00167 PyErr_SetString(PyExc_TypeError, "unknown tag type");
00168 return NULL;
00169 }
00170
00171 rpmmiAddPattern(s->mi, tag, type, pattern);
00172
00173 Py_INCREF (Py_None);
00174 return Py_None;
00175
00176 }
00177
00182
00183
00184 static struct PyMethodDef rpmmi_methods[] = {
00185 {"next", (PyCFunction) rpmmi_Next, METH_NOARGS,
00186 "mi.next() -> hdr\n\
00187 - Retrieve next header that matches. Iterate directly in python if possible.\n" },
00188 {"instance", (PyCFunction) rpmmi_Instance, METH_NOARGS,
00189 NULL },
00190 {"count", (PyCFunction) rpmmi_Count, METH_NOARGS,
00191 NULL },
00192 {"pattern", (PyCFunction) rpmmi_Pattern, METH_VARARGS|METH_KEYWORDS,
00193 "mi.pattern(TagN, mire_type, pattern)\n\
00194 - Set a secondary match pattern on tags from retrieved header.\n" },
00195 {NULL, NULL}
00196 };
00197
00198
00201 static void rpmmi_dealloc( rpmmiObject * s)
00202
00203
00204 {
00205 if (s) {
00206 s->mi = rpmmiFree(s->mi);
00207 PyObject_Del(s);
00208 }
00209 }
00210
00211 static PyObject * rpmmi_getattro(PyObject * o, PyObject * n)
00212
00213 {
00214 return PyObject_GenericGetAttr(o, n);
00215 }
00216
00217 static int rpmmi_setattro(PyObject * o, PyObject * n, PyObject * v)
00218
00219 {
00220 return PyObject_GenericSetAttr(o, n, v);
00221 }
00222
00225
00226 static char rpmmi_doc[] =
00227 "";
00228
00231
00232 PyTypeObject rpmmi_Type = {
00233 PyObject_HEAD_INIT(&PyType_Type)
00234 0,
00235 "rpm.mi",
00236 sizeof(rpmmiObject),
00237 0,
00238 (destructor) rpmmi_dealloc,
00239 0,
00240 (getattrfunc)0,
00241 0,
00242 0,
00243 0,
00244 0,
00245 0,
00246 0,
00247 0,
00248 0,
00249 0,
00250 (getattrofunc) rpmmi_getattro,
00251 (setattrofunc) rpmmi_setattro,
00252 0,
00253 Py_TPFLAGS_DEFAULT,
00254 rpmmi_doc,
00255 #if Py_TPFLAGS_HAVE_ITER
00256 0,
00257 0,
00258 0,
00259 0,
00260 (getiterfunc) rpmmi_iter,
00261 (iternextfunc) rpmmi_iternext,
00262 rpmmi_methods,
00263 0,
00264 0,
00265 0,
00266 0,
00267 0,
00268 0,
00269 0,
00270 0,
00271 0,
00272 0,
00273 0,
00274 0,
00275 #endif
00276 };
00277
00278
00279 rpmmiObject * rpmmi_Wrap(rpmmi mi)
00280 {
00281 rpmmiObject * mio = (rpmmiObject *) PyObject_New(rpmmiObject, &rpmmi_Type);
00282
00283 if (mio == NULL) {
00284 PyErr_SetString(pyrpmError, "out of memory creating rpmmiObject");
00285 return NULL;
00286 }
00287 mio->mi = mi;
00288 return mio;
00289 }