[svn] commit: r2211 - in /branches/trac232/src: bin/auth/auth.spec.pre.in bin/auth/auth_srv.cc lib/datasrc/data_source.cc lib/datasrc/data_source.h lib/datasrc/sqlite3_datasrc.cc lib/datasrc/sqlite3_datasrc.h

BIND 10 source code commits bind10-changes at lists.isc.org
Tue Jun 22 08:30:09 UTC 2010


Author: jelte
Date: Tue Jun 22 08:30:08 2010
New Revision: 2211

Log:
use RRsetPtr instead of RRset&
make delRR in sqlite handle ANY and rrsets with no rdata (i.e. delete all of this type)

Modified:
    branches/trac232/src/bin/auth/auth.spec.pre.in
    branches/trac232/src/bin/auth/auth_srv.cc
    branches/trac232/src/lib/datasrc/data_source.cc
    branches/trac232/src/lib/datasrc/data_source.h
    branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
    branches/trac232/src/lib/datasrc/sqlite3_datasrc.h

Modified: branches/trac232/src/bin/auth/auth.spec.pre.in
==============================================================================
--- branches/trac232/src/bin/auth/auth.spec.pre.in (original)
+++ branches/trac232/src/bin/auth/auth.spec.pre.in Tue Jun 22 08:30:08 2010
@@ -77,7 +77,7 @@
           },
           { "item_name": "rr_rdata",
             "item_type": "string",
-            "item_optional": false,
+            "item_optional": true,
             "item_default": ""
           }
         ]

Modified: branches/trac232/src/bin/auth/auth_srv.cc
==============================================================================
--- branches/trac232/src/bin/auth/auth_srv.cc (original)
+++ branches/trac232/src/bin/auth/auth_srv.cc Tue Jun 22 08:30:08 2010
@@ -329,17 +329,16 @@
 {
     Name zone_name = Name(args->get("zone_name")->stringValue());
     RRClass rrclass = RRClass(args->get("rr_class")->stringValue());
-    
     NameMatch match(zone_name);
     impl_->data_sources_.findClosestEnclosure(match, rrclass);
     DataSrc* datasource = (DataSrc*) match.bestDataSrc();
     if (datasource) {
-        RRset rrset(Name(args->get("rr_name")->stringValue()),
-                    rrclass,
-                    RRType(args->get("rr_type")->stringValue()),
-                    RRTTL(args->get("rr_ttl")->stringValue()));
-        RdataPtr rdata = createRdata(rrset.getType(), rrset.getClass(), args->get("rr_rdata")->stringValue());
-        rrset.addRdata(rdata);
+        RRsetPtr rrset = RRsetPtr(new RRset(Name(args->get("rr_name")->stringValue()),
+                                   rrclass,
+                                   RRType(args->get("rr_type")->stringValue()),
+                                   RRTTL(args->get("rr_ttl")->stringValue())));
+        RdataPtr rdata = createRdata(rrset->getType(), rrset->getClass(), args->get("rr_rdata")->stringValue());
+        rrset->addRdata(rdata);
         DataSrcTransaction* transaction;
         DataSrc::Result r = datasource->startTransaction(&transaction, zone_name);
         if (r != DataSrc::SUCCESS) {
@@ -359,7 +358,7 @@
         }
         
     } else {
-        return isc::config::createAnswer(1, "Not data store found for zone");
+        return isc::config::createAnswer(1, "No data store found for zone");
     }
 }
 
@@ -372,13 +371,24 @@
     NameMatch match(zone_name);
     impl_->data_sources_.findClosestEnclosure(match, rrclass);
     DataSrc* datasource = (DataSrc*) match.bestDataSrc();
+    // hmz can't we assign RRTypes?
     if (datasource) {
-        RRset rrset(Name(args->get("rr_name")->stringValue()),
-                    rrclass,
-                    RRType(args->get("rr_type")->stringValue()),
-                    RRTTL(0));
-        RdataPtr rdata = createRdata(rrset.getType(), rrset.getClass(), args->get("rr_rdata")->stringValue());
-        rrset.addRdata(rdata);
+        RRsetPtr rrset;
+        if (args->get("rr_type")->stringValue() == "ANY") {
+            rrset = RRsetPtr(new RRset(Name(args->get("rr_name")->stringValue()),
+                                       rrclass,
+                                       RRType::ANY(),
+                                       RRTTL(0)));
+        } else {
+            rrset = RRsetPtr(new RRset(Name(args->get("rr_name")->stringValue()),
+                                       rrclass,
+                                       RRType(args->get("rr_type")->stringValue()),
+                                       RRTTL(0)));
+            if (args->contains("rr_rdata")) {
+                RdataPtr rdata = createRdata(rrset->getType(), rrset->getClass(), args->get("rr_rdata")->stringValue());
+                rrset->addRdata(rdata);
+            }
+        }
         DataSrcTransaction* transaction;
         DataSrc::Result r = datasource->startTransaction(&transaction, zone_name);
         if (r != DataSrc::SUCCESS) {
@@ -396,9 +406,8 @@
         } else {
             return isc::config::createAnswer(r, "error");
         }
-        
     } else {
-        return isc::config::createAnswer(1, "Not data store found for zone");
-    }
-
-}
+        return isc::config::createAnswer(1, "No data store found for zone");
+    }
+
+}

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 Tue Jun 22 08:30:08 2010
@@ -936,14 +936,14 @@
 
 DataSrc::Result
 DataSrc::addRRset(DataSrcTransaction* transaction UNUSED_PARAM,
-                  const isc::dns::RRset& rrset UNUSED_PARAM)
+                  const isc::dns::ConstRRsetPtr rrset UNUSED_PARAM)
 {
     return NOT_IMPLEMENTED;
 }
 
 DataSrc::Result
 DataSrc::delRRset(DataSrcTransaction* transaction UNUSED_PARAM,
-                  const isc::dns::RRset& rrset UNUSED_PARAM)
+                  isc::dns::ConstRRsetPtr rrset UNUSED_PARAM)
 {
     return NOT_IMPLEMENTED;
 }
@@ -1026,7 +1026,7 @@
 
 DataSrc::Result
 MetaDataSrc::addRRset(DataSrcTransaction* transaction UNUSED_PARAM,
-                      const isc::dns::RRset& rrset UNUSED_PARAM)
+                      isc::dns::ConstRRsetPtr rrset UNUSED_PARAM)
 {
     return NOT_IMPLEMENTED;
     // TODO: factor out this code (copied from doQuery)
@@ -1045,7 +1045,7 @@
 
 DataSrc::Result
 MetaDataSrc::delRRset(DataSrcTransaction* transaction UNUSED_PARAM,
-                      const isc::dns::RRset& rrset UNUSED_PARAM)
+                      isc::dns::ConstRRsetPtr rrset UNUSED_PARAM)
 {
     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 Tue Jun 22 08:30:08 2010
@@ -27,6 +27,7 @@
 
 #include <dns/name.h>
 #include <dns/rrclass.h>
+#include <dns/rrset.h>
 #include <cc/data.h>
 
 namespace isc {
@@ -244,9 +245,9 @@
     // functions there. (keeping in mind that high-level write
     // functions also need read functionality)
     virtual Result addRRset(DataSrcTransaction* transaction,
-                            const isc::dns::RRset& rrset);
+                            isc::dns::ConstRRsetPtr rrset);
     virtual Result delRRset(DataSrcTransaction* transaction,
-                            const isc::dns::RRset& rrset);
+                            isc::dns::ConstRRsetPtr rrset);
     virtual Result startTransaction(DataSrcTransaction** transaction, const isc::dns::Name& zonename);
     virtual Result commitTransaction(DataSrcTransaction *transaction);
     virtual Result rollbackTransaction(DataSrcTransaction *transaction);
@@ -329,9 +330,9 @@
     virtual Result rollbackTransaction(DataSrcTransaction* transaction);
     
     virtual Result addRRset(DataSrcTransaction* transaction,
-                            const isc::dns::RRset& rrset);
+                            isc::dns::ConstRRsetPtr rrset);
     virtual Result delRRset(DataSrcTransaction* transaction,
-                            const isc::dns::RRset& rrset);
+                            isc::dns::ConstRRsetPtr rrset);
     // end of writable data sources part
 private:
     std::vector<ConstDataSrcPtr> data_sources;

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 Tue Jun 22 08:30:08 2010
@@ -28,6 +28,8 @@
 #include <dns/rdataclass.h>
 #include <dns/rrset.h>
 #include <dns/rrsetlist.h>
+
+#include <boost/foreach.hpp>
 
 using namespace std;
 using namespace isc::dns;
@@ -55,6 +57,7 @@
     sqlite3_stmt* q_prevnsec3_;
     sqlite3_stmt* w_add_rr_;
     sqlite3_stmt* w_del_rr_;
+    sqlite3_stmt* w_del_all_;
 };
 
 namespace {
@@ -120,13 +123,17 @@
     "VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";
 
 const char* const w_del_rr_str = "DELETE FROM records WHERE "
-    "zone_id = ?1 AND name = ?2 AND rdtype = ?3 AND rdata = ?4";
+    "zone_id = ?1 AND name = ?2 AND rdtype LIKE ?3 AND rdata LIKE ?4";
+
+const char* const w_del_all_str = "DELETE FROM records WHERE zone_id = ?1";
 
 const char* const w_start_transaction_str = "BEGIN TRANSACTION";
 
 const char* const w_commit_transaction_str = "COMMIT TRANSACTION";
 
 const char* const w_rollback_transaction_str = "ROLLBACK TRANSACTION";
+
+
 }
 
 
@@ -684,6 +691,7 @@
     initializer->params_.q_prevnsec3_ = prepare(db, q_prevnsec3_str);
     initializer->params_.w_add_rr_ = prepare(db, w_add_rr_str);
     initializer->params_.w_del_rr_ = prepare(db, w_del_rr_str);
+    initializer->params_.w_del_all_ = prepare(db, w_del_all_str);
     
 }
 }
@@ -751,6 +759,9 @@
     sqlite3_finalize(dbparameters->w_del_rr_);
     dbparameters->w_del_rr_ = NULL;
 
+    sqlite3_finalize(dbparameters->w_del_all_);
+    dbparameters->w_del_rr_ = NULL;
+
     sqlite3_close(dbparameters->db_);
     dbparameters->db_ = NULL;
 
@@ -872,19 +883,19 @@
 
 DataSrc::Result
 Sqlite3DataSrc::addRRset(DataSrcTransaction* transaction,
-                         const isc::dns::RRset& rrset)
+                         isc::dns::ConstRRsetPtr rrset)
 {
     std::cout << "[XX] addRR at sqlite3" << std::endl;
     Sqlite3DataSrcTransaction* trans = (Sqlite3DataSrcTransaction*) transaction;
     std::cout << "[XX] zone id: " << trans->zone_id << std::endl;
 
-    RdataIteratorPtr rdp = rrset.getRdataIterator();
+    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::Result result = DataSrc::SUCCESS;
     do {
-        result = addRR(trans->zone_id, rrset.getName(), rrset.getType(), rrset.getTTL(), rdp->getCurrent());
+        result = addRR(trans->zone_id, rrset->getName(), rrset->getType(), rrset->getTTL(), rdp->getCurrent());
         if (result != DataSrc::SUCCESS) {
             return result;
         } else {
@@ -897,8 +908,7 @@
 DataSrc::Result
 Sqlite3DataSrc::delRR(int zone_id,
                       const isc::dns::Name& name,
-                      const isc::dns::RRType& rrtype,
-                      const isc::dns::rdata::Rdata& rdata)
+                      const isc::dns::RRType& rrtype)
 {
     sqlite3_stmt* query = dbparameters->w_del_rr_;
     
@@ -918,6 +928,65 @@
                   " to SQL statement (query)");
     }
 
+    if (rrtype == RRType::ANY()) {
+        std::cout << "[XX] rrtype any" << std::endl;
+        rc = sqlite3_bind_text(query, 3, "%", -1,
+                               SQLITE_STATIC);
+    } else {
+        rc = sqlite3_bind_text(query, 3, rrtype.toText().c_str(), -1,
+                               SQLITE_TRANSIENT);
+    }
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind RR type " <<
+                  rrtype.toText() << " to SQL statement (query)");
+    }
+
+    rc = sqlite3_bind_text(query, 4, "%", -1,
+                           SQLITE_TRANSIENT);
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind '%' rdata "
+                                " to SQL statement (query)");
+    }
+
+    std::cout << "[XX] query prepared, executing" << std::endl;
+    int result = sqlite3_step(query);
+
+    sqlite3_reset(query);
+
+    if (result == SQLITE_DONE) {
+        return DataSrc::SUCCESS;
+    } else {
+        std::cout << "[XX] sqlite3 del_rr error: " << result << std::endl;;
+        std::cout << "[XX] " << sqlite3_errmsg(dbparameters->db_) << std::endl;
+
+        return DataSrc::ERROR;
+    }
+}
+
+DataSrc::Result
+Sqlite3DataSrc::delRR(int zone_id,
+                      const isc::dns::Name& name,
+                      const isc::dns::RRType& rrtype,
+                      const isc::dns::rdata::Rdata& rdata)
+{
+    sqlite3_stmt* query = dbparameters->w_del_rr_;
+    
+    sqlite3_reset(query);
+    sqlite3_clear_bindings(query);
+
+    int rc;
+    rc = sqlite3_bind_int(query, 1, zone_id);
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind zone ID " << zone_id <<
+                  " to SQL statement (query)");
+    }
+    const string s_name = name.toText();
+    rc = sqlite3_bind_text(query, 2, s_name.c_str(), -1, SQLITE_STATIC);
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind name " << s_name <<
+                  " to SQL statement (query)");
+    }
+
     rc = sqlite3_bind_text(query, 3, rrtype.toText().c_str(), -1,
                            SQLITE_STATIC);
     if (rc != SQLITE_OK) {
@@ -948,27 +1017,77 @@
 }
 
 DataSrc::Result
+Sqlite3DataSrc::delAll(int zone_id)
+{
+    sqlite3_stmt* query = dbparameters->w_del_rr_;
+    
+    sqlite3_reset(query);
+    sqlite3_clear_bindings(query);
+
+    int rc;
+    rc = sqlite3_bind_int(query, 1, zone_id);
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind zone ID " << zone_id <<
+                  " to SQL statement (query)");
+    }
+
+    std::cout << "[XX] query prepared, executing" << std::endl;
+    int result = sqlite3_step(query);
+
+    sqlite3_reset(query);
+
+    if (result == SQLITE_DONE) {
+        return DataSrc::SUCCESS;
+    } else {
+        std::cout << "[XX] sqlite3 add_rr error: " << result << std::endl;;
+        std::cout << "[XX] " << sqlite3_errmsg(dbparameters->db_) << std::endl;
+
+        return DataSrc::ERROR;
+    }
+}
+
+DataSrc::Result
+Sqlite3DataSrc::replaceZone(DataSrcTransaction* transaction,
+                            isc::dns::RRsetList& rrsets)
+{
+    Sqlite3DataSrcTransaction *trans = (Sqlite3DataSrcTransaction*)transaction;
+    DataSrc::Result result = delAll(trans->zone_id);
+    if (result != DataSrc::SUCCESS) {
+        return result;
+    }
+    BOOST_FOREACH(isc::dns::ConstRRsetPtr rrset, rrsets) {
+        addRRset(transaction, rrset);
+    }
+    return DataSrc::SUCCESS;
+}
+
+DataSrc::Result
 Sqlite3DataSrc::delRRset(DataSrcTransaction* transaction,
-                         const isc::dns::RRset& rrset)
+                         isc::dns::ConstRRsetPtr rrset)
 {
     std::cout << "[XX] delRR at sqlite3" << std::endl;
     Sqlite3DataSrcTransaction* trans = (Sqlite3DataSrcTransaction*) transaction;
     
     std::cout << "[XX] zone id for: " << trans->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::Result result = DataSrc::SUCCESS;
-    do {
-        result = delRR(trans->zone_id, rrset.getName(), rrset.getType(), rdp->getCurrent());
-        if (result != DataSrc::SUCCESS) {
-            return result;
-        } else {
-            rdp->next();
-        }
-    } while (!rdp->isLast());
+
+    if (rrset->getRdataCount() > 0) {
+        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;
+        do {
+            result = delRR(trans->zone_id, rrset->getName(), rrset->getType(), rdp->getCurrent());
+            if (result != DataSrc::SUCCESS) {
+                return result;
+            } else {
+                rdp->next();
+            }
+        } while (!rdp->isLast());
+    } else {
+        result = delRR(trans->zone_id, rrset->getName(), rrset->getType());
+    }
     return result;
 }
 

Modified: branches/trac232/src/lib/datasrc/sqlite3_datasrc.h
==============================================================================
--- branches/trac232/src/lib/datasrc/sqlite3_datasrc.h (original)
+++ branches/trac232/src/lib/datasrc/sqlite3_datasrc.h Tue Jun 22 08:30:08 2010
@@ -115,9 +115,11 @@
     
     //DataSrc::Result addRRset(const isc::dns::Name& zonename, const isc::dns::RRset& rrset);
     DataSrc::Result addRRset(DataSrcTransaction* transaction,
-                             const isc::dns::RRset& rrset);
+                             isc::dns::ConstRRsetPtr rrset);
     DataSrc::Result delRRset(DataSrcTransaction* transaction,
-                             const isc::dns::RRset& rrset);
+                             isc::dns::ConstRRsetPtr rrset);
+    DataSrc::Result replaceZone(DataSrcTransaction* transaction,
+                                isc::dns::RRsetList& rrsets);
 private:
     DataSrc::Result addRR(int zone_id,
                           const isc::dns::Name& name,
@@ -126,8 +128,12 @@
                           const isc::dns::rdata::Rdata& rdata);
     DataSrc::Result delRR(int zone_id,
                           const isc::dns::Name& name,
+                          const isc::dns::RRType& rrtype);
+    DataSrc::Result delRR(int zone_id,
+                          const isc::dns::Name& name,
                           const isc::dns::RRType& rrtype,
                           const isc::dns::rdata::Rdata& rdata);
+    DataSrc::Result delAll(int zone_id);
 
 private:
     enum Mode {




More information about the bind10-changes mailing list