BIND 10 trac1067, updated. 6df7102965c6afdec6f621175f9e91a56ee42a67 [1067] Added little bit of logging

BIND 10 source code commits bind10-changes at lists.isc.org
Tue Aug 16 10:59:18 UTC 2011


The branch, trac1067 has been updated
       via  6df7102965c6afdec6f621175f9e91a56ee42a67 (commit)
       via  81613a741bcc9cbe909c814fab9ca99c1a1fc2fd (commit)
       via  cc004ec0ff327ca300cde89ffc252a9b1c588bec (commit)
       via  c454dfae8988337bd10bfe0551ee62a267049dfe (commit)
       via  afde75c1fe9ab3fa35acdf1a3b5f80ec389e1190 (commit)
      from  d9f4f26b0f2c73eddd07b2a4368ae1b238944b80 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 6df7102965c6afdec6f621175f9e91a56ee42a67
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date:   Tue Aug 16 12:39:37 2011 +0200

    [1067] Added little bit of logging

commit 81613a741bcc9cbe909c814fab9ca99c1a1fc2fd
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date:   Tue Aug 16 12:11:20 2011 +0200

    [1067] Note why we have friend

commit cc004ec0ff327ca300cde89ffc252a9b1c588bec
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date:   Tue Aug 16 12:02:46 2011 +0200

    [1067] Note about iterator and exception

commit c454dfae8988337bd10bfe0551ee62a267049dfe
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date:   Tue Aug 16 11:53:45 2011 +0200

    [1067] Unify the interface

commit afde75c1fe9ab3fa35acdf1a3b5f80ec389e1190
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date:   Tue Aug 16 11:13:30 2011 +0200

    [1067] Add another column
    
    So we can unify the interface

-----------------------------------------------------------------------

Summary of changes:
 src/lib/datasrc/database.cc                        |   18 +++--
 src/lib/datasrc/database.h                         |   17 +++--
 src/lib/datasrc/datasrc_messages.mes               |   11 +++
 src/lib/datasrc/memory_datasrc.h                   |    4 +
 src/lib/datasrc/sqlite3_accessor.cc                |   26 +++---
 src/lib/datasrc/tests/database_unittest.cc         |   76 ++++++++++-------
 src/lib/datasrc/tests/sqlite3_accessor_unittest.cc |   92 +++++++++++++-------
 7 files changed, 157 insertions(+), 87 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/database.cc b/src/lib/datasrc/database.cc
index 14e5fa7..d5e8f59 100644
--- a/src/lib/datasrc/database.cc
+++ b/src/lib/datasrc/database.cc
@@ -342,6 +342,8 @@ public:
         if (!data_ready_) {
             // At the end of zone
             ready_ = false;
+            LOG_DEBUG(logger, DBG_TRACE_DETAILED,
+                      DATASRC_DATABASE_ITERATE_END);
             return (ConstRRsetPtr());
         }
         string name_str(name_), rtype_str(rtype_), ttl(ttl_);
@@ -356,17 +358,19 @@ public:
             rrset->addRdata(rdata::createRdata(rtype, class_, rdata_));
             getData();
         }
+        LOG_DEBUG(logger, DBG_TRACE_DETAILED, DATASRC_DATABASE_ITERATE_NEXT).
+            arg(rrset->getName()).arg(rrset->getType());
         return (rrset);
     }
 private:
     // Load next row of data
     void getData() {
-        string data[4];
-        data_ready_ = context_->getNext(data);
-        name_ = data[0];
-        rtype_ = data[1];
-        ttl_ = data[2];
-        rdata_ = data[3];
+        string data[DatabaseAccessor::COLUMN_COUNT];
+        data_ready_ = context_->getNext(data, DatabaseAccessor::COLUMN_COUNT);
+        name_ = data[DatabaseAccessor::NAME_COLUMN];
+        rtype_ = data[DatabaseAccessor::TYPE_COLUMN];
+        ttl_ = data[DatabaseAccessor::TTL_COLUMN];
+        rdata_ = data[DatabaseAccessor::RDATA_COLUMN];
     }
 
     // The context
@@ -404,6 +408,8 @@ DatabaseClient::getIterator(const isc::dns::Name& name) const {
     // actual zone class from the connection, as the DatabaseClient
     // doesn't know it and the iterator needs it (so it wouldn't query
     // it each time)
+    LOG_DEBUG(logger, DBG_TRACE_DETAILED, DATASRC_DATABASE_ITERATE).
+        arg(name);
     return (ZoneIteratorPtr(new DatabaseIterator(context, RRClass::IN())));
 }
 
diff --git a/src/lib/datasrc/database.h b/src/lib/datasrc/database.h
index 1b2f2c0..fa4125c 100644
--- a/src/lib/datasrc/database.h
+++ b/src/lib/datasrc/database.h
@@ -108,13 +108,17 @@ public:
          * RRset must not be interleaved with any other RRs (eg. RRsets must be
          * "together").
          *
-         * \param data The data are to be returned by this parameter. They are
-         *     (in order) the name, rrtype, TTL and the rdata.
-         * \todo Unify with the interface in #1062 eventually.
+         * \param columns The data will be returned through here. The order
+         *     is specified by the RecordColumns enum.
+         * \param Size of the columns array. Must be equal to COLUMN_COUNT,
+         *     otherwise DataSourceError is thrown.
          * \todo Do we consider databases where it is stored in binary blob
          *     format?
+         * \throw DataSourceError if there's database-related error. If the
+         *     exception (or any other in case of derived class) is thrown,
+         *     the iterator can't be safely used any more.
          */
-        virtual bool getNext(std::string data[4]) = 0;
+        virtual bool getNext(std::string columns[], size_t column_data) = 0;
     };
 
     typedef boost::shared_ptr<IteratorContext> IteratorContextPtr;
@@ -221,11 +225,12 @@ public:
         SIGTYPE_COLUMN = 2, ///< For RRSIG records, this contains the RRTYPE
                             ///< the RRSIG covers. In the current implementation,
                             ///< this field is ignored.
-        RDATA_COLUMN = 3    ///< Full text representation of the record's RDATA
+        RDATA_COLUMN = 3,   ///< Full text representation of the record's RDATA
+        NAME_COLUMN = 4     ///< The domain name of this RR
     };
 
     /// The number of fields the columns array passed to getNextRecord should have
-    static const size_t COLUMN_COUNT = 4;
+    static const size_t COLUMN_COUNT = 5;
 
     /**
      * \brief Returns a string identifying this dabase backend
diff --git a/src/lib/datasrc/datasrc_messages.mes b/src/lib/datasrc/datasrc_messages.mes
index 6af4fe6..ef1b26f 100644
--- a/src/lib/datasrc/datasrc_messages.mes
+++ b/src/lib/datasrc/datasrc_messages.mes
@@ -103,6 +103,17 @@ The data returned by the database backend contained data for the given domain
 name, and it either matches the type or has a relevant type. The RRset that is
 returned is printed.
 
+% DATASRC_DATABASE_ITERATE iterating zone %1
+The program is reading the whole zone, eg. not searching for data, but going
+through each of the RRsets there.
+
+% DATASRC_DATABASE_ITERATE_END iterating zone finished
+While iterating through the zone, the program reached end of the data.
+
+% DATASRC_DATABASE_ITERATE_NEXT next RRset in zone is %1/%2
+While iterating through the zone, the program extracted next RRset from it.
+The name and RRtype of the RRset is indicated in the message.
+
 % DATASRC_DO_QUERY handling query for '%1/%2'
 A debug message indicating that a query for the given name and RR type is being
 processed.
diff --git a/src/lib/datasrc/memory_datasrc.h b/src/lib/datasrc/memory_datasrc.h
index b5193b7..6cd1753 100644
--- a/src/lib/datasrc/memory_datasrc.h
+++ b/src/lib/datasrc/memory_datasrc.h
@@ -182,6 +182,10 @@ private:
     struct InMemoryZoneFinderImpl;
     InMemoryZoneFinderImpl* impl_;
     //@}
+    // The friend here is for InMemoryClient::getIterator. The iterator
+    // needs to access the data inside the zone, so the InMemoryClient
+    // extracts the pointer to data and puts it into the iterator.
+    // The access is read only.
     friend class InMemoryClient;
 };
 
diff --git a/src/lib/datasrc/sqlite3_accessor.cc b/src/lib/datasrc/sqlite3_accessor.cc
index e7aa538..bab7d29 100644
--- a/src/lib/datasrc/sqlite3_accessor.cc
+++ b/src/lib/datasrc/sqlite3_accessor.cc
@@ -138,10 +138,10 @@ const char* const SCHEMA_LIST[] = {
 
 const char* const q_zone_str = "SELECT id FROM zones WHERE name=?1 AND rdclass = ?2";
 
-const char* const q_any_str = "SELECT rdtype, ttl, sigtype, rdata "
+const char* const q_any_str = "SELECT rdtype, ttl, sigtype, rdata, name "
     "FROM records WHERE zone_id=?1 AND name=?2";
 
-const char* const q_iterate_str = "SELECT name, rdtype, ttl, rdata FROM records "
+const char* const q_iterate_str = "SELECT rdtype, ttl, sigtype, rdata, name FROM records "
                                   "WHERE zone_id = ?1 "
                                   "ORDER BY name, rdtype";
 
@@ -362,6 +362,10 @@ convertToPlainChar(const unsigned char* ucp,
 }
 }
 
+// TODO: Once we want to have iterator returned from searchForRecords, this
+// class can be reused. It should be modified to take the sqlite3 statement
+// instead of creating it in constructor, it doesn't have to care which one
+// it is, just provide data from it.
 class SQLite3Database::Context : public DatabaseAccessor::IteratorContext {
 public:
     Context(const boost::shared_ptr<const SQLite3Database>& database, int id) :
@@ -375,18 +379,18 @@ public:
                       " to SQL statement (iterate)");
         }
     }
-    bool getNext(std::string data[4]) {
+    bool getNext(std::string data[], size_t size) {
+        if (size != COLUMN_COUNT) {
+            isc_throw(DataSourceError, "getNext received size of " << size <<
+                      ", not " << COLUMN_COUNT);
+        }
         // If there's another row, get it
         int rc(sqlite3_step(statement));
         if (rc == SQLITE_ROW) {
-            data[0] = convertToPlainChar(sqlite3_column_text(statement, 0),
-                                         database_->dbparameters_);
-            data[1] = convertToPlainChar(sqlite3_column_text(statement, 1),
-                                         database_->dbparameters_);
-            data[2] = boost::lexical_cast<std::string>(
-                sqlite3_column_int(statement, 2));
-            data[3] = convertToPlainChar(sqlite3_column_text(statement, 3),
-                                         database_->dbparameters_);
+            for (size_t i(0); i < size; ++ i) {
+                data[i] = convertToPlainChar(sqlite3_column_text(statement, i),
+                                             database_->dbparameters_);
+            }
             return (true);
         } else if (rc != SQLITE_DONE) {
             isc_throw(DataSourceError,
diff --git a/src/lib/datasrc/tests/database_unittest.cc b/src/lib/datasrc/tests/database_unittest.cc
index 6f9c7d7..48319ea 100644
--- a/src/lib/datasrc/tests/database_unittest.cc
+++ b/src/lib/datasrc/tests/database_unittest.cc
@@ -94,38 +94,41 @@ private:
         MockIteratorContext() :
             step(0)
         { }
-        virtual bool getNext(string data[4]) {
+        virtual bool getNext(string data[], size_t size) {
+            if (size != DatabaseAccessor::COLUMN_COUNT) {
+                isc_throw(DataSourceError, "Wrong column count in getNextRecord");
+            }
             switch (step ++) {
                 case 0:
-                    data[0] = "example.org";
-                    data[1] = "SOA";
-                    data[2] = "300";
-                    data[3] = "ns1.example.org. admin.example.org. "
+                    data[DatabaseAccessor::NAME_COLUMN] = "example.org";
+                    data[DatabaseAccessor::TYPE_COLUMN] = "SOA";
+                    data[DatabaseAccessor::TTL_COLUMN] = "300";
+                    data[DatabaseAccessor::RDATA_COLUMN] = "ns1.example.org. admin.example.org. "
                         "1234 3600 1800 2419200 7200";
                     return (true);
                 case 1:
-                    data[0] = "x.example.org";
-                    data[1] = "A";
-                    data[2] = "300";
-                    data[3] = "192.0.2.1";
+                    data[DatabaseAccessor::NAME_COLUMN] = "x.example.org";
+                    data[DatabaseAccessor::TYPE_COLUMN] = "A";
+                    data[DatabaseAccessor::TTL_COLUMN] = "300";
+                    data[DatabaseAccessor::RDATA_COLUMN] = "192.0.2.1";
                     return (true);
                 case 2:
-                    data[0] = "x.example.org";
-                    data[1] = "A";
-                    data[2] = "300";
-                    data[3] = "192.0.2.2";
+                    data[DatabaseAccessor::NAME_COLUMN] = "x.example.org";
+                    data[DatabaseAccessor::TYPE_COLUMN] = "A";
+                    data[DatabaseAccessor::TTL_COLUMN] = "300";
+                    data[DatabaseAccessor::RDATA_COLUMN] = "192.0.2.2";
                     return (true);
                 case 3:
-                    data[0] = "x.example.org";
-                    data[1] = "AAAA";
-                    data[2] = "300";
-                    data[3] = "2001:db8::1";
+                    data[DatabaseAccessor::NAME_COLUMN] = "x.example.org";
+                    data[DatabaseAccessor::TYPE_COLUMN] = "AAAA";
+                    data[DatabaseAccessor::TTL_COLUMN] = "300";
+                    data[DatabaseAccessor::RDATA_COLUMN] = "2001:db8::1";
                     return (true);
                 case 4:
-                    data[0] = "x.example.org";
-                    data[1] = "AAAA";
-                    data[2] = "300";
-                    data[3] = "2001:db8::2";
+                    data[DatabaseAccessor::NAME_COLUMN] = "x.example.org";
+                    data[DatabaseAccessor::TYPE_COLUMN] = "AAAA";
+                    data[DatabaseAccessor::TTL_COLUMN] = "300";
+                    data[DatabaseAccessor::RDATA_COLUMN] = "2001:db8::2";
                     return (true);
                 default:
                     ADD_FAILURE() <<
@@ -137,7 +140,10 @@ private:
     };
     class EmptyIteratorContext : public IteratorContext {
     public:
-        virtual bool getNext(string[4]) {
+        virtual bool getNext(string[], size_t size) {
+            if (size != DatabaseAccessor::COLUMN_COUNT) {
+                isc_throw(DataSourceError, "Wrong column count in getNextRecord");
+            }
             return (false);
         }
     };
@@ -148,19 +154,22 @@ private:
         BadIteratorContext() :
             step(0)
         { }
-        virtual bool getNext(string data[4]) {
+        virtual bool getNext(string data[], size_t size) {
+            if (size != DatabaseAccessor::COLUMN_COUNT) {
+                isc_throw(DataSourceError, "Wrong column count in getNextRecord");
+            }
             switch (step ++) {
                 case 0:
-                    data[0] = "x.example.org";
-                    data[1] = "A";
-                    data[2] = "300";
-                    data[3] = "192.0.2.1";
+                    data[DatabaseAccessor::NAME_COLUMN] = "x.example.org";
+                    data[DatabaseAccessor::TYPE_COLUMN] = "A";
+                    data[DatabaseAccessor::TTL_COLUMN] = "300";
+                    data[DatabaseAccessor::RDATA_COLUMN] = "192.0.2.1";
                     return (true);
                 case 1:
-                    data[0] = "x.example.org";
-                    data[1] = "A";
-                    data[2] = "301";
-                    data[3] = "192.0.2.2";
+                    data[DatabaseAccessor::NAME_COLUMN] = "x.example.org";
+                    data[DatabaseAccessor::TYPE_COLUMN] = "A";
+                    data[DatabaseAccessor::TTL_COLUMN] = "301";
+                    data[DatabaseAccessor::RDATA_COLUMN] = "192.0.2.2";
                     return (true);
                 default:
                     ADD_FAILURE() <<
@@ -282,6 +291,11 @@ private:
     // so we can immediately start adding new records.
     void addCurName(const std::string& name) {
         ASSERT_EQ(0, records.count(name));
+        // Append the name to all of them
+        for (std::vector<std::vector<std::string> >::iterator
+             i(cur_name.begin()); i != cur_name.end(); ++ i) {
+            i->push_back(name);
+        }
         records[name] = cur_name;
         cur_name.clear();
     }
diff --git a/src/lib/datasrc/tests/sqlite3_accessor_unittest.cc b/src/lib/datasrc/tests/sqlite3_accessor_unittest.cc
index 454638f..89fc069 100644
--- a/src/lib/datasrc/tests/sqlite3_accessor_unittest.cc
+++ b/src/lib/datasrc/tests/sqlite3_accessor_unittest.cc
@@ -114,16 +114,34 @@ TEST_F(SQLite3Access, iterator) {
     ASSERT_NE(DatabaseAccessor::IteratorContextPtr(),
               context);
 
-    std::string data[4];
+    size_t size(5);
+    std::string data[size];
     // Get and check the first and only record
-    EXPECT_TRUE(context->getNext(data));
-    EXPECT_EQ("example2.com.", data[0]);
-    EXPECT_EQ("SOA", data[1]);
+    EXPECT_TRUE(context->getNext(data, size));
+    EXPECT_EQ("example2.com.", data[4]);
+    EXPECT_EQ("SOA", data[0]);
     EXPECT_EQ("master.example2.com. admin.example2.com. "
               "1234 3600 1800 2419200 7200", data[3]);
-    EXPECT_EQ("3600", data[2]);
+    EXPECT_EQ("3600", data[1]);
     // Check there's no other
-    EXPECT_FALSE(context->getNext(data));
+    EXPECT_FALSE(context->getNext(data, size));
+}
+
+TEST_F(SQLite3Access, iteratorColumnCount) {
+    // Our test zone is conveniently small, but not empty
+    initAccessor(SQLITE_DBFILE_EXAMPLE2, RRClass::IN());
+
+    // Get the iterator context
+    DatabaseAccessor::IteratorContextPtr
+        context(db->getAllRecords(Name("example2.com"), 1));
+    ASSERT_NE(DatabaseAccessor::IteratorContextPtr(),
+              context);
+
+    EXPECT_THROW(context->getNext(NULL, 0), DataSourceError);
+    std::string data[6];
+    EXPECT_THROW(context->getNext(data, 4), DataSourceError);
+    EXPECT_THROW(context->getNext(data, 6), DataSourceError);
+    EXPECT_NO_THROW(context->getNext(data, 5));
 }
 
 TEST(SQLite3Open, getDBNameExample2) {
@@ -143,12 +161,14 @@ checkRecordRow(const std::string columns[],
                const std::string& field0,
                const std::string& field1,
                const std::string& field2,
-               const std::string& field3)
+               const std::string& field3,
+               const std::string& field4)
 {
     EXPECT_EQ(field0, columns[0]);
     EXPECT_EQ(field1, columns[1]);
     EXPECT_EQ(field2, columns[2]);
     EXPECT_EQ(field3, columns[3]);
+    EXPECT_EQ(field4, columns[4]);
 }
 
 TEST_F(SQLite3Access, getRecords) {
@@ -163,83 +183,89 @@ TEST_F(SQLite3Access, getRecords) {
 
     // without search, getNext() should return false
     EXPECT_FALSE(db->getNextRecord(columns, column_count));
-    checkRecordRow(columns, "", "", "", "");
+    checkRecordRow(columns, "", "", "", "", "");
 
     db->searchForRecords(zone_id, "foo.bar.");
     EXPECT_FALSE(db->getNextRecord(columns, column_count));
-    checkRecordRow(columns, "", "", "", "");
+    checkRecordRow(columns, "", "", "", "", "");
 
     db->searchForRecords(zone_id, "");
     EXPECT_FALSE(db->getNextRecord(columns, column_count));
-    checkRecordRow(columns, "", "", "", "");
+    checkRecordRow(columns, "", "", "", "", "");
 
     // Should error on a bad number of columns
-    EXPECT_THROW(db->getNextRecord(columns, 3), DataSourceError);
-    EXPECT_THROW(db->getNextRecord(columns, 5), DataSourceError);
+    EXPECT_THROW(db->getNextRecord(columns, 4), DataSourceError);
+    EXPECT_THROW(db->getNextRecord(columns, 6), DataSourceError);
 
     // now try some real searches
     db->searchForRecords(zone_id, "foo.example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "CNAME", "3600", "",
-                   "cnametest.example.org.");
+                   "cnametest.example.org.", "foo.example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "RRSIG", "3600", "CNAME",
                    "CNAME 5 3 3600 20100322084538 20100220084538 33495 "
-                   "example.com. FAKEFAKEFAKEFAKE");
+                   "example.com. FAKEFAKEFAKEFAKE", "foo.example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "NSEC", "7200", "",
-                   "mail.example.com. CNAME RRSIG NSEC");
+                   "mail.example.com. CNAME RRSIG NSEC", "foo.example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "RRSIG", "7200", "NSEC",
                    "NSEC 5 3 7200 20100322084538 20100220084538 33495 "
-                   "example.com. FAKEFAKEFAKEFAKE");
+                   "example.com. FAKEFAKEFAKEFAKE", "foo.example.com.");
     EXPECT_FALSE(db->getNextRecord(columns, column_count));
     // with no more records, the array should not have been modified
     checkRecordRow(columns, "RRSIG", "7200", "NSEC",
                    "NSEC 5 3 7200 20100322084538 20100220084538 33495 "
-                   "example.com. FAKEFAKEFAKEFAKE");
+                   "example.com. FAKEFAKEFAKEFAKE", "foo.example.com.");
 
     db->searchForRecords(zone_id, "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "SOA", "3600", "",
                    "master.example.com. admin.example.com. "
-                   "1234 3600 1800 2419200 7200");
+                   "1234 3600 1800 2419200 7200", "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "RRSIG", "3600", "SOA",
                    "SOA 5 2 3600 20100322084538 20100220084538 "
-                   "33495 example.com. FAKEFAKEFAKEFAKE");
+                   "33495 example.com. FAKEFAKEFAKEFAKE", "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
-    checkRecordRow(columns, "NS", "1200", "", "dns01.example.com.");
+    checkRecordRow(columns, "NS", "1200", "", "dns01.example.com.",
+                   "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
-    checkRecordRow(columns, "NS", "3600", "", "dns02.example.com.");
+    checkRecordRow(columns, "NS", "3600", "", "dns02.example.com.",
+                   "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
-    checkRecordRow(columns, "NS", "1800", "", "dns03.example.com.");
+    checkRecordRow(columns, "NS", "1800", "", "dns03.example.com.",
+                   "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "RRSIG", "3600", "NS",
                    "NS 5 2 3600 20100322084538 20100220084538 "
-                   "33495 example.com. FAKEFAKEFAKEFAKE");
+                   "33495 example.com. FAKEFAKEFAKEFAKE",
+                   "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
-    checkRecordRow(columns, "MX", "3600", "", "10 mail.example.com.");
+    checkRecordRow(columns, "MX", "3600", "", "10 mail.example.com.",
+                   "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "MX", "3600", "",
-                   "20 mail.subzone.example.com.");
+                   "20 mail.subzone.example.com.", "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "RRSIG", "3600", "MX",
                    "MX 5 2 3600 20100322084538 20100220084538 "
-                   "33495 example.com. FAKEFAKEFAKEFAKE");
+                   "33495 example.com. FAKEFAKEFAKEFAKE", "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "NSEC", "7200", "",
-                   "cname-ext.example.com. NS SOA MX RRSIG NSEC DNSKEY");
+                   "cname-ext.example.com. NS SOA MX RRSIG NSEC DNSKEY",
+                   "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "RRSIG", "7200", "NSEC",
                    "NSEC 5 2 7200 20100322084538 20100220084538 "
-                   "33495 example.com. FAKEFAKEFAKEFAKE");
+                   "33495 example.com. FAKEFAKEFAKEFAKE", "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "DNSKEY", "3600", "",
                    "256 3 5 AwEAAcOUBllYc1hf7ND9uDy+Yz1BF3sI0m4q NGV7W"
                    "cTD0WEiuV7IjXgHE36fCmS9QsUxSSOV o1I/FMxI2PJVqTYHkX"
                    "FBS7AzLGsQYMU7UjBZ SotBJ6Imt5pXMu+lEDNy8TOUzG3xm7g"
-                   "0qcbW YF6qCEfvZoBtAqi5Rk7Mlrqs8agxYyMx");
+                   "0qcbW YF6qCEfvZoBtAqi5Rk7Mlrqs8agxYyMx", "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "DNSKEY", "3600", "",
                    "257 3 5 AwEAAe5WFbxdCPq2jZrZhlMj7oJdff3W7syJ tbvzg"
@@ -249,20 +275,20 @@ TEST_F(SQLite3Access, getRecords) {
                    "qiODyNZYQ+ZrLmF0KIJ2yPN3iO6Zq 23TaOrVTjB7d1a/h31OD"
                    "fiHAxFHrkY3t3D5J R9Nsl/7fdRmSznwtcSDgLXBoFEYmw6p86"
                    "Acv RyoYNcL1SXjaKVLG5jyU3UR+LcGZT5t/0xGf oIK/aKwEN"
-                   "rsjcKZZj660b1M=");
+                   "rsjcKZZj660b1M=", "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "RRSIG", "3600", "DNSKEY",
                    "DNSKEY 5 2 3600 20100322084538 20100220084538 "
-                   "4456 example.com. FAKEFAKEFAKEFAKE");
+                   "4456 example.com. FAKEFAKEFAKEFAKE", "example.com.");
     ASSERT_TRUE(db->getNextRecord(columns, column_count));
     checkRecordRow(columns, "RRSIG", "3600", "DNSKEY",
                    "DNSKEY 5 2 3600 20100322084538 20100220084538 "
-                   "33495 example.com. FAKEFAKEFAKEFAKE");
+                   "33495 example.com. FAKEFAKEFAKEFAKE", "example.com.");
     EXPECT_FALSE(db->getNextRecord(columns, column_count));
     // getnextrecord returning false should mean array is not altered
     checkRecordRow(columns, "RRSIG", "3600", "DNSKEY",
                    "DNSKEY 5 2 3600 20100322084538 20100220084538 "
-                   "33495 example.com. FAKEFAKEFAKEFAKE");
+                   "33495 example.com. FAKEFAKEFAKEFAKE", "example.com.");
 }
 
 } // end anonymous namespace




More information about the bind10-changes mailing list