Kea  1.5.0
mysql_lease_mgr.h
Go to the documentation of this file.
1 // Copyright (C) 2012-2018 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #ifndef MYSQL_LEASE_MGR_H
8 #define MYSQL_LEASE_MGR_H
9 
10 #include <dhcp/hwaddr.h>
12 #include <dhcpsrv/lease_mgr.h>
13 #include <mysql/mysql_connection.h>
14 
15 #include <boost/scoped_ptr.hpp>
16 #include <boost/utility.hpp>
17 #include <mysql.h>
18 
19 #include <time.h>
20 
21 namespace isc {
22 namespace dhcp {
23 
24 // Forward declaration of the Lease exchange objects. These classes are defined
25 // in the .cc file.
26 class MySqlLease4Exchange;
27 class MySqlLease6Exchange;
28 
34 
35 class MySqlLeaseMgr : public LeaseMgr {
36 public:
37 
62 
64  virtual ~MySqlLeaseMgr();
65 
67  static std::string getDBVersion();
68 
78  virtual bool addLease(const Lease4Ptr& lease);
79 
89  virtual bool addLease(const Lease6Ptr& lease);
90 
109  virtual Lease4Ptr getLease4(const isc::asiolink::IOAddress& addr) const;
110 
111 
128  virtual Lease4Collection getLease4(const isc::dhcp::HWAddr& hwaddr) const;
129 
146  virtual Lease4Ptr getLease4(const isc::dhcp::HWAddr& hwaddr,
147  SubnetID subnet_id) const;
148 
165  virtual Lease4Collection getLease4(const ClientId& clientid) const;
166 
177  virtual Lease4Ptr getLease4(const ClientId& client_id, const HWAddr& hwaddr,
178  SubnetID subnet_id) const;
179 
195  virtual Lease4Ptr getLease4(const ClientId& clientid,
196  SubnetID subnet_id) const;
197 
203  virtual Lease4Collection getLeases4(SubnetID subnet_id) const;
204 
208  virtual Lease4Collection getLeases4() const;
209 
234  virtual Lease4Collection
235  getLeases4(const asiolink::IOAddress& lower_bound_address,
236  const LeasePageSize& page_size) const;
237 
256  virtual Lease6Ptr getLease6(Lease::Type type,
257  const isc::asiolink::IOAddress& addr) const;
258 
279  virtual Lease6Collection getLeases6(Lease::Type type, const DUID& duid,
280  uint32_t iaid) const;
281 
298  virtual Lease6Collection getLeases6(Lease::Type type, const DUID& duid,
299  uint32_t iaid, SubnetID subnet_id) const;
300 
306  virtual Lease6Collection getLeases6(SubnetID subnet_id) const;
307 
311  virtual Lease6Collection getLeases6() const;
312 
318  virtual Lease6Collection getLeases6(const DUID& duid) const;
319 
344  virtual Lease6Collection
345  getLeases6(const asiolink::IOAddress& lower_bound_address,
346  const LeasePageSize& page_size) const;
347 
358  virtual void getExpiredLeases4(Lease4Collection& expired_leases,
359  const size_t max_leases) const;
360 
371  virtual void getExpiredLeases6(Lease6Collection& expired_leases,
372  const size_t max_leases) const;
373 
385  virtual void updateLease4(const Lease4Ptr& lease4);
386 
398  virtual void updateLease6(const Lease6Ptr& lease6);
399 
409  virtual bool deleteLease(const isc::asiolink::IOAddress& addr);
410 
418  virtual uint64_t deleteExpiredReclaimedLeases4(const uint32_t secs);
419 
427  virtual uint64_t deleteExpiredReclaimedLeases6(const uint32_t secs);
428 
438 
447  virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery4(const SubnetID& subnet_id);
448 
458  virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery4(const SubnetID& first_subnet_id,
459  const SubnetID& last_subnet_id);
460 
470 
479  virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery6(const SubnetID& subnet_id);
480 
490  virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery6(const SubnetID& first_subnet_id,
491  const SubnetID& last_subnet_id);
492 
502  virtual size_t wipeLeases4(const SubnetID& subnet_id);
503 
513  virtual size_t wipeLeases6(const SubnetID& subnet_id);
514 
520  virtual std::string getType() const {
521  return (std::string("mysql"));
522  }
523 
529  virtual std::string getName() const;
530 
536  virtual std::string getDescription() const;
537 
550  virtual std::pair<uint32_t, uint32_t> getVersion() const;
551 
558  virtual void commit();
559 
566  virtual void rollback();
567 
572  DELETE_LEASE4, // Delete from lease4 by address
573  DELETE_LEASE4_STATE_EXPIRED, // Delete expired lease4 in a given state
574  DELETE_LEASE6, // Delete from lease6 by address
575  DELETE_LEASE6_STATE_EXPIRED, // Delete expired lease6 in a given state
576  GET_LEASE4, // Get all IPv4 leases
577  GET_LEASE4_ADDR, // Get lease4 by address
578  GET_LEASE4_CLIENTID, // Get lease4 by client ID
579  GET_LEASE4_CLIENTID_SUBID, // Get lease4 by client ID & subnet ID
580  GET_LEASE4_HWADDR, // Get lease4 by HW address
581  GET_LEASE4_HWADDR_SUBID, // Get lease4 by HW address & subnet ID
582  GET_LEASE4_PAGE, // Get page of leases beginning with an address
583  GET_LEASE4_SUBID, // Get IPv4 leases by subnet ID
584  GET_LEASE4_EXPIRE, // Get lease4 by expiration.
585  GET_LEASE6, // Get all IPv6 leases
586  GET_LEASE6_ADDR, // Get lease6 by address
587  GET_LEASE6_DUID_IAID, // Get lease6 by DUID and IAID
588  GET_LEASE6_DUID_IAID_SUBID, // Get lease6 by DUID, IAID and subnet ID
589  GET_LEASE6_PAGE, // Get page of leases beginning with an address
590  GET_LEASE6_SUBID, // Get IPv6 leases by subnet ID
591  GET_LEASE6_DUID, // Get IPv6 leases by DUID
592  GET_LEASE6_EXPIRE, // Get lease6 by expiration.
593  INSERT_LEASE4, // Add entry to lease4 table
594  INSERT_LEASE6, // Add entry to lease6 table
595  UPDATE_LEASE4, // Update a Lease4 entry
596  UPDATE_LEASE6, // Update a Lease6 entry
597  ALL_LEASE4_STATS, // Fetches IPv4 lease statistics
598  SUBNET_LEASE4_STATS, // Fetched IPv4 lease stats for a single subnet.
599  SUBNET_RANGE_LEASE4_STATS, // Fetched IPv4 lease stats for a subnet range.
600  ALL_LEASE6_STATS, // Fetches IPv6 lease statistics
601  SUBNET_LEASE6_STATS, // Fetched IPv6 lease stats for a single subnet.
602  SUBNET_RANGE_LEASE6_STATS, // Fetched IPv6 lease stats for a subnet range.
603  NUM_STATEMENTS // Number of statements
604  };
605 
606 private:
622  bool addLeaseCommon(StatementIndex stindex, std::vector<MYSQL_BIND>& bind);
623 
644  template <typename Exchange, typename LeaseCollection>
645  void getLeaseCollection(StatementIndex stindex, MYSQL_BIND* bind,
646  Exchange& exchange, LeaseCollection& result,
647  bool single = false) const;
648 
665  void getLeaseCollection(StatementIndex stindex, MYSQL_BIND* bind,
666  Lease4Collection& result) const {
667  getLeaseCollection(stindex, bind, exchange4_, result);
668  }
669 
685  void getLeaseCollection(StatementIndex stindex, MYSQL_BIND* bind,
686  Lease6Collection& result) const {
687  getLeaseCollection(stindex, bind, exchange6_, result);
688  }
689 
699  void getLease(StatementIndex stindex, MYSQL_BIND* bind,
700  Lease4Ptr& result) const;
701 
711  void getLease(StatementIndex stindex, MYSQL_BIND* bind,
712  Lease6Ptr& result) const;
713 
714 
729  template<typename LeaseCollection>
730  void getExpiredLeasesCommon(LeaseCollection& expired_leases,
731  const size_t max_leases,
732  StatementIndex statement_index) const;
733 
750  template <typename LeasePtr>
751  void updateLeaseCommon(StatementIndex stindex, MYSQL_BIND* bind,
752  const LeasePtr& lease);
753 
769  uint64_t deleteLeaseCommon(StatementIndex stindex, MYSQL_BIND* bind);
770 
780  uint64_t deleteExpiredReclaimedLeasesCommon(const uint32_t secs,
781  StatementIndex statement_index);
782 
793  void checkError(int status, StatementIndex index,
794  const char* what) const;
795 
796  // Members
797 
802  boost::scoped_ptr<MySqlLease4Exchange> exchange4_;
803  boost::scoped_ptr<MySqlLease6Exchange> exchange6_;
804 
806  db::MySqlConnection conn_;
807 };
808 
809 } // namespace dhcp
810 } // namespace isc
811 
812 #endif // MYSQL_LEASE_MGR_H
isc::dhcp::MySqlLeaseMgr::deleteExpiredReclaimedLeases4
virtual uint64_t deleteExpiredReclaimedLeases4(const uint32_t secs)
Deletes all expired-reclaimed DHCPv4 leases.
Definition: mysql_lease_mgr.cc:2569
isc::dhcp::LeasePageSize
Wraps value holding size of the page with leases.
Definition: lease_mgr.h:43
isc::dhcp::MySqlLeaseMgr::wipeLeases4
virtual size_t wipeLeases4(const SubnetID &subnet_id)
Removes specified IPv4 leases.
Definition: mysql_lease_mgr.cc:2674
isc::dhcp::MySqlLeaseMgr::GET_LEASE4_CLIENTID
@ GET_LEASE4_CLIENTID
Definition: mysql_lease_mgr.h:578
isc::dhcp::MySqlLeaseMgr::getLeases4
virtual Lease4Collection getLeases4() const
Returns all IPv4 leases.
Definition: mysql_lease_mgr.cc:2097
isc::dhcp::MySqlLeaseMgr::addLease
virtual bool addLease(const Lease4Ptr &lease)
Adds an IPv4 lease.
Definition: mysql_lease_mgr.cc:1748
isc::dhcp::MySqlLeaseMgr::getDescription
virtual std::string getDescription() const
Returns description of the backend.
Definition: mysql_lease_mgr.cc:2697
isc::dhcp::MySqlLeaseMgr::commit
virtual void commit()
Commit Transactions.
Definition: mysql_lease_mgr.cc:2762
isc::dhcp::Lease4Ptr
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
Definition: lease.h:245
isc::dhcp::MySqlLeaseMgr::StatementIndex
StatementIndex
Statement Tags.
Definition: mysql_lease_mgr.h:571
isc::dhcp::MySqlLeaseMgr::SUBNET_LEASE6_STATS
@ SUBNET_LEASE6_STATS
Definition: mysql_lease_mgr.h:601
isc::dhcp::MySqlLeaseMgr::deleteLease
virtual bool deleteLease(const isc::asiolink::IOAddress &addr)
Deletes a lease.
Definition: mysql_lease_mgr.cc:2536
isc::dhcp::LeaseMgr
Abstract Lease Manager.
Definition: lease_mgr.h:222
isc::dhcp::Lease6Ptr
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
Definition: lease.h:460
isc::dhcp::MySqlLeaseMgr::INSERT_LEASE6
@ INSERT_LEASE6
Definition: mysql_lease_mgr.h:594
isc::dhcp::MySqlLeaseMgr::ALL_LEASE4_STATS
@ ALL_LEASE4_STATS
Definition: mysql_lease_mgr.h:597
isc::dhcp::MySqlLeaseMgr::INSERT_LEASE4
@ INSERT_LEASE4
Definition: mysql_lease_mgr.h:593
isc::dhcp::Lease::Type
Type
Type of lease or pool.
Definition: lease.h:38
isc::dhcp::MySqlLeaseMgr::DELETE_LEASE6_STATE_EXPIRED
@ DELETE_LEASE6_STATE_EXPIRED
Definition: mysql_lease_mgr.h:575
isc::dhcp::MySqlLeaseMgr::startSubnetRangeLeaseStatsQuery6
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery6(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id)
Creates and runs the IPv6 lease stats query for a single subnet.
Definition: mysql_lease_mgr.cc:2663
isc::dhcp::HWAddr
Hardware type that represents information from DHCPv4 packet.
Definition: hwaddr.h:20
isc::dhcp::MySqlLeaseMgr::GET_LEASE4
@ GET_LEASE4
Definition: mysql_lease_mgr.h:576
isc::dhcp::MySqlLeaseMgr::GET_LEASE6_EXPIRE
@ GET_LEASE6_EXPIRE
Definition: mysql_lease_mgr.h:592
lease_mgr.h
An abstract API for lease database.
isc::dhcp::MySqlLeaseMgr::GET_LEASE6_ADDR
@ GET_LEASE6_ADDR
Definition: mysql_lease_mgr.h:586
isc::dhcp::MySqlLeaseMgr::NUM_STATEMENTS
@ NUM_STATEMENTS
Definition: mysql_lease_mgr.h:603
isc::dhcp::MySqlLeaseMgr::startLeaseStatsQuery6
virtual LeaseStatsQueryPtr startLeaseStatsQuery6()
Creates and runs the IPv6 lease stats query.
Definition: mysql_lease_mgr.cc:2644
isc::dhcp::MySqlLeaseMgr::startSubnetLeaseStatsQuery4
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery4(const SubnetID &subnet_id)
Creates and runs the IPv4 lease stats query for a single subnet.
Definition: mysql_lease_mgr.cc:2623
isc::dhcp::MySqlLeaseMgr::getLease4
virtual Lease4Ptr getLease4(const isc::asiolink::IOAddress &addr) const
Returns an IPv4 lease for specified IPv4 address.
Definition: mysql_lease_mgr.cc:1901
isc
Defines the logger used by the top-level component of kea-dhcp-ddns.
Definition: agent_parser.cc:144
isc::dhcp::MySqlLeaseMgr::updateLease4
virtual void updateLease4(const Lease4Ptr &lease4)
Updates IPv4 lease.
Definition: mysql_lease_mgr.cc:2461
isc::dhcp::MySqlLeaseMgr::getLease6
virtual Lease6Ptr getLease6(Lease::Type type, const isc::asiolink::IOAddress &addr) const
Returns existing IPv6 lease for a given IPv6 address.
Definition: mysql_lease_mgr.cc:2144
isc::dhcp::MySqlLeaseMgr::MySqlLeaseMgr
MySqlLeaseMgr(const db::DatabaseConnection::ParameterMap &parameters)
Constructor.
Definition: mysql_lease_mgr.cc:1667
isc::dhcp::MySqlLeaseMgr
MySQL Lease Manager.
Definition: mysql_lease_mgr.h:35
isc::dhcp::MySqlLeaseMgr::GET_LEASE6
@ GET_LEASE6
Definition: mysql_lease_mgr.h:585
isc::dhcp::ClientId
Holds Client identifier or client IPv4 address.
Definition: duid.h:111
isc::dhcp::MySqlLeaseMgr::GET_LEASE6_SUBID
@ GET_LEASE6_SUBID
Definition: mysql_lease_mgr.h:590
isc::dhcp::MySqlLeaseMgr::updateLease6
virtual void updateLease6(const Lease6Ptr &lease6)
Updates IPv6 lease.
Definition: mysql_lease_mgr.cc:2485
isc::dhcp::MySqlLeaseMgr::DELETE_LEASE6
@ DELETE_LEASE6
Definition: mysql_lease_mgr.h:574
isc::dhcp::MySqlLeaseMgr::GET_LEASE4_ADDR
@ GET_LEASE4_ADDR
Definition: mysql_lease_mgr.h:577
isc::dhcp::MySqlLeaseMgr::rollback
virtual void rollback()
Rollback Transactions.
Definition: mysql_lease_mgr.cc:2770
isc::dhcp::MySqlLeaseMgr::getExpiredLeases6
virtual void getExpiredLeases6(Lease6Collection &expired_leases, const size_t max_leases) const
Returns a collection of expired DHCPv6 leases.
Definition: mysql_lease_mgr.cc:2388
isc::dhcp::MySqlLeaseMgr::GET_LEASE4_CLIENTID_SUBID
@ GET_LEASE4_CLIENTID_SUBID
Definition: mysql_lease_mgr.h:579
isc::dhcp::MySqlLeaseMgr::startSubnetLeaseStatsQuery6
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery6(const SubnetID &subnet_id)
Creates and runs the IPv6 lease stats query for a single subnet.
Definition: mysql_lease_mgr.cc:2653
isc::dhcp::MySqlLeaseMgr::getVersion
virtual std::pair< uint32_t, uint32_t > getVersion() const
Returns backend version.
Definition: mysql_lease_mgr.cc:2702
isc::dhcp::MySqlLeaseMgr::GET_LEASE6_PAGE
@ GET_LEASE6_PAGE
Definition: mysql_lease_mgr.h:589
isc::dhcp::MySqlLeaseMgr::startSubnetRangeLeaseStatsQuery4
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery4(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id)
Creates and runs the IPv4 lease stats query for a single subnet.
Definition: mysql_lease_mgr.cc:2633
isc::dhcp::MySqlLeaseMgr::GET_LEASE4_HWADDR_SUBID
@ GET_LEASE4_HWADDR_SUBID
Definition: mysql_lease_mgr.h:581
isc::dhcp::LeasePtr
boost::shared_ptr< Lease > LeasePtr
Pointer to the lease object.
Definition: lease.h:26
isc::dhcp::MySqlLeaseMgr::GET_LEASE4_HWADDR
@ GET_LEASE4_HWADDR
Definition: mysql_lease_mgr.h:580
isc::dhcp::MySqlLeaseMgr::wipeLeases6
virtual size_t wipeLeases6(const SubnetID &subnet_id)
Removed specified IPv6 leases.
Definition: mysql_lease_mgr.cc:2679
isc::dhcp::MySqlLeaseMgr::DELETE_LEASE4_STATE_EXPIRED
@ DELETE_LEASE4_STATE_EXPIRED
Definition: mysql_lease_mgr.h:573
isc::dhcp::MySqlLeaseMgr::GET_LEASE4_PAGE
@ GET_LEASE4_PAGE
Definition: mysql_lease_mgr.h:582
hwaddr.h
isc::dhcp::MySqlLeaseMgr::getType
virtual std::string getType() const
Return backend type.
Definition: mysql_lease_mgr.h:520
isc::dhcp::MySqlLeaseMgr::getName
virtual std::string getName() const
Returns backend name.
Definition: mysql_lease_mgr.cc:2686
isc::dhcp::MySqlLeaseMgr::getExpiredLeases4
virtual void getExpiredLeases4(Lease4Collection &expired_leases, const size_t max_leases) const
Returns a collection of expired DHCPv4 leases.
Definition: mysql_lease_mgr.cc:2380
isc::dhcp::MySqlLeaseMgr::SUBNET_RANGE_LEASE4_STATS
@ SUBNET_RANGE_LEASE4_STATS
Definition: mysql_lease_mgr.h:599
isc::dhcp::Lease4Collection
std::vector< Lease4Ptr > Lease4Collection
A collection of IPv4 leases.
Definition: lease.h:455
isc::dhcp::MySqlLeaseMgr::GET_LEASE6_DUID_IAID
@ GET_LEASE6_DUID_IAID
Definition: mysql_lease_mgr.h:587
isc::dhcp::MySqlLeaseMgr::startLeaseStatsQuery4
virtual LeaseStatsQueryPtr startLeaseStatsQuery4()
Creates and runs the IPv4 lease stats query.
Definition: mysql_lease_mgr.cc:2614
isc::dhcp::MySqlLeaseMgr::UPDATE_LEASE4
@ UPDATE_LEASE4
Definition: mysql_lease_mgr.h:595
isc::dhcp::LeaseStatsQueryPtr
boost::shared_ptr< LeaseStatsQuery > LeaseStatsQueryPtr
Defines a pointer to a LeaseStatsQuery.
Definition: lease_mgr.h:207
isc::dhcp::MySqlLeaseMgr::ALL_LEASE6_STATS
@ ALL_LEASE6_STATS
Definition: mysql_lease_mgr.h:600
isc::dhcp::MySqlLeaseMgr::GET_LEASE6_DUID
@ GET_LEASE6_DUID
Definition: mysql_lease_mgr.h:591
mysql_connection.h
isc::dhcp::DUID
Holds DUID (DHCPv6 Unique Identifier)
Definition: duid.h:27
isc::dhcp::MySqlLeaseMgr::getDBVersion
static std::string getDBVersion()
Local version of getDBVersion() class method.
Definition: mysql_lease_mgr.cc:1710
isc::dhcp::MySqlLeaseMgr::SUBNET_RANGE_LEASE6_STATS
@ SUBNET_RANGE_LEASE6_STATS
Definition: mysql_lease_mgr.h:602
isc::dhcp::MySqlLeaseMgr::deleteExpiredReclaimedLeases6
virtual uint64_t deleteExpiredReclaimedLeases6(const uint32_t secs)
Deletes all expired-reclaimed DHCPv6 leases.
Definition: mysql_lease_mgr.cc:2577
isc::dhcp::MySqlLeaseMgr::GET_LEASE4_SUBID
@ GET_LEASE4_SUBID
Definition: mysql_lease_mgr.h:583
isc::dhcp::SubnetID
uint32_t SubnetID
Unique identifier for a subnet (both v4 and v6)
Definition: lease.h:24
isc::dhcp::Lease6Collection
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
Definition: lease.h:604
isc::db::DatabaseConnection::ParameterMap
std::map< std::string, std::string > ParameterMap
Database configuration parameter map.
Definition: database_connection.h:152
isc::dhcp::MySqlLeaseMgr::GET_LEASE4_EXPIRE
@ GET_LEASE4_EXPIRE
Definition: mysql_lease_mgr.h:584
dhcpsrv_exceptions.h
isc::dhcp::MySqlLeaseMgr::getLeases6
virtual Lease6Collection getLeases6() const
Returns all IPv6 leases.
Definition: mysql_lease_mgr.cc:2299
isc::dhcp::MySqlLeaseMgr::SUBNET_LEASE4_STATS
@ SUBNET_LEASE4_STATS
Definition: mysql_lease_mgr.h:598
isc::dhcp::MySqlLeaseMgr::DELETE_LEASE4
@ DELETE_LEASE4
Definition: mysql_lease_mgr.h:572
isc::dhcp::MySqlLeaseMgr::~MySqlLeaseMgr
virtual ~MySqlLeaseMgr()
Destructor (closes database)
Definition: mysql_lease_mgr.cc:1704
isc::dhcp::MySqlLeaseMgr::GET_LEASE6_DUID_IAID_SUBID
@ GET_LEASE6_DUID_IAID_SUBID
Definition: mysql_lease_mgr.h:588
isc::dhcp::MySqlLeaseMgr::UPDATE_LEASE6
@ UPDATE_LEASE6
Definition: mysql_lease_mgr.h:596