23
#include <drizzled/field/int64.h>
24
#include <drizzled/error.h>
25
#include <drizzled/table.h>
26
#include <drizzled/session.h>
27
#include <drizzled/internal/my_sys.h>
22
#include <drizzled/server_includes.h>
23
#include <drizzled/field/int64_t.h>
41
25
/****************************************************************************
42
Field type Int64 int (8 bytes)
43
****************************************************************************/
26
Field type int64_t int (8 bytes)
27
****************************************************************************/
45
int Int64::store(const char *from,uint32_t len, const CHARSET_INFO * const cs)
29
int Field_int64_t::store(const char *from,uint32_t len, const CHARSET_INFO * const cs)
51
ASSERT_COLUMN_MARKED_FOR_WRITE;
53
35
tmp= cs->cset->strntoull10rnd(cs, from, len, false, &end,&error);
54
36
if (error == MY_ERRNO_ERANGE)
56
38
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
59
else if (getTable()->in_use->count_cuted_fields && check_int(cs, from, len, end, error))
41
else if (table->in_use->count_cuted_fields &&
42
check_int(cs, from, len, end, error))
46
#ifdef WORDS_BIGENDIAN
47
if (table->s->db_low_byte_first)
68
int64_tstore(ptr,tmp);
53
int64_tstore(ptr,tmp);
74
int Int64::store(double nr)
58
int Field_int64_t::store(double nr)
79
ASSERT_COLUMN_MARKED_FOR_WRITE;
83
65
if (nr <= (double) INT64_MIN)
91
73
error= (nr > (double) INT64_MAX);
99
79
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
101
int64_tstore(ptr, res);
81
#ifdef WORDS_BIGENDIAN
82
if (table->s->db_low_byte_first)
88
int64_tstore(ptr,res);
107
int Int64::store(int64_t nr, bool arg)
93
int Field_int64_t::store(int64_t nr, bool unsigned_val __attribute__((unused)))
111
ASSERT_COLUMN_MARKED_FOR_WRITE;
112
if (arg and (nr < 0)) // Only a partial fix for overflow
97
#ifdef WORDS_BIGENDIAN
98
if (table->s->db_low_byte_first)
114
set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
118
int64_tstore(ptr,nr);
104
int64_tstore(ptr,nr);
124
double Int64::val_real(void) const
109
double Field_int64_t::val_real(void)
128
ASSERT_COLUMN_MARKED_FOR_READ;
112
#ifdef WORDS_BIGENDIAN
113
if (table->s->db_low_byte_first)
131
120
/* The following is open coded to avoid a bug in gcc 3.3 */
133
121
return (double) j;
137
int64_t Int64::val_int(void) const
125
int64_t Field_int64_t::val_int(void)
141
ASSERT_COLUMN_MARKED_FOR_READ;
128
#ifdef WORDS_BIGENDIAN
129
if (table->s->db_low_byte_first)
149
String *Int64::val_str(String *val_buffer, String *) const
138
String *Field_int64_t::val_str(String *val_buffer,
139
String *val_ptr __attribute__((unused)))
151
141
const CHARSET_INFO * const cs= &my_charset_bin;
153
uint32_t mlength= max(field_length+1,22*cs->mbmaxlen);
143
uint32_t mlength=cmax(field_length+1,22*cs->mbmaxlen);
154
144
val_buffer->alloc(mlength);
155
145
char *to=(char*) val_buffer->ptr();
158
ASSERT_COLUMN_MARKED_FOR_READ;
162
length=(uint32_t) (cs->cset->int64_t10_to_str)(cs,to,mlength, -10, j);
147
#ifdef WORDS_BIGENDIAN
148
if (table->s->db_low_byte_first)
154
length=(uint) (cs->cset->int64_t10_to_str)(cs,to,mlength, -10, j);
163
155
val_buffer->length(length);
165
157
return val_buffer;
168
int Int64::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
161
bool Field_int64_t::send_binary(Protocol *protocol)
163
return protocol->store_int64_t(Field_int64_t::val_int(), false);
167
int Field_int64_t::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
170
#ifdef WORDS_BIGENDIAN
171
if (table->s->db_low_byte_first)
175
182
return (a < b) ? -1 : (a > b) ? 1 : 0;
178
void Int64::sort_string(unsigned char *to,uint32_t )
185
void Field_int64_t::sort_string(unsigned char *to,uint32_t length __attribute__((unused)))
180
187
#ifdef WORDS_BIGENDIAN
188
if (!table->s->db_low_byte_first)
182
190
to[0] = (char) (ptr[0] ^ 128); /* Revers signbit */
206
void Int64::sql_type(String &res) const
214
void Field_int64_t::sql_type(String &res) const
208
216
const CHARSET_INFO * const cs=res.charset();
209
217
res.length(cs->cset->snprintf(cs,(char*) res.ptr(),res.alloced_length(), "bigint"));
213
unsigned char *Int64::pack(unsigned char* to, const unsigned char *from, uint32_t, bool)
217
int64_tget(val, from);
218
int64_tstore(to, val);
220
return to + sizeof(val);
224
const unsigned char *Int64::unpack(unsigned char* to, const unsigned char *from, uint32_t, bool)
228
int64_tget(val, from);
229
int64_tstore(to, val);
231
return from + sizeof(val);
234
} /* namespace field */
235
} /* namespace drizzled */