[svn] commit: r2872 - 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 20:04:13 UTC 2010


Author: jelte
Date: Wed Sep  8 20:04:13 2010
New Revision: 2872

Log:
replaceZone, haveRRset, and updateCheckPrerequisite wrappers

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 20:04:13 2010
@@ -86,6 +86,9 @@
 static PyObject* DataSrc_addRRset(s_DataSrc* self, PyObject* args);
 static PyObject* DataSrc_delRRset(s_DataSrc* self, PyObject* args);
 static PyObject* DataSrc_delZone(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_replaceZone(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_haveRRset(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_updateCheckPrerequisite(s_DataSrc* self, PyObject* args);
 
 static PyMethodDef DataSrc_methods[] = {
     { "get_class", reinterpret_cast<PyCFunction>(DataSrc_getClass), METH_NOARGS,
@@ -119,6 +122,12 @@
       "Delete an RRset" },
     { "del_zone", reinterpret_cast<PyCFunction>(DataSrc_delZone), METH_VARARGS,
       "Delete an entire zone" },
+    { "replace_zone", reinterpret_cast<PyCFunction>(DataSrc_replaceZone), METH_VARARGS,
+      "Replace an entire zone" },
+    { "have_rrset", reinterpret_cast<PyCFunction>(DataSrc_haveRRset), METH_VARARGS,
+      "Checks if the given RRset exists" },
+    { "update_check_prerequisite", reinterpret_cast<PyCFunction>(DataSrc_updateCheckPrerequisite), METH_VARARGS,
+      "Checks the given DNS Update prerequisite" },
     { NULL, NULL, 0, NULL }
 };
 
@@ -413,6 +422,20 @@
     return isc::dns::rdata::createRdata(rrtype, rrclass, rdata_str);
 }
 
+bool
+pyRRset_Check(const PyObject* rrset_obj)
+{
+    PyObject* rrset_class = PyObject_GetAttrString(po_DNS_module, "RRset");
+    bool result = false;
+    
+    if (rrset_obj && rrset_obj->ob_type &&
+        rrset_class->ob_type == rrset_obj->ob_type
+    ) {
+        result = true;
+    }
+    return result;
+}
+
 PyObject*
 pyRRset_FromRRset(const isc::dns::RRset& rrset)
 {
@@ -444,7 +467,7 @@
     return rrset_obj;
 }
 
-isc::dns::ConstRRsetPtr
+isc::dns::RRsetPtr
 pyRRset_AsRRsetPtr(PyObject* rrset_obj)
 {
     PyObject* name_obj = PyObject_CallMethod(rrset_obj, "get_name", NULL);
@@ -469,6 +492,15 @@
     Py_DECREF(rrttl_obj);
 
     return rrset_ptr;
+}
+
+PyObject*
+pyRcode_FromRcode(const isc::dns::Rcode& rcode)
+{
+    PyObject* rcode_class = PyObject_GetAttrString(po_DNS_module, "Rcode");
+    PyObject* rcode_obj = PyObject_CallObject(rcode_class, Py_BuildValue("(I)", rcode.getCode()));
+    Py_DECREF(rcode_class);
+    return rcode_obj;
 }
 
 /* end of conversion functions */
@@ -865,9 +897,84 @@
     
 }
 
+static PyObject*
+DataSrc_replaceZone(s_DataSrc* self, PyObject* args) {
+    s_DataSrcTransaction *transaction;
+    PyObject *rrset_list_obj;
+    
+    if (PyArg_ParseTuple(args, "O!O",
+                         &datasrc_transaction_type, &transaction,
+                         &rrset_list_obj)) {
+        if (!PyList_Check(rrset_list_obj)) {
+            PyErr_SetString(PyExc_TypeError,
+                            "argument 2 of replace_zone() is not a List");
+            return (NULL);
+        }
+        isc::dns::RRsetList rrset_list;
+        for (int i = 0; i < PyList_Size(rrset_list_obj); ++i) {
+            PyObject* rrset_obj = PyList_GET_ITEM(rrset_list_obj, i);
+            if (!pyRRset_Check(rrset_obj)) {
+                PyErr_SetString(PyExc_TypeError,
+                    "non-RRset object in argument 2 of replace_zone()");
+                return (NULL);
+            }
+            rrset_list.addRRset(pyRRset_AsRRsetPtr(rrset_obj));
+        }
+        PyObject* result = Py_BuildValue("I",
+                              self->datasrc->replaceZone(
+                              *(transaction->datasrc_transaction),
+                              rrset_list));
+        return result;
+    }
+    return (NULL);
+}
+
+static PyObject*
+DataSrc_haveRRset(s_DataSrc* self, PyObject* args) {
+    s_DataSrcTransaction *transaction;
+    PyObject* rrset_obj;
+    
+    if (PyArg_ParseTuple(args, "O!O",
+                         &datasrc_transaction_type, &transaction,
+                         &rrset_obj)) {
+        isc::dns::ConstRRsetPtr rrset_ptr = pyRRset_AsRRsetPtr(rrset_obj);
+        
+        PyObject* result = Py_BuildValue("I",
+                              self->datasrc->haveRRset(
+                              *(transaction->datasrc_transaction),
+                              rrset_ptr));
+        return result;
+    }
+    return (NULL);
+}
+
+static PyObject*
+DataSrc_updateCheckPrerequisite(s_DataSrc* self, PyObject* args) {
+    s_DataSrcTransaction *transaction;
+    PyObject* rrset_type = PyObject_GetAttrString(po_DNS_module, "RRset");
+    PyObject* rrset_obj;
+
+    if (PyArg_ParseTuple(args, "O!O!",
+                         &datasrc_transaction_type, &transaction,
+                         rrset_type, &rrset_obj)) {
+        isc::dns::ConstRRsetPtr rrset_ptr = pyRRset_AsRRsetPtr(rrset_obj);
+        isc::dns::Rcode rcode = self->datasrc->updateCheckPrerequisite(
+                                    *(transaction->datasrc_transaction),
+                                    rrset_ptr);
+        return pyRcode_FromRcode(rcode);
+    }
+    return (NULL);
+}
+
+
+
+//
 //
 // Transaction objects
 //
+//
+
+
 static int
 DataSrcTransaction_new(s_DataSrcTransaction* self, PyObject* args) {
     // TODO: hardcoded to sqlite3 data source right now.

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 20:04:13 2010
@@ -321,10 +321,11 @@
     def test_del_zone(self):
         transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
         result = self.ds.start_transaction(transaction)
-
-        self.assertEqual(DataSrc.T_SUCCESS, result)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+
         result = self.ds.del_zone(transaction)
         self.assertEqual(DataSrc.T_SUCCESS, result)
+
         result = self.ds.commit_transaction(transaction)
         self.assertEqual(DataSrc.T_SUCCESS, result)
 
@@ -336,6 +337,76 @@
         transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
         result = self.ds.start_transaction(transaction)
         self.assertEqual(DataSrc.T_NO_SUCH_ZONE, result)
+        
+    def test_replace_zone(self):
+        transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+        result = self.ds.start_transaction(transaction)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+
+        result = []
+        n = self.ds.find_rrset(Name("www.example.com"), RRClass.IN(), RRType.A(), result, 0, Name("example.com"))
+        self.assertEqual(DataSrc.SUCCESS, n);
+        self.assertEqual(1, len(result))
+
+        new_rrs = []
+        result = self.ds.replace_zone(transaction, new_rrs)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+
+        self.assertRaises(TypeError, self.ds.replace_zone, transaction)
+        self.assertRaises(TypeError, self.ds.replace_zone, transaction, 1)
+        self.assertRaises(TypeError, self.ds.replace_zone, transaction, [1])
+
+        result = self.ds.commit_transaction(transaction)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+
+        result = []
+        n = self.ds.find_rrset(Name("www.example.com"), RRClass.IN(), RRType.A(), result, 0, Name("example.com"))
+        self.assertEqual(DataSrc.SUCCESS, n);
+        self.assertEqual(0, len(result))
+
+    def test_have_rrset(self):
+        transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+        result = self.ds.start_transaction(transaction)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+
+        rrset1 = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+        rrset1.add_rdata(Rdata(rrset1.get_type(), rrset1.get_class(), "192.0.2.1"))
+        rrset2 = RRset(Name("www.example.com"), RRClass.IN(), RRType.TXT(), RRTTL(3600))
+        rrset2.add_rdata(Rdata(rrset2.get_type(), rrset2.get_class(), "Just some text"))
+
+        self.assertTrue(self.ds.have_rrset(transaction, rrset1))
+        self.assertFalse(self.ds.have_rrset(transaction, rrset2))
+
+        self.assertRaises(TypeError, self.ds.have_rrset)
+        self.assertRaises(TypeError, self.ds.have_rrset, 1)
+        self.assertRaises(TypeError, self.ds.have_rrset, [])
+    
+    
+    def test_update_check_prerequisite(self):
+        transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+        result = self.ds.start_transaction(transaction)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+
+        rrset1 = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(0))
+        rrset1.add_rdata(Rdata(rrset1.get_type(), rrset1.get_class(), "192.0.2.1"))
+        rrset2 = RRset(Name("www.example.com"), RRClass.IN(), RRType.TXT(), RRTTL(0))
+        rrset2.add_rdata(Rdata(rrset2.get_type(), rrset2.get_class(), "Just some text"))
+        rrset3 = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(0))
+        rrset3.add_rdata(Rdata(rrset3.get_type(), rrset3.get_class(), "192.0.2.255"))
+        rrset4 = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+        rrset4.add_rdata(Rdata(rrset3.get_type(), rrset4.get_class(), "192.0.2.255"))
+
+        self.assertEqual(Rcode.NOERROR(), self.ds.update_check_prerequisite(transaction, rrset1))
+        self.assertEqual(Rcode.NXRRSET(), self.ds.update_check_prerequisite(transaction, rrset2))
+        self.assertEqual(Rcode.NXRRSET(), self.ds.update_check_prerequisite(transaction, rrset3))
+        self.assertEqual(Rcode.FORMERR(), self.ds.update_check_prerequisite(transaction, rrset4))
+
+        self.assertRaises(TypeError, self.ds.update_check_prerequisite)
+        self.assertRaises(TypeError, self.ds.update_check_prerequisite, 1)
+        self.assertRaises(TypeError, self.ds.update_check_prerequisite, [])
+    
+    
+        
         
 
 # helper functions for tests taken from c++ unittests




More information about the bind10-changes mailing list