~drizzle-trunk/drizzle/development

2008.2.3 by Brian Aker
Fixing up a, somewhat, hidden unsigned type to solve a few issues around
1
/* - mode: c++ c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2008 MySQL
5
 *
6
 *  This program is free software; you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; either version 2 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  This program is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with this program; if not, write to the Free Software
18
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
 */
20
21
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
22
#include <config.h>
2008.2.3 by Brian Aker
Fixing up a, somewhat, hidden unsigned type to solve a few issues around
23
#include <drizzled/field/size.h>
24
#include <drizzled/error.h>
25
#include <drizzled/table.h>
26
#include <drizzled/session.h>
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
27
#include <drizzled/internal/my_sys.h>
2008.2.3 by Brian Aker
Fixing up a, somewhat, hidden unsigned type to solve a few issues around
28
29
#include <math.h>
30
31
#include <algorithm>
32
33
using namespace std;
34
35
namespace drizzled
36
{
37
38
namespace field
39
{
40
41
/****************************************************************************
42
  Field type Size int (8 bytes)
43
 ****************************************************************************/
44
2008.2.4 by Brian Aker
Merge in additional fixes for sign, plus alter table, plus TIME on
45
Size::Size(unsigned char *ptr_arg, uint32_t len_arg,
46
           unsigned char *null_ptr_arg,
47
           unsigned char null_bit_arg,
48
           enum utype unireg_check_arg,
49
           const char *field_name_arg) :
50
  Field_num(ptr_arg,
51
            len_arg,
52
            null_ptr_arg,
53
            null_bit_arg,
54
            unireg_check_arg,
55
            field_name_arg,
56
            0, false, true)
57
{
58
  flags|= UNSIGNED_FLAG;
59
}
60
61
Size::Size(uint32_t len_arg,bool maybe_null_arg,
62
           const char *field_name_arg,
63
           bool unsigned_arg) :
64
  Field_num((unsigned char*) 0,
65
            len_arg, maybe_null_arg ? (unsigned char*) "": 0,
66
            0,
67
            NONE,
68
            field_name_arg,
69
            0,
70
            0,
71
            unsigned_arg)
72
{
73
  flags|= UNSIGNED_FLAG;
74
  assert(unsigned_arg);
75
}
76
2254 by Brian Aker
Shift CHARSET_INFO to charset_info_st
77
int Size::store(const char *from,uint32_t len, const charset_info_st * const cs)
2008.2.3 by Brian Aker
Fixing up a, somewhat, hidden unsigned type to solve a few issues around
78
{
79
  int error= 0;
80
  char *end;
81
  uint64_t tmp;
82
83
  ASSERT_COLUMN_MARKED_FOR_WRITE;
84
85
  tmp= cs->cset->strntoull10rnd(cs, from, len, false, &end,&error);
2241.4.22 by Stewart Smith
remove MY_ERRNO_EDOM and MY_ERRNO_ERANGE. Instead, we should consistently use the system EDOM and ERANGE. If on any platform, they weren't 33 and 34 respectively, we would have had bugs.
86
  if (error == ERANGE)
2008.2.3 by Brian Aker
Fixing up a, somewhat, hidden unsigned type to solve a few issues around
87
  {
88
    set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
89
    error= 1;
90
  }
91
  else if (getTable()->in_use->count_cuted_fields && check_int(cs, from, len, end, error))
92
  {
93
    error= 1;
94
  }
95
  else
96
  {
97
    error= 0;
98
  }
99
100
  int64_tstore(ptr,tmp);
101
102
  return error;
103
}
104
105
106
int Size::store(double nr)
107
{
108
  int error= 0;
109
  int64_t res;
110
111
  ASSERT_COLUMN_MARKED_FOR_WRITE;
112
113
  nr= rint(nr);
114
115
  if (nr <= (double) INT64_MIN)
116
  {
117
    res= INT64_MIN;
118
    error= (nr < (double) INT64_MIN);
119
  }
120
  else if (nr >= (double) (uint64_t) INT64_MAX)
121
  {
122
    res= INT64_MAX;
123
    error= (nr > (double) INT64_MAX);
124
  }
125
  else
126
  {
127
    res=(int64_t) nr;
128
  }
129
130
  if (error)
131
  {
132
    set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
133
    return 0;
134
  }
135
136
  int64_tstore(ptr, res);
137
138
  return error;
139
}
140
141
142
int Size::store(int64_t nr, bool arg)
143
{
144
  int error= 0;
145
146
  ASSERT_COLUMN_MARKED_FOR_WRITE;
147
148
  if (not arg and nr < 0)
149
  {
150
    set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
151
    return 0;
152
  }
153
154
  int64_tstore(ptr,nr);
155
156
  return error;
157
}
158
159
2181.2.1 by Brian Aker
Protect all of the val_* methods from modification.
160
double Size::val_real(void) const
2008.2.3 by Brian Aker
Fixing up a, somewhat, hidden unsigned type to solve a few issues around
161
{
162
  int64_t j;
163
164
  ASSERT_COLUMN_MARKED_FOR_READ;
165
166
  int64_tget(j,ptr);
167
168
  return (double) j;
169
}
170
171
2181.2.1 by Brian Aker
Protect all of the val_* methods from modification.
172
int64_t Size::val_int(void) const
2008.2.3 by Brian Aker
Fixing up a, somewhat, hidden unsigned type to solve a few issues around
173
{
174
  int64_t j;
175
176
  ASSERT_COLUMN_MARKED_FOR_READ;
177
178
  int64_tget(j,ptr);
179
180
  return j;
181
}
182
183
2181.2.1 by Brian Aker
Protect all of the val_* methods from modification.
184
String *Size::val_str(String *val_buffer, String *) const
2008.2.3 by Brian Aker
Fixing up a, somewhat, hidden unsigned type to solve a few issues around
185
{
2254 by Brian Aker
Shift CHARSET_INFO to charset_info_st
186
  const charset_info_st * const cs= &my_charset_bin;
2008.2.3 by Brian Aker
Fixing up a, somewhat, hidden unsigned type to solve a few issues around
187
  uint32_t length;
188
  uint32_t mlength= max(field_length+1,22*cs->mbmaxlen);
189
  val_buffer->alloc(mlength);
190
  char *to=(char*) val_buffer->ptr();
191
  int64_t j;
192
193
  ASSERT_COLUMN_MARKED_FOR_READ;
194
195
  int64_tget(j,ptr);
196
197
  length=(uint32_t) (cs->cset->int64_t10_to_str)(cs,to,mlength, -10, j);
198
  val_buffer->length(length);
199
200
  return val_buffer;
201
}
202
203
int Size::cmp(const unsigned char *a_ptr, const unsigned char *b_ptr)
204
{
205
  int64_t a,b;
206
207
  int64_tget(a,a_ptr);
208
  int64_tget(b,b_ptr);
209
210
  return (a < b) ? -1 : (a > b) ? 1 : 0;
211
}
212
213
void Size::sort_string(unsigned char *to,uint32_t )
214
{
215
#ifdef WORDS_BIGENDIAN
216
  {
217
    to[0] = (char) (ptr[0] ^ 128);		/* Revers signbit */
218
    to[1]   = ptr[1];
219
    to[2]   = ptr[2];
220
    to[3]   = ptr[3];
221
    to[4]   = ptr[4];
222
    to[5]   = ptr[5];
223
    to[6]   = ptr[6];
224
    to[7]   = ptr[7];
225
  }
226
#else
227
  {
228
    to[0] = (char) (ptr[7] ^ 128);		/* Revers signbit */
229
    to[1]   = ptr[6];
230
    to[2]   = ptr[5];
231
    to[3]   = ptr[4];
232
    to[4]   = ptr[3];
233
    to[5]   = ptr[2];
234
    to[6]   = ptr[1];
235
    to[7]   = ptr[0];
236
  }
237
#endif
238
}
239
240
unsigned char *Size::pack(unsigned char* to, const unsigned char *from, uint32_t, bool)
241
{
242
  int64_t val;
243
244
  int64_tget(val, from);
245
  int64_tstore(to, val);
246
247
  return to + sizeof(val);
248
}
249
250
251
const unsigned char *Size::unpack(unsigned char* to, const unsigned char *from, uint32_t, bool)
252
{
253
  int64_t val;
254
255
  int64_tget(val, from);
256
  int64_tstore(to, val);
257
258
  return from + sizeof(val);
259
}
260
261
} /* namespace field */
262
} /* namespace drizzled */