BIND 10 trac326, updated. ee36e780fdec13d0b242a55a1cf5c3f03982c057 [326] address review comments
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Aug 24 14:42:53 UTC 2011
The branch, trac326 has been updated
via ee36e780fdec13d0b242a55a1cf5c3f03982c057 (commit)
from 1820f211d285fcd92e4b18351b9f0fd7e47c3b34 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit ee36e780fdec13d0b242a55a1cf5c3f03982c057
Author: Jelte Jansen <jelte at isc.org>
Date: Wed Aug 24 16:42:45 2011 +0200
[326] address review comments
-----------------------------------------------------------------------
Summary of changes:
src/lib/datasrc/sqlite3_accessor.cc | 50 +++++++++++++++++---------------
src/lib/datasrc/sqlite3_datasrc.cc | 54 +++++++++++++++++++---------------
2 files changed, 57 insertions(+), 47 deletions(-)
-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/sqlite3_accessor.cc b/src/lib/datasrc/sqlite3_accessor.cc
index cdb4026..715bfd5 100644
--- a/src/lib/datasrc/sqlite3_accessor.cc
+++ b/src/lib/datasrc/sqlite3_accessor.cc
@@ -23,6 +23,10 @@
#define SQLITE_SCHEMA_VERSION 1
+// wait 5 seconds (50 times 0.1 second) for database lock at startup and
+// database creation
+#define DB_LOCK_WAIT_TIME 50
+
namespace isc {
namespace datasrc {
@@ -118,22 +122,22 @@ const char* const SCHEMA_LIST[] = {
"CREATE TABLE schema_version (version INTEGER NOT NULL)",
"INSERT INTO schema_version VALUES (1)",
"CREATE TABLE zones (id INTEGER PRIMARY KEY, "
- "name STRING NOT NULL COLLATE NOCASE, "
- "rdclass STRING NOT NULL COLLATE NOCASE DEFAULT 'IN', "
- "dnssec BOOLEAN NOT NULL DEFAULT 0)",
+ "name STRING NOT NULL COLLATE NOCASE, "
+ "rdclass STRING NOT NULL COLLATE NOCASE DEFAULT 'IN', "
+ "dnssec BOOLEAN NOT NULL DEFAULT 0)",
"CREATE INDEX zones_byname ON zones (name)",
"CREATE TABLE records (id INTEGER PRIMARY KEY, "
- "zone_id INTEGER NOT NULL, name STRING NOT NULL COLLATE NOCASE, "
- "rname STRING NOT NULL COLLATE NOCASE, ttl INTEGER NOT NULL, "
- "rdtype STRING NOT NULL COLLATE NOCASE, sigtype STRING COLLATE NOCASE, "
- "rdata STRING NOT NULL)",
+ "zone_id INTEGER NOT NULL, name STRING NOT NULL COLLATE NOCASE, "
+ "rname STRING NOT NULL COLLATE NOCASE, ttl INTEGER NOT NULL, "
+ "rdtype STRING NOT NULL COLLATE NOCASE, sigtype STRING COLLATE NOCASE, "
+ "rdata STRING NOT NULL)",
"CREATE INDEX records_byname ON records (name)",
"CREATE INDEX records_byrname ON records (rname)",
"CREATE TABLE nsec3 (id INTEGER PRIMARY KEY, zone_id INTEGER NOT NULL, "
- "hash STRING NOT NULL COLLATE NOCASE, "
- "owner STRING NOT NULL COLLATE NOCASE, "
- "ttl INTEGER NOT NULL, rdtype STRING NOT NULL COLLATE NOCASE, "
- "rdata STRING NOT NULL)",
+ "hash STRING NOT NULL COLLATE NOCASE, "
+ "owner STRING NOT NULL COLLATE NOCASE, "
+ "ttl INTEGER NOT NULL, rdtype STRING NOT NULL COLLATE NOCASE, "
+ "rdata STRING NOT NULL)",
"CREATE INDEX nsec3_byhash ON nsec3 (hash)",
NULL
};
@@ -207,7 +211,7 @@ int check_schema_version(sqlite3* db) {
// At this point in time, the database might be exclusively locked, in
// which case even prepare() will return BUSY, so we may need to try a
// few times
- for (size_t i = 0; i < 50; ++i) {
+ for (size_t i = 1; i <= DB_LOCK_WAIT_TIME; ++i) {
int rc = sqlite3_prepare_v2(db, q_version_str, -1, &prepared, NULL);
if (rc == SQLITE_ERROR) {
// this is the error that is returned when the table does not
@@ -215,7 +219,7 @@ int check_schema_version(sqlite3* db) {
return (-1);
} else if (rc == SQLITE_OK) {
break;
- } else if (rc != SQLITE_BUSY || i == 50) {
+ } else if (rc != SQLITE_BUSY || i == DB_LOCK_WAIT_TIME) {
isc_throw(SQLite3Error, "Unable to prepare version query: "
<< rc << " " << sqlite3_errmsg(db));
}
@@ -238,15 +242,14 @@ int create_database(sqlite3* db) {
// check *again*, just in case this process was racing another
//
// try for 5 secs (50*0.1)
- int rc;
logger.info(DATASRC_SQLITE_SETUP);
- for (size_t i = 0; i < 50; ++i) {
- rc = sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", NULL, NULL,
- NULL);
+ for (size_t i = 1; i <= DB_LOCK_WAIT_TIME; ++i) {
+ int rc = sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", NULL, NULL,
+ NULL);
if (rc == SQLITE_OK) {
// Lock acquired, move on
break;
- } else if (rc != SQLITE_BUSY || i == 50) {
+ } else if (rc != SQLITE_BUSY || i == DB_LOCK_WAIT_TIME) {
isc_throw(SQLite3Error, "Unable to acquire exclusive lock "
"for database creation: " << sqlite3_errmsg(db));
}
@@ -273,9 +276,12 @@ checkAndSetupSchema(Initializer* initializer) {
sqlite3* const db = initializer->params_.db_;
int schema_version = check_schema_version(db);
- if (schema_version != SQLITE_SCHEMA_VERSION) {
+ if (schema_version == -1) {
schema_version = create_database(db);
}
+ if (schema_version != SQLITE_SCHEMA_VERSION) {
+ isc_throw(SQLite3Error, "Bad sqlite database schema version ");
+ }
initializer->params_.version_ = schema_version;
initializer->params_.q_zone_ = prepare(db, q_zone_str);
@@ -363,13 +369,11 @@ SQLite3Database::close(void) {
std::pair<bool, int>
SQLite3Database::getZone(const isc::dns::Name& name) const {
- int rc;
-
// Take the statement (simple SELECT id FROM zones WHERE...)
// and prepare it (bind the parameters to it)
sqlite3_reset(dbparameters_->q_zone_);
- rc = sqlite3_bind_text(dbparameters_->q_zone_, 1, name.toText().c_str(),
- -1, SQLITE_TRANSIENT);
+ int rc = sqlite3_bind_text(dbparameters_->q_zone_, 1, name.toText().c_str(),
+ -1, SQLITE_TRANSIENT);
if (rc != SQLITE_OK) {
isc_throw(SQLite3Error, "Could not bind " << name <<
" to SQL statement (zone)");
diff --git a/src/lib/datasrc/sqlite3_datasrc.cc b/src/lib/datasrc/sqlite3_datasrc.cc
index 03b057c..9638eec 100644
--- a/src/lib/datasrc/sqlite3_datasrc.cc
+++ b/src/lib/datasrc/sqlite3_datasrc.cc
@@ -28,6 +28,10 @@
#define SQLITE_SCHEMA_VERSION 1
+// wait 5 seconds (50 times 0.1 second) for database lock at startup and
+// database creation
+#define DB_LOCK_WAIT_TIME 50
+
using namespace std;
using namespace isc::dns;
using namespace isc::dns::rdata;
@@ -59,22 +63,22 @@ const char* const SCHEMA_LIST[] = {
"CREATE TABLE schema_version (version INTEGER NOT NULL)",
"INSERT INTO schema_version VALUES (1)",
"CREATE TABLE zones (id INTEGER PRIMARY KEY, "
- "name STRING NOT NULL COLLATE NOCASE, "
- "rdclass STRING NOT NULL COLLATE NOCASE DEFAULT 'IN', "
- "dnssec BOOLEAN NOT NULL DEFAULT 0)",
+ "name STRING NOT NULL COLLATE NOCASE, "
+ "rdclass STRING NOT NULL COLLATE NOCASE DEFAULT 'IN', "
+ "dnssec BOOLEAN NOT NULL DEFAULT 0)",
"CREATE INDEX zones_byname ON zones (name)",
"CREATE TABLE records (id INTEGER PRIMARY KEY, "
- "zone_id INTEGER NOT NULL, name STRING NOT NULL COLLATE NOCASE, "
- "rname STRING NOT NULL COLLATE NOCASE, ttl INTEGER NOT NULL, "
- "rdtype STRING NOT NULL COLLATE NOCASE, sigtype STRING COLLATE NOCASE, "
- "rdata STRING NOT NULL)",
+ "zone_id INTEGER NOT NULL, name STRING NOT NULL COLLATE NOCASE, "
+ "rname STRING NOT NULL COLLATE NOCASE, ttl INTEGER NOT NULL, "
+ "rdtype STRING NOT NULL COLLATE NOCASE, sigtype STRING COLLATE NOCASE, "
+ "rdata STRING NOT NULL)",
"CREATE INDEX records_byname ON records (name)",
"CREATE INDEX records_byrname ON records (rname)",
"CREATE TABLE nsec3 (id INTEGER PRIMARY KEY, zone_id INTEGER NOT NULL, "
- "hash STRING NOT NULL COLLATE NOCASE, "
- "owner STRING NOT NULL COLLATE NOCASE, "
- "ttl INTEGER NOT NULL, rdtype STRING NOT NULL COLLATE NOCASE, "
- "rdata STRING NOT NULL)",
+ "hash STRING NOT NULL COLLATE NOCASE, "
+ "owner STRING NOT NULL COLLATE NOCASE, "
+ "ttl INTEGER NOT NULL, rdtype STRING NOT NULL COLLATE NOCASE, "
+ "rdata STRING NOT NULL)",
"CREATE INDEX nsec3_byhash ON nsec3 (hash)",
NULL
};
@@ -122,10 +126,9 @@ const char* const q_prevnsec3_str = "SELECT hash FROM nsec3 "
//
int
Sqlite3DataSrc::hasExactZone(const char* const name) const {
- int rc;
-
sqlite3_reset(dbparameters->q_zone_);
- rc = sqlite3_bind_text(dbparameters->q_zone_, 1, name, -1, SQLITE_STATIC);
+ int rc = sqlite3_bind_text(dbparameters->q_zone_, 1, name, -1,
+ SQLITE_STATIC);
if (rc != SQLITE_OK) {
isc_throw(Sqlite3Error, "Could not bind " << name <<
" to SQL statement (zone)");
@@ -262,8 +265,7 @@ Sqlite3DataSrc::findRecords(const Name& name, const RRType& rdtype,
sqlite3_reset(query);
sqlite3_clear_bindings(query);
- int rc;
- rc = sqlite3_bind_int(query, 1, zone_id);
+ int 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)");
@@ -674,7 +676,7 @@ int check_schema_version(sqlite3* db) {
// At this point in time, the database might be exclusively locked, in
// which case even prepare() will return BUSY, so we may need to try a
// few times
- for (size_t i = 0; i < 50; ++i) {
+ for (size_t i = 1; i <= DB_LOCK_WAIT_TIME; ++i) {
int rc = sqlite3_prepare_v2(db, q_version_str, -1, &prepared, NULL);
if (rc == SQLITE_ERROR) {
// this is the error that is returned when the table does not
@@ -682,7 +684,7 @@ int check_schema_version(sqlite3* db) {
return (-1);
} else if (rc == SQLITE_OK) {
break;
- } else if (rc != SQLITE_BUSY || i == 50) {
+ } else if (rc != SQLITE_BUSY || i == DB_LOCK_WAIT_TIME) {
isc_throw(Sqlite3Error, "Unable to prepare version query: "
<< rc << " " << sqlite3_errmsg(db));
}
@@ -703,14 +705,13 @@ int create_database(sqlite3* db) {
// check *again*, just in case this process was racing another
//
// try for 5 secs (50*0.1)
- int rc;
logger.info(DATASRC_SQLITE_SETUP);
- for (size_t i = 0; i < 50; ++i) {
- rc = sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", NULL, NULL,
- NULL);
+ for (size_t i = 1; i <= DB_LOCK_WAIT_TIME; ++i) {
+ int rc = sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", NULL, NULL,
+ NULL);
if (rc == SQLITE_OK) {
break;
- } else if (rc != SQLITE_BUSY || i == 50) {
+ } else if (rc != SQLITE_BUSY || i == DB_LOCK_WAIT_TIME) {
isc_throw(Sqlite3Error, "Unable to acquire exclusive lock "
"for database creation: " << sqlite3_errmsg(db));
}
@@ -721,6 +722,7 @@ int create_database(sqlite3* db) {
for (int i = 0; SCHEMA_LIST[i] != NULL; ++i) {
if (sqlite3_exec(db, SCHEMA_LIST[i], NULL, NULL, NULL) !=
SQLITE_OK) {
+ sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
isc_throw(Sqlite3Error,
"Failed to set up schema " << SCHEMA_LIST[i]);
}
@@ -728,6 +730,7 @@ int create_database(sqlite3* db) {
sqlite3_exec(db, "COMMIT TRANSACTION", NULL, NULL, NULL);
return (SQLITE_SCHEMA_VERSION);
} else {
+ sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, NULL);
return (schema_version);
}
}
@@ -737,9 +740,12 @@ checkAndSetupSchema(Sqlite3Initializer* initializer) {
sqlite3* const db = initializer->params_.db_;
int schema_version = check_schema_version(db);
- if (schema_version != SQLITE_SCHEMA_VERSION) {
+ if (schema_version == -1) {
schema_version = create_database(db);
}
+ if (schema_version != SQLITE_SCHEMA_VERSION) {
+ isc_throw(Sqlite3Error, "Bad sqlite database schema version ");
+ }
initializer->params_.version_ = schema_version;
initializer->params_.q_zone_ = prepare(db, q_zone_str);
More information about the bind10-changes
mailing list