[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