[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