]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1708] MySqlConnection:rawStatement()
authorAndrei Pavel <andrei@isc.org>
Mon, 15 Feb 2021 19:02:22 +0000 (21:02 +0200)
committerAndrei Pavel <andrei@isc.org>
Fri, 19 Feb 2021 13:37:41 +0000 (15:37 +0200)
used to run any statement that has no placeholder question mark where
you would normally bind variables

src/lib/mysql/mysql_connection.cc
src/lib/mysql/mysql_connection.h

index 4d205ce14a84935b89bf01d7209ecf2a85646185..c70d9f0e28bfb5a5f622a9ac468fc9410759be30 100644 (file)
@@ -437,5 +437,31 @@ MySqlConnection::rollback() {
     }
 }
 
+std::vector<std::vector<std::string>>
+MySqlConnection::rawStatement(std::string const& statement) const {
+    // Execute a SQL statement.
+    if (mysql_query(mysql_, statement.c_str())) {
+        isc_throw(DbOperationError, statement << ": " << mysql_error(mysql_));
+    }
+
+    // Get a result set.
+    MySqlResult result(mysql_use_result(mysql_));
+
+    // Fetch a result set.
+    std::vector<std::vector<std::string>> output;
+    size_t r(0);
+    MYSQL_ROW row;
+    size_t const column_count(mysql_num_fields(result.result_));
+    while ((row = mysql_fetch_row(result.result_)) != NULL) {
+        output.push_back(std::vector<std::string>());
+        for (size_t i = 0; i < column_count; ++i) {
+            output[r].push_back(row[i]);
+        }
+        ++r;
+    }
+
+    return output;
+}
+
 } // namespace isc::db
 } // namespace isc
index c48221f1c5d61d83dd9b0676b98515181e862892..6583898fcfcce9d43a045fcb2cd77fd2949a100d 100644 (file)
@@ -67,6 +67,19 @@ private:
     MYSQL_STMT*     statement_;     ///< Statement for which results are freed
 };
 
+/// @brief RAII wrapper oer MYSQL_RES obtained from MySQL library functions like
+/// mysql_use_result().
+struct MySqlResult {
+    MySqlResult(MYSQL_RES* result) : result_(result) {
+    }
+
+    ~MySqlResult() {
+        mysql_free_result(result_);
+    }
+
+    MYSQL_RES* const result_;
+};
+
 /// @brief MySQL Selection Statements
 ///
 /// Each statement is associated with an index, which is used to reference the
@@ -565,6 +578,20 @@ public:
         return (static_cast<uint64_t>(mysql_stmt_affected_rows(statements_[index])));
     }
 
+    /// @brief Run a raw, unprepared statement.
+    ///
+    /// This is useful when running statements that can't be parametrized with a
+    /// question mark in place of a binded variable e.g. "SHOW GLOBAL VARIABLES"
+    /// and thus cannot be prepared beforehand. All the results are string, the
+    /// output should be the same as that which one would see in a mysql command
+    /// line client.
+    ///
+    /// @param statement the statement in string form
+    /// @throw DbOperationError if the statement could not be run
+    /// @return the list of rows, each row consisting of a list of values for
+    ///     each column
+    std::vector<std::vector<std::string>>
+    rawStatement(std::string const& statement) const;
 
     /// @brief Commit Transactions
     ///