[svn] commit: r1385 - in /trunk/src/lib/auth: data_source.h sqlite3_datasrc.cc tests/sqlite3_unittest.cc

BIND 10 source code commits bind10-changes at lists.isc.org
Sat Mar 13 00:58:17 UTC 2010


Author: jinmei
Date: Sat Mar 13 00:58:16 2010
New Revision: 1385

Log:
prevented double close for sqlite3 data sources

Modified:
    trunk/src/lib/auth/data_source.h
    trunk/src/lib/auth/sqlite3_datasrc.cc
    trunk/src/lib/auth/tests/sqlite3_unittest.cc

Modified: trunk/src/lib/auth/data_source.h
==============================================================================
--- trunk/src/lib/auth/data_source.h (original)
+++ trunk/src/lib/auth/data_source.h Sat Mar 13 00:58:16 2010
@@ -25,6 +25,8 @@
 
 #include <boost/shared_ptr.hpp>
 
+#include <exceptions/exceptions.h>
+
 #include <dns/name.h>
 #include <dns/rrclass.h>
 #include <cc/data.h>
@@ -46,6 +48,15 @@
 class DataSrc;
 typedef boost::shared_ptr<DataSrc> DataSrcPtr;
 typedef boost::shared_ptr<const DataSrc> ConstDataSrcPtr;
+
+/// This exception represents Backend-independent errors relating to
+/// data source operations.
+class DataSourceError : public Exception {
+public:
+    DataSourceError(const char* file, size_t line, const char* what) :
+        isc::Exception(file, line, what) {}
+};
+
 
 class AbstractDataSrc {
     ///

Modified: trunk/src/lib/auth/sqlite3_datasrc.cc
==============================================================================
--- trunk/src/lib/auth/sqlite3_datasrc.cc (original)
+++ trunk/src/lib/auth/sqlite3_datasrc.cc Sat Mar 13 00:58:16 2010
@@ -482,7 +482,9 @@
 }
 
 Sqlite3DataSrc::~Sqlite3DataSrc() {
-    close();
+    if (db != NULL) {
+        close();
+    }
 }
 
 DataSrc::Result
@@ -688,7 +690,7 @@
 void
 Sqlite3DataSrc::open(const string& name) {
     if (db != NULL) {
-        isc_throw(Sqlite3Error, "Duplicate Sqlite3 open with " << name);
+        isc_throw(DataSourceError, "Duplicate Sqlite3 open with " << name);
     }
     if (sqlite3_open(name.c_str(), &db) != 0) {
         // sqlite3_close() must be called even when open fails.
@@ -702,7 +704,8 @@
 DataSrc::Result
 Sqlite3DataSrc::close(void) {
     if (db == NULL) {
-        return (SUCCESS);
+        isc_throw(DataSourceError,
+                  "Sqlite3 data source is being closed before open");
     }
 
     if (q_zone != NULL) {

Modified: trunk/src/lib/auth/tests/sqlite3_unittest.cc
==============================================================================
--- trunk/src/lib/auth/tests/sqlite3_unittest.cc (original)
+++ trunk/src/lib/auth/tests/sqlite3_unittest.cc Sat Mar 13 00:58:16 2010
@@ -367,7 +367,13 @@
 
 TEST_F(Sqlite3DataSourceTest, doubleOpen) {
     // An attempt of duplicate open should trigger an exception.
-    EXPECT_THROW(data_source.init(SQLITE_DBFILE_EXAMPLE), Sqlite3Error);
+    EXPECT_THROW(data_source.init(SQLITE_DBFILE_EXAMPLE), DataSourceError);
+}
+
+TEST_F(Sqlite3DataSourceTest, doubleClose) {
+    // An attempt of duplicate close should trigger an exception.
+    EXPECT_EQ(DataSrc::SUCCESS, data_source.close());
+    EXPECT_THROW(data_source.close(), DataSourceError);
 }
 
 TEST_F(Sqlite3DataSourceTest, findClosestEnclosure) {




More information about the bind10-changes mailing list