Kea  2.3.5-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 ()
 Commits current transaction. More...
 
bool getTls () const
 Get the TLS flag. More...
 
std::string getTlsCipher ()
 Get the TLS cipher. More...
 
template<typename StatementIndex >
void insertQuery (const StatementIndex &index, const MySqlBindingCollection &in_bindings)
 Executes INSERT prepared statement. More...
 
bool isTransactionStarted () const
 Checks if there is a transaction in progress. 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 ()
 Rollbacks current transaction. 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 new 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...
 
util::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 util::ReconnectCtlPtr &db_reconnect_ctl)
 Invokes the connection's restore failed connectivity callback. More...
 
static bool invokeDbLostCallback (const util::ReconnectCtlPtr &db_reconnect_ctl)
 Invokes the connection's lost connectivity callback. More...
 
static bool invokeDbRecoveredCallback (const util::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...
 
bool tls_
 TLS flag (true when TLS was required, false otherwise). More...
 
int transaction_ref_count_
 Reference counter for transactions. 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 235 of file mysql_connection.h.

Member Typedef Documentation

◆ ConsumeResultFun

Function invoked to process fetched row.

Definition at line 239 of file mysql_connection.h.

Constructor & Destructor Documentation

◆ MySqlConnection()

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 248 of file mysql_connection.h.

◆ ~MySqlConnection()

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

Destructor.

Definition at line 400 of file mysql_connection.cc.

Member Function Documentation

◆ checkError()

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 640 of file mysql_connection.h.

References isc::db::DB_LOG< log_type >::arg(), isc_throw, and isc::db::MYSQL_FATAL_ERROR.

+ Here is the call graph for this function:

◆ clearStatements()

void isc::db::MySqlConnection::clearStatements ( )

Clears prepared statements and text statements.

Definition at line 394 of file mysql_connection.cc.

◆ commit()

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.

Exceptions
DbOperationErrorIf the commit failed.

Definition at line 467 of file mysql_connection.cc.

References isc::db::DB_DBG_TRACE_DETAIL, isc_throw, and isc::db::MYSQL_COMMIT.

Referenced by isc::db::MySqlTransaction::commit().

◆ convertFromDatabaseTime()

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 438 of file mysql_connection.cc.

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

+ Here is the call graph for this function:

◆ convertToDatabaseTime() [1/2]

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 425 of file mysql_connection.cc.

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

Referenced by isc::dhcp::MySqlLeaseMgr::deleteExpiredReclaimedLeases6(), isc::dhcp::MySqlLeaseMgr::deleteLease(), isc::dhcp::MySqlLeaseMgr::getExpiredLeases6(), isc::dhcp::MySqlLeaseMgr::updateLease4(), and isc::dhcp::MySqlLeaseMgr::updateLease6().

+ Here is the call graph for this function:

◆ convertToDatabaseTime() [2/2]

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 431 of file mysql_connection.cc.

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

+ Here is the call graph for this function:

◆ getTls()

bool isc::db::MySqlConnection::getTls ( ) const
inline

Get the TLS flag.

Returns
True if TLS was required, false otherwise.

Definition at line 703 of file mysql_connection.h.

◆ getTlsCipher()

std::string isc::db::MySqlConnection::getTlsCipher ( )
inline

Get the TLS cipher.

This method is used to check if required TLS was setup.

Definition at line 710 of file mysql_connection.h.

◆ getVersion()

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 271 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:

◆ insertQuery()

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 505 of file mysql_connection.h.

References isc_throw, and isc::db::MysqlExecuteStatement().

+ Here is the call graph for this function:

◆ isTransactionStarted()

bool isc::db::MySqlConnection::isTransactionStarted ( ) const

Checks if there is a transaction in progress.

Returns
true if a transaction has been started, false otherwise.

Definition at line 462 of file mysql_connection.cc.

◆ openDatabase()

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 56 of file mysql_connection.cc.

References isc_throw, isc::util::file::isDir(), isc::db::MLM_FALSE, isc::db::MYSQL_DEFAULT_CONNECTION_TIMEOUT, and isc::Exception::what().

Referenced by getVersion().

+ Here is the call graph for this function:

◆ prepareStatement()

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 354 of file mysql_connection.cc.

References isc_throw.

◆ 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 379 of file mysql_connection.cc.

◆ rollback()

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.

Exceptions
DbOperationErrorIf the rollback failed.

Definition at line 485 of file mysql_connection.cc.

References isc::db::DB_DBG_TRACE_DETAIL, isc_throw, and isc::db::MYSQL_ROLLBACK.

Referenced by isc::db::MySqlTransaction::~MySqlTransaction().

◆ selectQuery()

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 425 of file mysql_connection.h.

References isc_throw, isc::db::MLM_MYSQL_FETCH_FAILURE, isc::db::MLM_MYSQL_FETCH_SUCCESS, isc::db::MysqlExecuteStatement(), and isc::Exception::what().

+ Here is the call graph for this function:

◆ startRecoverDbConnection()

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 687 of file mysql_connection.h.

◆ startTransaction()

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 444 of file mysql_connection.cc.

References isc::db::DB_DBG_TRACE_DETAIL, isc_throw, and isc::db::MYSQL_START_TRANSACTION.

Referenced by isc::db::MySqlTransaction::MySqlTransaction().

◆ updateDeleteQuery()

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 549 of file mysql_connection.h.

References isc_throw, and isc::db::MysqlExecuteStatement().

+ Here is the call graph for this function:

Member Data Documentation

◆ io_service_

isc::asiolink::IOServicePtr isc::db::MySqlConnection::io_service_

IOService object, used for all ASIO operations.

Definition at line 764 of file mysql_connection.h.

◆ io_service_accessor_

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 761 of file mysql_connection.h.

◆ mysql_

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 752 of file mysql_connection.h.

Referenced by getVersion().

◆ statements_

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 740 of file mysql_connection.h.

◆ text_statements_

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 746 of file mysql_connection.h.

◆ tls_

bool isc::db::MySqlConnection::tls_

TLS flag (true when TLS was required, false otherwise).

Definition at line 775 of file mysql_connection.h.

◆ transaction_ref_count_

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 772 of file mysql_connection.h.


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