}
}
+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
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
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
///