Browse Source

[2342] Add check that database name cannot be NULL

Stephen Morris 12 years ago
parent
commit
08daa03bea

+ 7 - 0
src/lib/dhcp/lease_mgr.h

@@ -61,6 +61,13 @@
 namespace isc {
 namespace dhcp {
 
+/// @brief Exception thrown if name of database is not specified
+class NoDatabaseName : public Exception {
+public:
+    NoDatabaseName(const char* file, size_t line, const char* what) :
+        isc::Exception(file, line, what) {}
+};
+
 /// @brief Exception thrown on failure to open database
 class DbOpenError : public Exception {
 public:

+ 2 - 2
src/lib/dhcp/mysql_lease_mgr.cc

@@ -471,8 +471,8 @@ MySqlLeaseMgr::openDatabase() {
         sname = getParameter("name");
         name = sname.c_str();
     } catch (...) {
-        // No database name.  Fine, we'll use NULL
-        ;
+        // No database name.  Throw a "NoName" exception
+        isc_throw(NoDatabaseName, "must specified a name for the database");
     }
 
     // Open the database.  Use defaults for non-specified options.

+ 2 - 0
src/lib/dhcp/mysql_lease_mgr.h

@@ -45,6 +45,7 @@ public:
     /// @param parameters A data structure relating keywords and values
     ///        concerned with the database.
     ///
+    /// @exception NoDatabaseName Mandatory database name not given
     /// @exception DbOpenError Error opening the database
     /// @exception DbOperationError An operation on the open database has
     ///            failed.
@@ -362,6 +363,7 @@ private:
     /// Opens the database using the information supplied in the parameters
     /// passed to the constructor.
     ///
+    /// @exception NoDatabaseName Mandatory database name not given
     /// @exception DbOpenError Error opening the database
     void openDatabase();
 

+ 43 - 2
src/lib/dhcp/tests/mysql_lease_mgr_unittest.cc

@@ -46,8 +46,41 @@ const char* INVALID_PASSWORD = "password=invalid";
 string connectionString(const char* type, const char* name, const char* host,
                         const char* user, const char* password) {
     const string space = " ";
-    return (string(type) + space + string(name) + space + string(host) + space +
-            string(user) + space + string(password));
+    string result = "";
+
+    if (type != NULL) {
+        result += string(type);
+    }
+
+    if (name != NULL) {
+        if (! result.empty()) {
+            result += space;
+        }
+        result += string(name);
+    }
+
+    if (host != NULL) {
+        if (! result.empty()) {
+            result += space;
+        }
+        result += string(host);
+    }
+
+    if (user != NULL) {
+        if (! result.empty()) {
+            result += space;
+        }
+        result += string(user);
+    }
+
+    if (password != NULL) {
+        if (! result.empty()) {
+            result += space;
+        }
+        result += string(password);
+    }
+
+    return (result);
 }
 
 // Return valid connection string
@@ -102,6 +135,9 @@ TEST(MySqlOpenTest, OpenDatabase) {
     // (This is really a check on LeaseMgrFactory, but is convenient to
     // perform here.)
     EXPECT_THROW(LeaseMgrFactory::create(connectionString(
+        NULL, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD)),
+        InvalidParameter);
+    EXPECT_THROW(LeaseMgrFactory::create(connectionString(
         INVALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD)),
         InvalidType);
 
@@ -119,6 +155,11 @@ TEST(MySqlOpenTest, OpenDatabase) {
         VALID_TYPE, VALID_NAME, VALID_HOST, VALID_USER, INVALID_PASSWORD)),
         DbOpenError);
 
+    // Check for missing parameters
+    EXPECT_THROW(LeaseMgrFactory::create(connectionString(
+        VALID_TYPE, NULL, VALID_HOST, INVALID_USER, VALID_PASSWORD)),
+        NoDatabaseName);
+
     // Check that database opens correctly.
     ASSERT_NO_THROW(LeaseMgrFactory::create(validConnectionString()));
     EXPECT_NO_THROW((void) LeaseMgrFactory::instance());