2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-31 05:55:28 +00:00

[3673] Throw DbOperationError exceptions when time conversion fails.

This commit is contained in:
Marcin Siodelski
2015-03-04 14:50:37 +01:00
parent 8fa9106272
commit 4f83df70a2
2 changed files with 303 additions and 292 deletions

View File

@@ -350,109 +350,113 @@ public:
// Set up the structures for the various components of the lease4
// structure.
// Address: uint32_t
// The address in the Lease structure is an IOAddress object. Convert
// this to an integer for storage.
addr4_ = static_cast<uint32_t>(lease_->addr_);
bind_[0].buffer_type = MYSQL_TYPE_LONG;
bind_[0].buffer = reinterpret_cast<char*>(&addr4_);
bind_[0].is_unsigned = MLM_TRUE;
// bind_[0].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// hwaddr: varbinary(128)
// For speed, we avoid copying the data into temporary storage and
// instead extract it from the lease structure directly.
hwaddr_length_ = lease_->hwaddr_->hwaddr_.size();
bind_[1].buffer_type = MYSQL_TYPE_BLOB;
bind_[1].buffer = reinterpret_cast<char*>(&(lease_->hwaddr_->hwaddr_[0]));
bind_[1].buffer_length = hwaddr_length_;
bind_[1].length = &hwaddr_length_;
// bind_[1].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// client_id: varbinary(128)
if (lease_->client_id_) {
client_id_ = lease_->client_id_->getClientId();
client_id_length_ = client_id_.size();
bind_[2].buffer_type = MYSQL_TYPE_BLOB;
bind_[2].buffer = reinterpret_cast<char*>(&client_id_[0]);
bind_[2].buffer_length = client_id_length_;
bind_[2].length = &client_id_length_;
// bind_[2].is_null = &MLM_FALSE; // commented out for performance
try {
// Address: uint32_t
// The address in the Lease structure is an IOAddress object. Convert
// this to an integer for storage.
addr4_ = static_cast<uint32_t>(lease_->addr_);
bind_[0].buffer_type = MYSQL_TYPE_LONG;
bind_[0].buffer = reinterpret_cast<char*>(&addr4_);
bind_[0].is_unsigned = MLM_TRUE;
// bind_[0].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
} else {
bind_[2].buffer_type = MYSQL_TYPE_NULL;
// According to http://dev.mysql.com/doc/refman/5.5/en/
// c-api-prepared-statement-data-structures.html, the other
// fields doesn't matter if type is set to MYSQL_TYPE_NULL,
// but let's set them to some sane values in case earlier versions
// didn't have that assumption.
client_id_null_ = MLM_TRUE;
bind_[2].buffer = NULL;
bind_[2].is_null = &client_id_null_;
// hwaddr: varbinary(128)
// For speed, we avoid copying the data into temporary storage and
// instead extract it from the lease structure directly.
hwaddr_length_ = lease_->hwaddr_->hwaddr_.size();
bind_[1].buffer_type = MYSQL_TYPE_BLOB;
bind_[1].buffer = reinterpret_cast<char*>(&(lease_->hwaddr_->hwaddr_[0]));
bind_[1].buffer_length = hwaddr_length_;
bind_[1].length = &hwaddr_length_;
// bind_[1].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// client_id: varbinary(128)
if (lease_->client_id_) {
client_id_ = lease_->client_id_->getClientId();
client_id_length_ = client_id_.size();
bind_[2].buffer_type = MYSQL_TYPE_BLOB;
bind_[2].buffer = reinterpret_cast<char*>(&client_id_[0]);
bind_[2].buffer_length = client_id_length_;
bind_[2].length = &client_id_length_;
// bind_[2].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
} else {
bind_[2].buffer_type = MYSQL_TYPE_NULL;
// According to http://dev.mysql.com/doc/refman/5.5/en/
// c-api-prepared-statement-data-structures.html, the other
// fields doesn't matter if type is set to MYSQL_TYPE_NULL,
// but let's set them to some sane values in case earlier versions
// didn't have that assumption.
client_id_null_ = MLM_TRUE;
bind_[2].buffer = NULL;
bind_[2].is_null = &client_id_null_;
}
// valid lifetime: unsigned int
bind_[3].buffer_type = MYSQL_TYPE_LONG;
bind_[3].buffer = reinterpret_cast<char*>(&lease_->valid_lft_);
bind_[3].is_unsigned = MLM_TRUE;
// bind_[3].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// expire: timestamp
// The lease structure holds the client last transmission time (cltt_)
// For convenience for external tools, this is converted to lease
// expiry time (expire). The relationship is given by:
//
// expire = cltt_ + valid_lft_
MySqlLeaseMgr::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_,
expire_);
bind_[4].buffer_type = MYSQL_TYPE_TIMESTAMP;
bind_[4].buffer = reinterpret_cast<char*>(&expire_);
bind_[4].buffer_length = sizeof(expire_);
// bind_[4].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// subnet_id: unsigned int
// Can use lease_->subnet_id_ directly as it is of type uint32_t.
bind_[5].buffer_type = MYSQL_TYPE_LONG;
bind_[5].buffer = reinterpret_cast<char*>(&lease_->subnet_id_);
bind_[5].is_unsigned = MLM_TRUE;
// bind_[5].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// fqdn_fwd: boolean
bind_[6].buffer_type = MYSQL_TYPE_TINY;
bind_[6].buffer = reinterpret_cast<char*>(&lease_->fqdn_fwd_);
bind_[6].is_unsigned = MLM_TRUE;
// bind_[6].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// fqdn_rev: boolean
bind_[7].buffer_type = MYSQL_TYPE_TINY;
bind_[7].buffer = reinterpret_cast<char*>(&lease_->fqdn_rev_);
bind_[7].is_unsigned = MLM_TRUE;
// bind_[7].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// hostname: varchar(255)
bind_[8].buffer_type = MYSQL_TYPE_VARCHAR;
bind_[8].buffer = const_cast<char*>(lease_->hostname_.c_str());
bind_[8].buffer_length = lease_->hostname_.length();
// bind_[8].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// Add the error flags
setErrorIndicators(bind_, error_, LEASE_COLUMNS);
// .. and check that we have the numbers correct at compile time.
BOOST_STATIC_ASSERT(8 < LEASE_COLUMNS);
} catch (const std::exception& ex) {
isc_throw(DbOperationError,
"Could not create bind array from Lease4: "
<< lease_->addr_.toText() << ", reason: " << ex.what());
}
// valid lifetime: unsigned int
bind_[3].buffer_type = MYSQL_TYPE_LONG;
bind_[3].buffer = reinterpret_cast<char*>(&lease_->valid_lft_);
bind_[3].is_unsigned = MLM_TRUE;
// bind_[3].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// expire: timestamp
// The lease structure holds the client last transmission time (cltt_)
// For convenience for external tools, this is converted to lease
// expiry time (expire). The relationship is given by:
//
// expire = cltt_ + valid_lft_
//
// @todo Handle overflows - a large enough valid_lft_ could cause
// an overflow on a 32-bit system.
MySqlLeaseMgr::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_,
expire_);
bind_[4].buffer_type = MYSQL_TYPE_TIMESTAMP;
bind_[4].buffer = reinterpret_cast<char*>(&expire_);
bind_[4].buffer_length = sizeof(expire_);
// bind_[4].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// subnet_id: unsigned int
// Can use lease_->subnet_id_ directly as it is of type uint32_t.
bind_[5].buffer_type = MYSQL_TYPE_LONG;
bind_[5].buffer = reinterpret_cast<char*>(&lease_->subnet_id_);
bind_[5].is_unsigned = MLM_TRUE;
// bind_[5].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// fqdn_fwd: boolean
bind_[6].buffer_type = MYSQL_TYPE_TINY;
bind_[6].buffer = reinterpret_cast<char*>(&lease_->fqdn_fwd_);
bind_[6].is_unsigned = MLM_TRUE;
// bind_[6].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// fqdn_rev: boolean
bind_[7].buffer_type = MYSQL_TYPE_TINY;
bind_[7].buffer = reinterpret_cast<char*>(&lease_->fqdn_rev_);
bind_[7].is_unsigned = MLM_TRUE;
// bind_[7].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// hostname: varchar(255)
bind_[8].buffer_type = MYSQL_TYPE_VARCHAR;
bind_[8].buffer = const_cast<char*>(lease_->hostname_.c_str());
bind_[8].buffer_length = lease_->hostname_.length();
// bind_[8].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// Add the error flags
setErrorIndicators(bind_, error_, LEASE_COLUMNS);
// .. and check that we have the numbers correct at compile time.
BOOST_STATIC_ASSERT(8 < LEASE_COLUMNS);
// Add the data to the vector. Note the end element is one after the
// end of the array.
return (std::vector<MYSQL_BIND>(&bind_[0], &bind_[LEASE_COLUMNS]));
@@ -709,198 +713,204 @@ public:
// code that explicitly sets is_null is there, but is commented out.
memset(bind_, 0, sizeof(bind_));
// address: varchar(39)
addr6_ = lease_->addr_.toText();
addr6_length_ = addr6_.size();
try {
// address: varchar(39)
addr6_ = lease_->addr_.toText();
addr6_length_ = addr6_.size();
// In the following statement, the string is being read. However, the
// MySQL C interface does not use "const", so the "buffer" element
// is declared as "char*" instead of "const char*". To resolve this,
// the "const" is discarded. (Note that the address of addr6_.c_str()
// is guaranteed to be valid until the next non-const operation on
// addr6_.)
//
// The const_cast could be avoided by copying the string to a writeable
// buffer and storing the address of that in the "buffer" element.
// However, this introduces a copy operation (with additional overhead)
// purely to get round the structures introduced by design of the
// MySQL interface (which uses the area pointed to by "buffer" as input
// when specifying query parameters and as output when retrieving data).
// For that reason, "const_cast" has been used.
bind_[0].buffer_type = MYSQL_TYPE_STRING;
bind_[0].buffer = const_cast<char*>(addr6_.c_str());
bind_[0].buffer_length = addr6_length_;
bind_[0].length = &addr6_length_;
// bind_[0].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// In the following statement, the string is being read. However, the
// MySQL C interface does not use "const", so the "buffer" element
// is declared as "char*" instead of "const char*". To resolve this,
// the "const" is discarded. (Note that the address of addr6_.c_str()
// is guaranteed to be valid until the next non-const operation on
// addr6_.)
//
// The const_cast could be avoided by copying the string to a writeable
// buffer and storing the address of that in the "buffer" element.
// However, this introduces a copy operation (with additional overhead)
// purely to get round the structures introduced by design of the
// MySQL interface (which uses the area pointed to by "buffer" as input
// when specifying query parameters and as output when retrieving data).
// For that reason, "const_cast" has been used.
bind_[0].buffer_type = MYSQL_TYPE_STRING;
bind_[0].buffer = const_cast<char*>(addr6_.c_str());
bind_[0].buffer_length = addr6_length_;
bind_[0].length = &addr6_length_;
// bind_[0].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// duid: varchar(128)
if (!lease_->duid_) {
isc_throw(DbOperationError, "lease6 for address " << addr6_
<< " is missing mandatory client-id.");
// duid: varchar(128)
if (!lease_->duid_) {
isc_throw(DbOperationError, "lease6 for address " << addr6_
<< " is missing mandatory client-id.");
}
duid_ = lease_->duid_->getDuid();
duid_length_ = duid_.size();
bind_[1].buffer_type = MYSQL_TYPE_BLOB;
bind_[1].buffer = reinterpret_cast<char*>(&(duid_[0]));
bind_[1].buffer_length = duid_length_;
bind_[1].length = &duid_length_;
// bind_[1].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// valid lifetime: unsigned int
bind_[2].buffer_type = MYSQL_TYPE_LONG;
bind_[2].buffer = reinterpret_cast<char*>(&lease_->valid_lft_);
bind_[2].is_unsigned = MLM_TRUE;
// bind_[2].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// expire: timestamp
// The lease structure holds the client last transmission time (cltt_)
// For convenience for external tools, this is converted to lease
/// expiry time (expire). The relationship is given by:
//
// expire = cltt_ + valid_lft_
//
MySqlLeaseMgr::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_,
expire_);
bind_[3].buffer_type = MYSQL_TYPE_TIMESTAMP;
bind_[3].buffer = reinterpret_cast<char*>(&expire_);
bind_[3].buffer_length = sizeof(expire_);
// bind_[3].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// subnet_id: unsigned int
// Can use lease_->subnet_id_ directly as it is of type uint32_t.
bind_[4].buffer_type = MYSQL_TYPE_LONG;
bind_[4].buffer = reinterpret_cast<char*>(&lease_->subnet_id_);
bind_[4].is_unsigned = MLM_TRUE;
// bind_[4].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// pref_lifetime: unsigned int
// Can use lease_->preferred_lft_ directly as it is of type uint32_t.
bind_[5].buffer_type = MYSQL_TYPE_LONG;
bind_[5].buffer = reinterpret_cast<char*>(&lease_->preferred_lft_);
bind_[5].is_unsigned = MLM_TRUE;
// bind_[5].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// lease_type: tinyint
// Must convert to uint8_t as lease_->type_ is a LeaseType variable.
lease_type_ = lease_->type_;
bind_[6].buffer_type = MYSQL_TYPE_TINY;
bind_[6].buffer = reinterpret_cast<char*>(&lease_type_);
bind_[6].is_unsigned = MLM_TRUE;
// bind_[6].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// iaid: unsigned int
// Can use lease_->iaid_ directly as it is of type uint32_t.
bind_[7].buffer_type = MYSQL_TYPE_LONG;
bind_[7].buffer = reinterpret_cast<char*>(&lease_->iaid_);
bind_[7].is_unsigned = MLM_TRUE;
// bind_[7].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// prefix_len: unsigned tinyint
// Can use lease_->prefixlen_ directly as it is uint32_t.
bind_[8].buffer_type = MYSQL_TYPE_TINY;
bind_[8].buffer = reinterpret_cast<char*>(&lease_->prefixlen_);
bind_[8].is_unsigned = MLM_TRUE;
// bind_[8].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// fqdn_fwd: boolean
bind_[9].buffer_type = MYSQL_TYPE_TINY;
bind_[9].buffer = reinterpret_cast<char*>(&lease_->fqdn_fwd_);
bind_[9].is_unsigned = MLM_TRUE;
// bind_[7].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// fqdn_rev: boolean
bind_[10].buffer_type = MYSQL_TYPE_TINY;
bind_[10].buffer = reinterpret_cast<char*>(&lease_->fqdn_rev_);
bind_[10].is_unsigned = MLM_TRUE;
// bind_[10].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// hostname: varchar(255)
bind_[11].buffer_type = MYSQL_TYPE_VARCHAR;
bind_[11].buffer = const_cast<char*>(lease_->hostname_.c_str());
bind_[11].buffer_length = lease_->hostname_.length();
// bind_[11].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// hwaddr: varbinary(20) - hardware/MAC address
HWAddrPtr hwaddr = lease_->hwaddr_;
if (hwaddr) {
hwaddr_ = hwaddr->hwaddr_;
hwaddr_length_ = hwaddr->hwaddr_.size();
bind_[12].buffer_type = MYSQL_TYPE_BLOB;
bind_[12].buffer = reinterpret_cast<char*>(&(hwaddr_[0]));
bind_[12].buffer_length = hwaddr_length_;
bind_[12].length = &hwaddr_length_;
} else {
bind_[12].buffer_type = MYSQL_TYPE_NULL;
// According to http://dev.mysql.com/doc/refman/5.5/en/
// c-api-prepared-statement-data-structures.html, the other
// fields doesn't matter if type is set to MYSQL_TYPE_NULL,
// but let's set them to some sane values in case earlier versions
// didn't have that assumption.
hwaddr_null_ = MLM_TRUE;
bind_[12].buffer = NULL;
bind_[12].is_null = &hwaddr_null_;
}
// hwtype
if (hwaddr) {
hwtype_ = lease->hwaddr_->htype_;
bind_[13].buffer_type = MYSQL_TYPE_SHORT;
bind_[13].buffer = reinterpret_cast<char*>(&hwtype_);
bind_[13].is_unsigned = MLM_TRUE;
} else {
hwtype_ = 0;
bind_[13].buffer_type = MYSQL_TYPE_NULL;
// According to http://dev.mysql.com/doc/refman/5.5/en/
// c-api-prepared-statement-data-structures.html, the other
// fields doesn't matter if type is set to MYSQL_TYPE_NULL,
// but let's set them to some sane values in case earlier versions
// didn't have that assumption.
hwaddr_null_ = MLM_TRUE;
bind_[13].buffer = NULL;
bind_[13].is_null = &hwaddr_null_;
}
/// Hardware source
if (hwaddr) {
hwaddr_source_ = lease->hwaddr_->source_;
bind_[14].buffer_type = MYSQL_TYPE_LONG;
bind_[14].buffer = reinterpret_cast<char*>(&hwaddr_source_);
bind_[14].is_unsigned = MLM_TRUE;
} else {
hwaddr_source_ = 0;
bind_[14].buffer_type = MYSQL_TYPE_NULL;
// According to http://dev.mysql.com/doc/refman/5.5/en/
// c-api-prepared-statement-data-structures.html, the other
// fields doesn't matter if type is set to MYSQL_TYPE_NULL,
// but let's set them to some sane values in case earlier versions
// didn't have that assumption.
hwaddr_null_ = MLM_TRUE;
bind_[14].buffer = NULL;
bind_[14].is_null = &hwaddr_null_;
}
// Add the error flags
setErrorIndicators(bind_, error_, LEASE_COLUMNS);
// .. and check that we have the numbers correct at compile time.
BOOST_STATIC_ASSERT(14 < LEASE_COLUMNS);
} catch (const std::exception& ex) {
isc_throw(DbOperationError,
"Could not create bind array from Lease6: "
<< lease_->addr_.toText() << ", reason: " << ex.what());
}
duid_ = lease_->duid_->getDuid();
duid_length_ = duid_.size();
bind_[1].buffer_type = MYSQL_TYPE_BLOB;
bind_[1].buffer = reinterpret_cast<char*>(&(duid_[0]));
bind_[1].buffer_length = duid_length_;
bind_[1].length = &duid_length_;
// bind_[1].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// valid lifetime: unsigned int
bind_[2].buffer_type = MYSQL_TYPE_LONG;
bind_[2].buffer = reinterpret_cast<char*>(&lease_->valid_lft_);
bind_[2].is_unsigned = MLM_TRUE;
// bind_[2].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// expire: timestamp
// The lease structure holds the client last transmission time (cltt_)
// For convenience for external tools, this is converted to lease
/// expiry time (expire). The relationship is given by:
//
// expire = cltt_ + valid_lft_
//
// @todo Handle overflows
MySqlLeaseMgr::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_,
expire_);
bind_[3].buffer_type = MYSQL_TYPE_TIMESTAMP;
bind_[3].buffer = reinterpret_cast<char*>(&expire_);
bind_[3].buffer_length = sizeof(expire_);
// bind_[3].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// subnet_id: unsigned int
// Can use lease_->subnet_id_ directly as it is of type uint32_t.
bind_[4].buffer_type = MYSQL_TYPE_LONG;
bind_[4].buffer = reinterpret_cast<char*>(&lease_->subnet_id_);
bind_[4].is_unsigned = MLM_TRUE;
// bind_[4].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// pref_lifetime: unsigned int
// Can use lease_->preferred_lft_ directly as it is of type uint32_t.
bind_[5].buffer_type = MYSQL_TYPE_LONG;
bind_[5].buffer = reinterpret_cast<char*>(&lease_->preferred_lft_);
bind_[5].is_unsigned = MLM_TRUE;
// bind_[5].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// lease_type: tinyint
// Must convert to uint8_t as lease_->type_ is a LeaseType variable.
lease_type_ = lease_->type_;
bind_[6].buffer_type = MYSQL_TYPE_TINY;
bind_[6].buffer = reinterpret_cast<char*>(&lease_type_);
bind_[6].is_unsigned = MLM_TRUE;
// bind_[6].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// iaid: unsigned int
// Can use lease_->iaid_ directly as it is of type uint32_t.
bind_[7].buffer_type = MYSQL_TYPE_LONG;
bind_[7].buffer = reinterpret_cast<char*>(&lease_->iaid_);
bind_[7].is_unsigned = MLM_TRUE;
// bind_[7].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// prefix_len: unsigned tinyint
// Can use lease_->prefixlen_ directly as it is uint32_t.
bind_[8].buffer_type = MYSQL_TYPE_TINY;
bind_[8].buffer = reinterpret_cast<char*>(&lease_->prefixlen_);
bind_[8].is_unsigned = MLM_TRUE;
// bind_[8].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// fqdn_fwd: boolean
bind_[9].buffer_type = MYSQL_TYPE_TINY;
bind_[9].buffer = reinterpret_cast<char*>(&lease_->fqdn_fwd_);
bind_[9].is_unsigned = MLM_TRUE;
// bind_[7].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// fqdn_rev: boolean
bind_[10].buffer_type = MYSQL_TYPE_TINY;
bind_[10].buffer = reinterpret_cast<char*>(&lease_->fqdn_rev_);
bind_[10].is_unsigned = MLM_TRUE;
// bind_[10].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// hostname: varchar(255)
bind_[11].buffer_type = MYSQL_TYPE_VARCHAR;
bind_[11].buffer = const_cast<char*>(lease_->hostname_.c_str());
bind_[11].buffer_length = lease_->hostname_.length();
// bind_[11].is_null = &MLM_FALSE; // commented out for performance
// reasons, see memset() above
// hwaddr: varbinary(20) - hardware/MAC address
HWAddrPtr hwaddr = lease_->hwaddr_;
if (hwaddr) {
hwaddr_ = hwaddr->hwaddr_;
hwaddr_length_ = hwaddr->hwaddr_.size();
bind_[12].buffer_type = MYSQL_TYPE_BLOB;
bind_[12].buffer = reinterpret_cast<char*>(&(hwaddr_[0]));
bind_[12].buffer_length = hwaddr_length_;
bind_[12].length = &hwaddr_length_;
} else {
bind_[12].buffer_type = MYSQL_TYPE_NULL;
// According to http://dev.mysql.com/doc/refman/5.5/en/
// c-api-prepared-statement-data-structures.html, the other
// fields doesn't matter if type is set to MYSQL_TYPE_NULL,
// but let's set them to some sane values in case earlier versions
// didn't have that assumption.
hwaddr_null_ = MLM_TRUE;
bind_[12].buffer = NULL;
bind_[12].is_null = &hwaddr_null_;
}
// hwtype
if (hwaddr) {
hwtype_ = lease->hwaddr_->htype_;
bind_[13].buffer_type = MYSQL_TYPE_SHORT;
bind_[13].buffer = reinterpret_cast<char*>(&hwtype_);
bind_[13].is_unsigned = MLM_TRUE;
} else {
hwtype_ = 0;
bind_[13].buffer_type = MYSQL_TYPE_NULL;
// According to http://dev.mysql.com/doc/refman/5.5/en/
// c-api-prepared-statement-data-structures.html, the other
// fields doesn't matter if type is set to MYSQL_TYPE_NULL,
// but let's set them to some sane values in case earlier versions
// didn't have that assumption.
hwaddr_null_ = MLM_TRUE;
bind_[13].buffer = NULL;
bind_[13].is_null = &hwaddr_null_;
}
/// Hardware source
if (hwaddr) {
hwaddr_source_ = lease->hwaddr_->source_;
bind_[14].buffer_type = MYSQL_TYPE_LONG;
bind_[14].buffer = reinterpret_cast<char*>(&hwaddr_source_);
bind_[14].is_unsigned = MLM_TRUE;
} else {
hwaddr_source_ = 0;
bind_[14].buffer_type = MYSQL_TYPE_NULL;
// According to http://dev.mysql.com/doc/refman/5.5/en/
// c-api-prepared-statement-data-structures.html, the other
// fields doesn't matter if type is set to MYSQL_TYPE_NULL,
// but let's set them to some sane values in case earlier versions
// didn't have that assumption.
hwaddr_null_ = MLM_TRUE;
bind_[14].buffer = NULL;
bind_[14].is_null = &hwaddr_null_;
}
// Add the error flags
setErrorIndicators(bind_, error_, LEASE_COLUMNS);
// .. and check that we have the numbers correct at compile time.
BOOST_STATIC_ASSERT(14 < LEASE_COLUMNS);
// Add the data to the vector. Note the end element is one after the
// end of the array.
@@ -1273,7 +1283,7 @@ MySqlLeaseMgr::convertToDatabaseTime(time_t cltt, uint32_t valid_lifetime,
// Calculate expiry time. Store it in the 64-bit value so as we can detect
// overflows.
int64_t expire_time_64 = static_cast<int64_t>(cltt) +
static_cast<iint64_t>(valid_lifetime);
static_cast<int64_t>(valid_lifetime);
// Prevent too large value.
if (expire_time_64 > LeaseMgr::MAX_DB_TIME) {