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;
99 std::string tmp(boost::lexical_cast<std::string>(from));
101 my_error(ER_INVALID_DATETIME_VALUE, MYF(ME_FATALERROR), tmp.c_str());
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 assert(tmp_string_len < type::Time::MAX_STRING_LENGTH);
142 my_error(ER_INVALID_DATETIME_VALUE, MYF(ME_FATALERROR), tmp_string);
149 #ifdef WORDS_BIGENDIAN
150 if (getTable() && getTable()->isDatabaseLowByteFirst())
152 int8store(
ptr, int_value);
156 int64_tstore(
ptr, int_value);
161 double Field_datetime::val_real(
void)
const
163 return (
double) Field_datetime::val_int();
166 int64_t Field_datetime::val_int(
void)
const
170 ASSERT_COLUMN_MARKED_FOR_READ;
172 #ifdef WORDS_BIGENDIAN
173 if (getTable() && getTable()->isDatabaseLowByteFirst())
182 String *Field_datetime::val_str(String *val_buffer, String *)
const
188 ASSERT_COLUMN_MARKED_FOR_READ;
190 #ifdef WORDS_BIGENDIAN
191 if (getTable() && getTable()->isDatabaseLowByteFirst())
204 dt.from_int64_t(tmp,
false);
214 val_buffer->length(rlen);
219 bool Field_datetime::get_date(type::Time <ime, uint32_t fuzzydate)
const
221 int64_t tmp=Field_datetime::val_int();
222 uint32_t part1,part2;
223 part1=(uint32_t) (tmp/INT64_C(1000000));
224 part2=(uint32_t) (tmp - (uint64_t) part1*INT64_C(1000000));
226 ltime.time_type= type::DRIZZLE_TIMESTAMP_DATETIME;
228 ltime.second_part= 0;
229 ltime.second= (int) (part2%100);
230 ltime.minute= (int) (part2/100%100);
231 ltime.hour= (int) (part2/10000);
232 ltime.day= (int) (part1%100);
233 ltime.month= (int) (part1/100%100);
234 ltime.year= (int) (part1/10000);
236 return (!(fuzzydate & TIME_FUZZY_DATE) && (!ltime.month || !ltime.day)) ? 1 : 0;
239 bool Field_datetime::get_time(type::Time <ime)
const
241 return Field_datetime::get_date(ltime,0);
244 int Field_datetime::cmp(
const unsigned char *a_ptr,
const unsigned char *b_ptr)
247 #ifdef WORDS_BIGENDIAN
248 if (getTable() && getTable()->isDatabaseLowByteFirst())
259 return ((uint64_t) a < (uint64_t) b) ? -1 :
260 ((uint64_t) a > (uint64_t) b) ? 1 : 0;
263 void Field_datetime::sort_string(
unsigned char *to,uint32_t )
265 #ifdef WORDS_BIGENDIAN
266 if (not getTable() || not getTable()->isDatabaseLowByteFirst())