22 #include <boost/lexical_cast.hpp>
23 #include <drizzled/field/enum.h>
24 #include <drizzled/error.h>
25 #include <drizzled/table.h>
26 #include <drizzled/session.h>
27 #include <drizzled/typelib.h>
40 void Field_enum::store_type(uint64_t value)
44 #ifdef WORDS_BIGENDIAN
45 if (getTable()->getShare()->db_low_byte_first)
47 int4store(
ptr, (
unsigned short) value);
51 longstore(
ptr, (
unsigned short) value);
63 ASSERT_COLUMN_MARKED_FOR_WRITE;
66 length= field_charset->cset->lengthsp(field_charset, from, length);
67 tmp=
typelib->find_type2(from, length, field_charset);
78 if (tmp == 0 || tmp >
typelib->count)
80 my_error(ER_INVALID_ENUM_VALUE, MYF(ME_FATALERROR), from);
86 my_error(ER_INVALID_ENUM_VALUE, MYF(ME_FATALERROR), from);
90 store_type((uint64_t) tmp);
108 ASSERT_COLUMN_MARKED_FOR_WRITE;
110 if (from <= 0 || (uint64_t) from >
typelib->count)
113 std::string tmp(boost::lexical_cast<std::string>(from));
115 my_error(ER_INVALID_ENUM_VALUE, MYF(ME_FATALERROR), tmp.c_str());
118 store_type((uint64_t) (uint32_t) from);
122 double Field_enum::val_real(
void)
const
124 return (
double) Field_enum::val_int();
127 int64_t Field_enum::val_int(
void)
const
129 ASSERT_COLUMN_MARKED_FOR_READ;
132 #ifdef WORDS_BIGENDIAN
133 if (getTable()->getShare()->db_low_byte_first)
138 return ((int64_t) tmp) + 1;
141 String *Field_enum::val_str(String *, String *val_ptr)
const
143 uint32_t tmp=(uint32_t) Field_enum::val_int();
145 ASSERT_COLUMN_MARKED_FOR_READ;
147 if (not tmp || tmp >
typelib->count)
149 val_ptr->set(
"", 0, field_charset);
153 val_ptr->set((
const char*)
typelib->type_names[tmp-1],
typelib->type_lengths[tmp-1], field_charset);
159 int Field_enum::cmp(
const unsigned char *a_ptr,
const unsigned char *b_ptr)
161 unsigned char *old=
ptr;
162 ptr= (
unsigned char*) a_ptr;
163 uint64_t a= Field_enum::val_int();
164 ptr= (
unsigned char*) b_ptr;
165 uint64_t b= Field_enum::val_int();
167 return (a < b) ? -1 : (a > b) ? 1 : 0;
170 void Field_enum::sort_string(
unsigned char *to,uint32_t )
172 uint64_t value=Field_enum::val_int()-1;
176 *to-- = (
unsigned char) (value & 255);
181 Field *Field_enum::new_field(memory::Root *root, Table *new_table,
184 Field_enum *res= (Field_enum*) Field::new_field(root, new_table, keep_type);
187 res->typelib=
typelib->copy_typelib(*root);