Kea 2.7.5
|
Common MySQL Connector Pool. More...
#include <mysql_connection.h>
Public Types | |
typedef std::function< void(MySqlBindingCollection &) | ConsumeResultFun) |
Function invoked to process fetched row. | |
Public Types inherited from isc::db::DatabaseConnection | |
typedef std::map< std::string, std::string > | ParameterMap |
Database configuration parameter map. | |
Public Member Functions | |
MySqlConnection (const ParameterMap ¶meters, IOServiceAccessorPtr io_accessor=IOServiceAccessorPtr(), DbCallback callback=DbCallback()) | |
Constructor. | |
virtual | ~MySqlConnection () |
Destructor. | |
template<typename StatementIndex > | |
void | checkError (const int status, const StatementIndex &index, const char *what) |
Check Error and Throw Exception. | |
void | commit () |
Commits current transaction. | |
template<typename StatementIndex > | |
MYSQL_STMT * | getStatement (StatementIndex index) const |
Returns a prepared statement by an index. | |
bool | getTls () const |
Get the TLS flag. | |
std::string | getTlsCipher () |
Get the TLS cipher. | |
template<typename StatementIndex > | |
void | insertQuery (const StatementIndex &index, const MySqlBindingCollection &in_bindings) |
Executes INSERT prepared statement. | |
bool | isTransactionStarted () const |
Checks if there is a transaction in progress. | |
void | openDatabase () |
Open Database. | |
void | prepareStatement (uint32_t index, const char *text) |
Prepare Single Statement. | |
void | prepareStatements (const TaggedStatement *start_statement, const TaggedStatement *end_statement) |
Prepare statements. | |
void | rollback () |
Rollbacks current transaction. | |
template<typename StatementIndex > | |
void | selectQuery (const StatementIndex &index, const MySqlBindingCollection &in_bindings, MySqlBindingCollection &out_bindings, ConsumeResultFun process_result) |
Executes SELECT query using prepared statement. | |
void | startRecoverDbConnection () |
The recover connection. | |
void | startTransaction () |
Starts new transaction. | |
template<typename StatementIndex > | |
uint64_t | updateDeleteQuery (const StatementIndex &index, const MySqlBindingCollection &in_bindings) |
Executes UPDATE or DELETE prepared statement and returns the number of affected rows. | |
Public Member Functions inherited from isc::db::DatabaseConnection | |
DatabaseConnection (const ParameterMap ¶meters, DbCallback callback=DbCallback()) | |
Constructor. | |
virtual | ~DatabaseConnection () |
Destructor. | |
void | checkUnusable () |
Throws an exception if the connection is not usable. | |
bool | configuredReadOnly () const |
Convenience method checking if database should be opened with read only access. | |
std::string | getParameter (const std::string &name) const |
Returns value of a connection parameter. | |
bool | isUnusable () |
Flag which indicates if connection is unusable. | |
virtual void | makeReconnectCtl (const std::string &timer_name) |
Instantiates a ReconnectCtl based on the connection's reconnect parameters. | |
util::ReconnectCtlPtr | reconnectCtl () |
The reconnect settings. | |
Static Public Member Functions | |
static void | ensureSchemaVersion (const ParameterMap ¶meters, const DbCallback &cb=DbCallback(), const std::string &timer_name=std::string()) |
Retrieve schema version, validate it against the hardcoded version, and attempt to initialize the schema if there is an error during retrieval. | |
static std::pair< uint32_t, uint32_t > | getVersion (const ParameterMap ¶meters, const IOServiceAccessorPtr &ac=IOServiceAccessorPtr(), const DbCallback &cb=DbCallback(), const std::string &timer_name=std::string()) |
Get the schema version. | |
static void | initializeSchema (const ParameterMap ¶meters) |
Initialize schema. | |
static std::vector< std::string > | toKeaAdminParameters (ParameterMap const ¶ms) |
Convert MySQL library parameters to kea-admin parameters. | |
static void | convertToDatabaseTime (const time_t input_time, MYSQL_TIME &output_time) |
Convert time_t value to database time. | |
static void | convertToDatabaseTime (const time_t cltt, const uint32_t valid_lifetime, MYSQL_TIME &expire) |
Convert Lease Time to Database Times. | |
static void | convertFromDatabaseTime (const MYSQL_TIME &expire, uint32_t valid_lifetime, time_t &cltt) |
Convert Database Time to Lease Times. | |
Static Public Member Functions inherited from isc::db::DatabaseConnection | |
static isc::asiolink::IOServicePtr & | getIOService () |
Returns pointer to the IO service. | |
static bool | invokeDbFailedCallback (const util::ReconnectCtlPtr &db_reconnect_ctl) |
Invokes the connection's restore failed connectivity callback. | |
static bool | invokeDbLostCallback (const util::ReconnectCtlPtr &db_reconnect_ctl) |
Invokes the connection's lost connectivity callback. | |
static bool | invokeDbRecoveredCallback (const util::ReconnectCtlPtr &db_reconnect_ctl) |
Invokes the connection's restored connectivity callback. | |
static ParameterMap | parse (const std::string &dbaccess) |
Parse database access string. | |
static std::string | redactedAccessString (const ParameterMap ¶meters) |
Redact database access string. | |
static void | setIOService (const isc::asiolink::IOServicePtr &io_service) |
Sets IO service to be used by the database backends. | |
static isc::data::ElementPtr | toElement (const ParameterMap ¶ms) |
Unparse a parameter map. | |
static isc::data::ElementPtr | toElementDbAccessString (const std::string &dbaccess) |
Unparse an access string. | |
Public Attributes | |
isc::asiolink::IOServicePtr | io_service_ |
IOService object, used for all ASIO operations. | |
IOServiceAccessorPtr | io_service_accessor_ |
Accessor function which returns the IOService that can be used to recover the connection. | |
MySqlHolder | mysql_ |
MySQL connection handle. | |
std::vector< std::string > | text_statements_ |
Raw text of statements. | |
bool | tls_ |
TLS flag (true when TLS was required, false otherwise). | |
int | transaction_ref_count_ |
Reference counter for transactions. | |
Static Public Attributes | |
static std::string | KEA_ADMIN_ = KEA_ADMIN |
Holds location to kea-admin. | |
Static Public Attributes inherited from isc::db::DatabaseConnection | |
static DbCallback | db_failed_callback_ = 0 |
Optional callback function to invoke if an opened connection recovery failed. | |
static DbCallback | db_lost_callback_ = 0 |
Optional callback function to invoke if an opened connection is lost. | |
static DbCallback | db_recovered_callback_ = 0 |
Optional callback function to invoke if an opened connection recovery succeeded. | |
static const time_t | MAX_DB_TIME = 2147483647 |
Defines maximum value for time that can be reliably stored. | |
static bool | retry_ = false |
Flag which indicates if the database connection should be retried on fail. | |
static bool | test_mode_ = false |
Test mode flag (default false). | |
Additional Inherited Members | |
Protected Member Functions inherited from isc::db::DatabaseConnection | |
void | markUnusable () |
Sets the unusable flag to true. | |
Protected Attributes inherited from isc::db::DatabaseConnection | |
DbCallback | callback_ |
The callback used to recover the connection. | |
Common MySQL Connector Pool.
This class provides common operations for MySQL database connection used by both MySqlLeaseMgr and MySqlHostDataSource. It manages connecting to the database and preparing compiled statements. Its fields are public, because they are used (both set and retrieved) in classes that use instances of MySqlConnection.
Definition at line 235 of file mysql_connection.h.
typedef std::function<void(MySqlBindingCollection&) isc::db::MySqlConnection::ConsumeResultFun) |
Function invoked to process fetched row.
Definition at line 239 of file mysql_connection.h.
|
inline |
Constructor.
Initialize MySqlConnection object with parameters needed for connection.
parameters | Specify the connection details. |
io_accessor | The IOService accessor function. |
callback | The connection recovery callback. |
Definition at line 248 of file mysql_connection.h.
|
virtual |
|
inline |
Check Error and Throw Exception.
Virtually all MySQL functions return a status which, if non-zero, indicates an error. This function centralizes the error checking code.
It is used to determine whether or not the function succeeded, and in the event of failures, decide whether or not those failures are recoverable.
If the error is recoverable, the function will throw a DbOperationError. If the error is deemed unrecoverable, such as a loss of connectivity with the server, the function will call startRecoverDbConnection() which will start the connection recovery.
If the invocation returns true, this indicates the calling layer will attempt recovery, and the function throws a DbOperationError to allow the caller to error handle the failed db access attempt.
status | Status code: non-zero implies an error |
index | Index of statement that caused the error |
what | High-level description of the error |
Enumeration | representing index of a statement to which an error pertains. |
isc::db::DbOperationError | An operation on the open database has failed. |
Definition at line 695 of file mysql_connection.h.
References isc::db::DB_LOG< log_type >::arg(), isc_throw, isc::db::DatabaseConnection::markUnusable(), mysql_, isc::db::MYSQL_FATAL_ERROR, startRecoverDbConnection(), and text_statements_.
Referenced by insertQuery(), selectQuery(), and updateDeleteQuery().
void isc::db::MySqlConnection::commit | ( | ) |
Commits current transaction.
Commits all pending database operations. On databases that don't support transactions, this is a no-op.
When this method is called for a nested transaction it decrements the transaction reference counter incremented during the call to startTransaction
.
DbOperationError | If the commit failed. |
Definition at line 634 of file mysql_connection.cc.
References isc::db::DatabaseConnection::checkUnusable(), isc::db::DB_DBG_TRACE_DETAIL, isc_throw, mysql_, isc::db::MYSQL_COMMIT, and transaction_ref_count_.
Referenced by isc::db::MySqlTransaction::commit().
|
static |
Convert Database Time to Lease Times.
Within the database, time is stored as "expire" (time of expiry of the lease) and valid lifetime. In the DHCP server, the information is stored client last transmit time and valid lifetime. These are related by the equation:
This method converts from the times in the database into times able to be inserted into the lease object.
expire | Reference to MYSQL_TIME object from where the expiry time of the lease is taken. |
valid_lifetime | lifetime of the lease. |
cltt | Reference to location where client last transmit time is put. |
Definition at line 605 of file mysql_connection.cc.
References isc::db::MySqlBinding::convertFromDatabaseTime().
|
static |
Convert Lease Time to Database Times.
Within the DHCP servers, times are stored as client last transmit time and valid lifetime. In the database, the information is stored as valid lifetime and "expire" (time of expiry of the lease). They are related by the equation:
This method converts from the times in the lease object into times able to be added to the database.
cltt | Client last transmit time |
valid_lifetime | Valid lifetime |
expire | Reference to MYSQL_TIME object where the expiry time of the lease will be put. |
isc::BadValue | if the sum of the calculated expiration time is greater than the value of LeaseMgr::MAX_DB_TIME . |
Definition at line 598 of file mysql_connection.cc.
References isc::db::MySqlBinding::convertToDatabaseTime().
|
static |
Convert time_t value to database time.
The following methods are used to convert between times and time intervals stored in the Lease object, and the times stored in the database. The reason for the difference is because in the DHCP server, the cltt (Client Time Since Last Transmission) is the natural data; in the lease file - which may be read by the user - it is the expiry time of the lease.
input_time | A time_t value representing time. |
output_time | Reference to MYSQL_TIME object where converted time will be put. |
Definition at line 592 of file mysql_connection.cc.
References isc::db::MySqlBinding::convertToDatabaseTime().
|
static |
Retrieve schema version, validate it against the hardcoded version, and attempt to initialize the schema if there is an error during retrieval.
Properly handles retrying of the database connection.
parameters | A data structure relating keywords and values concerned with the database. |
cb | The dbReconnect callback. |
timer_name | The DB reconnect timer name. |
isc::db::ScehamInitializationFailed | if the initialization fails |
Definition at line 402 of file mysql_connection.cc.
References isc::db::DatabaseConnection::getIOService(), getVersion(), initializeSchema(), isc_throw, isc::db::MYSQL_SCHEMA_VERSION_MAJOR, isc::db::MYSQL_SCHEMA_VERSION_MINOR, and isc::db::DatabaseConnection::test_mode_.
|
inline |
Returns a prepared statement by an index.
StatementIndex | Type of the statement index enum. |
index | Statement index. |
isc::db::DbConnectionUnusable | when the mysql pointer in the returned statement is NULL; it may be the result of the database connectivity loss. |
Definition at line 354 of file mysql_connection.h.
References isc_throw.
Referenced by insertQuery(), selectQuery(), and updateDeleteQuery().
|
inline |
Get the TLS flag.
Definition at line 758 of file mysql_connection.h.
References tls_.
|
inline |
Get the TLS cipher.
This method is used to check if required TLS was setup.
Definition at line 765 of file mysql_connection.h.
References mysql_.
|
static |
Get the schema version.
parameters | A data structure relating keywords and values concerned with the database. |
ac | An IOServiceAccessor object. |
cb | The dbReconnect callback. |
timer_name | The DB reconnect timer name. |
isc::db::DbOperationError | An operation on the open database has failed. |
Definition at line 320 of file mysql_connection.cc.
References isc_throw, isc::db::MysqlExecuteStatement(), and version().
Referenced by ensureSchemaVersion().
|
static |
Initialize schema.
parameters | A data structure relating keywords and values concerned with the database. |
isc::db::ScehamInitializationFailed | if the initialization fails |
Definition at line 448 of file mysql_connection.cc.
References isc::db::DB_LOG< log_type >::arg(), isc_throw, isc::util::file::isFile(), KEA_ADMIN_, isc::db::MYSQL_INITIALIZE_SCHEMA, isc::asiolink::ProcessSpawn::SYNC, and toKeaAdminParameters().
Referenced by ensureSchemaVersion().
|
inline |
Executes INSERT prepared statement.
The statement index must point to an existing prepared statement associated with the connection. The in_bindings
size must match the number of placeholders in the prepared statement.
This method executes prepared statement using provided bindings to insert data into the database.
StatementIndex | Type of the statement index enum. |
index | Index of the query to be executed. |
in_bindings | Input bindings holding values to substitue placeholders in the query. |
Definition at line 560 of file mysql_connection.h.
References checkError(), isc::db::DatabaseConnection::checkUnusable(), getStatement(), isc_throw, mysql_, and isc::db::MysqlExecuteStatement().
bool isc::db::MySqlConnection::isTransactionStarted | ( | ) | const |
Checks if there is a transaction in progress.
Definition at line 629 of file mysql_connection.cc.
References transaction_ref_count_.
void isc::db::MySqlConnection::openDatabase | ( | ) |
Open Database.
Opens the database using the information supplied in the parameters passed to the constructor.
NoDatabaseName | Mandatory database name not given |
DbOpenError | Error opening the database |
Definition at line 63 of file mysql_connection.cc.
References isc::db::DatabaseConnection::getParameter(), isc_throw, isc::util::file::isDir(), isc::db::MLM_FALSE, mysql_, isc::db::MYSQL_DEFAULT_CONNECTION_TIMEOUT, isc::db::DatabaseConnection::reconnectCtl(), isc::db::DatabaseConnection::retry_, startRecoverDbConnection(), tls_, and isc::Exception::what().
void isc::db::MySqlConnection::prepareStatement | ( | uint32_t | index, |
const char * | text ) |
Prepare Single Statement.
Creates a prepared statement from the text given and adds it to the statements_ vector at the given index.
index | Index into the statements_ vector into which the text should be placed. The vector must be big enough for the index to be valid, else an exception will be thrown. |
text | Text of the SQL statement to be prepared. |
isc::db::DbOperationError | An operation on the open database has failed. |
isc::InvalidParameter | 'index' is not valid for the vector. |
Definition at line 526 of file mysql_connection.cc.
References isc_throw, mysql_, and text_statements_.
Referenced by prepareStatements().
void isc::db::MySqlConnection::prepareStatements | ( | const TaggedStatement * | start_statement, |
const TaggedStatement * | end_statement ) |
Prepare statements.
Creates the prepared statements for all of the SQL statements used by the MySQL backend.
start_statement | Pointer to the first statement in range of the statements to be compiled. |
end_statement | Pointer to the statement marking end of the range of statements to be compiled. This last statement is not compiled. |
isc::db::DbOperationError | An operation on the open database has failed. |
isc::InvalidParameter | 'index' is not valid for the vector. This represents an internal error within the code. |
Definition at line 551 of file mysql_connection.cc.
References prepareStatement(), and text_statements_.
void isc::db::MySqlConnection::rollback | ( | ) |
Rollbacks current transaction.
Rolls back all pending database operations. On databases that don't support transactions, this is a no-op.
When this method is called for a nested transaction it decrements the transaction reference counter incremented during the call to startTransaction
.
DbOperationError | If the rollback failed. |
Definition at line 652 of file mysql_connection.cc.
References isc::db::DatabaseConnection::checkUnusable(), isc::db::DB_DBG_TRACE_DETAIL, isc_throw, mysql_, isc::db::MYSQL_ROLLBACK, and transaction_ref_count_.
Referenced by isc::db::MySqlTransaction::~MySqlTransaction().
|
inline |
Executes SELECT query using prepared statement.
The statement index must point to an existing prepared statement associated with the connection. The in_bindings
size must match the number of placeholders in the prepared statement. The size of the out_bindings
must match the number of selected columns. The output bindings must be created and must encapsulate values of the appropriate type, e.g. string, uint32_t etc.
This method executes prepared statement using provided bindings and calls process_result
function for each returned row. The process_result
function is implemented by the caller and should gather and store each returned row in an external data structure prior to returning because the values in the out_bindings
will be overwritten by the values of the next returned row when this function is called again.
StatementIndex | Type of the statement index enum. |
index | Index of the query to be executed. | |
in_bindings | Input bindings holding values to substitue placeholders in the query. | |
[out] | out_bindings | Output bindings where retrieved data will be stored. |
process_result | Pointer to the function to be invoked for each retrieved row. This function consumes the retrieved data from the output bindings. |
Definition at line 480 of file mysql_connection.h.
References checkError(), isc::db::DatabaseConnection::checkUnusable(), getStatement(), isc_throw, isc::db::MLM_MYSQL_FETCH_FAILURE, isc::db::MLM_MYSQL_FETCH_SUCCESS, isc::db::MysqlExecuteStatement(), text_statements_, and isc::Exception::what().
|
inline |
The recover connection.
This function starts the recover process of the connection.
Definition at line 742 of file mysql_connection.h.
References isc::db::DatabaseConnection::callback_, io_service_, io_service_accessor_, and isc::db::DatabaseConnection::reconnectCtl().
Referenced by checkError(), and openDatabase().
void isc::db::MySqlConnection::startTransaction | ( | ) |
Starts new transaction.
This function begins a new transaction by sending the START TRANSACTION statement to the database. The transaction should be explicitly committed by calling commit()
or rolled back by calling rollback()
. MySQL does not support nested transactions, and it implicitly commits a current transaction when the new transaction begins. Therefore, this function checks if a transaction has already started and does not start a new transaction. However, it increments a transaction reference counter which is later decremented when commit()
or rollback()
is called. When this mechanism is used properly, it guarantees that nested transactions are not attempted, thus avoiding implicit (unexpected) commits of the pending transaction.
Definition at line 611 of file mysql_connection.cc.
References isc::db::DatabaseConnection::checkUnusable(), isc::db::DB_DBG_TRACE_DETAIL, isc_throw, mysql_, isc::db::MYSQL_START_TRANSACTION, and transaction_ref_count_.
Referenced by isc::db::MySqlTransaction::MySqlTransaction().
|
static |
Convert MySQL library parameters to kea-admin parameters.
params | input MySQL parameters |
Definition at line 481 of file mysql_connection.cc.
Referenced by initializeSchema().
|
inline |
Executes UPDATE or DELETE prepared statement and returns the number of affected rows.
The statement index must point to an existing prepared statement associated with the connection. The in_bindings
size must match the number of placeholders in the prepared statement.
StatementIndex | Type of the statement index enum. |
index | Index of the query to be executed. |
in_bindings | Input bindings holding values to substitute placeholders in the query. |
Definition at line 604 of file mysql_connection.h.
References checkError(), isc::db::DatabaseConnection::checkUnusable(), getStatement(), isc_throw, mysql_, and isc::db::MysqlExecuteStatement().
isc::asiolink::IOServicePtr isc::db::MySqlConnection::io_service_ |
IOService object, used for all ASIO operations.
Definition at line 819 of file mysql_connection.h.
Referenced by startRecoverDbConnection().
IOServiceAccessorPtr isc::db::MySqlConnection::io_service_accessor_ |
Accessor function which returns the IOService that can be used to recover the connection.
This accessor is used to lazy retrieve the IOService when the connection is lost. It is useful to retrieve it at a later time to support hook libraries which create managers on load and set IOService later on by using the dhcp4_srv_configured and dhcp6_srv_configured hooks.
Definition at line 816 of file mysql_connection.h.
Referenced by startRecoverDbConnection().
|
static |
Holds location to kea-admin.
By default, it points to kea-admin from installation. In tests, it points to kea-admin from sources.
Definition at line 834 of file mysql_connection.h.
Referenced by initializeSchema().
MySqlHolder isc::db::MySqlConnection::mysql_ |
MySQL connection handle.
This field is public, because it is used heavily from MySqlConnection and will be from MySqlHostDataSource.
Definition at line 807 of file mysql_connection.h.
Referenced by checkError(), commit(), getTlsCipher(), insertQuery(), openDatabase(), prepareStatement(), rollback(), startTransaction(), and updateDeleteQuery().
std::vector<std::string> isc::db::MySqlConnection::text_statements_ |
Raw text of statements.
This field is public, because it is used heavily from MySqlConnection and will be from MySqlHostDataSource.
Definition at line 801 of file mysql_connection.h.
Referenced by ~MySqlConnection(), checkError(), prepareStatement(), prepareStatements(), and selectQuery().
bool isc::db::MySqlConnection::tls_ |
TLS flag (true when TLS was required, false otherwise).
Definition at line 830 of file mysql_connection.h.
Referenced by getTls(), and openDatabase().
int isc::db::MySqlConnection::transaction_ref_count_ |
Reference counter for transactions.
It precludes starting and committing nested transactions. MySQL implicitly commits current transaction when new transaction is started. We want to not start new transactions when one is already in progress.
Definition at line 827 of file mysql_connection.h.
Referenced by commit(), isTransactionStarted(), rollback(), and startTransaction().