[svn] commit: r2196 - in /branches/trac232/src: bin/auth/auth.spec.pre.in bin/auth/auth_srv.cc bin/auth/auth_srv.h bin/auth/main.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
Mon Jun 21 11:35:54 UTC 2010


Author: jelte
Date: Mon Jun 21 11:35:54 2010
New Revision: 2196

Log:
checkpoint commit, some very naive and unfinished functions to add and delete an rr. Added a few temporary functions to authsrv to perform these actions for quick testing.

Modified:
    branches/trac232/src/bin/auth/auth.spec.pre.in
    branches/trac232/src/bin/auth/auth_srv.cc
    branches/trac232/src/bin/auth/auth_srv.h
    branches/trac232/src/bin/auth/main.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 Mon Jun 21 11:35:54 2010
@@ -14,6 +14,73 @@
         "command_name": "shutdown",
         "command_description": "Shut down authoritative DNS server",
         "command_args": []
+      },
+      {
+        "command_name": "add_rr",
+        "command_description": "Add an RR to the given zone (temp for testing)",
+        "command_args": [
+          { "item_name": "zone_name",
+            "item_type": "string",
+            "item_optional": false,
+            "item_default": ""
+          },
+          { "item_name": "rr_name",
+            "item_type": "string",
+            "item_optional": false,
+            "item_default": ""
+          },
+          { "item_name": "rr_class",
+            "item_type": "string",
+            "item_optional": false,
+            "item_default": ""
+          },
+          { "item_name": "rr_type",
+            "item_type": "string",
+            "item_optional": false,
+            "item_default": ""
+          },
+          { "item_name": "rr_ttl",
+            "item_type": "string",
+            "item_optional": false,
+            "item_default": ""
+          },
+          { "item_name": "rr_rdata",
+            "item_type": "string",
+            "item_optional": false,
+            "item_default": ""
+          }
+        ]
+      },
+      {
+        "command_name": "del_rr",
+        "command_description": "Remove rr from the given zone (temp for testing)",
+        "command_args": [
+          { "item_name": "zone_name",
+            "item_type": "string",
+            "item_optional": false,
+            "item_default": ""
+          },
+          { "item_name": "rr_name",
+            "item_type": "string",
+            "item_optional": false,
+            "item_default": ""
+          },
+          { "item_name": "rr_class",
+            "item_type": "string",
+            "item_optional": false,
+            "item_default": ""
+          },
+          { "item_name": "rr_type",
+            "item_type": "string",
+            "item_optional": false,
+            "item_default": ""
+          },
+          { "item_name": "rr_rdata",
+            "item_type": "string",
+            "item_optional": false,
+            "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 Mon Jun 21 11:35:54 2010
@@ -76,6 +76,7 @@
 
     /// Currently non-configurable, but will be.
     static const uint16_t DEFAULT_LOCAL_UDPSIZE = 4096;
+
 };
 
 AuthSrvImpl::AuthSrvImpl() : cs_(NULL), verbose_mode_(false)
@@ -318,3 +319,84 @@
         return isc::config::createAnswer(1, error.what());
     }
 }
+
+//
+// TEMP, just a bindctl command to add an RR
+//
+
+ElementPtr
+AuthSrv::addRR(isc::data::ElementPtr args)
+{
+    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);
+        DataSrc::Result r = datasource->startTransaction();
+        if (r != DataSrc::SUCCESS) {
+            return isc::config::createAnswer(r, "error starting transaction");
+        }
+        r = datasource->addRRset(zone_name, rrset);
+        std::cout << "[XX] RESULT: " << r << std::endl;
+        if (r != DataSrc::SUCCESS) {
+            // log? rollback immediately?
+        }
+        r = datasource->commitTransaction();
+        std::cout << "[XX] RESULT rollback: " << r << std::endl;
+        if (r == DataSrc::SUCCESS) {
+            return isc::config::createAnswer();
+        } else {
+            return isc::config::createAnswer(r, "error");
+        }
+        
+    } else {
+        return isc::config::createAnswer(1, "Not data store found for zone");
+    }
+}
+
+ElementPtr
+AuthSrv::delRR(isc::data::ElementPtr args)
+{
+    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(0));
+        RdataPtr rdata = createRdata(rrset.getType(), rrset.getClass(), args->get("rr_rdata")->stringValue());
+        rrset.addRdata(rdata);
+        DataSrc::Result r = datasource->startTransaction();
+        if (r != DataSrc::SUCCESS) {
+            return isc::config::createAnswer(r, "error starting transaction");
+        }
+        r = datasource->delRRset(zone_name, rrset);
+        std::cout << "[XX] RESULT: " << r << std::endl;
+        if (r != DataSrc::SUCCESS) {
+            // log? rollback immediately?
+        }
+        r = datasource->commitTransaction();
+        std::cout << "[XX] RESULT rollback: " << r << std::endl;
+        if (r == DataSrc::SUCCESS) {
+            return isc::config::createAnswer();
+        } else {
+            return isc::config::createAnswer(r, "error");
+        }
+        
+    } else {
+        return isc::config::createAnswer(1, "Not data store found for zone");
+    }
+
+}

Modified: branches/trac232/src/bin/auth/auth_srv.h
==============================================================================
--- branches/trac232/src/bin/auth/auth_srv.h (original)
+++ branches/trac232/src/bin/auth/auth_srv.h Mon Jun 21 11:35:54 2010
@@ -58,6 +58,10 @@
     isc::data::ElementPtr updateConfig(isc::data::ElementPtr config);
     isc::config::ModuleCCSession* configSession() const;
     void setConfigSession(isc::config::ModuleCCSession* cs);
+    // temporarily added for manual testing of writable data sources
+    isc::data::ElementPtr addRR(isc::data::ElementPtr arg);
+    isc::data::ElementPtr delRR(isc::data::ElementPtr arg);
+    // end temp add
 private:
     AuthSrvImpl* impl_;
 };

Modified: branches/trac232/src/bin/auth/main.cc
==============================================================================
--- branches/trac232/src/bin/auth/main.cc (original)
+++ branches/trac232/src/bin/auth/main.cc Mon Jun 21 11:35:54 2010
@@ -77,6 +77,10 @@
         cout << args << endl;
         /* let's add that message to our answer as well */
         answer->get("result")->add(args);
+    } else if (command == "add_rr") {
+        answer = auth_server->addRR(args);
+    } else if (command == "del_rr") {
+        answer = auth_server->delRR(args);
     } else if (command == "shutdown") {
         io_service->stop();
     }

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 Mon Jun 21 11:35:54 2010
@@ -917,6 +917,38 @@
 }
 
 DataSrc::Result
+DataSrc::startTransaction()
+{
+    return NOT_IMPLEMENTED;
+}
+
+DataSrc::Result
+DataSrc::commitTransaction()
+{
+    return NOT_IMPLEMENTED;
+}
+
+DataSrc::Result
+DataSrc::rollbackTransaction()
+{
+    return NOT_IMPLEMENTED;
+}
+
+DataSrc::Result
+DataSrc::addRRset(const isc::dns::Name& zonename UNUSED_PARAM,
+                  const isc::dns::RRset& rrset UNUSED_PARAM)
+{
+    return NOT_IMPLEMENTED;
+}
+
+DataSrc::Result
+DataSrc::delRRset(const isc::dns::Name& zonename UNUSED_PARAM,
+                  const isc::dns::RRset& rrset UNUSED_PARAM)
+{
+    return NOT_IMPLEMENTED;
+}
+
+DataSrc::Result
 MetaDataSrc::findRRset(const isc::dns::Name& qname UNUSED_PARAM,
                        const isc::dns::RRClass& qclass UNUSED_PARAM,
                        const isc::dns::RRType& qtype UNUSED_PARAM,
@@ -974,5 +1006,62 @@
     return (NOT_IMPLEMENTED);
 }
 
-}
-}
+DataSrc::Result
+MetaDataSrc::startTransaction()
+{
+    return NOT_IMPLEMENTED;
+}
+
+DataSrc::Result
+MetaDataSrc::commitTransaction()
+{
+    return NOT_IMPLEMENTED;
+}
+
+DataSrc::Result
+MetaDataSrc::rollbackTransaction()
+{
+    return NOT_IMPLEMENTED;
+}
+
+DataSrc::Result
+MetaDataSrc::addRRset(const isc::dns::Name& zonename UNUSED_PARAM,
+                      const isc::dns::RRset& rrset UNUSED_PARAM)
+{
+    return NOT_IMPLEMENTED;
+    // TODO: factor out this code (copied from doQuery)
+    // (with one change, no DS special case)
+    /*
+    NameMatch match(zonename);
+    findClosestEnclosure(match, rrset.getClass());
+    DataSrc* datasource = (DataSrc*) match.bestDataSrc();
+    if (datasource) {
+        return datasource->addRRset(zonename, rrset);
+    } else {
+        return DataSrc::ERROR;
+    }
+    */
+}
+
+DataSrc::Result
+MetaDataSrc::delRRset(const isc::dns::Name& zonename UNUSED_PARAM,
+                      const isc::dns::RRset& rrset UNUSED_PARAM)
+{
+    return NOT_IMPLEMENTED;
+
+    // TODO: factor out this code (copied from doQuery)
+    // (with one change, no DS special case)
+    /*
+    NameMatch match(zonename);
+    findClosestEnclosure(match, rrset.getClass());
+    DataSrc* datasource = (DataSrc*) match.bestDataSrc();
+    if (datasource) {
+        return datasource->delRRset(zonename, rrset);
+    } else {
+        return DataSrc::ERROR;
+    }
+    */
+}
+
+}
+}

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 Mon Jun 21 11:35:54 2010
@@ -225,6 +225,23 @@
                                     std::string& hash,
                                     isc::dns::RRsetList& target) const = 0;
 
+    //
+    // Writable data sources
+    //
+    // This certainly not the final API, we probably want to
+    // make transactions mandatory (even if start/end are nops),
+    // by either creating a transaction context, or even a 'writable'
+    // class that creates the transaction on init, and move al write
+    // functions there. (keeping in mind that high-level write
+    // functions also need read functionality)
+    virtual Result addRRset(const isc::dns::Name& zonename,
+                            const isc::dns::RRset& rrset);
+    virtual Result delRRset(const isc::dns::Name& zonename,
+                            const isc::dns::RRset& rrset);
+    virtual Result startTransaction();
+    virtual Result commitTransaction();
+    virtual Result rollbackTransaction();
+
 private:
     isc::dns::RRClass rrclass;
 };
@@ -294,6 +311,19 @@
                                     std::string& hash,
                                     isc::dns::RRsetList& target) const;
 
+    //
+    // Writable data sources
+    //
+    // see comments at DataSrc
+    virtual Result startTransaction();
+    virtual Result commitTransaction();
+    virtual Result rollbackTransaction();
+    
+    virtual Result addRRset(const isc::dns::Name& zonename,
+                            const isc::dns::RRset& rrset);
+    virtual Result delRRset(const isc::dns::Name& zonename,
+                            const isc::dns::RRset& 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 Mon Jun 21 11:35:54 2010
@@ -38,7 +38,7 @@
     Sqlite3Parameters() :  db_(NULL), version_(-1),
         q_zone_(NULL), q_record_(NULL), q_addrs_(NULL), q_referral_(NULL),
         q_any_(NULL), q_count_(NULL), q_previous_(NULL), q_nsec3_(NULL),
-        q_prevnsec3_(NULL)
+        q_prevnsec3_(NULL), w_add_rr_(NULL)
     {}
     sqlite3* db_;
     int version_;
@@ -51,6 +51,8 @@
     sqlite3_stmt* q_previous_;
     sqlite3_stmt* q_nsec3_;
     sqlite3_stmt* q_prevnsec3_;
+    sqlite3_stmt* w_add_rr_;
+    sqlite3_stmt* w_del_rr_;
 };
 
 namespace {
@@ -111,7 +113,20 @@
 const char* const q_prevnsec3_str = "SELECT hash FROM nsec3 "
     "WHERE zone_id = ?1 AND hash <= $2 ORDER BY hash DESC LIMIT 1";
 
-}
+const char* const w_add_rr_str = "INSERT INTO records "
+    "(zone_id, name, rname, ttl, rdtype, sigtype, rdata) "
+    "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";
+
+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";
+}
+
 
 //
 //  Find the exact zone match.  Return -1 if not found, or the zone's
@@ -606,6 +621,12 @@
         if (params_.q_prevnsec3_ != NULL) {
             sqlite3_finalize(params_.q_prevnsec3_);
         }
+        if (params_.w_add_rr_ != NULL) {
+            sqlite3_finalize(params_.w_add_rr_);
+        }
+        if (params_.w_del_rr_ != NULL) {
+            sqlite3_finalize(params_.w_del_rr_);
+        }
         if (params_.db_ != NULL) {
             sqlite3_close(params_.db_);
         }
@@ -659,6 +680,9 @@
     initializer->params_.q_previous_ = prepare(db, q_previous_str);
     initializer->params_.q_nsec3_ = prepare(db, q_nsec3_str);
     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);
+    
 }
 }
 
@@ -719,11 +743,228 @@
     sqlite3_finalize(dbparameters->q_nsec3_);
     dbparameters->q_nsec3_ = NULL;
 
+    sqlite3_finalize(dbparameters->w_add_rr_);
+    dbparameters->w_add_rr_ = NULL;
+
+    sqlite3_finalize(dbparameters->w_del_rr_);
+    dbparameters->w_del_rr_ = NULL;
+
     sqlite3_close(dbparameters->db_);
     dbparameters->db_ = NULL;
 
     return (SUCCESS);
 }
 
-}
-}
+DataSrc::Result
+Sqlite3DataSrc::startTransaction()
+{
+    int result = sqlite3_exec(dbparameters->db_, w_start_transaction_str, NULL, NULL, NULL);
+    if (result == SQLITE_OK) {
+        return DataSrc::SUCCESS;
+    } else {
+        return DataSrc::ERROR;
+    }
+}
+
+DataSrc::Result
+Sqlite3DataSrc::commitTransaction()
+{
+    int result = sqlite3_exec(dbparameters->db_, w_commit_transaction_str, NULL, NULL, NULL);
+    if (result == SQLITE_OK) {
+        return DataSrc::SUCCESS;
+    } else {
+        return DataSrc::ERROR;
+    }
+}
+
+DataSrc::Result
+Sqlite3DataSrc::rollbackTransaction()
+{
+    int result = sqlite3_exec(dbparameters->db_, w_rollback_transaction_str, NULL, NULL, NULL);
+    if (result == SQLITE_OK) {
+        return DataSrc::SUCCESS;
+    } else {
+        return DataSrc::ERROR;
+    }
+}
+
+
+DataSrc::Result
+Sqlite3DataSrc::addRR(int zone_id,
+                      const isc::dns::Name& name,
+                      const isc::dns::RRType& rrtype,
+                      const isc::dns::RRTTL& rrttl,
+                      const isc::dns::rdata::Rdata& rdata)
+{
+
+    sqlite3_stmt* query = dbparameters->w_add_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)");
+    }
+
+    // reverse name
+    const string r_name = name.reverse().toText();
+    rc = sqlite3_bind_text(query, 3, r_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_int(query, 4, rrttl.getValue());
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind RR TTL " <<
+                  rrttl.toText() << " to SQL statement (query)");
+    }
+
+    rc = sqlite3_bind_text(query, 5, rrtype.toText().c_str(), -1,
+                           SQLITE_STATIC);
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind RR type " <<
+                  rrtype.toText() << " to SQL statement (query)");
+    }
+
+    // TODO: sigtype
+
+    rc = sqlite3_bind_text(query, 7, rdata.toText().c_str(), -1,
+                           SQLITE_TRANSIENT);
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind RR rdata " <<
+                  rdata.toText() << " 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::addRRset(const isc::dns::Name& zonename,
+                         const isc::dns::RRset& rrset)
+{
+    std::cout << "[XX] addRR at sqlite3" << std::endl;
+    int zone_id = hasExactZone(zonename.toText().c_str());
+    
+    std::cout << "[XX] zone id for: " << zonename << ": " << 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 = addRR(zone_id, rrset.getName(), rrset.getType(), rrset.getTTL(), rdp->getCurrent());
+        if (result != DataSrc::SUCCESS) {
+            return result;
+        } else {
+            rdp->next();
+        }
+    } while (!rdp->isLast());
+    return result;
+}
+
+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) {
+        isc_throw(Sqlite3Error, "Could not bind RR type " <<
+                  rrtype.toText() << " to SQL statement (query)");
+    }
+
+    rc = sqlite3_bind_text(query, 4, rdata.toText().c_str(), -1,
+                           SQLITE_TRANSIENT);
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind RR rdata " <<
+                  rdata.toText() << " 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::delRRset(const isc::dns::Name& zonename,
+                         const isc::dns::RRset& rrset)
+{
+    std::cout << "[XX] delRR at sqlite3" << std::endl;
+    int zone_id = hasExactZone(zonename.toText().c_str());
+    
+    std::cout << "[XX] zone id for: " << zonename << ": " << 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(zone_id, rrset.getName(), rrset.getType(), rdp->getCurrent());
+        if (result != DataSrc::SUCCESS) {
+            return result;
+        } else {
+            rdp->next();
+        }
+    } while (!rdp->isLast());
+    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 Mon Jun 21 11:35:54 2010
@@ -22,6 +22,11 @@
 #include <exceptions/exceptions.h>
 
 #include "data_source.h"
+
+#include <dns/name.h>
+#include <dns/rrttl.h>
+#include <dns/rdata.h>
+#include <dns/rrset.h>
 
 namespace isc {
 
@@ -99,6 +104,31 @@
     Result init(const isc::data::ElementPtr config);
     Result close();
 
+
+    // write access
+
+    // hmz, should we have a transaction context object? (see comments
+    // in datasource.h
+    Result startTransaction();
+    Result commitTransaction();
+    Result rollbackTransaction();
+    
+    //DataSrc::Result addRRset(const isc::dns::Name& zonename, const isc::dns::RRset& rrset);
+    DataSrc::Result addRRset(const isc::dns::Name& zonename,
+                             const isc::dns::RRset& rrset);
+    DataSrc::Result delRRset(const isc::dns::Name& zonename,
+                             const isc::dns::RRset& rrset);
+private:
+    DataSrc::Result addRR(int zone_id,
+                          const isc::dns::Name& name,
+                          const isc::dns::RRType& rrtype,
+                          const isc::dns::RRTTL& rrttl,
+                          const isc::dns::rdata::Rdata& rdata);
+    DataSrc::Result delRR(int zone_id,
+                          const isc::dns::Name& name,
+                          const isc::dns::RRType& rrtype,
+                          const isc::dns::rdata::Rdata& rdata);
+
 private:
     enum Mode {
         NORMAL,




More information about the bind10-changes mailing list