00001
00005 #include "system.h"
00006
00007 #include "Python.h"
00008 #ifdef __LCLINT__
00009 #undef PyObject_HEAD
00010 #define PyObject_HEAD int _PyObjectHead;
00011 #endif
00012
00013 #include <rpmlib.h>
00014 #include <rpmdb.h>
00015
00016 #include "rpmmi-py.h"
00017 #include "header-py.h"
00018
00019 #include "debug.h"
00020
00074
00077 static PyObject *
00078 rpmmi_iter(rpmmiObject * s)
00079
00080 {
00081 Py_INCREF(s);
00082 return (PyObject *)s;
00083 }
00084
00087 static PyObject *
00088 rpmmi_iternext(rpmmiObject * s)
00089
00090
00091 {
00092 Header h;
00093
00094 if (s->mi == NULL || (h = rpmdbNextIterator(s->mi)) == NULL) {
00095 s->mi = rpmdbFreeIterator(s->mi);
00096 return NULL;
00097 }
00098 return (PyObject *) hdr_Wrap(h);
00099 }
00100
00103 static PyObject *
00104 rpmmi_Next(rpmmiObject * s, PyObject *args)
00105
00106
00107 {
00108 PyObject * result;
00109
00110 if (!PyArg_ParseTuple(args, ":Next"))
00111 return NULL;
00112
00113 result = rpmmi_iternext(s);
00114
00115 if (result == NULL) {
00116 Py_INCREF(Py_None);
00117 return Py_None;
00118 }
00119 return result;
00120 }
00121
00124 static PyObject *
00125 rpmmi_Instance(rpmmiObject * s, PyObject * args)
00126
00127
00128 {
00129 int rc = 0;
00130
00131 if (!PyArg_ParseTuple(args, ":Instance"))
00132 return NULL;
00133
00134 if (s->mi)
00135 rc = rpmdbGetIteratorOffset(s->mi);
00136
00137 return Py_BuildValue("i", rc);
00138 }
00139
00142 static PyObject *
00143 rpmmi_Count(rpmmiObject * s, PyObject * args)
00144
00145
00146 {
00147 int rc = 0;
00148
00149 if (!PyArg_ParseTuple(args, ":Instance"))
00150 return NULL;
00151
00152 if (s->mi)
00153 rc = rpmdbGetIteratorCount(s->mi);
00154
00155 return Py_BuildValue("i", rc);
00156 }
00157
00160 static PyObject *
00161 rpmmi_Pattern(rpmmiObject * s, PyObject * args)
00162
00163
00164 {
00165 PyObject *TagN = NULL;
00166 int type;
00167 char * pattern;
00168 rpmTag tag;
00169
00170 if (!PyArg_ParseTuple(args, "Ois:Pattern", &TagN, &type, &pattern))
00171 return NULL;
00172
00173 if ((tag = tagNumFromPyObject (TagN)) == -1) {
00174 PyErr_SetString(PyExc_TypeError, "unknown tag type");
00175 return NULL;
00176 }
00177
00178 rpmdbSetIteratorRE(s->mi, tag, type, pattern);
00179
00180 Py_INCREF (Py_None);
00181 return Py_None;
00182
00183 }
00184
00187
00188
00189 static struct PyMethodDef rpmmi_methods[] = {
00190 {"next", (PyCFunction) rpmmi_Next, METH_VARARGS,
00191 "mi.next() -> hdr\n\
00192 - Retrieve next header that matches. Iterate directly in python if possible.\n" },
00193 {"instance", (PyCFunction) rpmmi_Instance, METH_VARARGS,
00194 NULL },
00195 {"count", (PyCFunction) rpmmi_Count, METH_VARARGS,
00196 NULL },
00197 {"pattern", (PyCFunction) rpmmi_Pattern, METH_VARARGS,
00198 "mi.pattern(TagN, mire_type, pattern)\n\
00199 - Set a secondary match pattern on tags from retrieved header.\n" },
00200 {NULL, NULL}
00201 };
00202
00203
00206 static void rpmmi_dealloc( rpmmiObject * s)
00207
00208 {
00209 if (s) {
00210 if (s->mi) s->mi = rpmdbFreeIterator(s->mi);
00211 PyMem_DEL(s);
00212 }
00213 }
00214
00217 static PyObject * rpmmi_getattr (rpmmiObject *s, char *name)
00218
00219 {
00220 return Py_FindMethod (rpmmi_methods, (PyObject *) s, name);
00221 }
00222
00225
00226 static char rpmmi_doc[] =
00227 "";
00228
00231
00232 PyTypeObject rpmmi_Type = {
00233 PyObject_HEAD_INIT(NULL)
00234 0,
00235 "rpm.mi",
00236 sizeof(rpmmiObject),
00237 0,
00238 (destructor) rpmmi_dealloc,
00239 0,
00240 (getattrfunc) rpmmi_getattr,
00241 0,
00242 0,
00243 0,
00244 0,
00245 0,
00246 0,
00247 0,
00248 0,
00249 0,
00250 0,
00251 0,
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(rpmdbMatchIterator 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 }
00290