mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-08-29 04:57:52 +00:00
[5586] MySQL shared leases stats implemented
src/share/database/scripts/mysql/dhcpdb_create.mysql src/share/database/scripts/mysql/dhcpdb_drop.mysql src/share/database/scripts/mysql/upgrade_5.2_to_6.0.sh.in Added MySQL v4/6 stat tables and triggers src/lib/dhcpsrv/memfile_lease_mgr.cc Suppress output of of rows with count values of 0 src/lib/dhcpsrv/mysql_lease_mgr.* Added v4/v6 lease stat SQL statements MySqlLeaseStatsQuery - Added ctor variants that accomodate selection criteria - Modified start() to handle three variants of selection MySqlLeaseMgr - Added start***Query4/6 variants src/lib/dhcpsrv/tests/mysql_lease_mgr_unittest.cc Added tests: - TEST_F(MySqlLeaseMgrTest, leaseStatsQuery4) - TEST_F(MySqlLeaseMgrTest, leaseStatsQuery6)
This commit is contained in:
parent
6c3c1afdec
commit
a662ab45d9
@ -202,13 +202,14 @@ public:
|
|||||||
return (select_mode_);
|
return (select_mode_);
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
/// @brief First (or only) subnet_id in the selection criteria
|
/// @brief First (or only) subnet_id in the selection criteria
|
||||||
SubnetID first_subnet_id_;
|
SubnetID first_subnet_id_;
|
||||||
|
|
||||||
/// @brief Last subnet_id in the selection criteria when a range is given
|
/// @brief Last subnet_id in the selection criteria when a range is given
|
||||||
SubnetID last_subnet_id_;
|
SubnetID last_subnet_id_;
|
||||||
|
|
||||||
|
private:
|
||||||
/// @brief Indicates the type of selection criteria specified
|
/// @brief Indicates the type of selection criteria specified
|
||||||
SelectMode select_mode_;
|
SelectMode select_mode_;
|
||||||
};
|
};
|
||||||
|
@ -409,12 +409,19 @@ public:
|
|||||||
// and wipe the accumulators
|
// and wipe the accumulators
|
||||||
if ((*lease)->subnet_id_ != cur_id) {
|
if ((*lease)->subnet_id_ != cur_id) {
|
||||||
if (cur_id > 0) {
|
if (cur_id > 0) {
|
||||||
rows_.push_back(LeaseStatsRow(cur_id, Lease::STATE_DEFAULT,
|
if (assigned > 0) {
|
||||||
assigned));
|
rows_.push_back(LeaseStatsRow(cur_id,
|
||||||
assigned = 0;
|
Lease::STATE_DEFAULT,
|
||||||
rows_.push_back(LeaseStatsRow(cur_id, Lease::STATE_DECLINED,
|
assigned));
|
||||||
declined));
|
assigned = 0;
|
||||||
declined = 0;
|
}
|
||||||
|
|
||||||
|
if (declined > 0) {
|
||||||
|
rows_.push_back(LeaseStatsRow(cur_id,
|
||||||
|
Lease::STATE_DECLINED,
|
||||||
|
declined));
|
||||||
|
declined = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update current subnet id
|
// Update current subnet id
|
||||||
@ -430,8 +437,15 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Make the rows for last subnet
|
// Make the rows for last subnet
|
||||||
rows_.push_back(LeaseStatsRow(cur_id, Lease::STATE_DEFAULT, assigned));
|
if (assigned > 0) {
|
||||||
rows_.push_back(LeaseStatsRow(cur_id, Lease::STATE_DECLINED, declined));
|
rows_.push_back(LeaseStatsRow(cur_id, Lease::STATE_DEFAULT,
|
||||||
|
assigned));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (declined > 0) {
|
||||||
|
rows_.push_back(LeaseStatsRow(cur_id, Lease::STATE_DECLINED,
|
||||||
|
declined));
|
||||||
|
}
|
||||||
|
|
||||||
// Reset the next row position back to the beginning of the rows.
|
// Reset the next row position back to the beginning of the rows.
|
||||||
next_pos_ = rows_.begin();
|
next_pos_ = rows_.begin();
|
||||||
@ -538,18 +552,26 @@ public:
|
|||||||
// and wipe the accumulators
|
// and wipe the accumulators
|
||||||
if ((*lease)->subnet_id_ != cur_id) {
|
if ((*lease)->subnet_id_ != cur_id) {
|
||||||
if (cur_id > 0) {
|
if (cur_id > 0) {
|
||||||
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_NA,
|
if (assigned > 0) {
|
||||||
Lease::STATE_DEFAULT,
|
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_NA,
|
||||||
assigned));
|
Lease::STATE_DEFAULT,
|
||||||
assigned = 0;
|
assigned));
|
||||||
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_NA,
|
assigned = 0;
|
||||||
Lease::STATE_DECLINED,
|
}
|
||||||
declined));
|
|
||||||
declined = 0;
|
if (declined > 0) {
|
||||||
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_PD,
|
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_NA,
|
||||||
Lease::STATE_DEFAULT,
|
Lease::STATE_DECLINED,
|
||||||
assigned_pds));
|
declined));
|
||||||
assigned_pds = 0;
|
declined = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (assigned_pds > 0) {
|
||||||
|
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_PD,
|
||||||
|
Lease::STATE_DEFAULT,
|
||||||
|
assigned_pds));
|
||||||
|
assigned_pds = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update current subnet id
|
// Update current subnet id
|
||||||
@ -577,12 +599,20 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Make the rows for last subnet, unless there were no rows
|
// Make the rows for last subnet, unless there were no rows
|
||||||
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_NA,
|
if (assigned > 0) {
|
||||||
Lease::STATE_DEFAULT, assigned));
|
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_NA,
|
||||||
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_NA,
|
Lease::STATE_DEFAULT, assigned));
|
||||||
Lease::STATE_DECLINED, declined));
|
}
|
||||||
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_PD,
|
|
||||||
Lease::STATE_DEFAULT, assigned_pds));
|
if (declined > 0) {
|
||||||
|
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_NA,
|
||||||
|
Lease::STATE_DECLINED, declined));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (assigned_pds > 0) {
|
||||||
|
rows_.push_back(LeaseStatsRow(cur_id, Lease::TYPE_PD,
|
||||||
|
Lease::STATE_DEFAULT, assigned_pds));
|
||||||
|
}
|
||||||
|
|
||||||
// Set the next row position to the beginning of the rows.
|
// Set the next row position to the beginning of the rows.
|
||||||
next_pos_ = rows_.begin();
|
next_pos_ = rows_.begin();
|
||||||
|
@ -240,13 +240,37 @@ tagged_statements = { {
|
|||||||
"hostname = ?, hwaddr = ?, hwtype = ?, hwaddr_source = ?, "
|
"hostname = ?, hwaddr = ?, hwtype = ?, hwaddr_source = ?, "
|
||||||
"state = ? "
|
"state = ? "
|
||||||
"WHERE address = ?"},
|
"WHERE address = ?"},
|
||||||
{MySqlLeaseMgr::RECOUNT_LEASE4_STATS,
|
{MySqlLeaseMgr::ALL_LEASE4_STATS,
|
||||||
"SELECT subnet_id, state, count(state) as state_count "
|
"SELECT subnet_id, state, leases as state_count"
|
||||||
" FROM lease4 GROUP BY subnet_id, state ORDER BY subnet_id"},
|
" FROM lease4_stat ORDER BY subnet_id, state"},
|
||||||
{MySqlLeaseMgr::RECOUNT_LEASE6_STATS,
|
|
||||||
"SELECT subnet_id, lease_type, state, count(state) as state_count"
|
{MySqlLeaseMgr::SUBNET_LEASE4_STATS,
|
||||||
" FROM lease6 GROUP BY subnet_id, lease_type, state "
|
"SELECT subnet_id, state, leases as state_count"
|
||||||
" ORDER BY subnet_id" }
|
" FROM lease4_stat "
|
||||||
|
" WHERE subnet_id = ? "
|
||||||
|
" ORDER BY state"},
|
||||||
|
|
||||||
|
{MySqlLeaseMgr::SUBNET_RANGE_LEASE4_STATS,
|
||||||
|
"SELECT subnet_id, state, leases as state_count"
|
||||||
|
" FROM lease4_stat "
|
||||||
|
" WHERE subnet_id >= ? and subnet_id <= ? "
|
||||||
|
" ORDER BY subnet_id, state"},
|
||||||
|
|
||||||
|
{MySqlLeaseMgr::ALL_LEASE6_STATS,
|
||||||
|
"SELECT subnet_id, lease_type, state, leases as state_count"
|
||||||
|
" FROM lease6_stat ORDER BY subnet_id, lease_type, state" },
|
||||||
|
|
||||||
|
{MySqlLeaseMgr::SUBNET_LEASE6_STATS,
|
||||||
|
"SELECT subnet_id, lease_type, state, leases as state_count"
|
||||||
|
" FROM lease6_stat "
|
||||||
|
" WHERE subnet_id = ? "
|
||||||
|
" ORDER BY lease_type, state" },
|
||||||
|
|
||||||
|
{MySqlLeaseMgr::SUBNET_RANGE_LEASE6_STATS,
|
||||||
|
"SELECT subnet_id, lease_type, state, leases as state_count"
|
||||||
|
" FROM lease6_stat "
|
||||||
|
" WHERE subnet_id >= ? and subnet_id <= ? "
|
||||||
|
" ORDER BY subnet_id, lease_type, state" }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1262,11 +1286,14 @@ private:
|
|||||||
///
|
///
|
||||||
class MySqlLeaseStatsQuery : public LeaseStatsQuery {
|
class MySqlLeaseStatsQuery : public LeaseStatsQuery {
|
||||||
public:
|
public:
|
||||||
/// @brief Constructor
|
/// @brief Constructor to query for all subnets' stats
|
||||||
|
///
|
||||||
|
/// The query created will return statistics for all subnets
|
||||||
///
|
///
|
||||||
/// @param conn A open connection to the database housing the lease data
|
/// @param conn A open connection to the database housing the lease data
|
||||||
/// @param statement_index Index of the query's prepared statement
|
/// @param statement_index Index of the query's prepared statement
|
||||||
/// @param fetch_type Indicates if query supplies lease type
|
/// @param fetch_type Indicates if query supplies lease type
|
||||||
|
/// @throw if statement index is invalid.
|
||||||
MySqlLeaseStatsQuery(MySqlConnection& conn, const size_t statement_index,
|
MySqlLeaseStatsQuery(MySqlConnection& conn, const size_t statement_index,
|
||||||
const bool fetch_type)
|
const bool fetch_type)
|
||||||
: conn_(conn), statement_index_(statement_index), statement_(NULL),
|
: conn_(conn), statement_index_(statement_index), statement_(NULL),
|
||||||
@ -1275,12 +1302,51 @@ public:
|
|||||||
// This is the number of columns expected in the result set
|
// This is the number of columns expected in the result set
|
||||||
bind_(fetch_type_ ? 4 : 3),
|
bind_(fetch_type_ ? 4 : 3),
|
||||||
subnet_id_(0), lease_type_(0), lease_state_(0), state_count_(0) {
|
subnet_id_(0), lease_type_(0), lease_state_(0), state_count_(0) {
|
||||||
if (statement_index_ >= MySqlLeaseMgr::NUM_STATEMENTS) {
|
validateStatement();
|
||||||
isc_throw(BadValue, "MySqlLeaseStatsQuery"
|
}
|
||||||
" - invalid statement index" << statement_index_);
|
|
||||||
}
|
|
||||||
|
|
||||||
statement_ = conn.statements_[statement_index_];
|
/// @brief Constructor to query for a single subnet's stats
|
||||||
|
///
|
||||||
|
/// The query created will return statistics for a single subnet
|
||||||
|
///
|
||||||
|
/// @param conn A open connection to the database housing the lease data
|
||||||
|
/// @param statement_index Index of the query's prepared statement
|
||||||
|
/// @param fetch_type Indicates if query supplies lease type
|
||||||
|
/// @param subnet_id id of the subnet for which stats are desired
|
||||||
|
/// @throw BadValue if sunbet_id given is 0 or if statement index is invalid.
|
||||||
|
MySqlLeaseStatsQuery(MySqlConnection& conn, const size_t statement_index,
|
||||||
|
const bool fetch_type, const SubnetID& subnet_id)
|
||||||
|
: LeaseStatsQuery(subnet_id), conn_(conn), statement_index_(statement_index),
|
||||||
|
statement_(NULL), fetch_type_(fetch_type),
|
||||||
|
// Set the number of columns in the bind array based on fetch_type
|
||||||
|
// This is the number of columns expected in the result set
|
||||||
|
bind_(fetch_type_ ? 4 : 3),
|
||||||
|
subnet_id_(0), lease_type_(0), lease_state_(0), state_count_(0) {
|
||||||
|
validateStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Constructor to query for the stats for a range of subnets
|
||||||
|
///
|
||||||
|
/// The query created will return statistics for the inclusive range of
|
||||||
|
/// subnets described by first and last sunbet IDs.
|
||||||
|
///
|
||||||
|
/// @param conn A open connection to the database housing the lease data
|
||||||
|
/// @param statement_index Index of the query's prepared statement
|
||||||
|
/// @param fetch_type Indicates if query supplies lease type
|
||||||
|
/// @param first_subnet_id first subnet in the range of subnets
|
||||||
|
/// @param last_subnet_id last subnet in the range of subnets
|
||||||
|
/// @throw BadValue if either subnet ID is 0 or if last <= first or
|
||||||
|
/// if statement index is invalid.
|
||||||
|
MySqlLeaseStatsQuery(MySqlConnection& conn, const size_t statement_index,
|
||||||
|
const bool fetch_type, const SubnetID& first_subnet_id,
|
||||||
|
const SubnetID& last_subnet_id)
|
||||||
|
: LeaseStatsQuery(first_subnet_id, last_subnet_id), conn_(conn),
|
||||||
|
statement_index_(statement_index), statement_(NULL), fetch_type_(fetch_type),
|
||||||
|
// Set the number of columns in the bind array based on fetch_type
|
||||||
|
// This is the number of columns expected in the result set
|
||||||
|
bind_(fetch_type_ ? 4 : 3),
|
||||||
|
subnet_id_(0), lease_type_(0), lease_state_(0), state_count_(0) {
|
||||||
|
validateStatement();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Destructor
|
/// @brief Destructor
|
||||||
@ -1296,6 +1362,28 @@ public:
|
|||||||
/// the output bind array and then executes the statement, and fetches
|
/// the output bind array and then executes the statement, and fetches
|
||||||
/// entire result set.
|
/// entire result set.
|
||||||
void start() {
|
void start() {
|
||||||
|
// Set up where clause inputs if needed */
|
||||||
|
if (getSelectMode() != ALL_SUBNETS) {
|
||||||
|
MYSQL_BIND inbind[2];
|
||||||
|
memset(inbind, 0, sizeof(inbind));
|
||||||
|
|
||||||
|
// Add first_subnet_id used by both single and range.
|
||||||
|
inbind[0].buffer_type = MYSQL_TYPE_LONG;
|
||||||
|
inbind[0].buffer = reinterpret_cast<char*>(&first_subnet_id_);
|
||||||
|
inbind[0].is_unsigned = MLM_TRUE;
|
||||||
|
|
||||||
|
// Add last_subnet_id for range.
|
||||||
|
if (getSelectMode() == SUBNET_RANGE) {
|
||||||
|
inbind[1].buffer_type = MYSQL_TYPE_LONG;
|
||||||
|
inbind[1].buffer = reinterpret_cast<char*>(&last_subnet_id_);
|
||||||
|
inbind[1].is_unsigned = MLM_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bind the parameters to the statement
|
||||||
|
int status = mysql_stmt_bind_param(statement_, &inbind[0]);
|
||||||
|
conn_.checkError(status, statement_index_, "unable to bind parameters");
|
||||||
|
}
|
||||||
|
|
||||||
int col = 0;
|
int col = 0;
|
||||||
// subnet_id: unsigned int
|
// subnet_id: unsigned int
|
||||||
bind_[col].buffer_type = MYSQL_TYPE_LONG;
|
bind_[col].buffer_type = MYSQL_TYPE_LONG;
|
||||||
@ -1321,7 +1409,7 @@ public:
|
|||||||
++col;
|
++col;
|
||||||
|
|
||||||
// state_count_: uint32_t
|
// state_count_: uint32_t
|
||||||
bind_[col].buffer_type = MYSQL_TYPE_LONG;
|
bind_[col].buffer_type = MYSQL_TYPE_LONGLONG;
|
||||||
bind_[col].buffer = reinterpret_cast<char*>(&state_count_);
|
bind_[col].buffer = reinterpret_cast<char*>(&state_count_);
|
||||||
bind_[col].is_unsigned = MLM_TRUE;
|
bind_[col].is_unsigned = MLM_TRUE;
|
||||||
|
|
||||||
@ -1368,6 +1456,18 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/// @brief Validate the statement index passed to the constructor
|
||||||
|
/// Safely fetch the statement from the connection based on statement index
|
||||||
|
/// @throw BadValue if statement index is out of range
|
||||||
|
void validateStatement() {
|
||||||
|
if (statement_index_ >= MySqlLeaseMgr::NUM_STATEMENTS) {
|
||||||
|
isc_throw(BadValue, "MySqlLeaseStatsQuery"
|
||||||
|
" - invalid statement index" << statement_index_);
|
||||||
|
}
|
||||||
|
|
||||||
|
statement_ = conn_.statements_[statement_index_];
|
||||||
|
}
|
||||||
|
|
||||||
/// @brief Database connection to use to execute the query
|
/// @brief Database connection to use to execute the query
|
||||||
MySqlConnection& conn_;
|
MySqlConnection& conn_;
|
||||||
|
|
||||||
@ -1390,7 +1490,7 @@ private:
|
|||||||
/// @brief Receives the lease state when fetching a row
|
/// @brief Receives the lease state when fetching a row
|
||||||
uint32_t lease_state_;
|
uint32_t lease_state_;
|
||||||
/// @brief Receives the state count when fetching a row
|
/// @brief Receives the state count when fetching a row
|
||||||
uint32_t state_count_;
|
int64_t state_count_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// MySqlLeaseMgr Constructor and Destructor
|
// MySqlLeaseMgr Constructor and Destructor
|
||||||
@ -2185,21 +2285,63 @@ MySqlLeaseMgr::deleteExpiredReclaimedLeasesCommon(const uint32_t secs,
|
|||||||
LeaseStatsQueryPtr
|
LeaseStatsQueryPtr
|
||||||
MySqlLeaseMgr::startLeaseStatsQuery4() {
|
MySqlLeaseMgr::startLeaseStatsQuery4() {
|
||||||
LeaseStatsQueryPtr query(new MySqlLeaseStatsQuery(conn_,
|
LeaseStatsQueryPtr query(new MySqlLeaseStatsQuery(conn_,
|
||||||
RECOUNT_LEASE4_STATS,
|
ALL_LEASE4_STATS,
|
||||||
false));
|
false));
|
||||||
query->start();
|
query->start();
|
||||||
return(query);
|
return(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LeaseStatsQueryPtr
|
||||||
|
MySqlLeaseMgr::startSubnetLeaseStatsQuery4(const SubnetID& subnet_id) {
|
||||||
|
LeaseStatsQueryPtr query(new MySqlLeaseStatsQuery(conn_,
|
||||||
|
SUBNET_LEASE4_STATS,
|
||||||
|
false,
|
||||||
|
subnet_id));
|
||||||
|
query->start();
|
||||||
|
return(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
LeaseStatsQueryPtr
|
||||||
|
MySqlLeaseMgr::startSubnetRangeLeaseStatsQuery4(const SubnetID& first_subnet_id,
|
||||||
|
const SubnetID& last_subnet_id) {
|
||||||
|
LeaseStatsQueryPtr query(new MySqlLeaseStatsQuery(conn_,
|
||||||
|
SUBNET_RANGE_LEASE4_STATS,
|
||||||
|
false,
|
||||||
|
first_subnet_id, last_subnet_id));
|
||||||
|
query->start();
|
||||||
|
return(query);
|
||||||
|
}
|
||||||
|
|
||||||
LeaseStatsQueryPtr
|
LeaseStatsQueryPtr
|
||||||
MySqlLeaseMgr::startLeaseStatsQuery6() {
|
MySqlLeaseMgr::startLeaseStatsQuery6() {
|
||||||
LeaseStatsQueryPtr query(new MySqlLeaseStatsQuery(conn_,
|
LeaseStatsQueryPtr query(new MySqlLeaseStatsQuery(conn_,
|
||||||
RECOUNT_LEASE6_STATS,
|
ALL_LEASE6_STATS,
|
||||||
true));
|
true));
|
||||||
query->start();
|
query->start();
|
||||||
return(query);
|
return(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LeaseStatsQueryPtr
|
||||||
|
MySqlLeaseMgr::startSubnetLeaseStatsQuery6(const SubnetID& subnet_id) {
|
||||||
|
LeaseStatsQueryPtr query(new MySqlLeaseStatsQuery(conn_,
|
||||||
|
SUBNET_LEASE6_STATS,
|
||||||
|
true,
|
||||||
|
subnet_id));
|
||||||
|
query->start();
|
||||||
|
return(query);
|
||||||
|
}
|
||||||
|
|
||||||
|
LeaseStatsQueryPtr
|
||||||
|
MySqlLeaseMgr::startSubnetRangeLeaseStatsQuery6(const SubnetID& first_subnet_id,
|
||||||
|
const SubnetID& last_subnet_id) {
|
||||||
|
LeaseStatsQueryPtr query(new MySqlLeaseStatsQuery(conn_,
|
||||||
|
SUBNET_RANGE_LEASE6_STATS,
|
||||||
|
true,
|
||||||
|
first_subnet_id, last_subnet_id));
|
||||||
|
query->start();
|
||||||
|
return(query);
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
MySqlLeaseMgr::wipeLeases4(const SubnetID& /*subnet_id*/) {
|
MySqlLeaseMgr::wipeLeases4(const SubnetID& /*subnet_id*/) {
|
||||||
isc_throw(NotImplemented, "wipeLeases4 is not implemented for MySQL backend");
|
isc_throw(NotImplemented, "wipeLeases4 is not implemented for MySQL backend");
|
||||||
|
@ -365,22 +365,66 @@ public:
|
|||||||
///
|
///
|
||||||
/// It creates an instance of a MySqlLeaseStatsQuery4 and then
|
/// It creates an instance of a MySqlLeaseStatsQuery4 and then
|
||||||
/// invokes its start method, which fetches its statistical data
|
/// invokes its start method, which fetches its statistical data
|
||||||
/// result set by executing the RECOUNT_LEASE_STATS4 query.
|
/// result set by executing the ALL_LEASE_STATS4 query.
|
||||||
/// The query object is then returned.
|
/// The query object is then returned.
|
||||||
///
|
///
|
||||||
/// @return The populated query as a pointer to an LeaseStatsQuery
|
/// @return The populated query as a pointer to an LeaseStatsQuery
|
||||||
virtual LeaseStatsQueryPtr startLeaseStatsQuery4();
|
virtual LeaseStatsQueryPtr startLeaseStatsQuery4();
|
||||||
|
|
||||||
|
/// @brief Creates and runs the IPv4 lease stats query for a single subnet
|
||||||
|
///
|
||||||
|
/// It creates an instance of a MySqlLeaseStatsQuery4 for a single subnet
|
||||||
|
/// query and then invokes its start method in which the query constructs its
|
||||||
|
/// statistical data result set. The query object is then returned.
|
||||||
|
///
|
||||||
|
/// @param subnet_id id of the subnet for which stats are desired
|
||||||
|
/// @return A populated LeaseStatsQuery
|
||||||
|
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery4(const SubnetID& subnet_id);
|
||||||
|
|
||||||
|
/// @brief Creates and runs the IPv4 lease stats query for a single subnet
|
||||||
|
///
|
||||||
|
/// It creates an instance of a MySqlLeaseStatsQuery4 for a subnet range
|
||||||
|
/// query and then invokes its start method in which the query constructs its
|
||||||
|
/// statistical data result set. The query object is then returned.
|
||||||
|
///
|
||||||
|
/// @param first_subnet_id first subnet in the range of subnets
|
||||||
|
/// @param last_subnet_id last subnet in the range of subnets
|
||||||
|
/// @return A populated LeaseStatsQuery
|
||||||
|
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery4(const SubnetID& first_subnet_id,
|
||||||
|
const SubnetID& last_subnet_id);
|
||||||
|
|
||||||
/// @brief Creates and runs the IPv6 lease stats query
|
/// @brief Creates and runs the IPv6 lease stats query
|
||||||
///
|
///
|
||||||
/// It creates an instance of a MySqlLeaseStatsQuery6 and then
|
/// It creates an instance of a MySqlLeaseStatsQuery6 and then
|
||||||
/// invokes its start method, which fetches its statistical data
|
/// invokes its start method, which fetches its statistical data
|
||||||
/// result set by executing the RECOUNT_LEASE_STATS6 query.
|
/// result set by executing the ALL_LEASE_STATS6 query.
|
||||||
/// The query object is then returned.
|
/// The query object is then returned.
|
||||||
///
|
///
|
||||||
/// @return The populated query as a pointer to an LeaseStatsQuery
|
/// @return The populated query as a pointer to an LeaseStatsQuery
|
||||||
virtual LeaseStatsQueryPtr startLeaseStatsQuery6();
|
virtual LeaseStatsQueryPtr startLeaseStatsQuery6();
|
||||||
|
|
||||||
|
/// @brief Creates and runs the IPv6 lease stats query for a single subnet
|
||||||
|
///
|
||||||
|
/// It creates an instance of a MySqlLeaseStatsQuery6 for a single subnet
|
||||||
|
/// query and then invokes its start method in which the query constructs its
|
||||||
|
/// statistical data result set. The query object is then returned.
|
||||||
|
///
|
||||||
|
/// @param subnet_id id of the subnet for which stats are desired
|
||||||
|
/// @return A populated LeaseStatsQuery
|
||||||
|
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery6(const SubnetID& subnet_id);
|
||||||
|
|
||||||
|
/// @brief Creates and runs the IPv6 lease stats query for a single subnet
|
||||||
|
///
|
||||||
|
/// It creates an instance of a MySqlLeaseStatsQuery6 for a subnet range
|
||||||
|
/// query and then invokes its start method in which the query constructs its
|
||||||
|
/// statistical data result set. The query object is then returned.
|
||||||
|
///
|
||||||
|
/// @param first_subnet_id first subnet in the range of subnets
|
||||||
|
/// @param last_subnet_id last subnet in the range of subnets
|
||||||
|
/// @return A populated LeaseStatsQuery
|
||||||
|
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery6(const SubnetID& first_subnet_id,
|
||||||
|
const SubnetID& last_subnet_id);
|
||||||
|
|
||||||
/// @brief Removes specified IPv4 leases.
|
/// @brief Removes specified IPv4 leases.
|
||||||
///
|
///
|
||||||
/// This rather dangerous method is able to remove all leases from specified
|
/// This rather dangerous method is able to remove all leases from specified
|
||||||
@ -478,8 +522,12 @@ public:
|
|||||||
INSERT_LEASE6, // Add entry to lease6 table
|
INSERT_LEASE6, // Add entry to lease6 table
|
||||||
UPDATE_LEASE4, // Update a Lease4 entry
|
UPDATE_LEASE4, // Update a Lease4 entry
|
||||||
UPDATE_LEASE6, // Update a Lease6 entry
|
UPDATE_LEASE6, // Update a Lease6 entry
|
||||||
RECOUNT_LEASE4_STATS, // Fetches IPv4 address statistics
|
ALL_LEASE4_STATS, // Fetches IPv4 lease statistics
|
||||||
RECOUNT_LEASE6_STATS, // Fetches IPv6 address statistics
|
SUBNET_LEASE4_STATS, // Fetched IPv4 lease stats for a single subnet.
|
||||||
|
SUBNET_RANGE_LEASE4_STATS, // Fetched IPv4 lease stats for a subnet range.
|
||||||
|
ALL_LEASE6_STATS, // Fetches IPv6 lease statistics
|
||||||
|
SUBNET_LEASE6_STATS, // Fetched IPv6 lease stats for a single subnet.
|
||||||
|
SUBNET_RANGE_LEASE6_STATS, // Fetched IPv6 lease stats for a subnet range.
|
||||||
NUM_STATEMENTS // Number of statements
|
NUM_STATEMENTS // Number of statements
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2873,7 +2873,16 @@ GenericLeaseMgrTest::checkQueryAgainstRowSet(const LeaseStatsQueryPtr& query,
|
|||||||
<< " state: " << row.lease_state_
|
<< " state: " << row.lease_state_
|
||||||
<< " count: " << row.state_count_;
|
<< " count: " << row.state_count_;
|
||||||
} else {
|
} else {
|
||||||
++rows_matched;
|
if (row.state_count_ != (*found_row).state_count_) {
|
||||||
|
ADD_FAILURE() << "row count wrong for "
|
||||||
|
<< " id: " << row.subnet_id_
|
||||||
|
<< " type: " << row.lease_type_
|
||||||
|
<< " state: " << row.lease_state_
|
||||||
|
<< " count: " << row.state_count_
|
||||||
|
<< "; expected: " << (*found_row).state_count_;
|
||||||
|
} else {
|
||||||
|
++rows_matched;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2963,7 +2972,6 @@ GenericLeaseMgrTest::testLeaseStatsQuery4() {
|
|||||||
{
|
{
|
||||||
SCOPED_TRACE("SINGLE SUBNET");
|
SCOPED_TRACE("SINGLE SUBNET");
|
||||||
// Add expected rows for Subnet 2
|
// Add expected rows for Subnet 2
|
||||||
expected_rows.insert(LeaseStatsRow(2, Lease::STATE_DEFAULT, 0));
|
|
||||||
expected_rows.insert(LeaseStatsRow(2, Lease::STATE_DECLINED, 1));
|
expected_rows.insert(LeaseStatsRow(2, Lease::STATE_DECLINED, 1));
|
||||||
// Start the query
|
// Start the query
|
||||||
ASSERT_NO_THROW(query = lmptr_->startSubnetLeaseStatsQuery4(2));
|
ASSERT_NO_THROW(query = lmptr_->startSubnetLeaseStatsQuery4(2));
|
||||||
@ -3110,7 +3118,6 @@ GenericLeaseMgrTest::testLeaseStatsQuery6() {
|
|||||||
// Add expected row for Subnet 2
|
// Add expected row for Subnet 2
|
||||||
expected_rows.insert(LeaseStatsRow(2, Lease::TYPE_NA, Lease::STATE_DEFAULT, 2));
|
expected_rows.insert(LeaseStatsRow(2, Lease::TYPE_NA, Lease::STATE_DEFAULT, 2));
|
||||||
expected_rows.insert(LeaseStatsRow(2, Lease::TYPE_NA, Lease::STATE_DECLINED, 1));
|
expected_rows.insert(LeaseStatsRow(2, Lease::TYPE_NA, Lease::STATE_DECLINED, 1));
|
||||||
expected_rows.insert(LeaseStatsRow(2, Lease::TYPE_PD, Lease::STATE_DEFAULT, 0));
|
|
||||||
// Start the query
|
// Start the query
|
||||||
ASSERT_NO_THROW(query = lmptr_->startSubnetLeaseStatsQuery6(2));
|
ASSERT_NO_THROW(query = lmptr_->startSubnetLeaseStatsQuery6(2));
|
||||||
// Verify contents
|
// Verify contents
|
||||||
@ -3123,7 +3130,6 @@ GenericLeaseMgrTest::testLeaseStatsQuery6() {
|
|||||||
// Add expected rows for Subnet 3
|
// Add expected rows for Subnet 3
|
||||||
expected_rows.insert(LeaseStatsRow(3, Lease::TYPE_NA, Lease::STATE_DEFAULT, 2));
|
expected_rows.insert(LeaseStatsRow(3, Lease::TYPE_NA, Lease::STATE_DEFAULT, 2));
|
||||||
expected_rows.insert(LeaseStatsRow(3, Lease::TYPE_NA, Lease::STATE_DECLINED, 1));
|
expected_rows.insert(LeaseStatsRow(3, Lease::TYPE_NA, Lease::STATE_DECLINED, 1));
|
||||||
expected_rows.insert(LeaseStatsRow(3, Lease::TYPE_PD, Lease::STATE_DEFAULT, 0));
|
|
||||||
// Start the query
|
// Start the query
|
||||||
ASSERT_NO_THROW(query = lmptr_->startSubnetRangeLeaseStatsQuery6(2,3));
|
ASSERT_NO_THROW(query = lmptr_->startSubnetRangeLeaseStatsQuery6(2,3));
|
||||||
// Verify contents
|
// Verify contents
|
||||||
|
@ -106,9 +106,7 @@ public:
|
|||||||
/// only if the database can be opened. Note that this is not part of the
|
/// only if the database can be opened. Note that this is not part of the
|
||||||
/// MySqlLeaseMgr test fixure set. This test checks that the database can be
|
/// MySqlLeaseMgr test fixure set. This test checks that the database can be
|
||||||
/// opened: the fixtures assume that and check basic operations.
|
/// opened: the fixtures assume that and check basic operations.
|
||||||
|
|
||||||
TEST(MySqlOpenTest, OpenDatabase) {
|
TEST(MySqlOpenTest, OpenDatabase) {
|
||||||
|
|
||||||
// Schema needs to be created for the test to work.
|
// Schema needs to be created for the test to work.
|
||||||
destroyMySQLSchema(true);
|
destroyMySQLSchema(true);
|
||||||
createMySQLSchema(true);
|
createMySQLSchema(true);
|
||||||
@ -126,6 +124,8 @@ TEST(MySqlOpenTest, OpenDatabase) {
|
|||||||
<< "*** before the MySQL tests will run correctly.\n";
|
<< "*** before the MySQL tests will run correctly.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LeaseMgrFactory::destroy();
|
||||||
|
|
||||||
// Check that lease manager open the database opens correctly with a longer
|
// Check that lease manager open the database opens correctly with a longer
|
||||||
// timeout. If it fails, print the error message.
|
// timeout. If it fails, print the error message.
|
||||||
try {
|
try {
|
||||||
@ -141,6 +141,8 @@ TEST(MySqlOpenTest, OpenDatabase) {
|
|||||||
<< "*** before the MySQL tests will run correctly.\n";
|
<< "*** before the MySQL tests will run correctly.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LeaseMgrFactory::destroy();
|
||||||
|
|
||||||
// Check that attempting to get an instance of the lease manager when
|
// Check that attempting to get an instance of the lease manager when
|
||||||
// none is set throws an exception.
|
// none is set throws an exception.
|
||||||
EXPECT_THROW(LeaseMgrFactory::instance(), NoLeaseManager);
|
EXPECT_THROW(LeaseMgrFactory::instance(), NoLeaseManager);
|
||||||
@ -161,9 +163,15 @@ TEST(MySqlOpenTest, OpenDatabase) {
|
|||||||
MYSQL_VALID_TYPE, INVALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD)),
|
MYSQL_VALID_TYPE, INVALID_NAME, VALID_HOST, VALID_USER, VALID_PASSWORD)),
|
||||||
DbOpenError);
|
DbOpenError);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// @todo Under MacOS, connecting with an invalid host, causes a TCP/IP socket
|
||||||
|
// to be orphaned and never closed. This can interfer with subsequent tests
|
||||||
|
// which attempt to locate and manipulate MySQL client socket descriptor.
|
||||||
|
// In the interests of progress, we'll just avoid this test.
|
||||||
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
||||||
MYSQL_VALID_TYPE, VALID_NAME, INVALID_HOST, VALID_USER, VALID_PASSWORD)),
|
MYSQL_VALID_TYPE, VALID_NAME, INVALID_HOST, VALID_USER, VALID_PASSWORD)),
|
||||||
DbOpenError);
|
DbOpenError);
|
||||||
|
#endif
|
||||||
|
|
||||||
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
EXPECT_THROW(LeaseMgrFactory::create(connectionString(
|
||||||
MYSQL_VALID_TYPE, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD)),
|
MYSQL_VALID_TYPE, VALID_NAME, VALID_HOST, INVALID_USER, VALID_PASSWORD)),
|
||||||
@ -189,6 +197,7 @@ TEST(MySqlOpenTest, OpenDatabase) {
|
|||||||
|
|
||||||
// Tidy up after the test
|
// Tidy up after the test
|
||||||
destroyMySQLSchema(true);
|
destroyMySQLSchema(true);
|
||||||
|
LeaseMgrFactory::destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Check the getType() method
|
/// @brief Check the getType() method
|
||||||
@ -553,14 +562,14 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual std::string invalidConnectString() {
|
virtual std::string invalidConnectString() {
|
||||||
return (connectionString(MYSQL_VALID_TYPE, VALID_NAME, INVALID_HOST,
|
return (connectionString(MYSQL_VALID_TYPE, INVALID_NAME, VALID_HOST,
|
||||||
VALID_USER, VALID_PASSWORD));
|
VALID_USER, VALID_PASSWORD));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Verifies that db lost callback is not invoked on an open failure
|
// Verifies that db lost callback is not invoked on an open failure
|
||||||
TEST_F(MySQLLeaseMgrDbLostCallbackTest, testNoCallbackOnOpenFailure) {
|
TEST_F(MySQLLeaseMgrDbLostCallbackTest, testNoCallbackOnOpenFailure) {
|
||||||
testDbLostCallback();
|
testNoCallbackOnOpenFailure();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verifies that loss of connectivity to MySQL is handled correctly.
|
// Verifies that loss of connectivity to MySQL is handled correctly.
|
||||||
@ -568,4 +577,14 @@ TEST_F(MySQLLeaseMgrDbLostCallbackTest, testDbLostCallback) {
|
|||||||
testDbLostCallback();
|
testDbLostCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tests v4 lease stats query variants.
|
||||||
|
TEST_F(MySqlLeaseMgrTest, leaseStatsQuery4) {
|
||||||
|
testLeaseStatsQuery4();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests v6 lease stats query variants.
|
||||||
|
TEST_F(MySqlLeaseMgrTest, leaseStatsQuery6) {
|
||||||
|
testLeaseStatsQuery6();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -533,9 +533,148 @@ CREATE INDEX lease6_by_subnet_id_lease_type ON lease6 (subnet_id, lease_type);
|
|||||||
DROP INDEX lease6_by_iaid_subnet_id_duid on lease6;
|
DROP INDEX lease6_by_iaid_subnet_id_duid on lease6;
|
||||||
CREATE INDEX lease6_by_duid_iaid_subnet_id ON lease6 (duid, iaid, subnet_id);
|
CREATE INDEX lease6_by_duid_iaid_subnet_id ON lease6 (duid, iaid, subnet_id);
|
||||||
|
|
||||||
|
# Create lease4_stat table
|
||||||
|
CREATE TABLE lease4_stat (
|
||||||
|
subnet_id INT UNSIGNED NOT NULL,
|
||||||
|
state INT UNSIGNED NOT NULL,
|
||||||
|
leases BIGINT,
|
||||||
|
PRIMARY KEY (subnet_id, state)
|
||||||
|
) ENGINE = INNODB;
|
||||||
|
|
||||||
|
# Create stat_lease4_insert trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease4_insert AFTER INSERT ON lease4
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
# Update the state count if it exists
|
||||||
|
UPDATE lease4_stat SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND state = NEW.state;
|
||||||
|
|
||||||
|
# Insert the state count record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease4_stat VALUES (NEW.subnet_id, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
# Create stat_lease4_update trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease4_update AFTER UPDATE ON lease4
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state != NEW.state THEN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
# Decrement the old state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND state = OLD.state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
# Increment the new state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND state = NEW.state;
|
||||||
|
|
||||||
|
# Insert new state record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease4_stat VALUES (NEW.subnet_id, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
# Create stat_lease4_delete trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease4_delete AFTER DELETE ON lease4
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
# Decrement the state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND OLD.state = state;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
# Create lease6_stat table
|
||||||
|
CREATE TABLE lease6_stat (
|
||||||
|
subnet_id INT UNSIGNED NOT NULL,
|
||||||
|
lease_type INT UNSIGNED NOT NULL,
|
||||||
|
state INT UNSIGNED NOT NULL,
|
||||||
|
leases BIGINT,
|
||||||
|
PRIMARY KEY (subnet_id, lease_type, state)
|
||||||
|
) ENGINE = INNODB;
|
||||||
|
|
||||||
|
# Create stat_lease6_insert trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease6_insert AFTER INSERT ON lease6
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
# Update the state count if it exists
|
||||||
|
UPDATE lease6_stat SET leases = leases + 1
|
||||||
|
WHERE
|
||||||
|
subnet_id = NEW.subnet_id AND lease_type = NEW.lease_type
|
||||||
|
AND state = NEW.state;
|
||||||
|
|
||||||
|
# Insert the state count record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease6_stat
|
||||||
|
VALUES (NEW.subnet_id, NEW.lease_type, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
# Create stat_lease6_update trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease6_update AFTER UPDATE ON lease6
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state != NEW.state THEN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
# Decrement the old state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND lease_type = OLD.lease_type
|
||||||
|
AND state = OLD.state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
# Increment the new state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND lease_type = NEW.lease_type
|
||||||
|
AND state = NEW.state;
|
||||||
|
|
||||||
|
# Insert new state record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease6_stat
|
||||||
|
VALUES (NEW.subnet_id, NEW.lease_type, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
# Create stat_lease6_delete trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease6_delete AFTER DELETE ON lease6
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
# Decrement the state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND lease_type = OLD.lease_type
|
||||||
|
AND state = OLD.state;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
# Update the schema version number
|
# Update the schema version number
|
||||||
UPDATE schema_version
|
UPDATE schema_version
|
||||||
SET version = '6', minor = '0';
|
SET version = '6', minor = '0';
|
||||||
|
|
||||||
# This line concludes database upgrade to version 6.0.
|
# This line concludes database upgrade to version 6.0.
|
||||||
|
|
||||||
# Notes:
|
# Notes:
|
||||||
|
@ -23,3 +23,11 @@ DROP PROCEDURE IF EXISTS lease4DumpHeader;
|
|||||||
DROP PROCEDURE IF EXISTS lease4DumpData;
|
DROP PROCEDURE IF EXISTS lease4DumpData;
|
||||||
DROP PROCEDURE IF EXISTS lease6DumpHeader;
|
DROP PROCEDURE IF EXISTS lease6DumpHeader;
|
||||||
DROP PROCEDURE IF EXISTS lease6DumpData;
|
DROP PROCEDURE IF EXISTS lease6DumpData;
|
||||||
|
DROP TRIGGER IF EXISTS lease4_stat_insert;
|
||||||
|
DROP TRIGGER IF EXISTS lease4_stat_update;
|
||||||
|
DROP TRIGGER IF EXISTS lease4_stat_delete;
|
||||||
|
DROP TABLE IF EXISTS lease4_stat;
|
||||||
|
DROP TRIGGER IF EXISTS lease6_stat_insert;
|
||||||
|
DROP TRIGGER IF EXISTS lease6_stat_update;
|
||||||
|
DROP TRIGGER IF EXISTS lease6_stat_delete;
|
||||||
|
DROP TABLE IF EXISTS lease6_stat;
|
||||||
|
@ -37,6 +37,144 @@ CREATE INDEX lease6_by_subnet_id_lease_type ON lease6 (subnet_id, lease_type);
|
|||||||
DROP INDEX lease6_by_iaid_subnet_id_duid on lease6;
|
DROP INDEX lease6_by_iaid_subnet_id_duid on lease6;
|
||||||
CREATE INDEX lease6_by_duid_iaid_subnet_id ON lease6 (duid, iaid, subnet_id);
|
CREATE INDEX lease6_by_duid_iaid_subnet_id ON lease6 (duid, iaid, subnet_id);
|
||||||
|
|
||||||
|
# Create lease4_stat table
|
||||||
|
CREATE TABLE lease4_stat (
|
||||||
|
subnet_id INT UNSIGNED NOT NULL,
|
||||||
|
state INT UNSIGNED NOT NULL,
|
||||||
|
leases BIGINT,
|
||||||
|
PRIMARY KEY (subnet_id, state)
|
||||||
|
) ENGINE = INNODB;
|
||||||
|
|
||||||
|
# Create stat_lease4_insert trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease4_insert AFTER INSERT ON lease4
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
# Update the state count if it exists
|
||||||
|
UPDATE lease4_stat SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND state = NEW.state;
|
||||||
|
|
||||||
|
# Insert the state count record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease4_stat VALUES (NEW.subnet_id, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
# Create stat_lease4_update trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease4_update AFTER UPDATE ON lease4
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state != NEW.state THEN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
# Decrement the old state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND state = OLD.state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
# Increment the new state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND state = NEW.state;
|
||||||
|
|
||||||
|
# Insert new state record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease4_stat VALUES (NEW.subnet_id, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
# Create stat_lease4_delete trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease4_delete AFTER DELETE ON lease4
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
# Decrement the state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND OLD.state = state;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
# Create lease6_stat table
|
||||||
|
CREATE TABLE lease6_stat (
|
||||||
|
subnet_id INT UNSIGNED NOT NULL,
|
||||||
|
lease_type INT UNSIGNED NOT NULL,
|
||||||
|
state INT UNSIGNED NOT NULL,
|
||||||
|
leases BIGINT,
|
||||||
|
PRIMARY KEY (subnet_id, lease_type, state)
|
||||||
|
) ENGINE = INNODB;
|
||||||
|
|
||||||
|
# Create stat_lease6_insert trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease6_insert AFTER INSERT ON lease6
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
# Update the state count if it exists
|
||||||
|
UPDATE lease6_stat SET leases = leases + 1
|
||||||
|
WHERE
|
||||||
|
subnet_id = NEW.subnet_id AND lease_type = NEW.lease_type
|
||||||
|
AND state = NEW.state;
|
||||||
|
|
||||||
|
# Insert the state count record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease6_stat
|
||||||
|
VALUES (NEW.subnet_id, NEW.lease_type, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
# Create stat_lease6_update trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease6_update AFTER UPDATE ON lease6
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state != NEW.state THEN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
# Decrement the old state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND lease_type = OLD.lease_type
|
||||||
|
AND state = OLD.state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
# Increment the new state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND lease_type = NEW.lease_type
|
||||||
|
AND state = NEW.state;
|
||||||
|
|
||||||
|
# Insert new state record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease6_stat
|
||||||
|
VALUES (NEW.subnet_id, NEW.lease_type, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
# Create stat_lease6_delete trigger
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE TRIGGER stat_lease6_delete AFTER DELETE ON lease6
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
# Decrement the state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND lease_type = OLD.lease_type
|
||||||
|
AND state = OLD.state;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
# Update the schema version number
|
# Update the schema version number
|
||||||
UPDATE schema_version
|
UPDATE schema_version
|
||||||
SET version = '6', minor = '0';
|
SET version = '6', minor = '0';
|
||||||
|
@ -570,6 +570,184 @@ CREATE INDEX lease6_by_subnet_id_lease_type ON lease6 (subnet_id, lease_type);
|
|||||||
DROP INDEX lease6_by_iaid_subnet_id_duid;
|
DROP INDEX lease6_by_iaid_subnet_id_duid;
|
||||||
CREATE INDEX lease6_by_duid_iaid_subnet_id ON lease6 (duid, iaid, subnet_id);
|
CREATE INDEX lease6_by_duid_iaid_subnet_id ON lease6 (duid, iaid, subnet_id);
|
||||||
|
|
||||||
|
-- Create v4 lease statistics table
|
||||||
|
CREATE TABLE lease4_stat (
|
||||||
|
subnet_id BIGINT NOT NULL,
|
||||||
|
state INT8 NOT NULL,
|
||||||
|
leases BIGINT,
|
||||||
|
PRIMARY KEY (subnet_id, state)
|
||||||
|
);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create v4 insert trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease4_insert () RETURNS trigger AS $stat_lease4_insert$
|
||||||
|
BEGIN
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
UPDATE lease4_stat
|
||||||
|
SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND state = NEW.state;
|
||||||
|
|
||||||
|
IF NOT FOUND THEN
|
||||||
|
INSERT INTO lease4_stat VALUES (new.subnet_id, new.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease4_insert$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create v4 insert trigger procedure
|
||||||
|
CREATE TRIGGER stat_lease4_insert
|
||||||
|
AFTER INSERT ON lease4
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease4_insert();
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create v4 update trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease4_update () RETURNS trigger AS $stat_lease4_update$
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state != NEW.state THEN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
-- Decrement the old state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND state = OLD.state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
-- Increment the new state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND state = NEW.state;
|
||||||
|
|
||||||
|
-- Insert new state record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease4_stat VALUES (NEW.subnet_id, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease4_update$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create v4 update trigger
|
||||||
|
CREATE TRIGGER stat_lease4_update
|
||||||
|
AFTER UPDATE ON lease4
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease4_update();
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create the v4 delete trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease4_delete () RETURNS trigger AS $stat_lease4_delete$
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
-- Decrement the state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND OLD.state = state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease4_delete$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create the v4 delete trigger
|
||||||
|
CREATE TRIGGER stat_lease4_delete
|
||||||
|
AFTER DELETE ON lease4
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease4_delete();
|
||||||
|
|
||||||
|
-- Create v6 lease statistics table
|
||||||
|
CREATE TABLE lease6_stat (
|
||||||
|
subnet_id BIGINT NOT NULL,
|
||||||
|
lease_type SMALLINT NOT NULL,
|
||||||
|
state INT8 NOT NULL,
|
||||||
|
leases BIGINT,
|
||||||
|
PRIMARY KEY (subnet_id, lease_type, state)
|
||||||
|
);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create v6 insert trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease6_insert () RETURNS trigger AS $stat_lease6_insert$
|
||||||
|
BEGIN
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
UPDATE lease6_stat
|
||||||
|
SET leases = leases + 1
|
||||||
|
WHERE
|
||||||
|
subnet_id = NEW.subnet_id AND lease_type = NEW.lease_type
|
||||||
|
AND state = NEW.state;
|
||||||
|
|
||||||
|
IF NOT FOUND THEN
|
||||||
|
INSERT INTO lease6_stat
|
||||||
|
VALUES (NEW.subnet_id, NEW.lease_type, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease6_insert$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create v6 insert trigger procedure
|
||||||
|
CREATE TRIGGER stat_lease6_insert
|
||||||
|
AFTER INSERT ON lease6
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease6_insert();
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create v6 update trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease6_update () RETURNS trigger AS $stat_lease6_update$
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state != NEW.state THEN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
-- Decrement the old state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND lease_type = OLD.lease_type
|
||||||
|
AND state = OLD.state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
-- Increment the new state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND lease_type = NEW.lease_type
|
||||||
|
AND state = NEW.state;
|
||||||
|
|
||||||
|
-- Insert new state record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease6_stat VALUES (NEW.subnet_id, NEW.lease_type, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease6_update$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create v6 update trigger
|
||||||
|
CREATE TRIGGER stat_lease6_update
|
||||||
|
AFTER UPDATE ON lease6
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease6_update();
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create the v6 delete trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease6_delete() RETURNS trigger AS $stat_lease6_delete$
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
-- Decrement the state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND lease_type = OLD.lease_type
|
||||||
|
AND OLD.state = state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease6_delete$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create the v6 delete trigger
|
||||||
|
CREATE TRIGGER stat_lease6_delete
|
||||||
|
AFTER DELETE ON lease6
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease6_delete();
|
||||||
|
|
||||||
-- Set 4.0 schema version.
|
-- Set 4.0 schema version.
|
||||||
UPDATE schema_version
|
UPDATE schema_version
|
||||||
SET version = '4', minor = '0';
|
SET version = '4', minor = '0';
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- Copyright (C) 2016 Internet Systems Consortium.
|
-- Copyright (C) 2016-2018 Internet Systems Consortium.
|
||||||
|
|
||||||
-- This Source Code Form is subject to the terms of the Mozilla Public
|
-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
-- License, v. 2.0. If a copy of the MPL was not distributed with this
|
-- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
@ -20,3 +20,11 @@ DROP FUNCTION IF EXISTS lease4DumpHeader();
|
|||||||
DROP FUNCTION IF EXISTS lease4DumpData();
|
DROP FUNCTION IF EXISTS lease4DumpData();
|
||||||
DROP FUNCTION IF EXISTS lease6DumpHeader();
|
DROP FUNCTION IF EXISTS lease6DumpHeader();
|
||||||
DROP FUNCTION IF EXISTS lease6DumpData();
|
DROP FUNCTION IF EXISTS lease6DumpData();
|
||||||
|
DROP TABLE IF EXISTS lease4_stat CASCADE;
|
||||||
|
DROP FUNCTION IF EXISTS proc_stat_lease4_insert ();
|
||||||
|
DROP FUNCTION IF EXISTS proc_stat_lease4_update ();
|
||||||
|
DROP FUNCTION IF EXISTS proc_stat_lease4_delete ();
|
||||||
|
DROP TABLE IF EXISTS lease6_stat CASCADE;
|
||||||
|
DROP FUNCTION IF EXISTS proc_stat_lease6_insert ();
|
||||||
|
DROP FUNCTION IF EXISTS proc_stat_lease6_update ();
|
||||||
|
DROP FUNCTION IF EXISTS proc_stat_lease6_delete ();
|
||||||
|
@ -39,11 +39,183 @@ CREATE INDEX lease6_by_subnet_id_lease_type ON lease6 (subnet_id, lease_type);
|
|||||||
DROP INDEX lease6_by_iaid_subnet_id_duid;
|
DROP INDEX lease6_by_iaid_subnet_id_duid;
|
||||||
CREATE INDEX lease6_by_duid_iaid_subnet_id ON lease6 (duid, iaid, subnet_id);
|
CREATE INDEX lease6_by_duid_iaid_subnet_id ON lease6 (duid, iaid, subnet_id);
|
||||||
|
|
||||||
-- Set 4.0 schema version.
|
-- Create v4 lease statistics table
|
||||||
UPDATE schema_version
|
CREATE TABLE lease4_stat (
|
||||||
SET version = '4', minor = '0';
|
subnet_id BIGINT NOT NULL,
|
||||||
|
state INT8 NOT NULL,
|
||||||
|
leases BIGINT,
|
||||||
|
PRIMARY KEY (subnet_id, state)
|
||||||
|
);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create v4 insert trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease4_insert () RETURNS trigger AS $stat_lease4_insert$
|
||||||
|
BEGIN
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
UPDATE lease4_stat
|
||||||
|
SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND state = NEW.state;
|
||||||
|
|
||||||
|
IF NOT FOUND THEN
|
||||||
|
INSERT INTO lease4_stat VALUES (new.subnet_id, new.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease4_insert$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create v4 insert trigger procedure
|
||||||
|
CREATE TRIGGER stat_lease4_insert
|
||||||
|
AFTER INSERT ON lease4
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease4_insert();
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create v4 update trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease4_update () RETURNS trigger AS $stat_lease4_update$
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state != NEW.state THEN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
-- Decrement the old state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND state = OLD.state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
-- Increment the new state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND state = NEW.state;
|
||||||
|
|
||||||
|
-- Insert new state record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease4_stat VALUES (NEW.subnet_id, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease4_update$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create v4 update trigger
|
||||||
|
CREATE TRIGGER stat_lease4_update
|
||||||
|
AFTER UPDATE ON lease4
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease4_update();
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create the v4 delete trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease4_delete () RETURNS trigger AS $stat_lease4_delete$
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
-- Decrement the state count if record exists
|
||||||
|
UPDATE lease4_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND OLD.state = state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease4_delete$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create the v4 delete trigger
|
||||||
|
CREATE TRIGGER stat_lease4_delete
|
||||||
|
AFTER DELETE ON lease4
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease4_delete();
|
||||||
|
|
||||||
|
-- Create v6 lease statistics table
|
||||||
|
CREATE TABLE lease6_stat (
|
||||||
|
subnet_id BIGINT NOT NULL,
|
||||||
|
lease_type SMALLINT NOT NULL,
|
||||||
|
state INT8 NOT NULL,
|
||||||
|
leases BIGINT,
|
||||||
|
PRIMARY KEY (subnet_id, lease_type, state)
|
||||||
|
);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create v6 insert trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease6_insert () RETURNS trigger AS $stat_lease6_insert$
|
||||||
|
BEGIN
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
UPDATE lease6_stat
|
||||||
|
SET leases = leases + 1
|
||||||
|
WHERE
|
||||||
|
subnet_id = NEW.subnet_id AND lease_type = NEW.lease_type
|
||||||
|
AND state = NEW.state;
|
||||||
|
|
||||||
|
IF NOT FOUND THEN
|
||||||
|
INSERT INTO lease6_stat
|
||||||
|
VALUES (NEW.subnet_id, NEW.lease_type, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease6_insert$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create v6 insert trigger procedure
|
||||||
|
CREATE TRIGGER stat_lease6_insert
|
||||||
|
AFTER INSERT ON lease6
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease6_insert();
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create v6 update trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease6_update () RETURNS trigger AS $stat_lease6_update$
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state != NEW.state THEN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
-- Decrement the old state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND lease_type = OLD.lease_type
|
||||||
|
AND state = OLD.state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NEW.state = 0 OR NEW.state = 1 THEN
|
||||||
|
-- Increment the new state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases + 1
|
||||||
|
WHERE subnet_id = NEW.subnet_id AND lease_type = NEW.lease_type
|
||||||
|
AND state = NEW.state;
|
||||||
|
|
||||||
|
-- Insert new state record if it does not exist
|
||||||
|
IF ROW_COUNT() <= 0 THEN
|
||||||
|
INSERT INTO lease6_stat VALUES (NEW.subnet_id, NEW.lease_type, NEW.state, 1);
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease6_update$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create v6 update trigger
|
||||||
|
CREATE TRIGGER stat_lease6_update
|
||||||
|
AFTER UPDATE ON lease6
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease6_update();
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Create the v6 delete trigger procedure
|
||||||
|
CREATE FUNCTION proc_stat_lease6_delete() RETURNS trigger AS $stat_lease6_delete$
|
||||||
|
BEGIN
|
||||||
|
IF OLD.state = 0 OR OLD.state = 1 THEN
|
||||||
|
-- Decrement the state count if record exists
|
||||||
|
UPDATE lease6_stat SET leases = leases - 1
|
||||||
|
WHERE subnet_id = OLD.subnet_id AND lease_type = OLD.lease_type
|
||||||
|
AND OLD.state = state;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Return is ignored since this is an after insert
|
||||||
|
RETURN NULL;
|
||||||
|
END;
|
||||||
|
$stat_lease6_delete$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- Create the v6 delete trigger
|
||||||
|
CREATE TRIGGER stat_lease6_delete
|
||||||
|
AFTER DELETE ON lease6
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease6_delete();
|
||||||
|
|
||||||
-- Schema 4.0 specification ends here.
|
|
||||||
|
|
||||||
-- Commit the script transaction
|
-- Commit the script transaction
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user