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

BIND 10 source code commits bind10-changes at lists.isc.org
Wed Sep 8 15:51:55 UTC 2010


Author: jelte
Date: Wed Sep  8 15:51:54 2010
New Revision: 2867

Log:
add_rrset and del_rrset

Modified:
    branches/trac232/src/lib/datasrc/python/libdata_source_python.cc
    branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py
    branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc

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 15:51:54 2010
@@ -83,6 +83,8 @@
 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);
+static PyObject* DataSrc_addRRset(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_delRRset(s_DataSrc* self, PyObject* args);
 
 static PyMethodDef DataSrc_methods[] = {
     { "get_class", reinterpret_cast<PyCFunction>(DataSrc_getClass), METH_NOARGS,
@@ -110,6 +112,10 @@
       "Commit a transaction" },
     { "rollback_transaction", reinterpret_cast<PyCFunction>(DataSrc_rollbackTransaction), METH_VARARGS,
       "Roll back a transaction" },
+    { "add_rrset", reinterpret_cast<PyCFunction>(DataSrc_addRRset), METH_VARARGS,
+      "Add an RRset" },
+    { "del_rrset", reinterpret_cast<PyCFunction>(DataSrc_delRRset), METH_VARARGS,
+      "Delete an RRset" },
     { NULL, NULL, 0, NULL }
 };
 
@@ -276,6 +282,7 @@
 {
     PyObject* name_obj_str = PyObject_CallMethod(name_obj, "to_text", NULL);
     const char* name_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(name_obj_str));
+    Py_DECREF(name_obj_str);
     return isc::dns::Name(name_str);
 }
 
@@ -309,6 +316,7 @@
 {
     PyObject* rrclass_obj_str = PyObject_CallMethod(rrclass_obj, "to_text", NULL);
     const char* rrclass_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(rrclass_obj_str));
+    Py_DECREF(rrclass_obj_str);
     return isc::dns::RRClass(rrclass_str);
 }
 
@@ -347,6 +355,7 @@
 {
     PyObject* rrtype_obj_str = PyObject_CallMethod(rrtype_obj, "to_text", NULL);
     const char* rrtype_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(rrtype_obj_str));
+    Py_DECREF(rrtype_obj_str);
     return isc::dns::RRType(rrtype_str);
 }
 
@@ -370,9 +379,11 @@
 {
     PyObject* rrttl_obj_str = PyObject_CallMethod(rrttl_obj, "to_text", NULL);
     const char* rrttl_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(rrttl_obj_str));
+    Py_DECREF(rrttl_obj_str);
     return isc::dns::RRTTL(rrttl_str);
 }
 
+// for Rdata we have no getClass and getType, so we need to provide these
 PyObject*
 pyRdata_createRdata(const isc::dns::RRType& rrtype, const isc::dns::RRClass& rrclass, const isc::dns::rdata::Rdata& rdata) {
     PyObject* rdata_class = PyObject_GetAttrString(po_DNS_module, "Rdata");
@@ -389,6 +400,16 @@
     return rdata_obj;
 }
 
+// for Rdata we have no getClass and getType, so we need to provide these
+isc::dns::rdata::ConstRdataPtr
+PyRdata_AsRdataPtr(const isc::dns::RRType& rrtype, const isc::dns::RRClass& rrclass, PyObject* rdata_obj)
+{
+    PyObject* rdata_obj_str = PyObject_CallMethod(rdata_obj, "to_text", NULL);
+    const char* rdata_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(rdata_obj_str));
+    Py_DECREF(rdata_obj_str);
+    return isc::dns::rdata::createRdata(rrtype, rrclass, rdata_str);
+}
+
 PyObject*
 pyRRset_FromRRset(const isc::dns::RRset& rrset)
 {
@@ -418,6 +439,33 @@
         Py_DECREF(rdata_obj);
     }
     return rrset_obj;
+}
+
+isc::dns::ConstRRsetPtr
+pyRRset_AsRRsetPtr(PyObject* rrset_obj)
+{
+    PyObject* name_obj = PyObject_CallMethod(rrset_obj, "get_name", NULL);
+    isc::dns::Name name = pyName_AsName(name_obj);
+    PyObject* rrclass_obj = PyObject_CallMethod(rrset_obj, "get_class", NULL);
+    isc::dns::RRClass rrclass = pyRRClass_AsRRClass(rrclass_obj);
+    PyObject* rrtype_obj = PyObject_CallMethod(rrset_obj, "get_type", NULL);
+    isc::dns::RRType rrtype = pyRRType_AsRRType(rrtype_obj);
+    PyObject* rrttl_obj = PyObject_CallMethod(rrset_obj, "get_ttl", NULL);
+    isc::dns::RRTTL rrttl = pyRRTTL_AsRRTTL(rrttl_obj);
+
+    isc::dns::RRsetPtr rrset_ptr = isc::dns::RRsetPtr(new
+              isc::dns::RRset(name, rrclass, rrtype, rrttl));
+    PyObject* rdata_list_obj = PyObject_CallMethod(rrset_obj, "get_rdata", NULL);
+    for (int i = 0; i < PyList_Size(rdata_list_obj); ++i) {
+        isc::dns::rdata::ConstRdataPtr rdata = PyRdata_AsRdataPtr(rrtype, rrclass, PyList_GET_ITEM(rdata_list_obj, i));
+        rrset_ptr->addRdata(*rdata);
+    }
+    Py_DECREF(name_obj);
+    Py_DECREF(rrclass_obj);
+    Py_DECREF(rrtype_obj);
+    Py_DECREF(rrttl_obj);
+
+    return rrset_ptr;
 }
 
 /* end of conversion functions */
@@ -494,10 +542,12 @@
                 self->datasrc->findRRset(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);
+        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 {
@@ -756,6 +806,46 @@
     return (NULL);
 }
 
+static PyObject*
+DataSrc_addRRset(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->addRRset(
+                              *(transaction->datasrc_transaction),
+                              rrset_ptr));
+        return result;
+    }
+    return (NULL);
+    
+}
+
+static PyObject*
+DataSrc_delRRset(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->delRRset(
+                              *(transaction->datasrc_transaction),
+                              rrset_ptr));
+        return result;
+    }
+    return (NULL);
+    
+}
+
 //
 // Transaction objects
 //

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 15:51:54 2010
@@ -192,8 +192,8 @@
         self.assertEqual(DataSrc.T_NO_SUCH_ZONE, result)
         self.assertEqual(DataSrcTransaction.INIT, transaction.get_state())
 
-    def test_add_rrset(self):
-        rrset = RRset(Name("pythontest.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+    def test_add_rrset_rollback(self):
+        rrset = RRset(Name("added.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
         
         transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
         self.assertEqual(DataSrcTransaction.INIT, transaction.get_state())
@@ -201,10 +201,122 @@
         result = self.ds.start_transaction(transaction)
         self.assertEqual(DataSrc.T_SUCCESS, result)
 
-        #result = self.ds.add_rrset(transaction, rrset)
+        # empty rrset, should fail on add
+        result = self.ds.add_rrset(transaction, rrset)
+        self.assertEqual(DataSrc.T_ERROR, result)
+
+        # check if rrset does not exist, then add it but roll back
+        # check for nonexistence again, then add it and commit
+        # finally check if exists
+        result = []
+        n = self.ds.find_addrs(Name("added.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+        self.assertEqual(DataSrc.SUCCESS, n);
+        self.assertEqual(0, len(result))
+
+        rrset.add_rdata(Rdata(rrset.get_type(), rrset.get_class(), "192.0.2.1"))
+        result = self.ds.add_rrset(transaction, rrset)
         self.assertEqual(DataSrc.T_SUCCESS, result)
 
         self.ds.rollback_transaction(transaction)
+
+        result = []
+        n = self.ds.find_addrs(Name("added.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+        self.assertEqual(DataSrc.SUCCESS, n);
+        self.assertEqual(0, len(result))
+
+    def test_add_rrset_commit(self):
+        rrset = RRset(Name("added.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+        rrset.add_rdata(Rdata(rrset.get_type(), rrset.get_class(), "192.0.2.1"))
+        
+        result = []
+        n = self.ds.find_addrs(Name("added.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+        self.assertEqual(DataSrc.SUCCESS, n);
+        self.assertEqual(0, len(result))
+
+        transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+        result = self.ds.start_transaction(transaction)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+        result = self.ds.add_rrset(transaction, rrset)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+        result = self.ds.commit_transaction(transaction)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+
+        result = []
+        n = self.ds.find_addrs(Name("added.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+        self.assertEqual(DataSrc.SUCCESS, n);
+        self.assertEqual(1, len(result))
+        self.assertEqual("added.example.com. 3600 IN A 192.0.2.1\n", str(result[0]))
+
+    def test_del_rrset_rollback(self):
+        rrset = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+        rrset.add_rdata(Rdata(rrset.get_type(), rrset.get_class(), "192.0.2.1"))
+        
+        transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+        self.assertEqual(DataSrcTransaction.INIT, transaction.get_state())
+
+        result = self.ds.start_transaction(transaction)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+
+        result = []
+        n = self.ds.find_addrs(Name("www.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+        self.assertEqual(DataSrc.SUCCESS, n);
+        self.assertEqual(1, len(result))
+
+        result = self.ds.del_rrset(transaction, rrset)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+
+        self.ds.rollback_transaction(transaction)
+
+        result = []
+        n = self.ds.find_addrs(Name("www.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+        self.assertEqual(DataSrc.SUCCESS, n);
+        self.assertEqual(1, len(result))
+
+    def test_del_rrset_commit(self):
+        rrset = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+        rrset.add_rdata(Rdata(rrset.get_type(), rrset.get_class(), "192.0.2.1"))
+        
+        result = []
+        n = self.ds.find_addrs(Name("www.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+        self.assertEqual(DataSrc.SUCCESS, n);
+        self.assertEqual(1, len(result))
+
+        transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+        result = self.ds.start_transaction(transaction)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+        result = self.ds.del_rrset(transaction, rrset)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+        result = self.ds.commit_transaction(transaction)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+
+        result = []
+        n = self.ds.find_addrs(Name("www.example.com"), RRClass.IN(), result, 0, Name("example.com"))
+        self.assertEqual(DataSrc.SUCCESS, n);
+        # there's still other data, so we should get a list of 1 empty
+        # rrset
+        self.assertEqual(1, len(result))
+        self.assertEqual(0, result[0].get_rdata_count())
+
+    def test_del_rrset_name(self):
+        rrset = RRset(Name("www.example.com"), RRClass.IN(), RRType.ANY(), RRTTL(3600))
+        
+        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))
+
+        transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+        result = self.ds.start_transaction(transaction)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+        result = self.ds.del_rrset(transaction, rrset)
+        self.assertEqual(DataSrc.T_SUCCESS, result)
+        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))
 
 
 # helper functions for tests taken from c++ unittests

Modified: branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc (original)
+++ branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc Wed Sep  8 15:51:54 2010
@@ -913,14 +913,13 @@
     if (transaction.getState() != DataSrcTransaction::RUNNING) {
         return DataSrc::T_ERROR;
     }
-    std::cout << "[XX] addRR at sqlite3" << std::endl;
+    if (rrset->getRdataCount() == 0) {
+        return DataSrc::T_ERROR;
+    }
     int zone_id = transaction.getData()->get("zone_id")->intValue();
-    std::cout << "[XX] zone id: " << zone_id << std::endl;
-
     RdataIteratorPtr rdp = rrset->getRdataIterator();
     rdp->first();
-    std::cout << "[XX] RDATA: " << rdp->getCurrent().toText() << std::endl;
-    std::cout << "[XX] RDATA: " << rdp->getCurrent().toText().c_str() << std::endl;
+
     DataSrc::TransactionResult result = DataSrc::T_SUCCESS;
     do {
         result = addRR(zone_id, rrset->getName(), rrset->getType(), rrset->getTTL(), rdp->getCurrent());




More information about the bind10-changes mailing list