namespace {
const size_t ADDRESS6_TEXT_MAX_LEN = 39;
+const size_t MAX_PARAMETERS_IN_QUERY = 12;
+
struct TaggedStatement {
PgSqlLeaseMgr::StatementIndex index;
- int nbparams;
- const Oid types[10];
- const char * name;
- const char * text;
+ int nbparams;
+ const Oid types[MAX_PARAMETERS_IN_QUERY + 1];
+ const char* name;
+ const char* text;
};
TaggedStatement tagged_statements[] = {
"get_lease4_addr",
"DECLARE get_lease4_addr CURSOR FOR "
"SELECT address, hwaddr, client_id, "
- "valid_lifetime, extract(epoch from expire), subnet_id "
+ "valid_lifetime, extract(epoch from expire), subnet_id, fqdn_fwd, fqdn_rev, hostname "
"FROM lease4 "
"WHERE address = $1"},
{PgSqlLeaseMgr::GET_LEASE4_CLIENTID, 1,
"get_lease4_clientid",
"DECLARE get_lease4_clientid CURSOR FOR "
"SELECT address, hwaddr, client_id, "
- "valid_lifetime, extract(epoch from expire), subnet_id "
+ "valid_lifetime, extract(epoch from expire), subnet_id, fqdn_fwd, fqdn_rev, hostname "
"FROM lease4 "
"WHERE client_id = $1"},
{PgSqlLeaseMgr::GET_LEASE4_CLIENTID_SUBID, 2,
"get_lease4_clientid_subid",
"DECLARE get_lease4_clientid_subid CURSOR FOR "
"SELECT address, hwaddr, client_id, "
- "valid_lifetime, extract(epoch from expire)::bigint, subnet_id "
+ "valid_lifetime, extract(epoch from expire)::bigint, subnet_id, fqdn_fwd, fqdn_rev, hostname "
"FROM lease4 "
"WHERE client_id = $1 AND subnet_id = $2"},
{PgSqlLeaseMgr::GET_LEASE4_HWADDR, 1,
"get_lease4_hwaddr",
"DECLARE get_lease4_hwaddr CURSOR FOR "
"SELECT address, hwaddr, client_id, "
- "valid_lifetime, extract(epoch from expire)::bigint, subnet_id "
+ "valid_lifetime, extract(epoch from expire)::bigint, subnet_id, fqdn_fwd, fqdn_rev, hostname "
"FROM lease4 "
"WHERE hwaddr = $1"},
{PgSqlLeaseMgr::GET_LEASE4_HWADDR_SUBID, 2,
"get_lease4_hwaddr_subid",
"DECLARE get_lease4_hwaddr_subid CURSOR FOR "
"SELECT address, hwaddr, client_id, "
- "valid_lifetime, extract(epoch from expire)::bigint, subnet_id "
+ "valid_lifetime, extract(epoch from expire)::bigint, subnet_id, fqdn_fwd, fqdn_rev, hostname "
"FROM lease4 "
"WHERE hwaddr = $1 AND subnet_id = $2"},
{PgSqlLeaseMgr::GET_LEASE6_ADDR, 1,
"DECLARE get_lease6_addr CURSOR FOR "
"SELECT address, duid, valid_lifetime, "
"extract(epoch from expire)::bigint, subnet_id, pref_lifetime, "
- "lease_type, iaid, prefix_len "
+ "lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname "
"FROM lease6 "
"WHERE address = $1"},
{PgSqlLeaseMgr::GET_LEASE6_DUID_IAID, 2,
"DECLARE get_lease6_duid_iaid CURSOR FOR "
"SELECT address, duid, valid_lifetime, "
"extract(epoch from expire)::bigint, subnet_id, pref_lifetime, "
- "lease_type, iaid, prefix_len "
+ "lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname "
"FROM lease6 "
"WHERE duid = $1 AND iaid = $2"},
{PgSqlLeaseMgr::GET_LEASE6_DUID_IAID_SUBID, 3,
"DECLARE get_lease6_duid_iaid_subid CURSOR FOR "
"SELECT address, duid, valid_lifetime, "
"extract(epoch from expire)::bigint, subnet_id, pref_lifetime, "
- "lease_type, iaid, prefix_len "
+ "lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname "
"FROM lease6 "
"WHERE duid = $1 AND iaid = $2 AND subnet_id = $3"},
{PgSqlLeaseMgr::GET_VERSION, 0,
"get_version",
"DECLARE get_version CURSOR FOR "
"SELECT version, minor FROM schema_version"},
- {PgSqlLeaseMgr::INSERT_LEASE4, 6,
- { 20, 17, 17, 20, 1114, 20 },
+ {PgSqlLeaseMgr::INSERT_LEASE4, 9,
+ { 20, 17, 17, 20, 1114, 20, 16, 16, 1043 },
"insert_lease4",
"INSERT INTO lease4(address, hwaddr, client_id, "
- "valid_lifetime, expire, subnet_id) "
- "VALUES ($1, $2, $3, $4, $5, $6)"},
- {PgSqlLeaseMgr::INSERT_LEASE6, 9,
- { 1043, 17, 20, 1114, 20,
- 20, 21, 20, 21 },
+ "valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname) "
+ "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)"},
+ {PgSqlLeaseMgr::INSERT_LEASE6, 12,
+ { 1043, 17, 20, 1114, 20, 20, 21, 20, 21, 16, 16, 1043 },
"insert_lease6",
"INSERT INTO lease6(address, duid, valid_lifetime, "
"expire, subnet_id, pref_lifetime, "
- "lease_type, iaid, prefix_len) "
- "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)"},
- {PgSqlLeaseMgr::UPDATE_LEASE4, 7,
- { 20, 17, 17, 20, 1114, 20, 20 },
+ "lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname) "
+ "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)"},
+ {PgSqlLeaseMgr::UPDATE_LEASE4, 10,
+ { 20, 17, 17, 20, 1114, 20, 16, 16, 1043, 20 },
"update_lease4",
"UPDATE lease4 SET address = $1, hwaddr = $2, "
"client_id = $3, valid_lifetime = $4, expire = $5, "
- "subnet_id = $6 "
- "WHERE address = $7"},
+ "subnet_id = $6, fqdn_fwd = $7, fqdn_rev = $8, hostname = $9 "
+ "WHERE address = $10"},
{PgSqlLeaseMgr::UPDATE_LEASE6, 10,
{ 1043, 17, 20, 1114, 20,
20, 21, 20, 21, 1043 },
localtime_r(&expire_, &tinfo);
strftime(buffer_, 20, "%Y-%m-%d %H:%M:%S", &tinfo);
}
+
+ bool stringToBool(char* value) {
+ if (!strlen(value)) {
+ return (false);
+ }
+ switch (value[0]) {
+ case 't':
+ return (true);
+ case 'f':
+ return (false);
+ default:
+ isc_throw(BadValue, "Received " << value[0] << " as boolean. The "
+ " only accepted values are 't', 'f' or ''");
+ }
+ }
};
class PgSqlLease4Exchange : public PgSqlLeaseExchange {
- static const size_t LEASE_COLUMNS = 6;
+ static const size_t LEASE_COLUMNS = 9;
public:
PgSqlLease4Exchange() : addr4_(0) {
memset(hwaddr_buffer_, 0, sizeof(hwaddr_buffer_));
columns_[3] = "valid_lifetime";
columns_[4] = "expire";
columns_[5] = "subnet_id";
+ columns_[6] = "fqdn_fwd";
+ columns_[7] = "fqdn_rev";
+ columns_[8] = "hostname";
- BOOST_STATIC_ASSERT(5 < LEASE_COLUMNS);
+ BOOST_STATIC_ASSERT(8 < LEASE_COLUMNS);
params.reserve(LEASE_COLUMNS);
}
tmp.str("");
tmp.clear();
- uint8_t* data = const_cast<uint8_t*>(&(lease_->hwaddr_[0]));
- PgSqlParam pdest = { .value = reinterpret_cast<char *>(data),
- .isbinary = 1,
- .binarylen = static_cast<int>(lease_->hwaddr_.size()) };
- params.push_back(pdest);
+ // Although HWADDR object will always be there, it may be just an empty vector
+ if (!lease_->hwaddr_.empty()) {
+ uint8_t* data = const_cast<uint8_t*>(&(lease_->hwaddr_[0]));
+ PgSqlParam pdest = { .value = reinterpret_cast<char *>(data),
+ .isbinary = 1,
+ .binarylen = static_cast<int>(lease_->hwaddr_.size()) };
+ params.push_back(pdest);
+ } else {
+ params.push_back(PgSqlParam());
+ }
if(lease_->client_id_) {
vector<uint8_t> client_data = lease_->client_id_->getClientId();
PgSqlParam psubnet_id = { .value = tmp.str() };
params.push_back(psubnet_id);
- BOOST_STATIC_ASSERT(5 < LEASE_COLUMNS);
+ PgSqlParam fqdn_fwd = { .value = lease_->fqdn_fwd_?"TRUE":"FALSE" };
+ PgSqlParam fqdn_rev = { .value = lease_->fqdn_fwd_?"TRUE":"FALSE" };
+ PgSqlParam hostname = { .value = lease_->hostname_ };
+
+ params.push_back(fqdn_fwd);
+ params.push_back(fqdn_rev);
+ params.push_back(hostname);
+
+ BOOST_STATIC_ASSERT(8 < LEASE_COLUMNS);
return (params);
}
time_t cltt = expire_ - valid_lifetime_;
+ // Extract fqdn_fwd, fqdn_rev
+ // boolean is represented as one of 3 possible strings:
+ // "" (means NULL or not set), "t" (means true), "f" (means false)
+ bool fwd = stringToBool(PQgetvalue(r, line, 6));
+ bool rev = stringToBool(PQgetvalue(r, line, 7));
+
+ // Extract hostname field
+ string hostname(PQgetvalue(r, line, 8));
+
return (Lease4Ptr(new Lease4(addr4_, hwaddr_buffer_, hwaddr_length_,
client_id_buffer_, client_id_length_,
- valid_lifetime_, 0, 0, cltt, subnet_id_)));
+ valid_lifetime_, 0, 0, cltt, subnet_id_,
+ fwd, rev, hostname)));
}
private:
uint32_t valid_lifetime_;
unsigned long hwaddr_length_;
unsigned long client_id_length_;
+ string hostname_;
};
class PgSqlLease6Exchange : public PgSqlLeaseExchange {
- static const size_t LEASE_COLUMNS = 9;
+ static const size_t LEASE_COLUMNS = 12;
public:
PgSqlLease6Exchange() {
memset(duid_buffer_, 0, sizeof(duid_buffer_));
columns_[6] = "lease_type";
columns_[7] = "iaid";
columns_[8] = "prefix_len";
+ columns_[9] = "fqdn_fwd";
+ columns_[10]= "fqdn_rev";
+ columns_[11]= "hostname";
BOOST_STATIC_ASSERT(8 < LEASE_COLUMNS);
params.reserve(LEASE_COLUMNS);
PgSqlParam prefixlen = { .value = tmp.str() };
params.push_back(prefixlen);
- BOOST_STATIC_ASSERT(8 < LEASE_COLUMNS);
+ PgSqlParam fqdn_fwd = { .value = lease_->fqdn_fwd_?"TRUE":"FALSE" };
+ PgSqlParam fqdn_rev = { .value = lease_->fqdn_rev_?"TRUE":"FALSE" };
+ PgSqlParam hostname = { .value = lease_->hostname_ };
+
+ params.push_back(fqdn_fwd);
+ params.push_back(fqdn_rev);
+ params.push_back(hostname);
+
+ BOOST_STATIC_ASSERT(11 < LEASE_COLUMNS);
return (params);
}
addr6_ << ". Only 0, 1, or 2 are allowed.");
}
+ // Extract fqdn_fwd, fqdn_rev
+ // boolean is represented as one of 3 possible strings:
+ // "" (means NULL or not set), "t" (means true), "f" (means false)
+ bool fwd = stringToBool(PQgetvalue(r, line, 9));
+ bool rev = stringToBool(PQgetvalue(r, line, 10));
+
+ // Extract hostname field
+ string hostname(PQgetvalue(r, line, 11));
+
// Set up DUID,
DuidPtr duid_ptr(new DUID(duid_buffer_, duid_length_));
Lease6Ptr result(new Lease6(type, addr, duid_ptr, iaid_,
pref_lifetime_, valid_lifetime_, 0, 0,
- subnet_id_, prefixlen_));
+ subnet_id_, fwd, rev, hostname, prefixlen_));
time_t cltt = expire_ - valid_lifetime_;
result->cltt_ = cltt;
bindparams params = exchange4_->createBindForSend(lease);
// Set up the WHERE clause and append it to the MYSQL_BIND array
- tmp << lease->addr_;
+ tmp << static_cast<uint32_t>(lease->addr_);
PgSqlParam addr4 = { .value = tmp.str() };
params.push_back(addr4);
if (addr.isV4()) {
ostringstream tmp;
- tmp << addr;
+ tmp << static_cast<uint32_t>(addr);
PgSqlParam addr4 = { .value = tmp.str() };
inparams.push_back(addr4);