Kea
1.9.9-git
|
Common MySQL Connector Pool. More...
#include <mysql_connection.h>
Public Types | |
typedef std::function< void(MySqlBindingCollection &)> | ConsumeResultFun |
Function invoked to process fetched row. More... | |
Public Types inherited from isc::db::DatabaseConnection | |
typedef std::map< std::string, std::string > | ParameterMap |
Database configuration parameter map. More... | |
Public Member Functions | |
MySqlConnection (const ParameterMap ¶meters, IOServiceAccessorPtr io_accessor=IOServiceAccessorPtr(), DbCallback callback=DbCallback()) | |
Constructor. More... | |
virtual | ~MySqlConnection () |
Destructor. More... | |
template<typename StatementIndex > | |
void | checkError (const int status, const StatementIndex &index, const char *what) |
Check Error and Throw Exception. More... | |
void | clearStatements () |
Clears prepared statements and text statements. More... | |
void | commit () |
Commit Transactions. More... | |
template<typename StatementIndex > | |
void | insertQuery (const StatementIndex &index, const MySqlBindingCollection &in_bindings) |
Executes INSERT prepared statement. More... | |
void | openDatabase () |
Open Database. More... | |
void | prepareStatement (uint32_t index, const char *text) |
Prepare Single Statement. More... | |
void | prepareStatements (const TaggedStatement *start_statement, const TaggedStatement *end_statement) |
Prepare statements. More... | |
void | rollback () |
Rollback Transactions. More... | |
template<typename StatementIndex > | |
void | selectQuery (const StatementIndex &index, const MySqlBindingCollection &in_bindings, MySqlBindingCollection &out_bindings, ConsumeResultFun process_result) |
Executes SELECT query using prepared statement. More... | |
void | startRecoverDbConnection () |
The recover connection. More... | |
void | startTransaction () |
Starts Transaction. More... | |
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. More... | |
Public Member Functions inherited from isc::db::DatabaseConnection | |
DatabaseConnection (const ParameterMap ¶meters, DbCallback callback=DbCallback()) | |
Constructor. More... | |
virtual | ~DatabaseConnection () |
Destructor. More... | |
void | checkUnusable () |
Throws an exception if the connection is not usable. More... | |
bool | configuredReadOnly () const |
Convenience method checking if database should be opened with read only access. More... | |
std::string | getParameter (const std::string &name) const |
Returns value of a connection parameter. More... | |
bool | isUnusable () |
Flag which indicates if connection is unusable. More... | |
virtual void | makeReconnectCtl (const std::string &timer_name) |
Instantiates a ReconnectCtl based on the connection's reconnect parameters. More... | |
ReconnectCtlPtr | reconnectCtl () |
The reconnect settings. More... | |
Static Public Member Functions | |
static std::pair< uint32_t, uint32_t > | getVersion (const ParameterMap ¶meters) |
Get the schema version. More... | |
static void | convertToDatabaseTime (const time_t input_time, MYSQL_TIME &output_time) |
Convert time_t value to database time. More... | |
static void | convertToDatabaseTime (const time_t cltt, const uint32_t valid_lifetime, MYSQL_TIME &expire) |
Convert Lease Time to Database Times. More... | |
static void | convertFromDatabaseTime (const MYSQL_TIME &expire, uint32_t valid_lifetime, time_t &cltt) |
Convert Database Time to Lease Times. More... | |
Static Public Member Functions inherited from isc::db::DatabaseConnection | |
static bool | invokeDbFailedCallback (const ReconnectCtlPtr &db_reconnect_ctl) |
Invokes the connection's restore failed connectivity callback. More... | |
static bool | invokeDbLostCallback (const ReconnectCtlPtr &db_reconnect_ctl) |
Invokes the connection's lost connectivity callback. More... | |
static bool | invokeDbRecoveredCallback (const ReconnectCtlPtr &db_reconnect_ctl) |
Invokes the connection's restored connectivity callback. More... | |
static ParameterMap | parse (const std::string &dbaccess) |
Parse database access string. More... | |
static std::string | redactedAccessString (const ParameterMap ¶meters) |
Redact database access string. More... | |
static isc::data::ElementPtr | toElement (const ParameterMap ¶ms) |
Unparse a parameter map. More... | |
static isc::data::ElementPtr | toElementDbAccessString (const std::string &dbaccess) |
Unparse an access string. More... | |
Public Attributes | |
isc::asiolink::IOServicePtr | io_service_ |
IOService object, used for all ASIO operations. More... | |
IOServiceAccessorPtr | io_service_accessor_ |
Accessor function which returns the IOService that can be used to recover the connection. More... | |
MySqlHolder | mysql_ |
MySQL connection handle. More... | |
std::vector< MYSQL_STMT * > | statements_ |
Prepared statements. More... | |
std::vector< std::string > | text_statements_ |
Raw text of statements. More... | |
Additional Inherited Members | |
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. More... | |
static DbCallback | db_lost_callback_ = 0 |
Optional callback function to invoke if an opened connection is lost. More... | |
static DbCallback | db_recovered_callback_ = 0 |
Optional callback function to invoke if an opened connection recovery succeeded. More... | |
static const time_t | MAX_DB_TIME = 2147483647 |
Defines maximum value for time that can be reliably stored. More... | |
Protected Member Functions inherited from isc::db::DatabaseConnection | |
void | markUnusable () |
Sets the unusable flag to true. More... | |
Protected Attributes inherited from isc::db::DatabaseConnection | |
DbCallback | callback_ |
The callback used to recover the connection. More... | |
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 233 of file mysql_connection.h.
typedef std::function<void(MySqlBindingCollection&)> isc::db::MySqlConnection::ConsumeResultFun |
Function invoked to process fetched row.
Definition at line 237 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 246 of file mysql_connection.h.
|
virtual |
Destructor.
Definition at line 364 of file mysql_connection.cc.
References statements_, and text_statements_.
|
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 612 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::clearStatements | ( | ) |
Clears prepared statements and text statements.
Definition at line 358 of file mysql_connection.cc.
References statements_, and text_statements_.
void isc::db::MySqlConnection::commit | ( | ) |
Commit Transactions.
Commits all pending database operations. On databases that don't support transactions, this is a no-op.
DbOperationError | If the commit failed. |
Definition at line 421 of file mysql_connection.cc.
References isc::db::DatabaseConnection::checkUnusable(), isc::db::DB_DBG_TRACE_DETAIL, isc_throw, mysql_, and isc::db::MYSQL_COMMIT.
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 402 of file mysql_connection.cc.
References isc::db::MySqlBinding::convertFromDatabaseTime().
|
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 389 of file mysql_connection.cc.
References isc::db::MySqlBinding::convertToDatabaseTime().
Referenced by isc::dhcp::MySqlLeaseMgr::deleteLease(), isc::dhcp::MySqlLeaseMgr::updateLease4(), and isc::dhcp::MySqlLeaseMgr::updateLease6().
|
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 395 of file mysql_connection.cc.
References isc::db::MySqlBinding::convertToDatabaseTime().
|
static |
Get the schema version.
parameters | A data structure relating keywords and values concerned with the database. |
isc::db::DbOperationError | An operation on the open database has failed. |
Definition at line 235 of file mysql_connection.cc.
References isc_throw, mysql_, isc::db::MysqlExecuteStatement(), openDatabase(), and version().
Referenced by isc::dhcp::MySqlLeaseMgr::getVersion(), and isc::dhcp::MySqlHostDataSourceImpl::getVersion().
|
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 485 of file mysql_connection.h.
References checkError(), isc::db::DatabaseConnection::checkUnusable(), isc_throw, mysql_, isc::db::MysqlExecuteStatement(), and statements_.
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 54 of file mysql_connection.cc.
References isc::db::DatabaseConnection::getParameter(), isc_throw, isc::db::MLM_FALSE, mysql_, and isc::db::MYSQL_DEFAULT_CONNECTION_TIMEOUT.
Referenced by getVersion().
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 318 of file mysql_connection.cc.
References isc_throw, mysql_, statements_, 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 343 of file mysql_connection.cc.
References prepareStatement(), statements_, and text_statements_.
void isc::db::MySqlConnection::rollback | ( | ) |
Rollback Transactions.
Rolls back all pending database operations. On databases that don't support transactions, this is a no-op.
DbOperationError | If the rollback failed. |
Definition at line 431 of file mysql_connection.cc.
References isc::db::DatabaseConnection::checkUnusable(), isc::db::DB_DBG_TRACE_DETAIL, isc_throw, mysql_, and isc::db::MYSQL_ROLLBACK.
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 405 of file mysql_connection.h.
References checkError(), isc::db::DatabaseConnection::checkUnusable(), isc_throw, isc::db::MLM_MYSQL_FETCH_FAILURE, isc::db::MLM_MYSQL_FETCH_SUCCESS, isc::db::MysqlExecuteStatement(), statements_, text_statements_, and isc::Exception::what().
|
inline |
The recover connection.
This function starts the recover process of the connection.
Definition at line 659 of file mysql_connection.h.
References isc::db::DatabaseConnection::callback_, io_service_, io_service_accessor_, and isc::db::DatabaseConnection::reconnectCtl().
Referenced by checkError().
void isc::db::MySqlConnection::startTransaction | ( | ) |
Starts Transaction.
Definition at line 408 of file mysql_connection.cc.
References isc::db::DatabaseConnection::checkUnusable(), isc::db::DB_DBG_TRACE_DETAIL, isc_throw, mysql_, and isc::db::MYSQL_START_TRANSACTION.
Referenced by isc::db::MySqlTransaction::MySqlTransaction().
|
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 529 of file mysql_connection.h.
References checkError(), isc::db::DatabaseConnection::checkUnusable(), isc_throw, mysql_, isc::db::MysqlExecuteStatement(), and statements_.
isc::asiolink::IOServicePtr isc::db::MySqlConnection::io_service_ |
IOService object, used for all ASIO operations.
Definition at line 700 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 697 of file mysql_connection.h.
Referenced by startRecoverDbConnection().
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 688 of file mysql_connection.h.
Referenced by checkError(), commit(), getVersion(), insertQuery(), openDatabase(), prepareStatement(), rollback(), startTransaction(), and updateDeleteQuery().
std::vector<MYSQL_STMT*> isc::db::MySqlConnection::statements_ |
Prepared statements.
This field is public, because it is used heavily from MySqlConnection and will be from MySqlHostDataSource.
Definition at line 676 of file mysql_connection.h.
Referenced by clearStatements(), insertQuery(), prepareStatement(), prepareStatements(), selectQuery(), updateDeleteQuery(), and ~MySqlConnection().
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 682 of file mysql_connection.h.
Referenced by checkError(), clearStatements(), prepareStatement(), prepareStatements(), selectQuery(), and ~MySqlConnection().