mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-09-02 15:05:16 +00:00
[#2445] implement PostgreSQL lease manager methods for limit checking
This commit is contained in:
@@ -3135,6 +3135,28 @@ MySqlLeaseMgr::checkLimits6(ConstElementPtr const& user_context) const {
|
|||||||
return checkLimits(user_context, CHECK_LEASE6_LIMITS);
|
return checkLimits(user_context, CHECK_LEASE6_LIMITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
MySqlLeaseMgr::isJsonSupported() const {
|
||||||
|
// Get a context.
|
||||||
|
MySqlLeaseContextAlloc get_context(*this);
|
||||||
|
MySqlLeaseContextPtr ctx = get_context.ctx_;
|
||||||
|
|
||||||
|
// Create bindings.
|
||||||
|
MySqlBindingCollection in_bindings;
|
||||||
|
MySqlBindingCollection out_bindings({
|
||||||
|
MySqlBinding::createBool()
|
||||||
|
});
|
||||||
|
|
||||||
|
// Execute the select.
|
||||||
|
bool json_supported(false);
|
||||||
|
ctx->conn_.selectQuery(IS_JSON_SUPPORTED, in_bindings, out_bindings,
|
||||||
|
[&json_supported] (MySqlBindingCollection const& result) {
|
||||||
|
json_supported = result[0]->getBool();
|
||||||
|
});
|
||||||
|
|
||||||
|
return json_supported;
|
||||||
|
}
|
||||||
|
|
||||||
LeaseStatsQueryPtr
|
LeaseStatsQueryPtr
|
||||||
MySqlLeaseMgr::startLeaseStatsQuery4() {
|
MySqlLeaseMgr::startLeaseStatsQuery4() {
|
||||||
// Get a context
|
// Get a context
|
||||||
@@ -3231,28 +3253,6 @@ MySqlLeaseMgr::wipeLeases6(const SubnetID& /*subnet_id*/) {
|
|||||||
isc_throw(NotImplemented, "wipeLeases6 is not implemented for MySQL backend");
|
isc_throw(NotImplemented, "wipeLeases6 is not implemented for MySQL backend");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
MySqlLeaseMgr::isJsonSupported() const {
|
|
||||||
// Get a context.
|
|
||||||
MySqlLeaseContextAlloc get_context(*this);
|
|
||||||
MySqlLeaseContextPtr ctx = get_context.ctx_;
|
|
||||||
|
|
||||||
// Create bindings.
|
|
||||||
MySqlBindingCollection in_bindings;
|
|
||||||
MySqlBindingCollection out_bindings({
|
|
||||||
MySqlBinding::createBool()
|
|
||||||
});
|
|
||||||
|
|
||||||
// Execute the select.
|
|
||||||
bool json_supported(false);
|
|
||||||
ctx->conn_.selectQuery(IS_JSON_SUPPORTED, in_bindings, out_bindings,
|
|
||||||
[&json_supported] (MySqlBindingCollection const& result) {
|
|
||||||
json_supported = result[0]->getBool();
|
|
||||||
});
|
|
||||||
|
|
||||||
return json_supported;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Miscellaneous database methods.
|
// Miscellaneous database methods.
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
|
@@ -638,12 +638,6 @@ public:
|
|||||||
/// @return number of leases removed.
|
/// @return number of leases removed.
|
||||||
virtual size_t wipeLeases6(const SubnetID& subnet_id) override;
|
virtual size_t wipeLeases6(const SubnetID& subnet_id) override;
|
||||||
|
|
||||||
/// @brief Checks if JSON support is enabled in the database.
|
|
||||||
/// MySQL implementation.
|
|
||||||
///
|
|
||||||
/// @return true if there is JSON support, false otherwise
|
|
||||||
virtual bool isJsonSupported() const override;
|
|
||||||
|
|
||||||
/// @brief Return backend type
|
/// @brief Return backend type
|
||||||
///
|
///
|
||||||
/// Returns the type of the backend (e.g. "mysql", "memfile" etc.)
|
/// Returns the type of the backend (e.g. "mysql", "memfile" etc.)
|
||||||
@@ -976,6 +970,12 @@ private:
|
|||||||
virtual std::string
|
virtual std::string
|
||||||
checkLimits6(isc::data::ConstElementPtr const& user_context) const override;
|
checkLimits6(isc::data::ConstElementPtr const& user_context) const override;
|
||||||
|
|
||||||
|
/// @brief Checks if JSON support is enabled in the database.
|
||||||
|
/// MySQL implementation.
|
||||||
|
///
|
||||||
|
/// @return true if there is JSON support, false otherwise
|
||||||
|
bool isJsonSupported() const override;
|
||||||
|
|
||||||
/// @brief Check Error and Throw Exception
|
/// @brief Check Error and Throw Exception
|
||||||
///
|
///
|
||||||
/// This method invokes @ref MySqlConnection::checkError.
|
/// This method invokes @ref MySqlConnection::checkError.
|
||||||
|
@@ -359,17 +359,20 @@ PgSqlTaggedStatement tagged_statements[] = {
|
|||||||
" WHERE subnet_id >= $1 and subnet_id <= $2 "
|
" WHERE subnet_id >= $1 and subnet_id <= $2 "
|
||||||
" ORDER BY subnet_id, lease_type, state" },
|
" ORDER BY subnet_id, lease_type, state" },
|
||||||
|
|
||||||
// TODO: remove single quotes from the following two SELECTs when the functions are implemented
|
|
||||||
|
|
||||||
// CHECK_LEASE4_LIMITS
|
// CHECK_LEASE4_LIMITS
|
||||||
{ 1, { OID_TEXT },
|
{ 1, { OID_TEXT },
|
||||||
"check_lease4_limits",
|
"check_lease4_limits",
|
||||||
"SELECT 'checkLease4Limits($1)'" },
|
"SELECT checkLease4Limits($1)" },
|
||||||
|
|
||||||
// CHECK_LEASE6_LIMITS
|
// CHECK_LEASE6_LIMITS
|
||||||
{ 1, { OID_TEXT },
|
{ 1, { OID_TEXT },
|
||||||
"check_lease6_limits",
|
"check_lease6_limits",
|
||||||
"SELECT 'checkLease6Limits($1)'" },
|
"SELECT checkLease6Limits($1)" },
|
||||||
|
|
||||||
|
// IS_JSON_SUPPORTED
|
||||||
|
{ 0, { OID_NONE },
|
||||||
|
"is_json_supported",
|
||||||
|
"SELECT isJsonSupported()" },
|
||||||
|
|
||||||
// End of list sentinel
|
// End of list sentinel
|
||||||
{ 0, { 0 }, NULL, NULL}
|
{ 0, { 0 }, NULL, NULL}
|
||||||
@@ -2290,31 +2293,29 @@ PgSqlLeaseMgr::deleteExpiredReclaimedLeasesCommon(const uint32_t secs,
|
|||||||
|
|
||||||
string
|
string
|
||||||
PgSqlLeaseMgr::checkLimits(ConstElementPtr const& user_context, StatementIndex const stindex) const {
|
PgSqlLeaseMgr::checkLimits(ConstElementPtr const& user_context, StatementIndex const stindex) const {
|
||||||
// Bindings
|
// No user context means no limits means allocation allowed means empty string.
|
||||||
PsqlBindArray bind_array;
|
if (!user_context) {
|
||||||
std::string const user_context_str(user_context->str());
|
return string();
|
||||||
bind_array.add(user_context_str);
|
}
|
||||||
|
|
||||||
// Get a context.
|
// Get a context.
|
||||||
PgSqlLeaseContextAlloc get_context(*this);
|
PgSqlLeaseContextAlloc get_context(*this);
|
||||||
PgSqlLeaseContextPtr ctx(get_context.ctx_);
|
PgSqlLeaseContextPtr ctx(get_context.ctx_);
|
||||||
|
|
||||||
|
// Create bindings.
|
||||||
|
PsqlBindArray bind_array;
|
||||||
|
std::string const user_context_str(user_context->str());
|
||||||
|
bind_array.add(user_context_str);
|
||||||
|
|
||||||
|
// Execute the select.
|
||||||
PgSqlResult r(PQexecPrepared(ctx->conn_,
|
PgSqlResult r(PQexecPrepared(ctx->conn_,
|
||||||
tagged_statements[stindex].name,
|
tagged_statements[stindex].name,
|
||||||
tagged_statements[stindex].nbparams,
|
tagged_statements[stindex].nbparams,
|
||||||
&bind_array.values_[0],
|
&bind_array.values_[0],
|
||||||
&bind_array.lengths_[0],
|
&bind_array.lengths_[0],
|
||||||
&bind_array.formats_[0], 0));
|
&bind_array.formats_[0], 0));
|
||||||
|
|
||||||
ctx->conn_.checkStatementError(r, tagged_statements[stindex]);
|
ctx->conn_.checkStatementError(r, tagged_statements[stindex]);
|
||||||
|
|
||||||
int rows = PQntuples(r);
|
|
||||||
if (rows > 1) {
|
|
||||||
isc_throw(MultipleRecords, "multiple records were found in the "
|
|
||||||
"database where only one was expected for query "
|
|
||||||
<< tagged_statements[stindex].name);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string const limits(PgSqlExchange::getRawColumnValue(r, 0, 0));
|
std::string const limits(PgSqlExchange::getRawColumnValue(r, 0, 0));
|
||||||
return limits;
|
return limits;
|
||||||
}
|
}
|
||||||
@@ -2329,6 +2330,22 @@ PgSqlLeaseMgr::checkLimits6(ConstElementPtr const& user_context) const {
|
|||||||
return checkLimits(user_context, CHECK_LEASE6_LIMITS);
|
return checkLimits(user_context, CHECK_LEASE6_LIMITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
PgSqlLeaseMgr::isJsonSupported() const {
|
||||||
|
// Get a context.
|
||||||
|
PgSqlLeaseContextAlloc get_context(*this);
|
||||||
|
PgSqlLeaseContextPtr ctx(get_context.ctx_);
|
||||||
|
|
||||||
|
// Execute the select.
|
||||||
|
StatementIndex const stindex(IS_JSON_SUPPORTED);
|
||||||
|
PgSqlResult r(PQexecPrepared(ctx->conn_, tagged_statements[stindex].name,
|
||||||
|
0, 0, 0, 0, 0));
|
||||||
|
ctx->conn_.checkStatementError(r, tagged_statements[stindex]);
|
||||||
|
|
||||||
|
bool const json_supported(PgSqlExchange::getRawColumnValue(r, 0, 0));
|
||||||
|
return json_supported;
|
||||||
|
}
|
||||||
|
|
||||||
LeaseStatsQueryPtr
|
LeaseStatsQueryPtr
|
||||||
PgSqlLeaseMgr::startLeaseStatsQuery4() {
|
PgSqlLeaseMgr::startLeaseStatsQuery4() {
|
||||||
// Get a context
|
// Get a context
|
||||||
@@ -2425,11 +2442,6 @@ PgSqlLeaseMgr::wipeLeases6(const SubnetID& /*subnet_id*/) {
|
|||||||
isc_throw(NotImplemented, "wipeLeases6 is not implemented for PostgreSQL backend");
|
isc_throw(NotImplemented, "wipeLeases6 is not implemented for PostgreSQL backend");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
PgSqlLeaseMgr::isJsonSupported() const {
|
|
||||||
isc_throw(NotImplemented, "PgSqlLeaseMgr::isJsonSupported() not implemented");
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
PgSqlLeaseMgr::getName() const {
|
PgSqlLeaseMgr::getName() const {
|
||||||
// Get a context
|
// Get a context
|
||||||
|
@@ -613,12 +613,6 @@ public:
|
|||||||
/// @return number of leases removed.
|
/// @return number of leases removed.
|
||||||
virtual size_t wipeLeases6(const SubnetID& subnet_id) override;
|
virtual size_t wipeLeases6(const SubnetID& subnet_id) override;
|
||||||
|
|
||||||
/// @brief Checks if JSON support is enabled in the database.
|
|
||||||
/// PostgreSQL implementation.
|
|
||||||
///
|
|
||||||
/// @return true if there is JSON support, false otherwise
|
|
||||||
virtual bool isJsonSupported() const override;
|
|
||||||
|
|
||||||
/// @brief Return backend type
|
/// @brief Return backend type
|
||||||
///
|
///
|
||||||
/// Returns the type of the backend (e.g. "mysql", "memfile" etc.)
|
/// Returns the type of the backend (e.g. "mysql", "memfile" etc.)
|
||||||
@@ -707,6 +701,7 @@ public:
|
|||||||
SUBNET_RANGE_LEASE6_STATS, // Fetched IPv6 lease stats for a subnet range.
|
SUBNET_RANGE_LEASE6_STATS, // Fetched IPv6 lease stats for a subnet range.
|
||||||
CHECK_LEASE4_LIMITS, // Check if allocated IPv4 leases are inside the set limits.
|
CHECK_LEASE4_LIMITS, // Check if allocated IPv4 leases are inside the set limits.
|
||||||
CHECK_LEASE6_LIMITS, // Check if allocated IPv6 leases are inside the set limits.
|
CHECK_LEASE6_LIMITS, // Check if allocated IPv6 leases are inside the set limits.
|
||||||
|
IS_JSON_SUPPORTED, // Checks if JSON support is enabled in the database.
|
||||||
NUM_STATEMENTS // Number of statements
|
NUM_STATEMENTS // Number of statements
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -949,6 +944,12 @@ private:
|
|||||||
virtual std::string
|
virtual std::string
|
||||||
checkLimits6(isc::data::ConstElementPtr const& user_context) const override;
|
checkLimits6(isc::data::ConstElementPtr const& user_context) const override;
|
||||||
|
|
||||||
|
/// @brief Checks if JSON support is enabled in the database.
|
||||||
|
/// PostgreSQL implementation.
|
||||||
|
///
|
||||||
|
/// @return true if there is JSON support, false otherwise
|
||||||
|
bool isJsonSupported() const override;
|
||||||
|
|
||||||
/// @brief Context RAII Allocator.
|
/// @brief Context RAII Allocator.
|
||||||
class PgSqlLeaseContextAlloc {
|
class PgSqlLeaseContextAlloc {
|
||||||
public:
|
public:
|
||||||
|
Reference in New Issue
Block a user