Kea  1.9.9-git
isc::db::MySqlConnection Class Reference

Common MySQL Connector Pool. More...

#include <mysql_connection.h>

+ Inheritance diagram for isc::db::MySqlConnection:

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 &parameters, 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 &parameters, 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 &parameters)
 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 &parameters)
 Redact database access string. More...
 
static isc::data::ElementPtr toElement (const ParameterMap &params)
 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...
 

Detailed Description

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.

Member Typedef Documentation

Function invoked to process fetched row.

Definition at line 237 of file mysql_connection.h.

Constructor & Destructor Documentation

isc::db::MySqlConnection::MySqlConnection ( const ParameterMap parameters,
IOServiceAccessorPtr  io_accessor = IOServiceAccessorPtr(),
DbCallback  callback = DbCallback() 
)
inline

Constructor.

Initialize MySqlConnection object with parameters needed for connection.

Parameters
parametersSpecify the connection details.
io_accessorThe IOService accessor function.
callbackThe connection recovery callback.

Definition at line 246 of file mysql_connection.h.

isc::db::MySqlConnection::~MySqlConnection ( )
virtual

Destructor.

Definition at line 364 of file mysql_connection.cc.

References statements_, and text_statements_.

Member Function Documentation

template<typename StatementIndex >
void isc::db::MySqlConnection::checkError ( const int  status,
const StatementIndex &  index,
const char *  what 
)
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.

Parameters
statusStatus code: non-zero implies an error
indexIndex of statement that caused the error
whatHigh-level description of the error
Template Parameters
Enumerationrepresenting index of a statement to which an error pertains.
Exceptions
isc::db::DbOperationErrorAn 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().

+ Here is the call graph for this function:

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.

Exceptions
DbOperationErrorIf 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().

+ Here is the call graph for this function:

void isc::db::MySqlConnection::convertFromDatabaseTime ( const MYSQL_TIME &  expire,
uint32_t  valid_lifetime,
time_t &  cltt 
)
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:

  • client last transmit time = expire - valid_lifetime

This method converts from the times in the database into times able to be inserted into the lease object.

Parameters
expireReference to MYSQL_TIME object from where the expiry time of the lease is taken.
valid_lifetimelifetime of the lease.
clttReference to location where client last transmit time is put.

Definition at line 402 of file mysql_connection.cc.

References isc::db::MySqlBinding::convertFromDatabaseTime().

+ Here is the call graph for this function:

void isc::db::MySqlConnection::convertToDatabaseTime ( const time_t  input_time,
MYSQL_TIME &  output_time 
)
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.

Parameters
input_timeA time_t value representing time.
output_timeReference 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().

+ Here is the call graph for this function:

void isc::db::MySqlConnection::convertToDatabaseTime ( const time_t  cltt,
const uint32_t  valid_lifetime,
MYSQL_TIME &  expire 
)
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:

  • expire = client last transmit time + valid lifetime

This method converts from the times in the lease object into times able to be added to the database.

Parameters
clttClient last transmit time
valid_lifetimeValid lifetime
expireReference to MYSQL_TIME object where the expiry time of the lease will be put.
Exceptions
isc::BadValueif 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().

+ Here is the call graph for this function:

std::pair< uint32_t, uint32_t > isc::db::MySqlConnection::getVersion ( const ParameterMap parameters)
static

Get the schema version.

Parameters
parametersA data structure relating keywords and values concerned with the database.
Returns
Version number as a pair of unsigned integers. "first" is the major version number, "second" the minor number.
Exceptions
isc::db::DbOperationErrorAn 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().

+ Here is the call graph for this function:

template<typename StatementIndex >
void isc::db::MySqlConnection::insertQuery ( const StatementIndex &  index,
const MySqlBindingCollection in_bindings 
)
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.

Template Parameters
StatementIndexType of the statement index enum.
Parameters
indexIndex of the query to be executed.
in_bindingsInput 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_.

+ Here is the call graph for this function:

void isc::db::MySqlConnection::openDatabase ( )

Open Database.

Opens the database using the information supplied in the parameters passed to the constructor.

Exceptions
NoDatabaseNameMandatory database name not given
DbOpenErrorError 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().

+ Here is the call graph for this function:

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.

Parameters
indexIndex 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.
textText of the SQL statement to be prepared.
Exceptions
isc::db::DbOperationErrorAn 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.

Parameters
start_statementPointer to the first statement in range of the statements to be compiled.
end_statementPointer to the statement marking end of the range of statements to be compiled. This last statement is not compiled.
Exceptions
isc::db::DbOperationErrorAn 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_.

+ Here is the call graph for this function:

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.

Exceptions
DbOperationErrorIf 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().

+ Here is the call graph for this function:

template<typename StatementIndex >
void isc::db::MySqlConnection::selectQuery ( const StatementIndex &  index,
const MySqlBindingCollection in_bindings,
MySqlBindingCollection out_bindings,
ConsumeResultFun  process_result 
)
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.

Template Parameters
StatementIndexType of the statement index enum.
Parameters
indexIndex of the query to be executed.
in_bindingsInput bindings holding values to substitue placeholders in the query.
[out]out_bindingsOutput bindings where retrieved data will be stored.
process_resultPointer 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().

+ Here is the call graph for this function:

void isc::db::MySqlConnection::startRecoverDbConnection ( )
inline

The recover connection.

This function starts the recover process of the connection.

Note
The recover function must be run on the IO Service thread.

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().

+ Here is the call graph for this function:

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().

+ Here is the call graph for this function:

template<typename StatementIndex >
uint64_t isc::db::MySqlConnection::updateDeleteQuery ( const StatementIndex &  index,
const MySqlBindingCollection in_bindings 
)
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.

Template Parameters
StatementIndexType of the statement index enum.
Parameters
indexIndex of the query to be executed.
in_bindingsInput bindings holding values to substitute placeholders in the query.
Returns
Number of affected rows.

Definition at line 529 of file mysql_connection.h.

References checkError(), isc::db::DatabaseConnection::checkUnusable(), isc_throw, mysql_, isc::db::MysqlExecuteStatement(), and statements_.

+ Here is the call graph for this function:

Member Data Documentation

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().


The documentation for this class was generated from the following files: