11 #include <boost/date_time/gregorian/gregorian.hpp> 23 MySqlBinding::getString()
const {
25 validateAccess<std::string>();
27 return (std::string());
29 return (std::string(buffer_.begin(), buffer_.begin() + length_));
33 MySqlBinding::getStringOrDefault(
const std::string& default_value)
const {
35 return (default_value);
41 MySqlBinding::getJSON()
const {
45 std::string s = getString();
46 return (Element::fromJSON(s));
50 MySqlBinding::getBlob()
const {
52 validateAccess<std::vector<uint8_t> >();
54 return (std::vector<uint8_t>());
56 return (std::vector<uint8_t>(buffer_.begin(), buffer_.begin() + length_));
60 MySqlBinding::getBlobOrDefault(
const std::vector<uint8_t>& default_value)
const {
62 return (default_value);
68 MySqlBinding::getFloat()
const {
75 return (getInteger<float>());
79 MySqlBinding::getTimestamp()
const {
81 validateAccess<ptime>();
84 const MYSQL_TIME* database_time =
reinterpret_cast<const MYSQL_TIME*
>(&buffer_[0]);
85 return (convertFromDatabaseTime(*database_time));
89 MySqlBinding::getTimestampOrDefault(
const ptime& default_value)
const {
91 return (default_value);
93 return (getTimestamp());
97 MySqlBinding::createString(
const unsigned long length) {
104 MySqlBinding::createString(
const std::string& value) {
107 binding->setBufferValue(value.begin(), value.end());
113 return (value.
unspecified() ? MySqlBinding::createNull() : createString(value));
117 MySqlBinding::createBlob(
const unsigned long length) {
124 MySqlBinding::createFloat(
const float value) {
131 return (createInteger<float>(value));
135 MySqlBinding::createBool() {
136 return (createInteger<uint8_t>(static_cast<uint8_t>(
false)));
140 MySqlBinding::createBool(
const bool value) {
141 return (createInteger<uint8_t>(static_cast<uint8_t>(value)));
147 return (MySqlBinding::createNull());
150 return (createInteger<uint8_t>(static_cast<uint8_t>(value.
get())));
157 return (MySqlBinding::createNull());
163 << value.
get().
toText() <<
"' is not an IPv4 address");
166 return (createInteger<uint32_t>(value.
get().
toUint32()));
170 MySqlBinding::createTimestamp(
const boost::posix_time::ptime& timestamp) {
173 binding->setTimestampValue(timestamp);
178 MySqlBinding::createTimestamp() {
185 MySqlBinding::createNull() {
191 MySqlBinding::convertToDatabaseTime(
const time_t input_time,
192 MYSQL_TIME& output_time) {
195 memset(&output_time, 0,
sizeof(MYSQL_TIME));
199 (void) localtime_r(&input_time, &time_tm);
202 output_time.year = time_tm.tm_year + 1900;
203 output_time.month = time_tm.tm_mon + 1;
204 output_time.day = time_tm.tm_mday;
205 output_time.hour = time_tm.tm_hour;
206 output_time.minute = time_tm.tm_min;
207 output_time.second = time_tm.tm_sec;
208 output_time.second_part = 0;
213 MySqlBinding::convertToDatabaseTime(
const boost::posix_time::ptime& input_time,
214 MYSQL_TIME& output_time) {
215 if (input_time.is_not_a_date_time()) {
220 memset(&output_time, 0,
sizeof(MYSQL_TIME));
222 output_time.year = input_time.date().year();
223 output_time.month = input_time.date().month();
224 output_time.day = input_time.date().day();
225 output_time.hour = input_time.time_of_day().hours();
226 output_time.minute = input_time.time_of_day().minutes();
227 output_time.second = input_time.time_of_day().seconds();
230 output_time.second_part = 0;
237 MySqlBinding::convertToDatabaseTime(
const time_t cltt,
238 const uint32_t valid_lifetime,
239 MYSQL_TIME& expire) {
243 int64_t expire_time_64 =
static_cast<int64_t
>(cltt) +
244 static_cast<int64_t>(valid_lifetime);
248 if (expire_time_64 > DatabaseConnection::MAX_DB_TIME) {
253 memset(&expire, 0,
sizeof(MYSQL_TIME));
255 const time_t expire_time =
static_cast<time_t
>(expire_time_64);
259 (void) localtime_r(&expire_time, &expire_tm);
262 expire.year = expire_tm.tm_year + 1900;
263 expire.month = expire_tm.tm_mon + 1;
264 expire.day = expire_tm.tm_mday;
265 expire.hour = expire_tm.tm_hour;
266 expire.minute = expire_tm.tm_min;
267 expire.second = expire_tm.tm_sec;
268 expire.second_part = 0;
273 MySqlBinding::convertFromDatabaseTime(
const MYSQL_TIME& expire,
274 uint32_t valid_lifetime,
278 memset(&expire_tm, 0,
sizeof(expire_tm));
280 expire_tm.tm_year = expire.year - 1900;
281 expire_tm.tm_mon = expire.month - 1;
282 expire_tm.tm_mday = expire.day;
283 expire_tm.tm_hour = expire.hour;
284 expire_tm.tm_min = expire.minute;
285 expire_tm.tm_sec = expire.second;
286 expire_tm.tm_isdst = -1;
289 cltt = mktime(&expire_tm) - valid_lifetime;
293 MySqlBinding::convertFromDatabaseTime(
const MYSQL_TIME& database_time) {
298 ptime pt(boost::gregorian::date(database_time.year,
299 boost::gregorian::greg_month(database_time.month),
301 time_duration(database_time.hour, database_time.minute,
302 database_time.second, fractional));
307 MySqlBinding::MySqlBinding(enum_field_types buffer_type,
311 : buffer_(length > 0 ? length : 1), length_(length),
312 null_value_(buffer_type == MYSQL_TYPE_NULL) {
313 memset(&bind_, 0,
sizeof(MYSQL_BIND));
314 bind_.buffer_type = buffer_type;
316 if (buffer_type != MYSQL_TYPE_NULL) {
317 bind_.buffer = &buffer_[0];
318 bind_.buffer_length = length_;
319 bind_.length = &length_;
320 bind_.is_null = &null_value_;
325 MySqlBinding::setBufferLength(
const unsigned long length) {
333 buffer_.resize(length_ > 0 ? length_ : 1);
334 bind_.buffer = &buffer_[0];
335 bind_.buffer_length = length_;
339 MySqlBinding::setTimestampValue(
const ptime& timestamp) {
340 MYSQL_TIME database_time;
341 convertToDatabaseTime(timestamp, database_time);
343 memcpy(static_cast<void*>(&buffer_[0]), reinterpret_cast<char*>(&database_time),
345 bind_.buffer = &buffer_[0];
bool my_bool
my_bool type in MySQL 8.x.
void unspecified(bool unspecified)
Modifies the flag that indicates whether the value is specified or unspecified.
T get() const
Retrieves the encapsulated value.
boost::shared_ptr< Element > ElementPtr
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
uint32_t toUint32() const
Converts IPv4 address to uint32_t.
Trait class for column types supported in MySQL.
bool isV4() const
Convenience function to check for an IPv4 address.
Defines the logger used by the top-level component of kea-lfc.
std::string toText() const
Convert the address to a string.
boost::shared_ptr< MySqlBinding > MySqlBindingPtr
Shared pointer to the Binding class.
MySQL binding used in prepared statements.