18
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
22
#include "config.h"
22
#include <boost/lexical_cast.hpp>
23
23
#include "drizzled/field/enum.h"
24
24
#include "drizzled/error.h"
25
25
#include "drizzled/table.h"
38
38
** If one uses this string in a number context one gets the type number.
39
39
****************************************************************************/
41
enum ha_base_keytype Field_enum::key_type() const
45
default: return HA_KEYTYPE_BINARY;
48
case 4: return HA_KEYTYPE_ULONG_INT;
49
case 8: return HA_KEYTYPE_ULONGLONG;
41
53
void Field_enum::store_type(uint64_t value)
43
value--; /* we store as starting from 0, although SQL starts from 1 */
45
#ifdef WORDS_BIGENDIAN
46
if (getTable()->getShare()->db_low_byte_first)
48
int4store(ptr, (unsigned short) value);
52
longstore(ptr, (unsigned short) value);
56
case 1: ptr[0]= (unsigned char) value; break;
58
#ifdef WORDS_BIGENDIAN
59
if (table->s->db_low_byte_first)
61
int2store(ptr,(unsigned short) value);
65
shortstore(ptr,(unsigned short) value);
67
case 3: int3store(ptr,(long) value); break;
69
#ifdef WORDS_BIGENDIAN
70
if (table->s->db_low_byte_first)
76
longstore(ptr,(long) value);
79
#ifdef WORDS_BIGENDIAN
80
if (table->s->db_low_byte_first)
86
int64_tstore(ptr,value); break;
56
91
* Given a supplied string, looks up the string in the internal typelib
57
* and stores the found key. Upon not finding an entry in the typelib,
92
* and stores the found key. Upon not finding an entry in the typelib,
58
93
* we always throw an error.
60
95
int Field_enum::store(const char *from, uint32_t length, const CHARSET_INFO * const)
101
136
* @note MySQL allows 0 values, saying that 0 is "the index of the
102
137
* blank string error", whatever that means. Uhm, Drizzle doesn't
103
138
* allow this. To store an ENUM column value using an integer, you
104
* must specify the 1-based index of the enum column definition's
139
* must specify the 1-based index of the enum column definition's
107
142
int Field_enum::store(int64_t from, bool)
111
146
if (from <= 0 || (uint64_t) from > typelib->count)
113
/* Convert the integer to a string using boost::lexical_cast */
114
std::string tmp(boost::lexical_cast<std::string>(from));
148
/* Convert the integer to a string using stringstream */
149
std::stringstream ss;
151
ss << from; ss >> tmp;
116
153
my_error(ER_INVALID_ENUM_VALUE, MYF(ME_FATALERROR), tmp.c_str());
130
167
ASSERT_COLUMN_MARKED_FOR_READ;
133
#ifdef WORDS_BIGENDIAN
134
if (getTable()->getShare()->db_low_byte_first)
139
return ((int64_t) tmp) + 1; /* SQL is from 1, we store from 0 */
169
switch (packlength) {
171
return (int64_t) ptr[0];
175
#ifdef WORDS_BIGENDIAN
176
if (table->s->db_low_byte_first)
181
return (int64_t) tmp;
184
return (int64_t) uint3korr(ptr);
188
#ifdef WORDS_BIGENDIAN
189
if (table->s->db_low_byte_first)
194
return (int64_t) tmp;
199
#ifdef WORDS_BIGENDIAN
200
if (table->s->db_low_byte_first)
208
return 0; // impossible
142
211
String *Field_enum::val_str(String *, String *val_ptr)
146
215
ASSERT_COLUMN_MARKED_FOR_READ;
148
if (not tmp || tmp > typelib->count)
217
if (!tmp || tmp > typelib->count)
150
219
val_ptr->set("", 0, field_charset);
162
231
unsigned char *old= ptr;
163
232
ptr= (unsigned char*) a_ptr;
164
uint64_t a= Field_enum::val_int();
233
uint64_t a=Field_enum::val_int();
165
234
ptr= (unsigned char*) b_ptr;
166
uint64_t b= Field_enum::val_int();
235
uint64_t b=Field_enum::val_int();
168
237
return (a < b) ? -1 : (a > b) ? 1 : 0;
171
240
void Field_enum::sort_string(unsigned char *to,uint32_t )
173
uint64_t value=Field_enum::val_int()-1; /* SQL is 1 based, stored as 0 based*/
174
to+=pack_length() -1;
175
for (uint32_t i=0 ; i < pack_length() ; i++)
242
uint64_t value=Field_enum::val_int();
244
for (uint32_t i=0 ; i < packlength ; i++)
177
246
*to-- = (unsigned char) (value & 255);
208
277
Field_enum *res= (Field_enum*) Field::new_field(root, new_table, keep_type);
211
res->typelib= typelib->copy_typelib(root);
280
res->typelib= copy_typelib(root, typelib);