13#include <boost/lexical_cast.hpp>
26int MySqlHolder::atexit_ = [] {
27 return atexit([] { mysql_library_end(); });
34 : conn_(conn), committed_(false) {
58 const char* host =
"localhost";
67 unsigned int port = 0;
76 if (sport.size() > 0) {
80 port = boost::lexical_cast<unsigned int>(sport);
89 if (port > numeric_limits<uint16_t>::max()) {
94 const char* user = NULL;
103 const char* password = NULL;
107 password = spassword.c_str();
112 const char* name = NULL;
116 name = sname.c_str();
131 if (stimeout.size() > 0) {
135 connect_timeout = boost::lexical_cast<unsigned int>(stimeout);
152 if ((connect_timeout == 0) ||
153 (connect_timeout > numeric_limits<int>::max())) {
155 stimeout <<
") must be an integer greater than 0");
166 int result = mysql_options(
mysql_, MYSQL_OPT_RECONNECT, &auto_reconnect);
173 const char *wait_time =
"SET SESSION wait_timeout = 30 * 86400";
174 result = mysql_options(
mysql_, MYSQL_INIT_COMMAND, wait_time);
184 const char *sql_mode =
"SET SESSION sql_mode ='STRICT_ALL_TABLES'";
185 result = mysql_options(
mysql_, MYSQL_INIT_COMMAND, sql_mode);
193 result = mysql_options(
mysql_, MYSQL_OPT_CONNECT_TIMEOUT, &connect_timeout);
209 MYSQL* status = mysql_real_connect(
mysql_, host, user, password, name,
210 port, NULL, CLIENT_FOUND_ROWS);
223 if (autocommit_result != 0) {
236std::pair<uint32_t, uint32_t>
245 MYSQL_STMT *stmt = mysql_stmt_init(conn.
mysql_);
248 "statement structure, reason: " << mysql_error(conn.
mysql_));
254 const char* version_sql =
"SELECT version, minor FROM schema_version";
255 int status = mysql_stmt_prepare(stmt, version_sql, strlen(version_sql));
258 << version_sql <<
">, reason: "
259 << mysql_error(conn.
mysql_));
265 << version_sql <<
">, reason: "
266 << mysql_errno(conn.
mysql_));
271 memset(bind, 0,
sizeof(bind));
274 bind[0].buffer_type = MYSQL_TYPE_LONG;
275 bind[0].is_unsigned = 1;
277 bind[0].buffer_length =
sizeof(
version);
280 bind[1].buffer_type = MYSQL_TYPE_LONG;
281 bind[1].is_unsigned = 1;
282 bind[1].buffer = &minor;
283 bind[1].buffer_length =
sizeof(minor);
285 if (mysql_stmt_bind_result(stmt, bind)) {
287 << version_sql <<
">, reason: "
288 << mysql_errno(conn.
mysql_));
292 if (mysql_stmt_fetch(stmt)) {
294 << version_sql <<
">, reason: "
295 << mysql_errno(conn.
mysql_));
299 mysql_stmt_close(stmt);
301 return (std::make_pair(
version, minor));
303 }
catch (
const std::exception&) {
305 mysql_stmt_close(stmt);
325 static_cast<int>(index) <<
") or indexed prepared " <<
326 "statement is not null");
334 "statement structure, reason: " << mysql_error(
mysql_));
337 int status = mysql_stmt_prepare(
statements_[index], text, strlen(text));
340 text <<
">, reason: " << mysql_error(
mysql_));
349 tagged_statement != end_statement; ++tagged_statement) {
350 if (tagged_statement->index >=
statements_.size()) {
351 statements_.resize(tagged_statement->index + 1, NULL);
356 tagged_statement->text);
392 MYSQL_TIME& output_time) {
398 const uint32_t valid_lifetime,
399 MYSQL_TIME& expire) {
405 uint32_t valid_lifetime, time_t& cltt) {
420 int status = mysql_query(
mysql_,
"START TRANSACTION");
423 "reason: " << mysql_error(
mysql_));
444 if (mysql_commit(
mysql_) != 0) {
462 if (mysql_rollback(
mysql_) != 0) {
int version()
returns Kea hooks version.
A generic exception that is thrown if a parameter given to a method or function is considered invalid...
A generic exception that is thrown when an unexpected error condition occurs.
std::string getParameter(const std::string &name) const
Returns value of a connection parameter.
void checkUnusable()
Throws an exception if the connection is not usable.
std::map< std::string, std::string > ParameterMap
Database configuration parameter map.
Exception thrown on failure to open database.
Exception thrown on failure to execute a database function.
static void convertFromDatabaseTime(const MYSQL_TIME &expire, uint32_t valid_lifetime, time_t &cltt)
Converts Database Time to Lease Times.
static void convertToDatabaseTime(const time_t input_time, MYSQL_TIME &output_time)
Converts time_t value to database time.
Common MySQL Connector Pool.
MySqlHolder mysql_
MySQL connection handle.
void prepareStatement(uint32_t index, const char *text)
Prepare Single Statement.
std::vector< MYSQL_STMT * > statements_
Prepared statements.
bool isTransactionStarted() const
Checks if there is a transaction in progress.
std::vector< std::string > text_statements_
Raw text of statements.
static void convertToDatabaseTime(const time_t input_time, MYSQL_TIME &output_time)
Convert time_t value to database time.
static void convertFromDatabaseTime(const MYSQL_TIME &expire, uint32_t valid_lifetime, time_t &cltt)
Convert Database Time to Lease Times.
void commit()
Commits current transaction.
void openDatabase()
Open Database.
void prepareStatements(const TaggedStatement *start_statement, const TaggedStatement *end_statement)
Prepare statements.
static std::pair< uint32_t, uint32_t > getVersion(const ParameterMap ¶meters)
Get the schema version.
int transaction_ref_count_
Reference counter for transactions.
void startTransaction()
Starts new transaction.
virtual ~MySqlConnection()
Destructor.
void clearStatements()
Clears prepared statements and text statements.
void rollback()
Rollbacks current transaction.
~MySqlTransaction()
Destructor.
void commit()
Commits transaction.
MySqlTransaction(MySqlConnection &conn)
Constructor.
Exception thrown if name of database is not specified.
We want to reuse the database backend connection and exchange code for other uses,...
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
const int DB_DBG_TRACE_DETAIL
Database logging levels.
const my_bool MLM_FALSE
MySQL false value.
const int MYSQL_DEFAULT_CONNECTION_TIMEOUT
@ MYSQL_START_TRANSACTION
bool my_bool
my_bool type in MySQL 8.x.
int MysqlExecuteStatement(MYSQL_STMT *stmt)
Execute a prepared statement.
Defines the logger used by the top-level component of kea-lfc.
MySQL Selection Statements.