[svn] commit: r3228 - in /branches/trac232/src: bin/xfrin/ lib/datasrc/ lib/datasrc/python/ lib/datasrc/python/tests/ lib/datasrc/tests/

BIND 10 source code commits bind10-changes at lists.isc.org
Fri Oct 15 13:09:04 UTC 2010


Author: jelte
Date: Fri Oct 15 13:09:04 2010
New Revision: 3228

Log:
general cleanup, and a bit of refactoring, moved a helper function from tests to the datasrc library, and renamed another helper function there

Modified:
    branches/trac232/src/bin/xfrin/xfrin.py.in
    branches/trac232/src/lib/datasrc/data_source.cc
    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
    branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
    branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc

Modified: branches/trac232/src/bin/xfrin/xfrin.py.in
==============================================================================
--- branches/trac232/src/bin/xfrin/xfrin.py.in (original)
+++ branches/trac232/src/bin/xfrin/xfrin.py.in Fri Oct 15 13:09:04 2010
@@ -207,12 +207,9 @@
                 ds.init("{ \"database_file\": \"" + self._db_file +"\" }")
                 transaction = libdata_source_python.DataSrcTransaction(ds, Name(self._zone_name), RRClass.IN())
                 result = ds.start_transaction(transaction, True)
+                #print("[XX] result: " + str(result))
                 
-                #result = ds.replace_zone(transaction, XfrinConnection._handle_xfrin_response, self)
-                print("[XX] Replacing zone")
                 result = ds.replace_zone(transaction, self._handle_xfrin_response)
-                print("[XX] done replacing zone")
-                #result = ds.replace_zone(transaction, test_xx_removeme)
                  
                 result = ds.commit_transaction(transaction)
                 ds.close()
@@ -311,8 +308,6 @@
     def _handle_xfrin_response(self):
         '''Return a generator for the response to a zone transfer. '''
         done = False
-        print("[XX] HANDLE generator called")
-        sys.stdout.flush()
         soa_seen = False
         while not done:
             data_len = self._get_request_response(2)
@@ -323,18 +318,10 @@
             self._check_response_status(msg)
             
             answer_section = msg.get_section(Section.ANSWER())
-            print("[XX] LIST:")
-            for a in answer_section:
-                print(a)
             for rrset in answer_section:
-                print("[XX] Type: " + rrset.get_type().to_text() + " soa seen: " + str(soa_seen))
-                sys.stdout.flush()
                 if rrset.get_type() == RRType.SOA():
-                    print("[XX] SOA!")
-                    sys.stdout.flush()
                     if soa_seen:
                         # second one, we're done.
-                        print("[XX] Second SOA, done!")
                         done = True
                         break
                     elif rrset.get_rdata_count() == 2:
@@ -344,17 +331,9 @@
                         new_soa = RRset(rrset.get_name(), rrset.get_class(),
                                         rrset.get_type(), rrset.get_ttl())
                         new_soa.add_rdata(rrset.get_rdata()[0])
-                        print("[XX] YIELDING: ")
-                        print(new_soa)
-                        sys.stdout.flush()
-                        yield new_soa
+                        rrset = new_soa
                     else:
-                        print("[XX] first soa")
-                        sys.stdout.flush()
                         soa_seen = True
-                print("[XX] YIELDING: ")
-                print(rrset)
-                sys.stdout.flush()
                 yield rrset
 
             if self._soa_rr_count == 2:

Modified: branches/trac232/src/lib/datasrc/data_source.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/data_source.cc (original)
+++ branches/trac232/src/lib/datasrc/data_source.cc Fri Oct 15 13:09:04 2010
@@ -1474,78 +1474,34 @@
     return (Rcode::NOERROR());
 }
 
-DataSrc::Result
-DataSrc::doIXFR(DataSrcTransaction& transaction UNUSED_PARAM,
-                const isc::dns::RRsetIterator start UNUSED_PARAM,
-                const isc::dns::RRsetIterator end UNUSED_PARAM)
-{
-    if (transaction.getState() != DataSrcTransaction::RUNNING) {
-        return (DataSrc::ERROR);
-    }
-
-    RRsetIterator rrsets = start;
-    if (rrsets == end) {
-        return (DataSrc::ERROR);
-    }
-    RRsetPtr final_soa = *rrsets;
-    rrsets++;
-    if (rrsets == end) {
-        return (DataSrc::ERROR);
-    }
-    RRsetPtr first_soa = *rrsets;
-    rrsets++;
-    if (first_soa->getType() == RRType::SOA()) {
-        if (!haveRRset(transaction, first_soa)) {
-            return (DataSrc::ERROR);
-        }
+isc::dns::RRsetPtr
+callbackHelperRRsetIterator(void* arg1, void* arg2)
+{
+    RRsetIterator* cur = reinterpret_cast<RRsetIterator*>(arg1);
+    RRsetIterator* end = reinterpret_cast<RRsetIterator*>(arg2);
+
+    if (cur == NULL || end == NULL || *cur == *end) {
+        return RRsetPtr();
     } else {
-        // Not a SOA, then this must be an AXFR-type response
-        //int zone_id = transaction.getData()->get("zone_id")->intValue();
-        //delAll(zone_id);
-        RRsetContainer empty;
-        replaceZone(transaction, empty);
-        
-        while (rrsets != end) {
-            addRRset(transaction, *rrsets++);
-        }
-        return (DataSrc::SUCCESS);
-    }
-    bool deleting = true;
-
-    RRsetPtr cur_rrset;
-    while (rrsets != end) {
-        cur_rrset = *rrsets;
-
-        // If we see a SOA, it means we are switching operations (either
-        // we start deleting or adding depending on what we were doing
-        // before.
-        // We don't delete the actual SOA itself, 
-        if (cur_rrset->getType() == RRType::SOA()) {
-            // TODO: check if serial has increased compared to the last soa we saw
-            deleting = !deleting;
-        } else {
-            if (deleting) {
-                // check if rrset exists, if not, something is very wrong, abort
-                if (haveRRset(transaction, cur_rrset)) {
-                    delRRset(transaction, cur_rrset);
-                } else {
-                    return (DataSrc::ERROR);
-                }
-            } else {
-                addRRset(transaction, cur_rrset);
-            }
-        }
-        rrsets++;
-    }
-    if (equalRRsets(cur_rrset, final_soa)) {
-        // Finally replace the SOA
-        delRRset(transaction, first_soa);
-        addRRset(transaction, final_soa);
-        return (DataSrc::SUCCESS);
+        RRsetPtr result = **cur;
+        (*cur)++;
+        return (result);
+    }
+}
+
+isc::dns::RRsetPtr
+callbackHelperRRsetVector(void *arg1,
+                          void *arg2)
+{
+    std::vector<RRsetPtr>* v = reinterpret_cast<std::vector<RRsetPtr>* >(arg1);
+    size_t* i = reinterpret_cast<size_t*>(arg2);
+
+    if (v && i && *i < v->size()) {
+        RRsetPtr result = ((*v)[(*i)++]);
+        return (result);
     } else {
-        return (DataSrc::ERROR);
-    }
-    return (NOT_IMPLEMENTED);
+        return (RRsetPtr());
+    }
 }
 
 DataSrc::Result
@@ -1554,18 +1510,15 @@
                 void* arg1, void* arg2)
 {
     if (transaction.getState() != DataSrcTransaction::RUNNING) {
-        std::cout << "[XX] 1" << std::endl;
         return (DataSrc::ERROR);
     }
 
     RRsetPtr final_soa = nextRRset(arg1, arg2);
     if (!final_soa) {
-        std::cout << "[XX] 2" << std::endl;
         return (DataSrc::ERROR);
     }
     RRsetPtr first_soa = nextRRset(arg1, arg2);
     if (!final_soa) {
-        std::cout << "[XX] 3" << std::endl;
         return (DataSrc::ERROR);
     }
 
@@ -1573,7 +1526,6 @@
 
     if (first_soa->getType() == RRType::SOA()) {
         if (!haveRRset(transaction, first_soa)) {
-            std::cout << "[XX] 4" << std::endl;
             return (DataSrc::ERROR);
         }
     } else {
@@ -1604,7 +1556,6 @@
                 if (haveRRset(transaction, next_rrset)) {
                     delRRset(transaction, next_rrset);
                 } else {
-                    std::cout << "[XX] 6" << std::endl;
                     return (DataSrc::ERROR);
                 }
             } else {
@@ -1618,7 +1569,6 @@
         addRRset(transaction, final_soa);
         return (DataSrc::SUCCESS);
     } else {
-        std::cout << "[XX] yup" << std::endl;
         return (DataSrc::ERROR);
     }
     return (NOT_IMPLEMENTED);

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 Fri Oct 15 13:09:04 2010
@@ -58,6 +58,39 @@
         isc::Exception(file, line, what) {}
 };
 
+/// \brief Helper function for use as ready-made callback argument
+///        (for instance for DataSrc::replaceZone and DataSrc::doIXFR)
+/// This function takes a pointer to an RRsetIterator (arg1) and a
+/// pointer to an RRsetIterator end value (arg2).
+/// On each call, the next RRsetPtr in the iterator is returned, and
+/// the iterator is advanced. If the last element is reached, and
+/// empty RRsetPtr is returned.
+///
+/// \param arg1, pointer to an RRsetIterator object, for instance as
+///              returned by isc::dns::message::beginSection(). This
+///              iterator is advanced on each call to this function
+/// \param arg2, pointer to an RRsetIterator end object, for instance
+///              as returned by isc::dns::message::endSection().
+/// \return The RRsetPtr as pointed to by the iterator in arg1, or
+///         an empty RRsetPtr if the end is reached.
+isc::dns::RRsetPtr
+callbackHelperRRsetIterator(void* arg1, void* arg2);
+
+/// \brief Helper function for use as ready-made callback argument
+///        (for instance for DataSrc::replaceZone and DataSrc::doIXFR)
+/// This function takes a pointer to an std::vector<RRsetPtr> (arg1)
+/// and a pointer to a size_t value (arg2).
+/// On each call, the RRsetPtr in the vector at arg1 at the position 
+/// at arg2 is returned, and arg2 is incremented with 1.
+/// If the size_t value at arg2 is is equal to or greater than the
+/// size of the vector, an empty ElementPtr() is returned.
+///
+/// \param arg1, pointer to an std::vector<RRsetPtr> object
+/// \param arg2, pointer to a size_t value. This value is incremented
+///              on each call to this function
+/// \return The RRsetPtr in the vector *arg1 at position *arg2.
+isc::dns::RRsetPtr
+callbackHelperRRsetVector(void* arg1, void* arg2);
 
 class AbstractDataSrc {
     ///
@@ -483,18 +516,6 @@
     virtual isc::dns::Rcode updateProcessUpdate(DataSrcTransaction& transaction,
                                         isc::dns::RRsetPtr update);
 
-    /// \brief Perform an IXFR operation directly from a dns message
-    /// section iterator
-    /// The given RRset iterator should point to the section of the
-    /// IXFR answer, and is processed as described in RFC1995
-    /// \param transaction the transaction to perform the operation in
-    /// \param start The start of the rrset iterator to handle
-    /// \param end the end of the rrset iterator to handle
-    /// \return SUCCESS on success, ERROR on failure.
-    virtual Result doIXFR(DataSrcTransaction& transaction,
-                          const isc::dns::RRsetIterator start,
-                          const isc::dns::RRsetIterator end);
-
     /// \brief Perform an IXFR operation with data provided by the
     ///        given function.
     /// The given function should return one RRset at a time, which

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 Fri Oct 15 13:09:04 2010
@@ -273,8 +273,6 @@
         PyObject* rrclass_obj_str = PyObject_CallMethod(rrclass_obj, const_cast<char*>("to_text"), NULL);
         const char* rrclass_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(rrclass_obj_str));
         isc::dns::RRClass rrclass = isc::dns::RRClass(rrclass_str);
-        std::cout << "[XX] converted to string" << std::endl;
-        std::cout << "[XX] end" << std::endl;
         
         self->datasrc = new DataSrc(rrclass);
     */
@@ -926,13 +924,15 @@
 /// function that an object is not an RRset
 class NotRRsetException : public std::exception {};
 
+/// only used in the callback iterator, to propagate the exception
+/// raise in the python callback
+class CallbackException : public std::exception {};
+
 isc::dns::RRsetPtr
 callback_iterator(void* arg1, void* arg2)
 {
     PyObject* iterator = reinterpret_cast<PyObject*>(arg1);
-    std::cout << "[XX] Getting next value from iterator" << std::endl;
     PyObject* rrset_obj = PyIter_Next(iterator);
-    std::cout << "[XX] got next value from iterator" << std::endl;
     if (rrset_obj) {
         if (PyRRset_Check(rrset_obj)) {
             return PyRRset_AsRRsetPtr(rrset_obj);
@@ -940,7 +940,11 @@
             throw NotRRsetException();
         }
     } else {
-        return isc::dns::RRsetPtr();
+        if (PyErr_Occurred()) {
+            throw CallbackException();
+        } else {
+            return isc::dns::RRsetPtr();
+        }
     }
 }
 
@@ -956,7 +960,6 @@
                          &rrset_list_or_function_obj,
                          &arg1, &arg2)) {
         if (PyList_Check(rrset_list_or_function_obj)) {
-            std::cout << "[XX] list argument" << std::endl;
             isc::dns::RRsetContainer rrset_list;
             for (int i = 0; i < PyList_Size(rrset_list_or_function_obj); ++i) {
                 PyObject* rrset_obj = PyList_GET_ITEM(rrset_list_or_function_obj, i);
@@ -973,7 +976,6 @@
                                   rrset_list));
             return (result);
         } else if (PyCallable_Check(rrset_list_or_function_obj)) {
-            std::cout << "[XX] callable argument" << std::endl;
             PyObject* iterator = PyObject_CallFunctionObjArgs(rrset_list_or_function_obj, arg1, arg2, NULL);
             if (!iterator) {
                 return (NULL);
@@ -995,22 +997,10 @@
                 PyErr_SetString(PyExc_TypeError,
                     "non-RRset object returned by iterator in replace_zone()");
                 return (NULL);
+            } catch (CallbackException) {
+                // specific error already set, just return NULL
+                return (NULL);
             }
-            /*
-            PyObject* rrset_obj;
-            while (rrset_obj = PyIter_Next(iterator)) {
-                std::cout << "[XX] GOT OBJ!" << std::endl;
-                //std::cout << PyObject_Dir(rrset_obj) << std::endl;
-                if (!PyRRset_Check(rrset_obj)) {
-                    PyErr_SetString(PyExc_TypeError,
-                        "non-RRset object returned by iterator in replace_zone()");
-                    return (NULL);
-                }
-            }
-            PyErr_SetString(PyExc_TypeError,
-                "Callable!!!");
-            return (NULL);
-            */
         } else {
             PyErr_SetString(PyExc_TypeError,
                             "argument 2 of replace_zone() is not a List or a function");
@@ -1083,12 +1073,15 @@
             }
             m.addRRset(isc::dns::Section::ANSWER(), PyRRset_AsRRsetPtr(rrset_obj), false);
         }
-        
+
+        isc::dns::RRsetIterator begin = m.beginSection(isc::dns::Section::ANSWER());
+        isc::dns::RRsetIterator end = m.endSection(isc::dns::Section::ANSWER());
         PyObject* result = Py_BuildValue("I",
                               self->datasrc->doIXFR(
                               *(transaction->datasrc_transaction),
-                              m.beginSection(isc::dns::Section::ANSWER()),
-                              m.endSection(isc::dns::Section::ANSWER())));
+                              isc::datasrc::callbackHelperRRsetIterator,
+                              &begin,
+                              &end));
         return (result);
     }
     return (NULL);

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 Fri Oct 15 13:09:04 2010
@@ -26,8 +26,6 @@
 def get_new_rrs(list):
     print("[XX] GET_NEW_RRS CALLED")
     for l in list:
-        print("[XX] get_new_rrs list item: ")
-        print(l)
         yield l
 
 
@@ -38,7 +36,6 @@
     def test_init_close(self):
         self.assertRaises(DataSrcError, self.ds.close)
         self.assertRaises(TypeError, self.ds.close, 1)
-        print(testdata_path)
         self.assertRaises(DataSrcError, self.ds.init, 1)
         self.assertRaises(DataSrcError, self.ds.init, "{")
         self.assertRaises(DataSrcError, self.ds.init, "{ \"database_file\": \"/ badfilename /\" }")
@@ -177,6 +174,9 @@
         install_writable_database()
         self.ds = DataSrc()
         self.ds.init("{ \"database_file\": \""+ testdata_out_path + "/write_test.sqlite3\" }")
+
+    def tearDown(self):
+        remove_writable_database()
 
     def test_transaction(self):
         
@@ -530,6 +530,9 @@
     return os.system(testdata_install_prog + " " + testdata_path +
                      "/test.sqlite3 " + testdata_out_path +
                      "/write_test.sqlite3" );
+
+def remove_writable_database():
+    return os.remove(testdata_out_path + "/write_test.sqlite3" );
 
 def rrsets_from_file(filename):
     rrsets = []

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 Fri Oct 15 13:09:04 2010
@@ -979,7 +979,6 @@
             rdp->next();
         }
     } while (!rdp->isLast());
-    std::cout << "[XX] added rrset to zone " << zone_id << ": " << rrset->toText() << std::endl;
     return result;
 }
 
@@ -1153,34 +1152,6 @@
                             void* arg1, void* arg2)
 {
     if (transaction.getState() != DataSrcTransaction::RUNNING) {
-        std::cout << "[XX] Transaction not running" << std::endl;
-        return DataSrc::W_ERROR;
-    }
-
-    int zone_id = transaction.getData()->get("zone_id")->intValue();
-
-    DataSrc::WriteResult result = delAll(zone_id);
-    if (result != DataSrc::W_SUCCESS) {
-        std::cout << "[XX] delAll failed" << std::endl;
-        return result;
-    }
-
-    RRsetPtr next_rrset;
-    while (next_rrset = nextRRset(arg1, arg2)) {
-        std::cout << "[XX] adding rrset: " << next_rrset->toText() << std::endl;
-        result = addRRset(transaction, next_rrset);
-        if (result != DataSrc::W_SUCCESS) {
-            std::cout << "[XX] addrrset failed" << std::endl;
-            return result;
-        }
-    }
-    return DataSrc::W_SUCCESS;
-}
-
-DataSrc::WriteResult
-Sqlite3DataSrc::delZone(DataSrcTransaction& transaction)
-{
-    if (transaction.getState() != DataSrcTransaction::RUNNING) {
         return DataSrc::W_ERROR;
     }
 
@@ -1191,6 +1162,30 @@
         return result;
     }
 
+    RRsetPtr next_rrset;
+    while (next_rrset = nextRRset(arg1, arg2)) {
+        result = addRRset(transaction, next_rrset);
+        if (result != DataSrc::W_SUCCESS) {
+            return result;
+        }
+    }
+    return DataSrc::W_SUCCESS;
+}
+
+DataSrc::WriteResult
+Sqlite3DataSrc::delZone(DataSrcTransaction& transaction)
+{
+    if (transaction.getState() != DataSrcTransaction::RUNNING) {
+        return DataSrc::W_ERROR;
+    }
+
+    int zone_id = transaction.getData()->get("zone_id")->intValue();
+
+    DataSrc::WriteResult result = delAll(zone_id);
+    if (result != DataSrc::W_SUCCESS) {
+        return result;
+    }
+
     sqlite3_stmt* query = dbparameters->w_del_zone_;
     
     sqlite3_reset(query);
@@ -1203,7 +1198,6 @@
                   " to SQL statement (query)");
     }
 
-    std::cout << "[XX] del zone " << zone_id << " query prepared, executing" << std::endl;
     int q_result = sqlite3_step(query);
 
     sqlite3_reset(query);

Modified: branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc (original)
+++ branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc Fri Oct 15 13:09:04 2010
@@ -1202,28 +1202,6 @@
 
 }
 
-RRsetPtr
-getRRsetCallback_vector(void *arg1,
-                        void *arg2)
-{
-    //std::vector<RRsetPtr> v = static_cast<std::vector<RRsetPtr> >(arg1);
-    std::vector<RRsetPtr>* v = reinterpret_cast<std::vector<RRsetPtr>* >(arg1);
-    size_t* i = reinterpret_cast<size_t*>(arg2);
-    std::cout << "[XX] getRRsetCallback_vector() called" << std::endl;
-    std::cout << "[XX] i: " << *i << std::endl;
-    std::cout << "[XX] s: " << v->size() << std::endl;
-
-    if (*i < v->size()) {
-        //return ((*v)[(*i)++]);
-        RRsetPtr result = ((*v)[(*i)++]);
-        std::cout << "Returning: " << result->toText() << std::endl;
-        return result;
-    } else {
-        std::cout << "Nothing in vector, returning empty Ptr" << std::endl;
-        return (RRsetPtr());
-    }
-}
-
 TEST_F(Sqlite3DataSourceTest, replaceZone_callback_vector) {
     std::vector<RRsetPtr> rrsets;
 
@@ -1250,7 +1228,7 @@
     // Replace them, roll back
     DataSrcTransaction transaction1(&data_source, zone_name, RRClass::IN());
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction1));
-    ASSERT_EQ(DataSrc::W_SUCCESS, data_source.replaceZone(transaction1, getRRsetCallback_vector, &rrsets, &i));
+    ASSERT_EQ(DataSrc::W_SUCCESS, data_source.replaceZone(transaction1, isc::datasrc::callbackHelperRRsetVector, &rrsets, &i));
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction1));
 
     // check whether it still exists
@@ -1264,7 +1242,7 @@
     i = 0;
     DataSrcTransaction transaction2(&data_source, zone_name, RRClass::IN());
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction2));
-    ASSERT_EQ(DataSrc::W_SUCCESS, data_source.replaceZone(transaction2, getRRsetCallback_vector, &rrsets, &i));
+    ASSERT_EQ(DataSrc::W_SUCCESS, data_source.replaceZone(transaction2, isc::datasrc::callbackHelperRRsetVector, &rrsets, &i));
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.commitTransaction(transaction2));
     
     // check whether the original rrs are gone now
@@ -1517,8 +1495,6 @@
     } else {
         return -1;
     }
-    cout << "[XX] CREATED IXFR PACKET:" << endl;
-    cout << m.toText() << endl;
     return 0;
 }
 
@@ -1570,10 +1546,6 @@
               data_source.findRRset(name, rrclass, rrtype,
                                     result_sets, find_flags, &zone_name));
 
-    if (result_sets.size() > 0) {
-        std::cout << "[XX] checkSingleRRset: " << (*result_sets.begin())->toText() << std::endl;
-    }
-
     //EXPECT_EQ(DataSrc::SUCCESS, find_flags);
     if (expected == "") {
         // noerror/nodata gives an rdatalen=0 rrset back?
@@ -1588,6 +1560,7 @@
     }
 }
 
+/*
 TEST_F(Sqlite3DataSourceTest, ixfr_ok_message) {
     // reset database
     ASSERT_EQ(0, install_writable_database());
@@ -1641,6 +1614,71 @@
     );
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction3));
 }
+*/
+
+TEST_F(Sqlite3DataSourceTest, ixfr_ok_message) {
+    // reset database
+    ASSERT_EQ(0, install_writable_database());
+
+    // use our copied writable datasource db
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.close());
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
+
+    checkSingleRRset(data_source,
+                     "www.example.com. 3600 IN A 192.0.2.1\n",
+                     www_name, RRClass::IN(), RRType::A());
+    
+    Message ixfr_msg(Message::RENDER);
+    ASSERT_EQ(0, ixfrFromFile(ixfr_msg, TEST_DATA_DIR "/ixfr_ok.rrs"));
+
+    // do IXFR, roll back
+    DataSrcTransaction transaction1(&data_source, zone_name, RRClass::IN());
+    ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction1));
+    RRsetIterator begin, end;
+    begin = ixfr_msg.beginSection(Section::ANSWER());
+    end = ixfr_msg.endSection(Section::ANSWER());
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.doIXFR(transaction1,
+                                 isc::datasrc::callbackHelperRRsetIterator,
+                                 &begin,
+                                 &end)
+    );
+    ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction1));
+
+    checkSingleRRset(data_source,
+                     "www.example.com. 3600 IN A 192.0.2.1\n",
+                     www_name, RRClass::IN(), RRType::A());
+
+    // do IXFR, commit
+    DataSrcTransaction transaction2(&data_source, zone_name, RRClass::IN());
+    ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction2));
+    begin = ixfr_msg.beginSection(Section::ANSWER());
+    end = ixfr_msg.endSection(Section::ANSWER());
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.doIXFR(transaction2,
+                                 isc::datasrc::callbackHelperRRsetIterator,
+                                 &begin,
+                                 &end)
+    );
+    ASSERT_EQ(DataSrc::W_SUCCESS, data_source.commitTransaction(transaction2));
+
+    checkSingleRRset(data_source,
+                     "www.example.com. 3600 IN A 192.0.2.3\n",
+                     www_name, RRClass::IN(), RRType::A());
+
+    // same IXFR should now fail, because the start serial doesn't match
+    DataSrcTransaction transaction3(&data_source, zone_name, RRClass::IN());
+    ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction3));
+    begin = ixfr_msg.beginSection(Section::ANSWER());
+    end = ixfr_msg.endSection(Section::ANSWER());
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.doIXFR(transaction3,
+                                 isc::datasrc::callbackHelperRRsetIterator,
+                                 &begin,
+                                 &end)
+    );
+    ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction3));
+}
 
 TEST_F(Sqlite3DataSourceTest, ixfr_ok_function) {
     // reset database
@@ -1663,7 +1701,7 @@
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction1));
     ASSERT_EQ(DataSrc::SUCCESS,
               data_source.doIXFR(transaction1,
-                                 getRRsetCallback_vector, &rrsets, &i)
+                                 isc::datasrc::callbackHelperRRsetVector, &rrsets, &i)
     );
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction1));
 
@@ -1677,7 +1715,7 @@
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction2));
     ASSERT_EQ(DataSrc::SUCCESS,
               data_source.doIXFR(transaction2,
-                                 getRRsetCallback_vector, &rrsets, &i)
+                                 isc::datasrc::callbackHelperRRsetVector, &rrsets, &i)
     );
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.commitTransaction(transaction2));
 
@@ -1691,7 +1729,7 @@
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction3));
     ASSERT_EQ(DataSrc::ERROR,
               data_source.doIXFR(transaction3,
-                                 getRRsetCallback_vector, &rrsets, &i)
+                                 isc::datasrc::callbackHelperRRsetVector, &rrsets, &i)
     );
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction3));
 }
@@ -1710,13 +1748,16 @@
               "/ixfr_bad_remove_nonexisting.rrs"));
     DataSrcTransaction transaction1(&data_source, zone_name, RRClass::IN());
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction1));
+    RRsetIterator begin, end;
+    begin = ixfr_msg.beginSection(Section::ANSWER());
+    end = ixfr_msg.endSection(Section::ANSWER());
     EXPECT_EQ(DataSrc::ERROR,
               data_source.doIXFR(transaction1,
-                                 ixfr_msg.beginSection(Section::ANSWER()),
-                                 ixfr_msg.endSection(Section::ANSWER()))
+                                 isc::datasrc::callbackHelperRRsetIterator,
+                                 &begin,
+                                 &end)
     );
     ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction1));
-    
 }
 
 TEST_F(Sqlite3DataSourceTest, dynamic_update) {




More information about the bind10-changes mailing list