summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2009-04-14 22:14:10 +0200
committerJulian Andres Klode <jak@debian.org>2009-04-14 22:14:10 +0200
commit3caa05aa8e295d338be4bfbe7fdd2e825a59d947 (patch)
treea2fc7347820381351123bcc5b6a61f2238cc825f
parent444b2afea3b58cc55fbf4b9deb6d20c4475c8fef (diff)
downloadpython-apt-3caa05aa8e295d338be4bfbe7fdd2e825a59d947.tar.gz
* python/pkgsrcrecords.cc: Use GetSet properties for PkgSrcRecordsType
This time, it is a bit more complicated because we have to raise an AttributeError when no package has been looked up.
-rw-r--r--python/apt_pkgmodule.cc1
-rw-r--r--python/apt_pkgmodule.h1
-rw-r--r--python/pkgsrcrecords.cc178
3 files changed, 119 insertions, 61 deletions
diff --git a/python/apt_pkgmodule.cc b/python/apt_pkgmodule.cc
index 4e718ffa..92727b6f 100644
--- a/python/apt_pkgmodule.cc
+++ b/python/apt_pkgmodule.cc
@@ -488,6 +488,7 @@ extern "C" void initapt_pkg()
if (PyType_Ready(&PkgAcquireType) == -1) return;
if (PyType_Ready(&PackageIndexFileType) == -1) return;
if (PyType_Ready(&PkgManagerType) == -1) return;
+ if (PyType_Ready(&PkgSrcRecordsType) == -1) return;
// Initialize the module
diff --git a/python/apt_pkgmodule.h b/python/apt_pkgmodule.h
index ea8e33df..d2631864 100644
--- a/python/apt_pkgmodule.h
+++ b/python/apt_pkgmodule.h
@@ -89,6 +89,7 @@ PyObject *GetPkgManager(PyObject *Self,PyObject *Args);
// PkgRecords Stuff
extern PyTypeObject PkgRecordsType;
+extern PyTypeObject PkgSrcRecordsType;
PyObject *GetPkgRecords(PyObject *Self,PyObject *Args);
PyObject *GetPkgSrcRecords(PyObject *Self,PyObject *Args);
diff --git a/python/pkgsrcrecords.cc b/python/pkgsrcrecords.cc
index f7f5d7a2..c830f8d2 100644
--- a/python/pkgsrcrecords.cc
+++ b/python/pkgsrcrecords.cc
@@ -75,71 +75,111 @@ static PyMethodDef PkgSrcRecordsMethods[] =
{}
};
-static PyObject *PkgSrcRecordsAttr(PyObject *Self,char *Name)
-{
+/**
+ * Get the PkgSrcRecordsStruct from a PyObject. If no package has been looked
+ * up, set an AttributeError using the given name.
+ */
+static inline PkgSrcRecordsStruct &GetStruct(PyObject *Self,char *name) {
PkgSrcRecordsStruct &Struct = GetCpp<PkgSrcRecordsStruct>(Self);
+ if (Struct.Last == 0)
+ PyErr_SetString(PyExc_AttributeError,name);
+ return Struct;
+}
+
+static PyObject *PkgSrcRecordsGetPackage(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Package");
+ return (Struct.Last != 0) ? CppPyString(Struct.Last->Package()) : 0;
+}
+static PyObject *PkgSrcRecordsGetVersion(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Version");
+ return (Struct.Last != 0) ? CppPyString(Struct.Last->Version()) : 0;
+}
+static PyObject *PkgSrcRecordsGetMaintainer(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Maintainer");
+ return (Struct.Last != 0) ? CppPyString(Struct.Last->Maintainer()) : 0;
+}
+static PyObject *PkgSrcRecordsGetSection(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Section");
+ return (Struct.Last != 0) ? CppPyString(Struct.Last->Section()) : 0;
+}
+static PyObject *PkgSrcRecordsGetRecord(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Record");
+ return (Struct.Last != 0) ? CppPyString(Struct.Last->AsStr()) : 0;
+}
+static PyObject *PkgSrcRecordsGetBinaries(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Binaries");
+ if (Struct.Last == 0)
+ return 0;
+ PyObject *List = PyList_New(0);
+ for(const char **b = Struct.Last->Binaries(); *b != 0; ++b)
+ PyList_Append(List, CppPyString(*b));
+ return List; // todo
+}
+static PyObject *PkgSrcRecordsGetIndex(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Index");
+ if (Struct.Last == 0)
+ return 0;
+ const pkgIndexFile &tmp = Struct.Last->Index();
+ return CppOwnedPyObject_NEW<pkgIndexFile*>(Self,&PackageIndexFileType,
+ (pkgIndexFile*)&tmp);
+}
- if (Struct.Last != 0)
- {
- if (strcmp("Package",Name) == 0)
- return CppPyString(Struct.Last->Package());
- else if (strcmp("Version",Name) == 0)
- return CppPyString(Struct.Last->Version());
- else if (strcmp("Maintainer",Name) == 0)
- return CppPyString(Struct.Last->Maintainer());
- else if (strcmp("Section",Name) == 0)
- return CppPyString(Struct.Last->Section());
- else if (strcmp("Record",Name) == 0)
- return CppPyString(Struct.Last->AsStr());
- else if (strcmp("Binaries",Name) == 0) {
- PyObject *List = PyList_New(0);
-
- for(const char **b = Struct.Last->Binaries();
- *b != 0;
- ++b)
- PyList_Append(List, CppPyString(*b));
- return List; // todo
- } else if (strcmp("Index",Name) == 0) {
- const pkgIndexFile &tmp = Struct.Last->Index();
- return CppOwnedPyObject_NEW<pkgIndexFile*>(Self,&PackageIndexFileType, (pkgIndexFile*)&tmp);
- } else if (strcmp("Files",Name) == 0) {
- PyObject *List = PyList_New(0);
-
- vector<pkgSrcRecords::File> f;
- if(!Struct.Last->Files(f))
- return NULL; // error
-
- PyObject *v;
- for(unsigned int i=0;i<f.size();i++) {
- v = Py_BuildValue("(siss)",
- f[i].MD5Hash.c_str(),
- f[i].Size,
- f[i].Path.c_str(),
- f[i].Type.c_str());
- PyList_Append(List, v);
- Py_DECREF(v);
- }
- return List;
- } else if (strcmp("BuildDepends",Name) == 0) {
- PyObject *List = PyList_New(0);
-
- vector<pkgSrcRecords::Parser::BuildDepRec> bd;
- if(!Struct.Last->BuildDepends(bd, false /* arch-only*/))
- return NULL; // error
-
- PyObject *v;
- for(unsigned int i=0;i<bd.size();i++) {
- v = Py_BuildValue("(ssii)", bd[i].Package.c_str(),
- bd[i].Version.c_str(), bd[i].Op, bd[i].Type);
- PyList_Append(List, v);
- Py_DECREF(v);
- }
- return List;
- }
+static PyObject *PkgSrcRecordsGetFiles(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"Files");
+ if (Struct.Last == 0)
+ return 0;
+ PyObject *List = PyList_New(0);
+
+ vector<pkgSrcRecords::File> f;
+ if(!Struct.Last->Files(f))
+ return NULL; // error
+
+ PyObject *v;
+ for(unsigned int i=0;i<f.size();i++) {
+ v = Py_BuildValue("(siss)",
+ f[i].MD5Hash.c_str(),
+ f[i].Size,
+ f[i].Path.c_str(),
+ f[i].Type.c_str());
+ PyList_Append(List, v);
+ Py_DECREF(v);
}
+ return List;
+}
- return Py_FindMethod(PkgSrcRecordsMethods,Self,Name);
+static PyObject *PkgSrcRecordsGetBuildDepends(PyObject *Self,void*) {
+ PkgSrcRecordsStruct &Struct = GetStruct(Self,"BuildDepends");
+ if (Struct.Last == 0)
+ return 0;
+ PyObject *List = PyList_New(0);
+
+ vector<pkgSrcRecords::Parser::BuildDepRec> bd;
+ if(!Struct.Last->BuildDepends(bd, false /* arch-only*/))
+ return NULL; // error
+
+ PyObject *v;
+ for(unsigned int i=0;i<bd.size();i++) {
+ v = Py_BuildValue("(ssii)", bd[i].Package.c_str(),
+ bd[i].Version.c_str(), bd[i].Op, bd[i].Type);
+ PyList_Append(List, v);
+ Py_DECREF(v);
+ }
+ return List;
}
+
+static PyGetSetDef PkgSrcRecordsGetSet[] = {
+ {"Binaries",PkgSrcRecordsGetBinaries},
+ {"BuildDepends",PkgSrcRecordsGetBuildDepends},
+ {"Files",PkgSrcRecordsGetFiles},
+ {"Index",PkgSrcRecordsGetIndex},
+ {"Maintainer",PkgSrcRecordsGetMaintainer},
+ {"Package",PkgSrcRecordsGetPackage},
+ {"Record",PkgSrcRecordsGetRecord},
+ {"Section",PkgSrcRecordsGetSection},
+ {"Version",PkgSrcRecordsGetVersion},
+ {}
+};
+
PyTypeObject PkgSrcRecordsType =
{
PyObject_HEAD_INIT(&PyType_Type)
@@ -150,7 +190,7 @@ PyTypeObject PkgSrcRecordsType =
// Methods
CppDealloc<PkgSrcRecordsStruct>, // tp_dealloc
0, // tp_print
- PkgSrcRecordsAttr, // tp_getattr
+ 0, // tp_getattr
0, // tp_setattr
0, // tp_compare
0, // tp_repr
@@ -158,6 +198,22 @@ PyTypeObject PkgSrcRecordsType =
0, // tp_as_sequence
0, // tp_as_mapping
0, // tp_hash
+ 0, // tp_call
+ 0, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT, // tp_flags
+ "SourceRecords Object", // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ 0, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ PkgSrcRecordsMethods, // tp_methods
+ 0, // tp_members
+ PkgSrcRecordsGetSet, // tp_getset
};
/*}}}*/