From: Marcin Siodelski Date: Wed, 4 Mar 2015 13:50:37 +0000 (+0100) Subject: [3673] Throw DbOperationError exceptions when time conversion fails. X-Git-Tag: trac3764_base~16^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4f83df70a22c5ea77abad2f8e118fd997fa84d27;p=thirdparty%2Fkea.git [3673] Throw DbOperationError exceptions when time conversion fails. --- diff --git a/src/lib/dhcpsrv/mysql_lease_mgr.cc b/src/lib/dhcpsrv/mysql_lease_mgr.cc index 13aae60b00..4cce4a6e02 100644 --- a/src/lib/dhcpsrv/mysql_lease_mgr.cc +++ b/src/lib/dhcpsrv/mysql_lease_mgr.cc @@ -350,108 +350,112 @@ 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(lease_->addr_); - bind_[0].buffer_type = MYSQL_TYPE_LONG; - bind_[0].buffer = reinterpret_cast(&addr4_); - bind_[0].is_unsigned = MLM_TRUE; - // bind_[0].is_null = &MLM_FALSE; // commented out for performance - // reasons, see memset() above + try { + // Address: uint32_t + // The address in the Lease structure is an IOAddress object. Convert + // this to an integer for storage. + addr4_ = static_cast(lease_->addr_); + bind_[0].buffer_type = MYSQL_TYPE_LONG; + bind_[0].buffer = reinterpret_cast(&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(&(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 + // 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(&(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(&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 + // 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(&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(&lease_->valid_lft_); + bind_[3].is_unsigned = MLM_TRUE; + // bind_[3].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(&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(&expire_); + bind_[4].buffer_length = sizeof(expire_); + // bind_[4].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(&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(&lease_->subnet_id_); + bind_[5].is_unsigned = MLM_TRUE; + // bind_[5].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(&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(&lease_->fqdn_fwd_); + bind_[6].is_unsigned = MLM_TRUE; + // bind_[6].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(&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(&lease_->fqdn_rev_); + bind_[7].is_unsigned = MLM_TRUE; + // bind_[7].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(&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(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 - // hostname: varchar(255) - bind_[8].buffer_type = MYSQL_TYPE_VARCHAR; - bind_[8].buffer = const_cast(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); - // 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); - // .. 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()); + } // Add the data to the vector. Note the end element is one after the // end of the array. @@ -709,199 +713,205 @@ 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(); - - // 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(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 + 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(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_ = lease_->duid_->getDuid(); - duid_length_ = duid_.size(); + // 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(&(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 - bind_[1].buffer_type = MYSQL_TYPE_BLOB; - bind_[1].buffer = reinterpret_cast(&(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(&lease_->valid_lft_); + bind_[2].is_unsigned = MLM_TRUE; + // bind_[2].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(&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(&expire_); + bind_[3].buffer_length = sizeof(expire_); + // 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 - MySqlLeaseMgr::convertToDatabaseTime(lease_->cltt_, lease_->valid_lft_, - expire_); - bind_[3].buffer_type = MYSQL_TYPE_TIMESTAMP; - bind_[3].buffer = reinterpret_cast(&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(&lease_->subnet_id_); + bind_[4].is_unsigned = MLM_TRUE; + // 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_[4].buffer_type = MYSQL_TYPE_LONG; - bind_[4].buffer = reinterpret_cast(&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(&lease_->preferred_lft_); + bind_[5].is_unsigned = MLM_TRUE; + // bind_[5].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(&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(&lease_type_); + bind_[6].is_unsigned = MLM_TRUE; + // bind_[6].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(&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(&lease_->iaid_); + bind_[7].is_unsigned = MLM_TRUE; + // bind_[7].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(&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(&lease_->prefixlen_); + bind_[8].is_unsigned = MLM_TRUE; + // bind_[8].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(&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(&lease_->fqdn_fwd_); + bind_[9].is_unsigned = MLM_TRUE; + // bind_[7].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(&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(&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(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(&(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_; + } - // fqdn_rev: boolean - bind_[10].buffer_type = MYSQL_TYPE_TINY; - bind_[10].buffer = reinterpret_cast(&lease_->fqdn_rev_); - bind_[10].is_unsigned = MLM_TRUE; - // bind_[10].is_null = &MLM_FALSE; // commented out for performance - // reasons, see memset() above + // hwtype + if (hwaddr) { + hwtype_ = lease->hwaddr_->htype_; + bind_[13].buffer_type = MYSQL_TYPE_SHORT; + bind_[13].buffer = reinterpret_cast(&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_; + } - // hostname: varchar(255) - bind_[11].buffer_type = MYSQL_TYPE_VARCHAR; - bind_[11].buffer = const_cast(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 + /// Hardware source + if (hwaddr) { + hwaddr_source_ = lease->hwaddr_->source_; + bind_[14].buffer_type = MYSQL_TYPE_LONG; + bind_[14].buffer = reinterpret_cast(&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_; + } - // 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(&(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_; - } + // Add the error flags + setErrorIndicators(bind_, error_, LEASE_COLUMNS); - // hwtype - if (hwaddr) { - hwtype_ = lease->hwaddr_->htype_; - bind_[13].buffer_type = MYSQL_TYPE_SHORT; - bind_[13].buffer = reinterpret_cast(&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_; - } + // .. and check that we have the numbers correct at compile time. + BOOST_STATIC_ASSERT(14 < LEASE_COLUMNS); - /// Hardware source - if (hwaddr) { - hwaddr_source_ = lease->hwaddr_->source_; - bind_[14].buffer_type = MYSQL_TYPE_LONG; - bind_[14].buffer = reinterpret_cast(&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_; + } catch (const std::exception& ex) { + isc_throw(DbOperationError, + "Could not create bind array from Lease6: " + << lease_->addr_.toText() << ", reason: " << ex.what()); } - // 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. return (std::vector(&bind_[0], &bind_[LEASE_COLUMNS])); @@ -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(cltt) + - static_cast(valid_lifetime); + static_cast(valid_lifetime); // Prevent too large value. if (expire_time_64 > LeaseMgr::MAX_DB_TIME) { diff --git a/src/lib/dhcpsrv/pgsql_lease_mgr.cc b/src/lib/dhcpsrv/pgsql_lease_mgr.cc index 59674a5f51..ac2a1c54a9 100644 --- a/src/lib/dhcpsrv/pgsql_lease_mgr.cc +++ b/src/lib/dhcpsrv/pgsql_lease_mgr.cc @@ -647,10 +647,11 @@ public: bind_array.add(lease->fqdn_rev_); bind_array.add(lease->hostname_); + } catch (const std::exception& ex) { isc_throw(DbOperationError, - "Could not create bind array for Lease4 lease: " - << lease_->addr_.toText() << " reason: " << ex.what()); + "Could not create bind array for Lease4: " + << lease_->addr_.toText() << ", reason: " << ex.what()); } } @@ -829,7 +830,7 @@ public: } catch (const std::exception& ex) { isc_throw(DbOperationError, "Could not create bind array from Lease6: " - << lease_->addr_.toText() << " reason: " << ex.what()); + << lease_->addr_.toText() << ", reason: " << ex.what()); } }