[svn] commit: r2861 - in /branches/trac232/src/lib/datasrc/python: libdata_source_python.cc tests/data_source_python_test.py

BIND 10 source code commits bind10-changes at lists.isc.org
Wed Sep 8 12:59:14 UTC 2010


Author: jelte
Date: Wed Sep  8 12:59:13 2010
New Revision: 2861

Log:
findPreviousName and findCoveringNSEC3

Modified:
    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/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 12:59:13 2010
@@ -77,6 +77,9 @@
 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_findPreviousName(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_findCoveringNSEC3(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);
@@ -96,6 +99,11 @@
       "Searches the datasource for an address list" },
     { "find_referral", reinterpret_cast<PyCFunction>(DataSrc_findReferral), METH_VARARGS,
       "Searches the datasource for a referral" },
+    { "find_previous_name", reinterpret_cast<PyCFunction>(DataSrc_findPreviousName), METH_VARARGS,
+      "Searches the datasource for the previous name. Returns (result_code, previous_name) tuple. "
+      "If result_code is not DataSrc.SUCCESS, previous_name will be None." },
+    { "find_covering_nsec3", reinterpret_cast<PyCFunction>(DataSrc_findCoveringNSEC3), METH_VARARGS,
+      "Searches the datasource for the covering NSEC3 rrset." },
     { "start_transaction", reinterpret_cast<PyCFunction>(DataSrc_startTransaction), METH_VARARGS,
       "Start a transaction" },
     { "commit_transaction", reinterpret_cast<PyCFunction>(DataSrc_commitTransaction), METH_VARARGS,
@@ -625,6 +633,71 @@
 }
 
 static PyObject*
+DataSrc_findPreviousName(s_DataSrc* self, PyObject* args) {
+    PyObject* name_class = PyObject_GetAttrString(po_DNS_module, "Name");
+    PyObject *name_obj, *zone_name_obj;
+    uint32_t flags;
+    int args_check = PyArg_ParseTuple(args, "O!O!",
+                         name_class, &name_obj,
+                         name_class, &zone_name_obj);
+    Py_DECREF(name_class);
+       
+    if (args_check) {
+        isc::dns::Name n = pyName_AsName(name_obj);
+        isc::dns::Name zone_name = pyName_AsName(zone_name_obj);
+        
+        isc::dns::Name result_name("old.");
+        isc::datasrc::DataSrc::Result result =
+                self->datasrc->findPreviousName(n, result_name, &zone_name);
+        if (result == isc::datasrc::DataSrc::SUCCESS) {
+            return Py_BuildValue("(IO)", result, pyName_FromName(result_name));
+        } else {
+            Py_INCREF(Py_None);
+            return Py_BuildValue("(IO)", result, Py_None);
+        }
+    } else {
+        return (NULL);
+    }
+}
+
+static PyObject*
+DataSrc_findCoveringNSEC3(s_DataSrc* self, PyObject* args) {
+    PyObject* name_class = PyObject_GetAttrString(po_DNS_module, "Name");
+    PyObject *name_obj, *result_list_obj;
+    const char* hash;
+    uint32_t flags;
+    int args_check = PyArg_ParseTuple(args, "O!sO",
+                         name_class, &name_obj,
+                         &hash,
+                         &result_list_obj);
+    Py_DECREF(name_class);
+       
+    if (args_check) {
+        if (!PyList_Check(result_list_obj)) {
+            PyErr_SetString(PyExc_TypeError,
+                            "argument 3 of find_covering_nsec3 is not a List");
+            return (NULL);
+        }
+        isc::dns::Name n = pyName_AsName(name_obj);
+        std::string hash_str(hash);
+        isc::dns::RRsetList result_list;
+        isc::datasrc::DataSrc::Result result =
+                self->datasrc->findCoveringNSEC3(n, hash_str, result_list);
+
+        if (result == isc::datasrc::DataSrc::SUCCESS) {
+            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 12:59:13 2010
@@ -136,6 +136,33 @@
                                      Name("sub.doesnotexist.org"),
                                      RRClass.IN(), 0,
                                      0, Name("doesnotexist.org"));
+
+    def test_find_previous_name(self):
+        self.ds.init("{ \"database_file\": \""+ testdata_path + "/test.sqlite3\" }")
+        result, result_name = self.ds.find_previous_name(Name("yyy.sql1.example.com"), Name("sql1.example.com"))
+        self.assertEqual(DataSrc.SUCCESS, result);
+        self.assertEqual("www.sql1.example.com.", result_name.to_text());
+
+        result, result_name = self.ds.find_previous_name(Name("www.nosuch.zone"), Name("nosuch.zone"))
+        self.assertEqual(DataSrc.ERROR, result);
+        self.assertEqual(None, result_name);
+        
+    def test_find_covering_nsec3(self):
+        self.ds.init("{ \"database_file\": \""+ testdata_path + "/test.sqlite3\" }")
+        hashstr = "1BB7SO0452U1QHL98UISNDD9218GELR5";
+    
+        nsec3_zonename = Name("sql2.example.com");
+
+        result_rrsets = []
+        result = self.ds.find_covering_nsec3(nsec3_zonename, hashstr, result_rrsets)
+        self.assertEqual(DataSrc.SUCCESS, result)
+        self.assertEqual(1, len(result_rrsets))
+        self.assertEqual("1BB7SO0452U1QHL98UISNDD9218GELR5.sql2.example.com. 7200 IN NSEC3 1 0 10 FEEDABEE 4KLSVDE8KH8G95VU68R7AHBE1CPQN38J\n", result_rrsets[0].to_text())
+
+        self.assertRaises(TypeError, self.ds.find_covering_nsec3)
+        self.assertRaises(TypeError, self.ds.find_covering_nsec3, 1)
+        self.assertRaises(TypeError, self.ds.find_covering_nsec3, nsec3_zonename, hashstr, 1)
+        
 
 class DataSourceWriteTest(unittest.TestCase):
     def setUp(self):




More information about the bind10-changes mailing list