22 #include <boost/lexical_cast.hpp>
23 #include <drizzled/field/datetime.h>
24 #include <drizzled/error.h>
25 #include <drizzled/table.h>
27 #include <drizzled/session.h>
44 int Field_datetime::store(
const char *from,
46 const charset_info_st *
const )
48 ASSERT_COLUMN_MARKED_FOR_WRITE;
54 if (! temporal.from_string(from, (
size_t) len))
56 my_error(ER_INVALID_DATETIME_VALUE, MYF(ME_FATALERROR), from);
61 temporal.to_int64_t(&int_value);
63 #ifdef WORDS_BIGENDIAN
64 if (getTable() && getTable()->isDatabaseLowByteFirst())
66 int8store(
ptr, int_value);
70 int64_tstore(
ptr, int_value);
74 int Field_datetime::store(
double from)
76 ASSERT_COLUMN_MARKED_FOR_WRITE;
77 if (from < 0.0 || from > 99991231235959.0)
80 std::string tmp(boost::lexical_cast<std::string>(from));
82 my_error(ER_INVALID_DATETIME_VALUE, MYF(ME_FATALERROR), tmp.c_str());
85 return Field_datetime::store((int64_t) rint(from),
false);
88 int Field_datetime::store(int64_t from,
bool)
90 ASSERT_COLUMN_MARKED_FOR_WRITE;
96 if (! temporal.from_int64_t(from))
99 std::string tmp(boost::lexical_cast<std::string>(from));
101 my_error(ER_INVALID_DATETIME_VALUE, MYF(ME_FATALERROR), tmp.c_str());
111 temporal.to_int64_t(&int_value);
113 #ifdef WORDS_BIGENDIAN
114 if (getTable() && getTable()->isDatabaseLowByteFirst())
116 int8store(
ptr, int_value);
120 int64_tstore(
ptr, int_value);
137 char tmp_string[type::Time::MAX_STRING_LENGTH];
138 size_t tmp_string_len;
140 tmp_string_len= temporal.
to_string(tmp_string, type::Time::MAX_STRING_LENGTH);
141 (void)(tmp_string_len);
142 assert(tmp_string_len < type::Time::MAX_STRING_LENGTH);
143 my_error(ER_INVALID_DATETIME_VALUE, MYF(ME_FATALERROR), tmp_string);
150 #ifdef WORDS_BIGENDIAN
151 if (getTable() && getTable()->isDatabaseLowByteFirst())
153 int8store(
ptr, int_value);
157 int64_tstore(
ptr, int_value);
162 double Field_datetime::val_real(
void)
const
164 return (
double) Field_datetime::val_int();
167 int64_t Field_datetime::val_int(
void)
const
171 ASSERT_COLUMN_MARKED_FOR_READ;
173 #ifdef WORDS_BIGENDIAN
174 if (getTable() && getTable()->isDatabaseLowByteFirst())
183 String *Field_datetime::val_str(String *val_buffer, String *)
const
189 ASSERT_COLUMN_MARKED_FOR_READ;
191 #ifdef WORDS_BIGENDIAN
192 if (getTable() && getTable()->isDatabaseLowByteFirst())
205 dt.from_int64_t(tmp,
false);
215 val_buffer->length(rlen);
220 bool Field_datetime::get_date(type::Time <ime, uint32_t fuzzydate)
const
222 int64_t tmp=Field_datetime::val_int();
223 uint32_t part1,part2;
224 part1=(uint32_t) (tmp/INT64_C(1000000));
225 part2=(uint32_t) (tmp - (uint64_t) part1*INT64_C(1000000));
227 ltime.time_type= type::DRIZZLE_TIMESTAMP_DATETIME;
229 ltime.second_part= 0;
230 ltime.second= (int) (part2%100);
231 ltime.minute= (int) (part2/100%100);
232 ltime.hour= (int) (part2/10000);
233 ltime.day= (int) (part1%100);
234 ltime.month= (int) (part1/100%100);
235 ltime.year= (int) (part1/10000);
237 return (!(fuzzydate & TIME_FUZZY_DATE) && (!ltime.month || !ltime.day)) ? 1 : 0;
240 bool Field_datetime::get_time(type::Time <ime)
const
242 return Field_datetime::get_date(ltime,0);
245 int Field_datetime::cmp(
const unsigned char *a_ptr,
const unsigned char *b_ptr)
248 #ifdef WORDS_BIGENDIAN
249 if (getTable() && getTable()->isDatabaseLowByteFirst())
260 return ((uint64_t) a < (uint64_t) b) ? -1 :
261 ((uint64_t) a > (uint64_t) b) ? 1 : 0;
264 void Field_datetime::sort_string(
unsigned char *to,uint32_t )
266 #ifdef WORDS_BIGENDIAN
267 if (not getTable() || not getTable()->isDatabaseLowByteFirst())
virtual int to_string(char *to, size_t to_len) const
void set_hours(const uint32_t hour)
void set_years(const uint32_t year)
void to_int64_t(int64_t *to) const
void set_minutes(const uint32_t minute)
int store_time(type::Time <ime, type::timestamp_t type)
void set_days(const uint32_t day)
static const int MAX_STRING_LENGTH
void set_seconds(const uint32_t second)
void set_months(const uint32_t month)
virtual bool is_valid() const