mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-08-31 14:05:33 +00:00
[4281] Moved MySQL host data source statements to impl class.
This commit is contained in:
@@ -67,159 +67,6 @@ const size_t OPTION_SPACE_MAX_LEN = 128;
|
|||||||
/// a database is within bounds. of supported identifiers.
|
/// a database is within bounds. of supported identifiers.
|
||||||
const uint8_t MAX_IDENTIFIER_TYPE = static_cast<uint8_t>(Host::IDENT_CIRCUIT_ID);
|
const uint8_t MAX_IDENTIFIER_TYPE = static_cast<uint8_t>(Host::IDENT_CIRCUIT_ID);
|
||||||
|
|
||||||
/// @brief Prepared MySQL statements used by the backend to insert and
|
|
||||||
/// retrieve hosts from the database.
|
|
||||||
TaggedStatement tagged_statements[] = {
|
|
||||||
// Inserts a host into the 'hosts' table.
|
|
||||||
{MySqlHostDataSource::INSERT_HOST,
|
|
||||||
"INSERT INTO hosts(host_id, dhcp_identifier, dhcp_identifier_type, "
|
|
||||||
"dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, "
|
|
||||||
"dhcp4_client_classes, dhcp6_client_classes) "
|
|
||||||
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"},
|
|
||||||
|
|
||||||
// Inserts a single IPv6 reservation into 'reservations' table.
|
|
||||||
{MySqlHostDataSource::INSERT_V6_RESRV,
|
|
||||||
"INSERT INTO ipv6_reservations(address, prefix_len, type, "
|
|
||||||
"dhcp6_iaid, host_id) "
|
|
||||||
"VALUES (?,?,?,?,?)"},
|
|
||||||
|
|
||||||
// Inserts a single DHCPv4 option into 'dhcp4_options' table.
|
|
||||||
{MySqlHostDataSource::INSERT_V4_OPTION,
|
|
||||||
"INSERT INTO dhcp4_options(option_id, code, value, formatted_value, space, "
|
|
||||||
"persistent, dhcp_client_class, dhcp4_subnet_id, host_id) "
|
|
||||||
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"},
|
|
||||||
|
|
||||||
// Inserts a single DHCPv6 option into 'dhcp6_options' table.
|
|
||||||
{MySqlHostDataSource::INSERT_V6_OPTION,
|
|
||||||
"INSERT INTO dhcp6_options(option_id, code, value, formatted_value, space, "
|
|
||||||
"persistent, dhcp_client_class, dhcp6_subnet_id, host_id) "
|
|
||||||
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"},
|
|
||||||
|
|
||||||
// Retrieves host information, IPv6 reservations and both DHCPv4 and
|
|
||||||
// DHCPv6 options associated with the host. The LEFT JOIN clause is used
|
|
||||||
// to retrieve information from 4 different tables using a single query.
|
|
||||||
// Hence, this query returns multiple rows for a single host.
|
|
||||||
{MySqlHostDataSource::GET_HOST_DHCPID,
|
|
||||||
"SELECT DISTINCT h.host_id, h.dhcp_identifier, h.dhcp_identifier_type, "
|
|
||||||
"h.dhcp4_subnet_id, h.dhcp6_subnet_id, h.ipv4_address, "
|
|
||||||
"h.hostname, h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
|
||||||
"o4.option_id, o4.code, o4.value, o4.formatted_value, o4.space, "
|
|
||||||
"o4.persistent, "
|
|
||||||
"o6.option_id, o6.code, o6.value, o6.formatted_value, o6.space, "
|
|
||||||
"o6.persistent, "
|
|
||||||
"r.reservation_id, r.address, r.prefix_len, r.type, "
|
|
||||||
"r.dhcp6_iaid "
|
|
||||||
"FROM hosts AS h "
|
|
||||||
"LEFT JOIN dhcp4_options AS o4 "
|
|
||||||
"ON h.host_id = o4.host_id "
|
|
||||||
"LEFT JOIN dhcp6_options AS o6 "
|
|
||||||
"ON h.host_id = o6.host_id "
|
|
||||||
"LEFT JOIN ipv6_reservations AS r "
|
|
||||||
"ON h.host_id = r.host_id "
|
|
||||||
"WHERE dhcp_identifier = ? AND dhcp_identifier_type = ? "
|
|
||||||
"ORDER BY h.host_id, o4.option_id, o6.option_id, r.reservation_id"},
|
|
||||||
|
|
||||||
// Retrieves host information along with the DHCPv4 options associated with
|
|
||||||
// it. Left joining the dhcp4_options table results in multiple rows being
|
|
||||||
// returned for the same host. The host is retrieved by IPv4 address.
|
|
||||||
{MySqlHostDataSource::GET_HOST_ADDR,
|
|
||||||
"SELECT DISTINCT h.host_id, h.dhcp_identifier, h.dhcp_identifier_type, "
|
|
||||||
"h.dhcp4_subnet_id, h.dhcp6_subnet_id, h.ipv4_address, h.hostname, "
|
|
||||||
"h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
|
||||||
"o.option_id, o.code, o.value, o.formatted_value, o.space, "
|
|
||||||
"o.persistent "
|
|
||||||
"FROM hosts AS h "
|
|
||||||
"LEFT JOIN dhcp4_options AS o "
|
|
||||||
"ON h.host_id = o.host_id "
|
|
||||||
"WHERE ipv4_address = ? "
|
|
||||||
"ORDER BY h.host_id, o.option_id"},
|
|
||||||
|
|
||||||
// Retrieves host information and DHCPv4 options using subnet identifier
|
|
||||||
// and client's identifier. Left joining the dhcp4_options table results in
|
|
||||||
// multiple rows being returned for the same host.
|
|
||||||
{MySqlHostDataSource::GET_HOST_SUBID4_DHCPID,
|
|
||||||
"SELECT DISTINCT h.host_id, h.dhcp_identifier, h.dhcp_identifier_type, "
|
|
||||||
"h.dhcp4_subnet_id, h.dhcp6_subnet_id, h.ipv4_address, h.hostname, "
|
|
||||||
"h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
|
||||||
"o.option_id, o.code, o.value, o.formatted_value, o.space, "
|
|
||||||
"o.persistent "
|
|
||||||
"FROM hosts AS h "
|
|
||||||
"LEFT JOIN dhcp4_options AS o "
|
|
||||||
"ON h.host_id = o.host_id "
|
|
||||||
"WHERE h.dhcp4_subnet_id = ? AND h.dhcp_identifier_type = ? "
|
|
||||||
" AND h.dhcp_identifier = ? "
|
|
||||||
"ORDER BY h.host_id, o.option_id"},
|
|
||||||
|
|
||||||
// Retrieves host information, IPv6 reservations and DHCPv6 options
|
|
||||||
// associated with a host. The number of rows returned is a multiplication
|
|
||||||
// of number of IPv6 reservations and DHCPv6 options.
|
|
||||||
{MySqlHostDataSource::GET_HOST_SUBID6_DHCPID,
|
|
||||||
"SELECT DISTINCT h.host_id, h.dhcp_identifier, "
|
|
||||||
"h.dhcp_identifier_type, h.dhcp4_subnet_id, "
|
|
||||||
"h.dhcp6_subnet_id, h.ipv4_address, h.hostname, "
|
|
||||||
"h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
|
||||||
"o.option_id, o.code, o.value, o.formatted_value, o.space, "
|
|
||||||
"o.persistent, "
|
|
||||||
"r.reservation_id, r.address, r.prefix_len, r.type, "
|
|
||||||
"r.dhcp6_iaid "
|
|
||||||
"FROM hosts AS h "
|
|
||||||
"LEFT JOIN dhcp6_options AS o "
|
|
||||||
"ON h.host_id = o.host_id "
|
|
||||||
"LEFT JOIN ipv6_reservations AS r "
|
|
||||||
"ON h.host_id = r.host_id "
|
|
||||||
"WHERE h.dhcp6_subnet_id = ? AND h.dhcp_identifier_type = ? "
|
|
||||||
"AND h.dhcp_identifier = ? "
|
|
||||||
"ORDER BY h.host_id, o.option_id, r.reservation_id"},
|
|
||||||
|
|
||||||
// Retrieves host information and DHCPv4 options for the host using subnet
|
|
||||||
// identifier and IPv4 reservation. Left joining the dhcp4_options table
|
|
||||||
// results in multiple rows being returned for the host. The number of
|
|
||||||
// rows depends on the number of options defined for the host.
|
|
||||||
{MySqlHostDataSource::GET_HOST_SUBID_ADDR,
|
|
||||||
"SELECT DISTINCT h.host_id, h.dhcp_identifier, h.dhcp_identifier_type, "
|
|
||||||
"h.dhcp4_subnet_id, h.dhcp6_subnet_id, h.ipv4_address, h.hostname, "
|
|
||||||
"h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
|
||||||
"o.option_id, o.code, o.value, o.formatted_value, o.space, "
|
|
||||||
"o.persistent "
|
|
||||||
"FROM hosts AS h "
|
|
||||||
"LEFT JOIN dhcp4_options AS o "
|
|
||||||
"ON h.host_id = o.host_id "
|
|
||||||
"WHERE h.dhcp4_subnet_id = ? AND h.ipv4_address = ? "
|
|
||||||
"ORDER BY h.host_id, o.option_id"},
|
|
||||||
|
|
||||||
// Retrieves host information, IPv6 reservations and DHCPv6 options
|
|
||||||
// associated with a host using prefix and prefix length. This query
|
|
||||||
// returns host information for a single host. However, multiple rows
|
|
||||||
// are returned due to left joining IPv6 reservations and DHCPv6 options.
|
|
||||||
// The number of rows returned is multiplication of number of existing
|
|
||||||
// IPv6 reservations and DHCPv6 options.
|
|
||||||
{MySqlHostDataSource::GET_HOST_PREFIX,
|
|
||||||
"SELECT DISTINCT h.host_id, h.dhcp_identifier, "
|
|
||||||
"h.dhcp_identifier_type, h.dhcp4_subnet_id, "
|
|
||||||
"h.dhcp6_subnet_id, h.ipv4_address, h.hostname, "
|
|
||||||
"h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
|
||||||
"o.option_id, o.code, o.value, o.formatted_value, o.space, "
|
|
||||||
"o.persistent, "
|
|
||||||
"r.reservation_id, r.address, r.prefix_len, r.type, "
|
|
||||||
"r.dhcp6_iaid "
|
|
||||||
"FROM hosts AS h "
|
|
||||||
"LEFT JOIN dhcp6_options AS o "
|
|
||||||
"ON h.host_id = o.host_id "
|
|
||||||
"LEFT JOIN ipv6_reservations AS r "
|
|
||||||
"ON h.host_id = r.host_id "
|
|
||||||
"WHERE h.host_id = "
|
|
||||||
"(SELECT host_id FROM ipv6_reservations "
|
|
||||||
"WHERE address = ? AND prefix_len = ?) "
|
|
||||||
"ORDER BY h.host_id, o.option_id, r.reservation_id"},
|
|
||||||
|
|
||||||
// Retrieves MySQL schema version.
|
|
||||||
{MySqlHostDataSource::GET_VERSION,
|
|
||||||
"SELECT version, minor FROM schema_version"},
|
|
||||||
|
|
||||||
// Marks the end of the statements table.
|
|
||||||
{MySqlHostDataSource::NUM_STATEMENTS, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @brief This class provides mechanisms for sending and retrieving
|
/// @brief This class provides mechanisms for sending and retrieving
|
||||||
/// information from the 'hosts' table.
|
/// information from the 'hosts' table.
|
||||||
///
|
///
|
||||||
@@ -1782,6 +1629,24 @@ namespace dhcp {
|
|||||||
class MySqlHostDataSourceImpl {
|
class MySqlHostDataSourceImpl {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/// @brief Statement Tags
|
||||||
|
///
|
||||||
|
/// The contents of the enum are indexes into the list of SQL statements
|
||||||
|
enum StatementIndex {
|
||||||
|
INSERT_HOST, // Insert new host to collection
|
||||||
|
INSERT_V6_RESRV, // Insert v6 reservation
|
||||||
|
INSERT_V4_OPTION, // Insert DHCPv4 option
|
||||||
|
INSERT_V6_OPTION, // Insert DHCPv6 option
|
||||||
|
GET_HOST_DHCPID, // Gets hosts by host identifier
|
||||||
|
GET_HOST_ADDR, // Gets hosts by IPv4 address
|
||||||
|
GET_HOST_SUBID4_DHCPID, // Gets host by IPv4 SubnetID, HW address/DUID
|
||||||
|
GET_HOST_SUBID6_DHCPID, // Gets host by IPv6 SubnetID, HW address/DUID
|
||||||
|
GET_HOST_SUBID_ADDR, // Gets host by IPv4 SubnetID and IPv4 address
|
||||||
|
GET_HOST_PREFIX, // Gets host by IPv6 prefix
|
||||||
|
GET_VERSION, // Obtain version number
|
||||||
|
NUM_STATEMENTS // Number of statements
|
||||||
|
};
|
||||||
|
|
||||||
/// @brief Constructor.
|
/// @brief Constructor.
|
||||||
///
|
///
|
||||||
/// This constructor opens database connection and initializes prepared
|
/// This constructor opens database connection and initializes prepared
|
||||||
@@ -1798,7 +1663,7 @@ public:
|
|||||||
/// query.
|
/// query.
|
||||||
///
|
///
|
||||||
/// @throw isc::dhcp::DuplicateEntry Database throws duplicate entry error
|
/// @throw isc::dhcp::DuplicateEntry Database throws duplicate entry error
|
||||||
void addStatement(MySqlHostDataSource::StatementIndex stindex,
|
void addStatement(MySqlHostDataSourceImpl::StatementIndex stindex,
|
||||||
std::vector<MYSQL_BIND>& bind);
|
std::vector<MYSQL_BIND>& bind);
|
||||||
|
|
||||||
/// @brief Inserts IPv6 Reservation into ipv6_reservation table.
|
/// @brief Inserts IPv6 Reservation into ipv6_reservation table.
|
||||||
@@ -1815,7 +1680,7 @@ public:
|
|||||||
/// @param opt_space Option space name.
|
/// @param opt_space Option space name.
|
||||||
/// @param subnet_id Subnet identifier.
|
/// @param subnet_id Subnet identifier.
|
||||||
/// @param host_id Host identifier.
|
/// @param host_id Host identifier.
|
||||||
void addOption(const MySqlHostDataSource::StatementIndex& stindex,
|
void addOption(const MySqlHostDataSourceImpl::StatementIndex& stindex,
|
||||||
const OptionDescriptor& opt_desc,
|
const OptionDescriptor& opt_desc,
|
||||||
const std::string& opt_space,
|
const std::string& opt_space,
|
||||||
const OptionalValue<SubnetID>& subnet_id,
|
const OptionalValue<SubnetID>& subnet_id,
|
||||||
@@ -1830,8 +1695,7 @@ public:
|
|||||||
/// host identifier will be assigned if the current host_id value is 0.
|
/// host identifier will be assigned if the current host_id value is 0.
|
||||||
/// The host identifier is retrieve from the database using the
|
/// The host identifier is retrieve from the database using the
|
||||||
/// mysql_insert_id function.
|
/// mysql_insert_id function.
|
||||||
void addOptions(const MySqlHostDataSource::StatementIndex& stindex,
|
void addOptions(const StatementIndex& stindex, const ConstCfgOptionPtr& options_cfg,
|
||||||
const ConstCfgOptionPtr& options_cfg,
|
|
||||||
uint64_t& host_id);
|
uint64_t& host_id);
|
||||||
|
|
||||||
/// @brief Check Error and Throw Exception
|
/// @brief Check Error and Throw Exception
|
||||||
@@ -1846,8 +1710,7 @@ public:
|
|||||||
///
|
///
|
||||||
/// @throw isc::dhcp::DbOperationError An operation on the open database
|
/// @throw isc::dhcp::DbOperationError An operation on the open database
|
||||||
/// has failed.
|
/// has failed.
|
||||||
void checkError(const int status,
|
void checkError(const int status, const StatementIndex index,
|
||||||
const MySqlHostDataSource::StatementIndex index,
|
|
||||||
const char* what) const;
|
const char* what) const;
|
||||||
|
|
||||||
/// @brief Creates collection of @ref Host objects with associated
|
/// @brief Creates collection of @ref Host objects with associated
|
||||||
@@ -1867,8 +1730,7 @@ public:
|
|||||||
/// @param [out] result Reference to the collection of hosts returned.
|
/// @param [out] result Reference to the collection of hosts returned.
|
||||||
/// @param single A boolean value indicating if a single host is
|
/// @param single A boolean value indicating if a single host is
|
||||||
/// expected to be returned, or multiple hosts.
|
/// expected to be returned, or multiple hosts.
|
||||||
void getHostCollection(MySqlHostDataSource::StatementIndex stindex,
|
void getHostCollection(StatementIndex stindex, MYSQL_BIND* bind,
|
||||||
MYSQL_BIND* bind,
|
|
||||||
boost::shared_ptr<MySqlHostExchange> exchange,
|
boost::shared_ptr<MySqlHostExchange> exchange,
|
||||||
ConstHostCollection& result, bool single) const;
|
ConstHostCollection& result, bool single) const;
|
||||||
|
|
||||||
@@ -1892,7 +1754,7 @@ public:
|
|||||||
const Host::IdentifierType& identifier_type,
|
const Host::IdentifierType& identifier_type,
|
||||||
const uint8_t* identifier_begin,
|
const uint8_t* identifier_begin,
|
||||||
const size_t identifier_len,
|
const size_t identifier_len,
|
||||||
MySqlHostDataSource::StatementIndex stindex,
|
StatementIndex stindex,
|
||||||
boost::shared_ptr<MySqlHostExchange> exchange) const;
|
boost::shared_ptr<MySqlHostExchange> exchange) const;
|
||||||
|
|
||||||
/// @brief Pointer to the object representing an exchange which
|
/// @brief Pointer to the object representing an exchange which
|
||||||
@@ -1922,6 +1784,159 @@ public:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// @brief Prepared MySQL statements used by the backend to insert and
|
||||||
|
/// retrieve hosts from the database.
|
||||||
|
TaggedStatement tagged_statements[] = {
|
||||||
|
// Inserts a host into the 'hosts' table.
|
||||||
|
{MySqlHostDataSourceImpl::INSERT_HOST,
|
||||||
|
"INSERT INTO hosts(host_id, dhcp_identifier, dhcp_identifier_type, "
|
||||||
|
"dhcp4_subnet_id, dhcp6_subnet_id, ipv4_address, hostname, "
|
||||||
|
"dhcp4_client_classes, dhcp6_client_classes) "
|
||||||
|
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"},
|
||||||
|
|
||||||
|
// Inserts a single IPv6 reservation into 'reservations' table.
|
||||||
|
{MySqlHostDataSourceImpl::INSERT_V6_RESRV,
|
||||||
|
"INSERT INTO ipv6_reservations(address, prefix_len, type, "
|
||||||
|
"dhcp6_iaid, host_id) "
|
||||||
|
"VALUES (?,?,?,?,?)"},
|
||||||
|
|
||||||
|
// Inserts a single DHCPv4 option into 'dhcp4_options' table.
|
||||||
|
{MySqlHostDataSourceImpl::INSERT_V4_OPTION,
|
||||||
|
"INSERT INTO dhcp4_options(option_id, code, value, formatted_value, space, "
|
||||||
|
"persistent, dhcp_client_class, dhcp4_subnet_id, host_id) "
|
||||||
|
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"},
|
||||||
|
|
||||||
|
// Inserts a single DHCPv6 option into 'dhcp6_options' table.
|
||||||
|
{MySqlHostDataSourceImpl::INSERT_V6_OPTION,
|
||||||
|
"INSERT INTO dhcp6_options(option_id, code, value, formatted_value, space, "
|
||||||
|
"persistent, dhcp_client_class, dhcp6_subnet_id, host_id) "
|
||||||
|
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"},
|
||||||
|
|
||||||
|
// Retrieves host information, IPv6 reservations and both DHCPv4 and
|
||||||
|
// DHCPv6 options associated with the host. The LEFT JOIN clause is used
|
||||||
|
// to retrieve information from 4 different tables using a single query.
|
||||||
|
// Hence, this query returns multiple rows for a single host.
|
||||||
|
{MySqlHostDataSourceImpl::GET_HOST_DHCPID,
|
||||||
|
"SELECT h.host_id, h.dhcp_identifier, h.dhcp_identifier_type, "
|
||||||
|
"h.dhcp4_subnet_id, h.dhcp6_subnet_id, h.ipv4_address, "
|
||||||
|
"h.hostname, h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
||||||
|
"o4.option_id, o4.code, o4.value, o4.formatted_value, o4.space, "
|
||||||
|
"o4.persistent, "
|
||||||
|
"o6.option_id, o6.code, o6.value, o6.formatted_value, o6.space, "
|
||||||
|
"o6.persistent, "
|
||||||
|
"r.reservation_id, r.address, r.prefix_len, r.type, "
|
||||||
|
"r.dhcp6_iaid "
|
||||||
|
"FROM hosts AS h "
|
||||||
|
"LEFT JOIN dhcp4_options AS o4 "
|
||||||
|
"ON h.host_id = o4.host_id "
|
||||||
|
"LEFT JOIN dhcp6_options AS o6 "
|
||||||
|
"ON h.host_id = o6.host_id "
|
||||||
|
"LEFT JOIN ipv6_reservations AS r "
|
||||||
|
"ON h.host_id = r.host_id "
|
||||||
|
"WHERE dhcp_identifier = ? AND dhcp_identifier_type = ? "
|
||||||
|
"ORDER BY h.host_id, o4.option_id, o6.option_id, r.reservation_id"},
|
||||||
|
|
||||||
|
// Retrieves host information along with the DHCPv4 options associated with
|
||||||
|
// it. Left joining the dhcp4_options table results in multiple rows being
|
||||||
|
// returned for the same host. The host is retrieved by IPv4 address.
|
||||||
|
{MySqlHostDataSourceImpl::GET_HOST_ADDR,
|
||||||
|
"SELECT h.host_id, h.dhcp_identifier, h.dhcp_identifier_type, "
|
||||||
|
"h.dhcp4_subnet_id, h.dhcp6_subnet_id, h.ipv4_address, h.hostname, "
|
||||||
|
"h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
||||||
|
"o.option_id, o.code, o.value, o.formatted_value, o.space, "
|
||||||
|
"o.persistent "
|
||||||
|
"FROM hosts AS h "
|
||||||
|
"LEFT JOIN dhcp4_options AS o "
|
||||||
|
"ON h.host_id = o.host_id "
|
||||||
|
"WHERE ipv4_address = ? "
|
||||||
|
"ORDER BY h.host_id, o.option_id"},
|
||||||
|
|
||||||
|
// Retrieves host information and DHCPv4 options using subnet identifier
|
||||||
|
// and client's identifier. Left joining the dhcp4_options table results in
|
||||||
|
// multiple rows being returned for the same host.
|
||||||
|
{MySqlHostDataSourceImpl::GET_HOST_SUBID4_DHCPID,
|
||||||
|
"SELECT h.host_id, h.dhcp_identifier, h.dhcp_identifier_type, "
|
||||||
|
"h.dhcp4_subnet_id, h.dhcp6_subnet_id, h.ipv4_address, h.hostname, "
|
||||||
|
"h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
||||||
|
"o.option_id, o.code, o.value, o.formatted_value, o.space, "
|
||||||
|
"o.persistent "
|
||||||
|
"FROM hosts AS h "
|
||||||
|
"LEFT JOIN dhcp4_options AS o "
|
||||||
|
"ON h.host_id = o.host_id "
|
||||||
|
"WHERE h.dhcp4_subnet_id = ? AND h.dhcp_identifier_type = ? "
|
||||||
|
" AND h.dhcp_identifier = ? "
|
||||||
|
"ORDER BY h.host_id, o.option_id"},
|
||||||
|
|
||||||
|
// Retrieves host information, IPv6 reservations and DHCPv6 options
|
||||||
|
// associated with a host. The number of rows returned is a multiplication
|
||||||
|
// of number of IPv6 reservations and DHCPv6 options.
|
||||||
|
{MySqlHostDataSourceImpl::GET_HOST_SUBID6_DHCPID,
|
||||||
|
"SELECT h.host_id, h.dhcp_identifier, "
|
||||||
|
"h.dhcp_identifier_type, h.dhcp4_subnet_id, "
|
||||||
|
"h.dhcp6_subnet_id, h.ipv4_address, h.hostname, "
|
||||||
|
"h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
||||||
|
"o.option_id, o.code, o.value, o.formatted_value, o.space, "
|
||||||
|
"o.persistent, "
|
||||||
|
"r.reservation_id, r.address, r.prefix_len, r.type, "
|
||||||
|
"r.dhcp6_iaid "
|
||||||
|
"FROM hosts AS h "
|
||||||
|
"LEFT JOIN dhcp6_options AS o "
|
||||||
|
"ON h.host_id = o.host_id "
|
||||||
|
"LEFT JOIN ipv6_reservations AS r "
|
||||||
|
"ON h.host_id = r.host_id "
|
||||||
|
"WHERE h.dhcp6_subnet_id = ? AND h.dhcp_identifier_type = ? "
|
||||||
|
"AND h.dhcp_identifier = ? "
|
||||||
|
"ORDER BY h.host_id, o.option_id, r.reservation_id"},
|
||||||
|
|
||||||
|
// Retrieves host information and DHCPv4 options for the host using subnet
|
||||||
|
// identifier and IPv4 reservation. Left joining the dhcp4_options table
|
||||||
|
// results in multiple rows being returned for the host. The number of
|
||||||
|
// rows depends on the number of options defined for the host.
|
||||||
|
{MySqlHostDataSourceImpl::GET_HOST_SUBID_ADDR,
|
||||||
|
"SELECT h.host_id, h.dhcp_identifier, h.dhcp_identifier_type, "
|
||||||
|
"h.dhcp4_subnet_id, h.dhcp6_subnet_id, h.ipv4_address, h.hostname, "
|
||||||
|
"h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
||||||
|
"o.option_id, o.code, o.value, o.formatted_value, o.space, "
|
||||||
|
"o.persistent "
|
||||||
|
"FROM hosts AS h "
|
||||||
|
"LEFT JOIN dhcp4_options AS o "
|
||||||
|
"ON h.host_id = o.host_id "
|
||||||
|
"WHERE h.dhcp4_subnet_id = ? AND h.ipv4_address = ? "
|
||||||
|
"ORDER BY h.host_id, o.option_id"},
|
||||||
|
|
||||||
|
// Retrieves host information, IPv6 reservations and DHCPv6 options
|
||||||
|
// associated with a host using prefix and prefix length. This query
|
||||||
|
// returns host information for a single host. However, multiple rows
|
||||||
|
// are returned due to left joining IPv6 reservations and DHCPv6 options.
|
||||||
|
// The number of rows returned is multiplication of number of existing
|
||||||
|
// IPv6 reservations and DHCPv6 options.
|
||||||
|
{MySqlHostDataSourceImpl::GET_HOST_PREFIX,
|
||||||
|
"SELECT h.host_id, h.dhcp_identifier, "
|
||||||
|
"h.dhcp_identifier_type, h.dhcp4_subnet_id, "
|
||||||
|
"h.dhcp6_subnet_id, h.ipv4_address, h.hostname, "
|
||||||
|
"h.dhcp4_client_classes, h.dhcp6_client_classes, "
|
||||||
|
"o.option_id, o.code, o.value, o.formatted_value, o.space, "
|
||||||
|
"o.persistent, "
|
||||||
|
"r.reservation_id, r.address, r.prefix_len, r.type, "
|
||||||
|
"r.dhcp6_iaid "
|
||||||
|
"FROM hosts AS h "
|
||||||
|
"LEFT JOIN dhcp6_options AS o "
|
||||||
|
"ON h.host_id = o.host_id "
|
||||||
|
"LEFT JOIN ipv6_reservations AS r "
|
||||||
|
"ON h.host_id = r.host_id "
|
||||||
|
"WHERE h.host_id = "
|
||||||
|
"(SELECT host_id FROM ipv6_reservations "
|
||||||
|
"WHERE address = ? AND prefix_len = ?) "
|
||||||
|
"ORDER BY h.host_id, o.option_id, r.reservation_id"},
|
||||||
|
|
||||||
|
// Retrieves MySQL schema version.
|
||||||
|
{MySqlHostDataSourceImpl::GET_VERSION,
|
||||||
|
"SELECT version, minor FROM schema_version"},
|
||||||
|
|
||||||
|
// Marks the end of the statements table.
|
||||||
|
{MySqlHostDataSourceImpl::NUM_STATEMENTS, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
MySqlHostDataSourceImpl::
|
MySqlHostDataSourceImpl::
|
||||||
MySqlHostDataSourceImpl(const MySqlConnection::ParameterMap& parameters)
|
MySqlHostDataSourceImpl(const MySqlConnection::ParameterMap& parameters)
|
||||||
: host_exchange_(new MySqlHostWithOptionsExchange(MySqlHostWithOptionsExchange::DHCP4_ONLY)),
|
: host_exchange_(new MySqlHostWithOptionsExchange(MySqlHostWithOptionsExchange::DHCP4_ONLY)),
|
||||||
@@ -1946,8 +1961,7 @@ MySqlHostDataSourceImpl(const MySqlConnection::ParameterMap& parameters)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Prepare all statements likely to be used.
|
// Prepare all statements likely to be used.
|
||||||
conn_.prepareStatements(tagged_statements,
|
conn_.prepareStatements(tagged_statements, NUM_STATEMENTS);
|
||||||
MySqlHostDataSource::NUM_STATEMENTS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MySqlHostDataSourceImpl::~MySqlHostDataSourceImpl() {
|
MySqlHostDataSourceImpl::~MySqlHostDataSourceImpl() {
|
||||||
@@ -1966,7 +1980,7 @@ MySqlHostDataSourceImpl::~MySqlHostDataSourceImpl() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MySqlHostDataSourceImpl::addStatement(MySqlHostDataSource::StatementIndex stindex,
|
MySqlHostDataSourceImpl::addStatement(StatementIndex stindex,
|
||||||
std::vector<MYSQL_BIND>& bind) {
|
std::vector<MYSQL_BIND>& bind) {
|
||||||
|
|
||||||
// Bind the parameters to the statement
|
// Bind the parameters to the statement
|
||||||
@@ -1991,11 +2005,11 @@ MySqlHostDataSourceImpl::addResv(const IPv6Resrv& resv,
|
|||||||
std::vector<MYSQL_BIND> bind =
|
std::vector<MYSQL_BIND> bind =
|
||||||
host_ipv6_reservation_exchange_->createBindForSend(resv, id);
|
host_ipv6_reservation_exchange_->createBindForSend(resv, id);
|
||||||
|
|
||||||
addStatement(MySqlHostDataSource::INSERT_V6_RESRV, bind);
|
addStatement(INSERT_V6_RESRV, bind);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MySqlHostDataSourceImpl::addOption(const MySqlHostDataSource::StatementIndex& stindex,
|
MySqlHostDataSourceImpl::addOption(const StatementIndex& stindex,
|
||||||
const OptionDescriptor& opt_desc,
|
const OptionDescriptor& opt_desc,
|
||||||
const std::string& opt_space,
|
const std::string& opt_space,
|
||||||
const OptionalValue<SubnetID>& subnet_id,
|
const OptionalValue<SubnetID>& subnet_id,
|
||||||
@@ -2008,7 +2022,7 @@ MySqlHostDataSourceImpl::addOption(const MySqlHostDataSource::StatementIndex& st
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MySqlHostDataSourceImpl::addOptions(const MySqlHostDataSource::StatementIndex& stindex,
|
MySqlHostDataSourceImpl::addOptions(const StatementIndex& stindex,
|
||||||
const ConstCfgOptionPtr& options_cfg,
|
const ConstCfgOptionPtr& options_cfg,
|
||||||
uint64_t& host_id) {
|
uint64_t& host_id) {
|
||||||
// Get option space names and vendor space names and combine them within a
|
// Get option space names and vendor space names and combine them within a
|
||||||
@@ -2041,7 +2055,7 @@ MySqlHostDataSourceImpl::addOptions(const MySqlHostDataSource::StatementIndex& s
|
|||||||
|
|
||||||
void
|
void
|
||||||
MySqlHostDataSourceImpl::
|
MySqlHostDataSourceImpl::
|
||||||
checkError(const int status, const MySqlHostDataSource::StatementIndex index,
|
checkError(const int status, const StatementIndex index,
|
||||||
const char* what) const {
|
const char* what) const {
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
isc_throw(DbOperationError, what << " for <"
|
isc_throw(DbOperationError, what << " for <"
|
||||||
@@ -2053,8 +2067,8 @@ checkError(const int status, const MySqlHostDataSource::StatementIndex index,
|
|||||||
|
|
||||||
void
|
void
|
||||||
MySqlHostDataSourceImpl::
|
MySqlHostDataSourceImpl::
|
||||||
getHostCollection(MySqlHostDataSource::StatementIndex stindex,
|
getHostCollection(StatementIndex stindex, MYSQL_BIND* bind,
|
||||||
MYSQL_BIND* bind, boost::shared_ptr<MySqlHostExchange> exchange,
|
boost::shared_ptr<MySqlHostExchange> exchange,
|
||||||
ConstHostCollection& result, bool single) const {
|
ConstHostCollection& result, bool single) const {
|
||||||
|
|
||||||
// Bind the selection parameters to the statement
|
// Bind the selection parameters to the statement
|
||||||
@@ -2119,7 +2133,7 @@ getHost(const SubnetID& subnet_id,
|
|||||||
const Host::IdentifierType& identifier_type,
|
const Host::IdentifierType& identifier_type,
|
||||||
const uint8_t* identifier_begin,
|
const uint8_t* identifier_begin,
|
||||||
const size_t identifier_len,
|
const size_t identifier_len,
|
||||||
MySqlHostDataSource::StatementIndex stindex,
|
StatementIndex stindex,
|
||||||
boost::shared_ptr<MySqlHostExchange> exchange) const {
|
boost::shared_ptr<MySqlHostExchange> exchange) const {
|
||||||
|
|
||||||
// Set up the WHERE clause value
|
// Set up the WHERE clause value
|
||||||
@@ -2179,7 +2193,7 @@ MySqlHostDataSource::add(const HostPtr& host) {
|
|||||||
std::vector<MYSQL_BIND> bind = impl_->host_exchange_->createBindForSend(host);
|
std::vector<MYSQL_BIND> bind = impl_->host_exchange_->createBindForSend(host);
|
||||||
|
|
||||||
// ... and insert the host.
|
// ... and insert the host.
|
||||||
impl_->addStatement(INSERT_HOST, bind);
|
impl_->addStatement(MySqlHostDataSourceImpl::INSERT_HOST, bind);
|
||||||
|
|
||||||
// Gets the last inserted hosts id
|
// Gets the last inserted hosts id
|
||||||
uint64_t host_id = 0;
|
uint64_t host_id = 0;
|
||||||
@@ -2187,13 +2201,15 @@ MySqlHostDataSource::add(const HostPtr& host) {
|
|||||||
// Insert DHCPv4 options.
|
// Insert DHCPv4 options.
|
||||||
ConstCfgOptionPtr cfg_option4 = host->getCfgOption4();
|
ConstCfgOptionPtr cfg_option4 = host->getCfgOption4();
|
||||||
if (cfg_option4) {
|
if (cfg_option4) {
|
||||||
impl_->addOptions(INSERT_V4_OPTION, cfg_option4, host_id);
|
impl_->addOptions(MySqlHostDataSourceImpl::INSERT_V4_OPTION,
|
||||||
|
cfg_option4, host_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert DHCPv6 options.
|
// Insert DHCPv6 options.
|
||||||
ConstCfgOptionPtr cfg_option6 = host->getCfgOption6();
|
ConstCfgOptionPtr cfg_option6 = host->getCfgOption6();
|
||||||
if (cfg_option6) {
|
if (cfg_option6) {
|
||||||
impl_->addOptions(INSERT_V6_OPTION, cfg_option6, host_id);
|
impl_->addOptions(MySqlHostDataSourceImpl::INSERT_V6_OPTION,
|
||||||
|
cfg_option6, host_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert IPv6 reservations.
|
// Insert IPv6 reservations.
|
||||||
@@ -2254,7 +2270,7 @@ MySqlHostDataSource::getAll(const Host::IdentifierType& identifier_type,
|
|||||||
inbind[0].length = &length;
|
inbind[0].length = &length;
|
||||||
|
|
||||||
ConstHostCollection result;
|
ConstHostCollection result;
|
||||||
impl_->getHostCollection(GET_HOST_DHCPID, inbind,
|
impl_->getHostCollection(MySqlHostDataSourceImpl::GET_HOST_DHCPID, inbind,
|
||||||
impl_->host_ipv46_exchange_,
|
impl_->host_ipv46_exchange_,
|
||||||
result, false);
|
result, false);
|
||||||
return (result);
|
return (result);
|
||||||
@@ -2273,8 +2289,8 @@ MySqlHostDataSource::getAll4(const asiolink::IOAddress& address) const {
|
|||||||
inbind[0].is_unsigned = MLM_TRUE;
|
inbind[0].is_unsigned = MLM_TRUE;
|
||||||
|
|
||||||
ConstHostCollection result;
|
ConstHostCollection result;
|
||||||
impl_->getHostCollection(GET_HOST_ADDR, inbind, impl_->host_exchange_,
|
impl_->getHostCollection(MySqlHostDataSourceImpl::GET_HOST_ADDR, inbind,
|
||||||
result, false);
|
impl_->host_exchange_, result, false);
|
||||||
|
|
||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
@@ -2313,7 +2329,7 @@ MySqlHostDataSource::get4(const SubnetID& subnet_id,
|
|||||||
const size_t identifier_len) const {
|
const size_t identifier_len) const {
|
||||||
|
|
||||||
return (impl_->getHost(subnet_id, identifier_type, identifier_begin,
|
return (impl_->getHost(subnet_id, identifier_type, identifier_begin,
|
||||||
identifier_len, GET_HOST_SUBID4_DHCPID,
|
identifier_len, MySqlHostDataSourceImpl::GET_HOST_SUBID4_DHCPID,
|
||||||
impl_->host_exchange_));
|
impl_->host_exchange_));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2335,8 +2351,8 @@ MySqlHostDataSource::get4(const SubnetID& subnet_id,
|
|||||||
inbind[1].is_unsigned = MLM_TRUE;
|
inbind[1].is_unsigned = MLM_TRUE;
|
||||||
|
|
||||||
ConstHostCollection collection;
|
ConstHostCollection collection;
|
||||||
impl_->getHostCollection(GET_HOST_SUBID_ADDR, inbind, impl_->host_exchange_,
|
impl_->getHostCollection(MySqlHostDataSourceImpl::GET_HOST_SUBID_ADDR,
|
||||||
collection, true);
|
inbind, impl_->host_exchange_, collection, true);
|
||||||
|
|
||||||
// Return single record if present, else clear the host.
|
// Return single record if present, else clear the host.
|
||||||
ConstHostPtr result;
|
ConstHostPtr result;
|
||||||
@@ -2379,7 +2395,7 @@ MySqlHostDataSource::get6(const SubnetID& subnet_id,
|
|||||||
const size_t identifier_len) const {
|
const size_t identifier_len) const {
|
||||||
|
|
||||||
return (impl_->getHost(subnet_id, identifier_type, identifier_begin,
|
return (impl_->getHost(subnet_id, identifier_type, identifier_begin,
|
||||||
identifier_len, GET_HOST_SUBID6_DHCPID,
|
identifier_len, MySqlHostDataSourceImpl::GET_HOST_SUBID6_DHCPID,
|
||||||
impl_->host_ipv6_exchange_));
|
impl_->host_ipv6_exchange_));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2408,8 +2424,8 @@ MySqlHostDataSource::get6(const asiolink::IOAddress& prefix,
|
|||||||
|
|
||||||
|
|
||||||
ConstHostCollection collection;
|
ConstHostCollection collection;
|
||||||
impl_->getHostCollection(GET_HOST_PREFIX, inbind,
|
impl_->getHostCollection(MySqlHostDataSourceImpl::GET_HOST_PREFIX,
|
||||||
impl_->host_ipv6_exchange_,
|
inbind, impl_->host_ipv6_exchange_,
|
||||||
collection, true);
|
collection, true);
|
||||||
|
|
||||||
// Return single record if present, else clear the host.
|
// Return single record if present, else clear the host.
|
||||||
@@ -2439,7 +2455,8 @@ std::string MySqlHostDataSource::getDescription() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::pair<uint32_t, uint32_t> MySqlHostDataSource::getVersion() const {
|
std::pair<uint32_t, uint32_t> MySqlHostDataSource::getVersion() const {
|
||||||
const StatementIndex stindex = GET_VERSION;
|
const MySqlHostDataSourceImpl::StatementIndex stindex =
|
||||||
|
MySqlHostDataSourceImpl::GET_VERSION;
|
||||||
|
|
||||||
LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL,
|
LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL,
|
||||||
DHCPSRV_MYSQL_HOST_DB_GET_VERSION);
|
DHCPSRV_MYSQL_HOST_DB_GET_VERSION);
|
||||||
|
@@ -251,24 +251,6 @@ public:
|
|||||||
/// Rolls back all pending database operations.
|
/// Rolls back all pending database operations.
|
||||||
virtual void rollback();
|
virtual void rollback();
|
||||||
|
|
||||||
/// @brief Statement Tags
|
|
||||||
///
|
|
||||||
/// The contents of the enum are indexes into the list of SQL statements
|
|
||||||
enum StatementIndex {
|
|
||||||
INSERT_HOST, // Insert new host to collection
|
|
||||||
INSERT_V6_RESRV, // Insert v6 reservation
|
|
||||||
INSERT_V4_OPTION, // Insert DHCPv4 option
|
|
||||||
INSERT_V6_OPTION, // Insert DHCPv6 option
|
|
||||||
GET_HOST_DHCPID, // Gets hosts by host identifier
|
|
||||||
GET_HOST_ADDR, // Gets hosts by IPv4 address
|
|
||||||
GET_HOST_SUBID4_DHCPID, // Gets host by IPv4 SubnetID, HW address/DUID
|
|
||||||
GET_HOST_SUBID6_DHCPID, // Gets host by IPv6 SubnetID, HW address/DUID
|
|
||||||
GET_HOST_SUBID_ADDR, // Gets host by IPv4 SubnetID and IPv4 address
|
|
||||||
GET_HOST_PREFIX, // Gets host by IPv6 prefix
|
|
||||||
GET_VERSION, // Obtain version number
|
|
||||||
NUM_STATEMENTS // Number of statements
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/// @brief Pointer to the implementation of the @ref MySqlHostDataSource.
|
/// @brief Pointer to the implementation of the @ref MySqlHostDataSource.
|
||||||
|
Reference in New Issue
Block a user