~drizzle-trunk/drizzle/development

483.1.6 by Lee
code clean up for Field_num
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
22
#include <drizzled/server_includes.h>
23
#include <drizzled/field/num.h>
549 by Monty Taylor
Took gettext.h out of header files.
24
#include <drizzled/error.h>
584.1.15 by Monty Taylor
The mega-patch from hell. Renamed sql_class to session (since that's what it is) and removed it and field and table from common_includes.
25
#include <drizzled/table.h>
26
#include <drizzled/session.h>
483.1.6 by Lee
code clean up for Field_num
27
28
/**
29
  Numeric fields base class constructor.
30
*/
31
Field_num::Field_num(unsigned char *ptr_arg,uint32_t len_arg, unsigned char *null_ptr_arg,
32
                     unsigned char null_bit_arg, utype unireg_check_arg,
33
                     const char *field_name_arg,
34
                     uint8_t dec_arg, bool zero_arg, bool unsigned_arg)
35
  :Field(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
36
         unireg_check_arg, field_name_arg),
509 by Brian Aker
Incremental patch for removing unsigned.
37
  dec(dec_arg),decimal_precision(zero_arg), unsigned_flag(unsigned_arg)
483.1.6 by Lee
code clean up for Field_num
38
{
39
}
40
41
42
/**
43
  Test if given number is a int.
44
45
  @todo
46
    Make this multi-byte-character safe
47
48
  @param str            String to test
49
  @param length        Length of 'str'
50
  @param int_end        Pointer to char after last used digit
51
  @param cs             Character set
52
53
  @note
54
    This is called after one has called strntoull10rnd() function.
55
56
  @retval
57
    0   OK
58
  @retval
59
    1   error: empty string or wrong integer.
60
  @retval
61
    2   error: garbage at the end of string.
62
*/
63
64
int Field_num::check_int(const CHARSET_INFO * const cs, const char *str, int length,
65
                         const char *int_end, int error)
66
{
67
  /* Test if we get an empty string or wrong integer */
68
  if (str == int_end || error == MY_ERRNO_EDOM)
69
  {
70
    char buff[128];
71
    String tmp(buff, (uint32_t) sizeof(buff), system_charset_info);
72
    tmp.copy(str, length, system_charset_info);
73
    push_warning_printf(table->in_use, DRIZZLE_ERROR::WARN_LEVEL_WARN,
74
                        ER_TRUNCATED_WRONG_VALUE_FOR_FIELD,
75
                        ER(ER_TRUNCATED_WRONG_VALUE_FOR_FIELD),
76
                        "integer", tmp.c_ptr(), field_name,
77
                        (uint32_t) table->in_use->row_count);
78
    return 1;
79
  }
80
  /* Test if we have garbage at the end of the given string. */
81
  if (test_if_important_data(cs, int_end, str + length))
82
  {
83
    set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1);
84
    return 2;
85
  }
86
  return 0;
87
}
88
89
/*
90
  Conver a string to an integer then check bounds.
91
92
  SYNOPSIS
93
    Field_num::get_int
94
    cs            Character set
95
    from          String to convert
96
    len           Length of the string
97
    rnd           OUT int64_t value
98
    unsigned_max  max unsigned value
99
    signed_min    min signed value
100
    signed_max    max signed value
101
102
  DESCRIPTION
103
    The function calls strntoull10rnd() to get an integer value then
104
    check bounds and errors returned. In case of any error a warning
105
    is raised.
106
107
  RETURN
108
    0   ok
109
    1   error
110
*/
111
112
bool Field_num::get_int(const CHARSET_INFO * const cs, const char *from, uint32_t len,
779.1.27 by Monty Taylor
Got rid of __attribute__((unused)) and the like from the .cc files.
113
                        int64_t *rnd, uint64_t ,
483.1.6 by Lee
code clean up for Field_num
114
                        int64_t signed_min, int64_t signed_max)
115
{
116
  char *end;
117
  int error;
118
509 by Brian Aker
Incremental patch for removing unsigned.
119
  *rnd= (int64_t) cs->cset->strntoull10rnd(cs, from, len, false, &end, &error);
120
  if (*rnd < signed_min)
121
  {
122
    *rnd= signed_min;
123
    goto out_of_range;
124
  }
125
  else if (*rnd > signed_max)
126
  {
127
    *rnd= signed_max;
128
    goto out_of_range;
129
  }
483.1.6 by Lee
code clean up for Field_num
130
131
  if (table->in_use->count_cuted_fields &&
132
      check_int(cs, from, len, end, error))
133
    return 1;
134
  return 0;
135
136
out_of_range:
137
  set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
138
  return 1;
139
}
140
141
/**
142
  Storing decimal in integer fields.
143
144
  @param val       value for storing
145
146
  @note
147
    This method is used by all integer fields, real/decimal redefine it
148
149
  @retval
150
    0     OK
151
  @retval
152
    !=0  error
153
*/
154
155
int Field_num::store_decimal(const my_decimal *val)
156
{
157
  int err= 0;
509 by Brian Aker
Incremental patch for removing unsigned.
158
  int64_t i= convert_decimal2int64_t(val, false, &err);
159
  return test(err | store(i, false));
483.1.6 by Lee
code clean up for Field_num
160
}
161
162
/**
163
  Return decimal value of integer field.
164
165
  @param decimal_value     buffer for storing decimal value
166
167
  @note
168
    This method is used by all integer fields, real/decimal redefine it.
169
    All int64_t values fit in our decimal buffer which cal store 8*9=72
170
    digits of integer number
171
172
  @return
173
    pointer to decimal buffer with value of field
174
*/
175
176
my_decimal* Field_num::val_decimal(my_decimal *decimal_value)
177
{
178
  assert(result_type() == INT_RESULT);
1089.1.3 by Brian Aker
Fix protobuf to release memory. Add in assert() for wrong column usage. Fix
179
483.1.6 by Lee
code clean up for Field_num
180
  int64_t nr= val_int();
509 by Brian Aker
Incremental patch for removing unsigned.
181
  int2my_decimal(E_DEC_FATAL_ERROR, nr, false, decimal_value);
483.1.6 by Lee
code clean up for Field_num
182
  return decimal_value;
183
}
184
185
1052.2.4 by Nathan Williams
No actual code changes. Changed Send_field to SendField to be consistent with coding standards.
186
void Field_num::make_field(SendField *field)
483.1.6 by Lee
code clean up for Field_num
187
{
188
  Field::make_field(field);
189
  field->decimals= dec;
190
}
191
192
/**
193
  @return
194
  returns 1 if the fields are equally defined
195
*/
196
bool Field_num::eq_def(Field *field)
197
{
198
  if (!Field::eq_def(field))
199
    return 0;
200
  Field_num *from_num= (Field_num*) field;
201
509 by Brian Aker
Incremental patch for removing unsigned.
202
  if (dec != from_num->dec)
483.1.6 by Lee
code clean up for Field_num
203
    return 0;
204
  return 1;
205
}
206
1052.2.3 by Nathan Williams
No actual code changes. Changed Create_field to CreateField to be consistent with coding standards.
207
uint32_t Field_num::is_equal(CreateField *new_field_ptr)
483.1.6 by Lee
code clean up for Field_num
208
{
779.3.10 by Monty Taylor
Turned on -Wshadow.
209
  return ((new_field_ptr->sql_type == real_type()) &&
210
          ((new_field_ptr->flags & UNSIGNED_FLAG) ==
211
           (uint32_t) (flags & UNSIGNED_FLAG)) &&
212
          ((new_field_ptr->flags & AUTO_INCREMENT_FLAG) ==
483.1.6 by Lee
code clean up for Field_num
213
           (uint32_t) (flags & AUTO_INCREMENT_FLAG)) &&
779.3.10 by Monty Taylor
Turned on -Wshadow.
214
          (new_field_ptr->length <= max_display_length()));
483.1.6 by Lee
code clean up for Field_num
215
}
216
217