Drizzled Public API Documentation

insert.cc
1 /* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3  *
4  * Copyright (C) 2008 Sun Microsystems, Inc.
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; version 2 of the License.
9  *
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.
14  *
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
18  */
19 
20 #include <config.h>
21 
22 #include <drizzled/function/str/insert.h>
23 #include <drizzled/error.h>
24 #include <drizzled/session.h>
25 #include <drizzled/system_variables.h>
26 
27 namespace drizzled {
28 
30 {
31  assert(fixed == 1);
32  String *res,*res2;
33  int64_t start, length; /* must be int64_t to avoid truncation */
34 
35  null_value=0;
36  res=args[0]->val_str(str);
37  res2=args[3]->val_str(&tmp_value);
38  start= args[1]->val_int() - 1;
39  length= args[2]->val_int();
40 
41  if (args[0]->null_value || args[1]->null_value || args[2]->null_value ||
42  args[3]->null_value)
43  goto null;
44 
45  if ((start < 0) || (start > static_cast<int64_t>(res->length())))
46  return res; // Wrong param; skip insert
47  if ((length < 0) || (length > static_cast<int64_t>(res->length())))
48  length= res->length();
49 
50  /* start and length are now sufficiently valid to pass to charpos function */
51  start= res->charpos((int) start);
52  length= res->charpos((int) length, (uint32_t) start);
53 
54  /* Re-testing with corrected params */
55  if (start > static_cast<int64_t>(res->length()))
56  return res;
57  if (length > static_cast<int64_t>(res->length()) - start)
58  length= res->length() - start;
59 
60  if ((uint64_t) (res->length() - length + res2->length()) >
61  (uint64_t) session.variables.max_allowed_packet)
62  {
63  push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
64  ER_WARN_ALLOWED_PACKET_OVERFLOWED,
65  ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED),
66  func_name(), session.variables.max_allowed_packet);
67  goto null;
68  }
69  res=copy_if_not_alloced(str,res,res->length());
70  res->replace((uint32_t) start,(uint32_t) length,*res2);
71  return res;
72 null:
73  null_value=1;
74  return 0;
75 }
76 
77 void Item_func_insert::fix_length_and_dec()
78 {
79  // Handle character set for args[0] and args[3].
80  if (agg_arg_charsets(collation, &args[0], 2, MY_COLL_ALLOW_CONV, 3))
81  return;
82  uint64_t max_result_length= ((uint64_t) args[0]->max_length + (uint64_t) args[3]->max_length);
83  if (max_result_length >= MAX_BLOB_WIDTH)
84  {
85  max_result_length= MAX_BLOB_WIDTH;
86  maybe_null= 1;
87  }
88  max_length= (ulong) max_result_length;
89 }
90 
91 } /* namespace drizzled */
virtual int64_t val_int()=0
bool fixed
Definition: item.h:120
bool null_value
Definition: item.h:122
bool maybe_null
Definition: item.h:121
String * val_str(String *)
Definition: insert.cc:29
virtual String * val_str(String *str)=0
drizzle_system_variables & variables
Definition: session.h:199