1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems, Inc.
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; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
#include <drizzled/session.h>
23
#include <drizzled/error.h>
24
#include <drizzled/item/string.h>
29
Item *Item_string::safe_charset_converter(const CHARSET_INFO * const tocs)
34
String tmp, cstr, *ostr= val_str(&tmp);
35
cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(), tocs, &conv_errors);
36
if (conv_errors || !(conv= new Item_string(cstr.ptr(), cstr.length(),
38
collation.derivation)))
41
Safe conversion is not possible (or EOM).
42
We could not convert a string into the requested character set
43
without data loss. The target charset does not cover all the
44
characters from the string. Operation cannot be done correctly.
49
if (!(ptr= getSession().strmake(cstr.ptr(), cstr.length())))
52
conv->str_value.set(ptr, cstr.length(), cstr.charset());
53
/* Ensure that no one is going to change the result string */
54
conv->str_value.mark_as_const();
59
Item *Item_static_string_func::safe_charset_converter(const CHARSET_INFO * const tocs)
63
String tmp, cstr, *ostr= val_str(&tmp);
64
cstr.copy(ostr->ptr(), ostr->length(), ostr->charset(), tocs, &conv_errors);
66
!(conv= new Item_static_string_func(func_name,
67
cstr.ptr(), cstr.length(),
69
collation.derivation)))
72
Safe conversion is not possible (or EOM).
73
We could not convert a string into the requested character set
74
without data loss. The target charset does not cover all the
75
characters from the string. Operation cannot be done correctly.
79
conv->str_value.copy();
80
/* Ensure that no one is going to change the result string */
81
conv->str_value.mark_as_const();
86
bool Item_string::eq(const Item *item, bool binary_cmp) const
88
if (type() == item->type() && item->basic_const_item())
91
return !stringcmp(&str_value, &item->str_value);
92
return (collation.collation == item->collation.collation &&
93
!sortcmp(&str_value, &item->str_value, collation.collation));
98
void Item_string::print(String *str, enum_query_type query_type)
100
if (query_type == QT_ORDINARY && is_cs_specified())
103
str->append(collation.collation->csname);
108
str_value.print(str);
113
double Item_string::val_real()
119
const CHARSET_INFO * const cs= str_value.charset();
121
org_end= (char*) str_value.ptr() + str_value.length();
122
tmp= my_strntod(cs, (char*) str_value.ptr(), str_value.length(), &end,
124
if (error || (end != org_end && !check_if_only_end_space(cs, end, org_end)))
127
We can use str_value.ptr() here as Item_string is gurantee to put an
130
push_warning_printf(&getSession(), DRIZZLE_ERROR::WARN_LEVEL_WARN,
131
ER_TRUNCATED_WRONG_VALUE,
132
ER(ER_TRUNCATED_WRONG_VALUE), "DOUBLE",
140
Give error if we wanted a signed integer and we got an unsigned one
142
int64_t Item_string::val_int()
147
char *end= (char*) str_value.ptr()+ str_value.length();
149
const CHARSET_INFO * const cs= str_value.charset();
151
tmp= (*(cs->cset->strtoll10))(cs, str_value.ptr(), &end, &err);
153
TODO: Give error if we wanted a signed integer and we got an unsigned
157
(end != org_end && !check_if_only_end_space(cs, end, org_end)))
159
push_warning_printf(&getSession(), DRIZZLE_ERROR::WARN_LEVEL_WARN,
160
ER_TRUNCATED_WRONG_VALUE,
161
ER(ER_TRUNCATED_WRONG_VALUE), "INTEGER",
167
type::Decimal *Item_string::val_decimal(type::Decimal *decimal_value)
169
return val_decimal_from_string(decimal_value);
172
int Item_string::save_in_field(Field *field, bool)
175
result=val_str(&str_value);
176
return save_str_value_in_field(field, result);
180
} /* namespace drizzled */