[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