[svn] commit: r3134 - in /branches/trac232/src/lib/datasrc: data_source.cc data_source.h sqlite3_datasrc.cc sqlite3_datasrc.h

BIND 10 source code commits bind10-changes at lists.isc.org
Thu Oct 7 13:30:56 UTC 2010


Author: jelte
Date: Thu Oct  7 13:30:56 2010
New Revision: 3134

Log:
added a create zone option within transactions (pending discussion)


Modified:
    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/lib/datasrc/data_source.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/data_source.cc (original)
+++ branches/trac232/src/lib/datasrc/data_source.cc Thu Oct  7 13:30:56 2010
@@ -1250,7 +1250,8 @@
 }
 
 DataSrc::WriteResult
-DataSrc::startTransaction(DataSrcTransaction& transaction UNUSED_PARAM)
+DataSrc::startTransaction(DataSrcTransaction& transaction UNUSED_PARAM,
+                          const bool create_zone UNUSED_PARAM)
 {
     return (W_NOT_IMPLEMENTED);
 }
@@ -1647,7 +1648,8 @@
 }
 
 DataSrc::WriteResult
-MetaDataSrc::startTransaction(DataSrcTransaction& transaction UNUSED_PARAM)
+MetaDataSrc::startTransaction(DataSrcTransaction& transaction UNUSED_PARAM,
+                              const bool create_zone UNUSED_PARAM)
 {
     return (W_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 Thu Oct  7 13:30:56 2010
@@ -224,7 +224,9 @@
     /// is actually started (by the data sources startTransaction()
     /// method).
     ///
-    /// After construction, the transaction state will be INIT.
+    /// After construction, and upon success, the transaction state will
+    /// be INIT.
+    ///
     /// \param data_source The data source to perform operations on
     /// \param zone_name The name of the zone to perform operations on
     /// \param zone_class The RRClass of the zone to perform operations on.
@@ -364,8 +366,13 @@
     /// transaction object.
     /// \param transaction, a transaction that has been initialized for
     /// a zone held by this data source.
+    /// \param create_zone, if set to true, and the zone does not exist,
+    ///        it is created within this transaction. If false, and
+    ///        the zone does not exist, W_NO_SUCH_ZONE is returned
+    ///        (defaults to false)
     /// \return W_SUCCESS on success, error value otherwise
-    virtual WriteResult startTransaction(DataSrcTransaction&  transaction);
+    virtual WriteResult startTransaction(DataSrcTransaction&  transaction,
+                                         const bool create_zone = false);
 
     /// \brief Commit the changes made in the given transaction
     /// The transaction object must be in state RUNNING.
@@ -548,7 +555,8 @@
     // Writable data sources
     //
     // see comments at DataSrc
-    virtual WriteResult startTransaction(DataSrcTransaction&  transaction);
+    virtual WriteResult startTransaction(DataSrcTransaction&  transaction,
+                                         const bool create_zone);
     virtual WriteResult commitTransaction(DataSrcTransaction&  transaction);
     virtual WriteResult rollbackTransaction(DataSrcTransaction&  transaction);
     

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 Thu Oct  7 13:30:56 2010
@@ -44,7 +44,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), w_add_rr_(NULL), w_del_rr_(NULL),
+        q_prevnsec3_(NULL), w_add_rr_(NULL), w_add_zone_(NULL), w_del_rr_(NULL),
         w_del_all_(NULL), w_del_zone_(NULL)
     {}
     sqlite3* db_;
@@ -59,6 +59,7 @@
     sqlite3_stmt* q_nsec3_;
     sqlite3_stmt* q_prevnsec3_;
     sqlite3_stmt* w_add_rr_;
+    sqlite3_stmt* w_add_zone_;
     sqlite3_stmt* w_del_rr_;
     sqlite3_stmt* w_del_all_;
     sqlite3_stmt* w_del_zone_;
@@ -126,6 +127,10 @@
     "(zone_id, name, rname, ttl, rdtype, sigtype, rdata) "
     "VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";
 
+const char* const w_add_zone_str = "INSERT INTO zones "
+    "(name, rdclass) "
+    "VALUES (?1, ?2)";
+
 const char* const w_del_rr_str = "DELETE FROM records WHERE "
     "zone_id = ?1 AND name = ?2 AND rdtype LIKE ?3 AND rdata LIKE ?4";
 
@@ -695,6 +700,7 @@
     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_add_zone_ = prepare(db, w_add_zone_str);
     initializer->params_.w_del_rr_ = prepare(db, w_del_rr_str);
     initializer->params_.w_del_all_ = prepare(db, w_del_all_str);
     initializer->params_.w_del_zone_ = prepare(db, w_del_zone_str);
@@ -763,6 +769,9 @@
     sqlite3_finalize(dbparameters->w_add_rr_);
     dbparameters->w_add_rr_ = NULL;
 
+    sqlite3_finalize(dbparameters->w_add_zone_);
+    dbparameters->w_add_zone_ = NULL;
+
     sqlite3_finalize(dbparameters->w_del_rr_);
     dbparameters->w_del_rr_ = NULL;
 
@@ -779,7 +788,7 @@
 }
 
 DataSrc::WriteResult
-Sqlite3DataSrc::startTransaction(DataSrcTransaction& transaction)
+Sqlite3DataSrc::startTransaction(DataSrcTransaction& transaction, bool new_zone)
 {
     if (transaction.getState() != DataSrcTransaction::INIT) {
         return DataSrc::W_ERROR;
@@ -788,7 +797,16 @@
     if (result == SQLITE_OK) {
         int zone_id = hasExactZone(transaction.getZoneName().toText().c_str());
         if (zone_id <= 0) {
-            return DataSrc::W_NO_SUCH_ZONE;
+            if (new_zone) {
+                DataSrc::WriteResult add_zone_res = 
+                    addZone(transaction.getZoneName(), isc::dns::RRClass::IN());
+                if (add_zone_res != DataSrc::W_SUCCESS) {
+                    return add_zone_res;
+                }
+                zone_id = hasExactZone(transaction.getZoneName().toText().c_str());
+            } else {
+                return DataSrc::W_NO_SUCH_ZONE;
+            }
         }
         isc::data::ElementPtr trans_data = isc::data::Element::createMap();
         trans_data->set("zone_id", isc::data::Element::create(zone_id));
@@ -833,6 +851,40 @@
     }
 }
 
+DataSrc::WriteResult
+Sqlite3DataSrc::addZone(const isc::dns::Name& name,
+                        const isc::dns::RRClass& rrclass)
+{
+    sqlite3_stmt* query = dbparameters->w_add_zone_;
+    
+    sqlite3_reset(query);
+    sqlite3_clear_bindings(query);
+
+    const string s_name = name.toText();
+    int rc;
+    rc = sqlite3_bind_text(query, 1, s_name.c_str(), -1, SQLITE_TRANSIENT);
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind name " << s_name <<
+                  " to SQL statement (query)");
+    }
+    
+    rc = sqlite3_bind_text(query, 2, rrclass.toText().c_str(), -1,
+                           SQLITE_TRANSIENT);
+    if (rc != SQLITE_OK) {
+        isc_throw(Sqlite3Error, "Could not bind zone class " <<
+                  rrclass.toText() << " to SQL statement (query)");
+    }
+
+    int result = sqlite3_step(query);
+
+    sqlite3_reset(query);
+
+    if (result == SQLITE_DONE) {
+        return DataSrc::W_SUCCESS;
+    } else {
+        return DataSrc::W_DB_ERROR;
+    }
+}
 
 DataSrc::WriteResult
 Sqlite3DataSrc::addRR(int zone_id,
@@ -854,7 +906,7 @@
                   " to SQL statement (query)");
     }
     const string s_name = name.toText();
-    rc = sqlite3_bind_text(query, 2, s_name.c_str(), -1, SQLITE_STATIC);
+    rc = sqlite3_bind_text(query, 2, s_name.c_str(), -1, SQLITE_TRANSIENT);
     if (rc != SQLITE_OK) {
         isc_throw(Sqlite3Error, "Could not bind name " << s_name <<
                   " to SQL statement (query)");
@@ -862,7 +914,7 @@
 
     // reverse name
     const string r_name = name.reverse().toText();
-    rc = sqlite3_bind_text(query, 3, r_name.c_str(), -1, SQLITE_STATIC);
+    rc = sqlite3_bind_text(query, 3, r_name.c_str(), -1, SQLITE_TRANSIENT);
     if (rc != SQLITE_OK) {
         isc_throw(Sqlite3Error, "Could not bind name " << s_name <<
                   " to SQL statement (query)");

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 Thu Oct  7 13:30:56 2010
@@ -107,7 +107,8 @@
 
     // write access
 
-    WriteResult startTransaction(DataSrcTransaction& transaction);
+    WriteResult startTransaction(DataSrcTransaction& transaction,
+                                 bool create_zone = false);
     WriteResult commitTransaction(DataSrcTransaction& transaction);
     WriteResult rollbackTransaction(DataSrcTransaction& transaction);
     
@@ -125,6 +126,8 @@
                           const isc::dns::RRType& rrtype,
                           const isc::dns::RRTTL& rrttl,
                           const isc::dns::rdata::Rdata& rdata);
+    DataSrc::WriteResult addZone(const isc::dns::Name& name,
+                                 const isc::dns::RRClass& rrclass);
     DataSrc::WriteResult delRR(int zone_id,
                                      const isc::dns::Name& name,
                                      const isc::dns::RRType& rrtype);




More information about the bind10-changes mailing list