[svn] commit: r2860 - in /branches/trac232/src/lib/datasrc: data_source.h python/libdata_source_python.cc python/tests/data_source_python_test.py
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Sep 8 10:52:46 UTC 2010
Author: jelte
Date: Wed Sep 8 10:52:46 2010
New Revision: 2860
Log:
findExactRRset, findAddrs and findReferral
Modified:
branches/trac232/src/lib/datasrc/data_source.h
branches/trac232/src/lib/datasrc/python/libdata_source_python.cc
branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py
Modified: branches/trac232/src/lib/datasrc/data_source.h
==============================================================================
--- branches/trac232/src/lib/datasrc/data_source.h (original)
+++ branches/trac232/src/lib/datasrc/data_source.h Wed Sep 8 10:52:46 2010
@@ -171,16 +171,6 @@
std::string& hash,
isc::dns::RRsetList& target) const = 0;
};
-
-// subclass this if you need specific data in your transaction model
-// TODO: should this also provide the outwards interface?
-// seems better to leave this as a pure data-holding class,
-// with only setters and getters
-
-//class DataSrcTransaction {
-//public:
-// virtual ~DataSrcTransaction() {};
-//};
///
/// \brief The \c DataSrcTransaction serves as a data container and
Modified: branches/trac232/src/lib/datasrc/python/libdata_source_python.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/python/libdata_source_python.cc (original)
+++ branches/trac232/src/lib/datasrc/python/libdata_source_python.cc Wed Sep 8 10:52:46 2010
@@ -74,6 +74,9 @@
static PyObject* DataSrc_init(s_DataSrc* self, PyObject *args);
static PyObject* DataSrc_close(s_DataSrc* self);
static PyObject* DataSrc_findRRset(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_findExactRRset(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_findAddrs(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_findReferral(s_DataSrc* self, PyObject* args);
static PyObject* DataSrc_startTransaction(s_DataSrc* self, PyObject* args);
static PyObject* DataSrc_commitTransaction(s_DataSrc* self, PyObject* args);
static PyObject* DataSrc_rollbackTransaction(s_DataSrc* self, PyObject* args);
@@ -87,6 +90,12 @@
"Closes the data source" },
{ "find_rrset", reinterpret_cast<PyCFunction>(DataSrc_findRRset), METH_VARARGS,
"Searches the datasource for an RRset" },
+ { "find_exact_rrset", reinterpret_cast<PyCFunction>(DataSrc_findExactRRset), METH_VARARGS,
+ "Searches the datasource for an RRset" },
+ { "find_addrs", reinterpret_cast<PyCFunction>(DataSrc_findAddrs), METH_VARARGS,
+ "Searches the datasource for an address list" },
+ { "find_referral", reinterpret_cast<PyCFunction>(DataSrc_findReferral), METH_VARARGS,
+ "Searches the datasource for a referral" },
{ "start_transaction", reinterpret_cast<PyCFunction>(DataSrc_startTransaction), METH_VARARGS,
"Start a transaction" },
{ "commit_transaction", reinterpret_cast<PyCFunction>(DataSrc_commitTransaction), METH_VARARGS,
@@ -489,6 +498,133 @@
}
static PyObject*
+DataSrc_findExactRRset(s_DataSrc* self, PyObject* args) {
+ PyObject* name_class = PyObject_GetAttrString(po_DNS_module, "Name");
+ PyObject* rrclass_class = PyObject_GetAttrString(po_DNS_module, "RRClass");
+ PyObject* rrtype_class = PyObject_GetAttrString(po_DNS_module, "RRType");
+ PyObject *name_obj, *class_obj, *type_obj, *result_list_obj, *zone_name_obj;
+ uint32_t flags;
+ int args_check = PyArg_ParseTuple(args, "O!O!O!OIO!",
+ name_class, &name_obj,
+ rrclass_class, &class_obj,
+ rrtype_class, &type_obj,
+ &result_list_obj,
+ &flags,
+ name_class, &zone_name_obj);
+ Py_DECREF(name_class);
+ Py_DECREF(rrclass_class);
+ Py_DECREF(rrtype_class);
+
+ if (args_check) {
+ if (!PyList_Check(result_list_obj)) {
+ PyErr_SetString(PyExc_TypeError,
+ "argument 4 of find_rrset is not a List");
+ return (NULL);
+ }
+ isc::dns::Name n = pyName_AsName(name_obj);
+ isc::dns::RRClass c = pyRRClass_AsRRClass(class_obj);
+ isc::dns::RRType t = pyRRType_AsRRType(type_obj);
+ isc::dns::Name zone_name = pyName_AsName(zone_name_obj);
+
+ isc::dns::RRsetList result_list;
+ isc::datasrc::DataSrc::Result result =
+ self->datasrc->findExactRRset(n, c, t, result_list,
+ flags, &zone_name);
+
+ BOOST_FOREACH(isc::dns::RRsetPtr rrs, result_list) {
+ PyObject *rrset_obj = pyRRset_FromRRset(*rrs);
+ PyList_Append(result_list_obj, rrset_obj);
+ Py_DECREF(rrset_obj);
+ }
+ return Py_BuildValue("I", result);
+ } else {
+ return (NULL);
+ }
+}
+
+static PyObject*
+DataSrc_findAddrs(s_DataSrc* self, PyObject* args) {
+ PyObject* name_class = PyObject_GetAttrString(po_DNS_module, "Name");
+ PyObject* rrclass_class = PyObject_GetAttrString(po_DNS_module, "RRClass");
+ PyObject *name_obj, *class_obj, *type_obj, *result_list_obj, *zone_name_obj;
+ uint32_t flags;
+ int args_check = PyArg_ParseTuple(args, "O!O!OIO!",
+ name_class, &name_obj,
+ rrclass_class, &class_obj,
+ &result_list_obj,
+ &flags,
+ name_class, &zone_name_obj);
+ Py_DECREF(name_class);
+ Py_DECREF(rrclass_class);
+
+ if (args_check) {
+ if (!PyList_Check(result_list_obj)) {
+ PyErr_SetString(PyExc_TypeError,
+ "argument 4 of find_rrset is not a List");
+ return (NULL);
+ }
+ isc::dns::Name n = pyName_AsName(name_obj);
+ isc::dns::RRClass c = pyRRClass_AsRRClass(class_obj);
+ isc::dns::Name zone_name = pyName_AsName(zone_name_obj);
+
+ isc::dns::RRsetList result_list;
+ isc::datasrc::DataSrc::Result result =
+ self->datasrc->findAddrs(n, c, result_list,
+ flags, &zone_name);
+
+ BOOST_FOREACH(isc::dns::RRsetPtr rrs, result_list) {
+ PyObject *rrset_obj = pyRRset_FromRRset(*rrs);
+ PyList_Append(result_list_obj, rrset_obj);
+ Py_DECREF(rrset_obj);
+ }
+ return Py_BuildValue("I", result);
+ } else {
+ return (NULL);
+ }
+}
+
+static PyObject*
+DataSrc_findReferral(s_DataSrc* self, PyObject* args) {
+ PyObject* name_class = PyObject_GetAttrString(po_DNS_module, "Name");
+ PyObject* rrclass_class = PyObject_GetAttrString(po_DNS_module, "RRClass");
+ PyObject *name_obj, *class_obj, *type_obj, *result_list_obj, *zone_name_obj;
+ uint32_t flags;
+ int args_check = PyArg_ParseTuple(args, "O!O!OIO!",
+ name_class, &name_obj,
+ rrclass_class, &class_obj,
+ &result_list_obj,
+ &flags,
+ name_class, &zone_name_obj);
+ Py_DECREF(name_class);
+ Py_DECREF(rrclass_class);
+
+ if (args_check) {
+ if (!PyList_Check(result_list_obj)) {
+ PyErr_SetString(PyExc_TypeError,
+ "argument 4 of find_rrset is not a List");
+ return (NULL);
+ }
+ isc::dns::Name n = pyName_AsName(name_obj);
+ isc::dns::RRClass c = pyRRClass_AsRRClass(class_obj);
+ isc::dns::Name zone_name = pyName_AsName(zone_name_obj);
+
+ isc::dns::RRsetList result_list;
+ isc::datasrc::DataSrc::Result result =
+ self->datasrc->findReferral(n, c, result_list,
+ flags, &zone_name);
+
+ BOOST_FOREACH(isc::dns::RRsetPtr rrs, result_list) {
+ PyObject *rrset_obj = pyRRset_FromRRset(*rrs);
+ PyList_Append(result_list_obj, rrset_obj);
+ Py_DECREF(rrset_obj);
+ }
+ return Py_BuildValue("I", result);
+ } else {
+ return (NULL);
+ }
+}
+
+static PyObject*
DataSrc_getClass(s_DataSrc* self) {
// Find the (python) type for the data we are asking for
PyObject* type = PyObject_GetAttrString(po_DNS_module, "RRClass");
Modified: branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py
==============================================================================
--- branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py (original)
+++ branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py Wed Sep 8 10:52:46 2010
@@ -63,6 +63,78 @@
self.assertRaises(TypeError, self.ds.find_rrset,
Name("www.doesnotexist.org"),
RRClass.IN(), RRType.A(), 0,
+ 0, Name("doesnotexist.org"));
+
+ def test_find_exact_rrset(self):
+ self.ds.init("{ \"database_file\": \""+ testdata_path + "/example.org.sqlite3\" }")
+ result = []
+ n = self.ds.find_exact_rrset(Name("www.example.org"), RRClass.IN(), RRType.A(), result, 0, Name("example.org"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(1, len(result))
+ self.assertEqual("www.example.org. 3600 IN A 192.0.2.1\n", str(result[0]))
+
+ result = []
+ n = self.ds.find_exact_rrset(Name("doesnotexist.example.org"), RRClass.IN(), RRType.A(), result, 0, Name("example.org"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
+
+ result = []
+ n = self.ds.find_exact_rrset(Name("www.doesnotexist.org"), RRClass.IN(), RRType.A(), result, 0, Name("doesnotexist.org"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
+
+ self.assertRaises(TypeError, self.ds.find_exact_rrset);
+ self.assertRaises(TypeError, self.ds.find_exact_rrset,
+ Name("www.doesnotexist.org"),
+ RRClass.IN(), RRType.A(), 0,
+ 0, Name("doesnotexist.org"));
+
+ def test_find_addrs(self):
+ self.ds.init("{ \"database_file\": \""+ testdata_path + "/example.org.sqlite3\" }")
+ result = []
+ n = self.ds.find_addrs(Name("www.example.org"), RRClass.IN(), result, 0, Name("example.org"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(1, len(result))
+ self.assertEqual("www.example.org. 3600 IN A 192.0.2.1\n", str(result[0]))
+
+ result = []
+ n = self.ds.find_addrs(Name("doesnotexist.example.org"), RRClass.IN(), result, 0, Name("example.org"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
+
+ result = []
+ n = self.ds.find_addrs(Name("www.doesnotexist.org"), RRClass.IN(), result, 0, Name("doesnotexist.org"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
+
+ self.assertRaises(TypeError, self.ds.find_addrs);
+ self.assertRaises(TypeError, self.ds.find_addrs,
+ Name("www.doesnotexist.org"),
+ RRClass.IN(), 0,
+ 0, Name("doesnotexist.org"));
+
+ def test_find_referral(self):
+ self.ds.init("{ \"database_file\": \""+ testdata_path + "/example.org.sqlite3\" }")
+ result = []
+ n = self.ds.find_referral(Name("sub.example.org"), RRClass.IN(), result, 0, Name("example.org"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(1, len(result))
+ self.assertEqual("sub.example.org. 3600 IN NS ns.sub.example.org.\n", str(result[0]))
+
+ result = []
+ n = self.ds.find_referral(Name("doesnotexist.example.org"), RRClass.IN(), result, 0, Name("example.org"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
+
+ result = []
+ n = self.ds.find_referral(Name("sub.doesnotexist.org"), RRClass.IN(), result, 0, Name("doesnotexist.org"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
+
+ self.assertRaises(TypeError, self.ds.find_referral);
+ self.assertRaises(TypeError, self.ds.find_referral,
+ Name("sub.doesnotexist.org"),
+ RRClass.IN(), 0,
0, Name("doesnotexist.org"));
class DataSourceWriteTest(unittest.TestCase):
More information about the bind10-changes
mailing list