Bind rpmds as class derived from header.

CVS patchset: 5444
CVS date: 2002/05/23 00:49:19
This commit is contained in:
jbj 2002-05-23 00:49:19 +00:00
parent 4008c689df
commit 0f0184d17f
5 changed files with 294 additions and 12 deletions

View File

@ -33,7 +33,8 @@ poptmodule_so_SOURCES = poptmodule.c
poptmodule_so_LDFLAGS = $(mylibs) $(LIBS) -shared -Wl,-soname,poptmodule.so
noinst_LTLIBRARIES = librpmmodule.la
librpmmodule_la_SOURCES = rpmmodule.c hash.c upgrade.c header-py.c db-py.c
librpmmodule_la_SOURCES = rpmmodule.c hash.c upgrade.c \
db-py.c header-py.c rpmds-py.c
rpmmodule.so$(EXEEXT): $(librpmmodule_la_OBJECTS)
$(LINK) -o $@ $(librpmmodule_la_OBJECTS) $(rpmmodule_so_LDFLAGS)

View File

@ -229,7 +229,9 @@ poptmodule_so_SOURCES = poptmodule.c
poptmodule_so_LDFLAGS = $(mylibs) $(LIBS) -shared -Wl,-soname,poptmodule.so
noinst_LTLIBRARIES = librpmmodule.la
librpmmodule_la_SOURCES = rpmmodule.c hash.c upgrade.c header-py.c db-py.c
librpmmodule_la_SOURCES = rpmmodule.c hash.c upgrade.c \
db-py.c header-py.c rpmds-py.c
subdir = python
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
@ -238,8 +240,8 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
librpmmodule_la_LDFLAGS =
librpmmodule_la_LIBADD =
am_librpmmodule_la_OBJECTS = rpmmodule.lo hash.lo upgrade.lo \
header-py.lo db-py.lo
am_librpmmodule_la_OBJECTS = rpmmodule.lo hash.lo upgrade.lo db-py.lo \
header-py.lo rpmds-py.lo
librpmmodule_la_OBJECTS = $(am_librpmmodule_la_OBJECTS)
python_PROGRAMS = rpmmodule.so$(EXEEXT) poptmodule.so$(EXEEXT)
PROGRAMS = $(python_PROGRAMS)
@ -262,7 +264,8 @@ depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/db-py.Plo ./$(DEPDIR)/hash.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/header-py.Plo ./$(DEPDIR)/poptmodule.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/rpmmodule.Plo ./$(DEPDIR)/upgrade.Plo
@AMDEP_TRUE@ ./$(DEPDIR)/rpmds-py.Plo ./$(DEPDIR)/rpmmodule.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/upgrade.Plo
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \
@ -328,6 +331,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/header-py.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/poptmodule.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpmds-py.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpmmodule.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/upgrade.Plo@am__quote@

View File

@ -17,6 +17,7 @@
#include "header_internal.h"
#include "header-py.h"
#include "rpmds-py.h"
/** \ingroup python
* \class header
@ -37,28 +38,33 @@
* import os, rpm
*
* fd = os.open("/tmp/foo-1.0-1.i386.rpm", os.O_RDONLY)
* (header, isSource) = rpm.headerFromPackage(fd)
* fd.close()
* hdr = rpm.headerFromPackage(fd)[0]
* os.close(fd)
* \endcode
*
* The Python interface to the header data is quite elegant. It
* presents the data in a dictionary form. We'll take the header we
* just loaded and access the data within it:
* \code
* print header[rpm.RPMTAG_NAME]
* print header[rpm.RPMTAG_VERSION]
* print header[rpm.RPMTAG_RELEASE]
* print hdr[rpm.RPMTAG_NAME]
* print hdr[rpm.RPMTAG_VERSION]
* print hdr[rpm.RPMTAG_RELEASE]
* \endcode
* in the case of our "foor-1.0-1.i386.rpm" package, this code would
* in the case of our "foo-1.0-1.i386.rpm" package, this code would
* output:
\verbatim
foo
1.0
1
\endverbatim
*
* You make also access the header data by string name:
* \code
* print header['name']
* print hdr['name']
* print hdr['version']
* print hdr['release']
* \endcode
*
* This method of access is a bit slower because the name must be
* translated into the tag number dynamically. You also must make sure
* the strings in header lookups don't get translated, or the lookups
@ -532,6 +538,9 @@ static struct PyMethodDef hdrMethods[] = {
{"fullFilelist", (PyCFunction) hdrFullFilelist, 1 },
{"rhnUnload", (PyCFunction) rhnUnload, METH_VARARGS },
{"sprintf", (PyCFunction) hdrSprintf, METH_VARARGS },
{"dsFromHeader", (PyCFunction)hdr_dsFromHeader, METH_VARARGS, NULL},
{NULL, NULL} /* sentinel */
};

247
python/rpmds-py.c Normal file
View File

@ -0,0 +1,247 @@
/** \ingroup python
* \file python/rpmds-py.c
*/
#include "system.h"
#include "Python.h"
#include <rpmlib.h>
#include "rpmps.h"
#include "rpmds.h"
#include "header-py.h"
#include "rpmds-py.h"
#include "debug.h"
static PyObject *
rpmds_Debug(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, "i", &_rpmds_debug)) return NULL;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
rpmds_Count(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
return Py_BuildValue("i", rpmdsCount(s->ds));
}
static PyObject *
rpmds_Ix(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
return Py_BuildValue("i", rpmdsIx(s->ds));
}
static PyObject *
rpmds_DNEVR(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
return Py_BuildValue("s", xstrdup(rpmdsDNEVR(s->ds)));
}
static PyObject *
rpmds_N(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
return Py_BuildValue("s", xstrdup(rpmdsN(s->ds)));
}
static PyObject *
rpmds_EVR(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
return Py_BuildValue("s", xstrdup(rpmdsEVR(s->ds)));
}
static PyObject *
rpmds_Flags(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
return Py_BuildValue("i", rpmdsFlags(s->ds));
}
static PyObject *
rpmds_TagN(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, "")) return NULL;
return Py_BuildValue("i", rpmdsTagN(s->ds));
}
#ifdef NOTYET
static PyObject *
rpmds_Notify(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, ""))
return NULL;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
rpmds_Next(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, ""))
return NULL;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
rpmds_Init(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, ""))
return NULL;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
rpmds_Compare(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, ""))
return NULL;
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
rpmds_Problem(rpmdsObject * s, PyObject * args)
{
if (!PyArg_ParseTuple(args, ""))
return NULL;
Py_INCREF(Py_None);
return Py_None;
}
#endif
static struct PyMethodDef rpmds_methods[] = {
{"Debug", (PyCFunction)rpmds_Debug, METH_VARARGS, NULL},
{"Count", (PyCFunction)rpmds_Count, METH_VARARGS, NULL},
{"Ix", (PyCFunction)rpmds_Ix, METH_VARARGS, NULL},
{"DNEVR", (PyCFunction)rpmds_DNEVR, METH_VARARGS, NULL},
{"N", (PyCFunction)rpmds_N, METH_VARARGS, NULL},
{"EVR", (PyCFunction)rpmds_EVR, METH_VARARGS, NULL},
{"Flags", (PyCFunction)rpmds_Flags, METH_VARARGS, NULL},
{"TagN", (PyCFunction)rpmds_TagN, METH_VARARGS, NULL},
#ifdef NOTYET
{"Notify", (PyCFunction)rpmds_Notify, METH_VARARGS, NULL},
{"Next", (PyCFunction)rpmds_Next, METH_VARARGS, NULL},
{"Init", (PyCFunction)rpmds_Init, METH_VARARGS, NULL},
{"Compare", (PyCFunction)rpmds_Compare, METH_VARARGS, NULL},
{"Problem", (PyCFunction)rpmds_Problem, METH_VARARGS, NULL},
#endif
{NULL, NULL} /* sentinel */
};
/* ---------- */
static void
rpmds_dealloc(rpmdsObject * s)
{
if (s && s->ds)
s->ds = rpmdsFree(s->ds);
PyMem_DEL(s);
}
static int
rpmds_print(rpmdsObject * s, FILE * fp, int flags)
{
if (!(s && s->ds))
return -1;
rpmdsInit(s->ds);
while (rpmdsNext(s->ds) >= 0)
fprintf(fp, "%s\n", rpmdsDNEVR(s->ds));
return 0;
}
static PyObject *
rpmds_getattr(rpmdsObject * s, char * name)
{
return Py_FindMethod(rpmds_methods, (PyObject *)s, name);
}
static int
rpmds_length(rpmdsObject * s)
{
return rpmdsCount(s->ds);
}
static PyObject *
rpmds_subscript(rpmdsObject * s, PyObject * key)
{
int ix;
if (!PyInt_Check(key)) {
PyErr_SetString(PyExc_TypeError, "integer expected");
return NULL;
}
ix = (int) PyInt_AsLong(key);
rpmdsSetIx(s->ds, ix);
return Py_BuildValue("s", xstrdup(rpmdsDNEVR(s->ds)));
}
static PyMappingMethods rpmds_as_mapping = {
(inquiry) rpmds_length, /* mp_length */
(binaryfunc) rpmds_subscript, /* mp_subscript */
(objobjargproc)0, /* mp_ass_subscript */
};
static PyTypeObject rpmds_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0, /* ob_size */
"rpmds", /* tp_name */
sizeof(rpmdsObject), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
(destructor)rpmds_dealloc, /* tp_dealloc */
(printfunc)rpmds_print, /* tp_print */
(getattrfunc)rpmds_getattr, /* tp_getattr */
(setattrfunc)0, /* tp_setattr */
(cmpfunc)0, /* tp_compare */
(reprfunc)0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
&rpmds_as_mapping, /* tp_as_mapping */
(hashfunc)0, /* tp_hash */
(ternaryfunc)0, /* tp_call */
(reprfunc)0, /* tp_str */
/* Space for future expansion */
0L,0L,0L,0L,
NULL /* Documentation string */
};
/* ---------- */
rpmds dsFromDs(rpmdsObject * s)
{
return s->ds;
}
rpmdsObject *
rpmds_New(rpmds ds)
{
rpmdsObject *s = PyObject_NEW(rpmdsObject, &rpmds_Type);
if (s == NULL)
return NULL;
s->ds = ds;
return s;
}
rpmdsObject *
hdr_dsFromHeader(PyObject * s, PyObject * args)
{
hdrObject * ho;
if (!PyArg_ParseTuple(args, "O!", &hdrType, &ho))
return NULL;
return rpmds_New( rpmdsNew(hdrGetHeader(ho), RPMTAG_REQUIRENAME, 0) );
}

21
python/rpmds-py.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef H_RPMDS_PY
#define H_RPMDS_PY
/** \ingroup python
* \file python/rpmds-py.h
*/
typedef struct rpmdsObject_s {
PyObject_HEAD
rpmds ds;
} rpmdsObject;
extern PyTypeObject rpmds_Type;
rpmds dsFromDs(rpmdsObject * ds);
rpmdsObject * rpmds_New(rpmds ds);
rpmdsObject * hdr_dsFromHeader(PyObject * s, PyObject * args);
#endif