~drizzle-trunk/drizzle/development

1008.3.1 by Stewart Smith
move Item_default_value out into its own files under drizzled/item/ to make it easier to find and follow current convention
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
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
1241.9.36 by Monty Taylor
ZOMG. I deleted drizzled/server_includes.h.
20
#include "config.h"
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
21
1008.3.1 by Stewart Smith
move Item_default_value out into its own files under drizzled/item/ to make it easier to find and follow current convention
22
#include <drizzled/error.h>
23
#include <drizzled/name_resolution_context.h>
24
#include <drizzled/table.h>
25
#include <drizzled/session.h>
26
#include <drizzled/current_session.h>
27
#include <drizzled/item/default_value.h>
28
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
29
namespace drizzled
30
{
1253.1.6 by Monty Taylor
Moved mem_root functions into drizzled::memory:: namespace.
31
1008.3.1 by Stewart Smith
move Item_default_value out into its own files under drizzled/item/ to make it easier to find and follow current convention
32
bool Item_default_value::eq(const Item *item, bool binary_cmp) const
33
{
34
  return item->type() == DEFAULT_VALUE_ITEM &&
35
    ((Item_default_value *)item)->arg->eq(arg, binary_cmp);
36
}
37
38
39
bool Item_default_value::fix_fields(Session *session, Item **)
40
{
41
  Item *real_arg;
42
  Item_field *field_arg;
43
  Field *def_field;
44
  assert(fixed == 0);
45
46
  if (!arg)
47
  {
48
    fixed= 1;
49
    return false;
50
  }
51
  if (!arg->fixed && arg->fix_fields(session, &arg))
52
    goto error;
53
54
55
  real_arg= arg->real_item();
56
  if (real_arg->type() != FIELD_ITEM)
57
  {
58
    my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), arg->name);
59
    goto error;
60
  }
61
62
  field_arg= (Item_field *)real_arg;
63
  if (field_arg->field->flags & NO_DEFAULT_VALUE_FLAG)
64
  {
65
    my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), field_arg->field->field_name);
66
    goto error;
67
  }
1253.1.6 by Monty Taylor
Moved mem_root functions into drizzled::memory:: namespace.
68
  if (!(def_field= (Field*) memory::sql_alloc(field_arg->field->size_of())))
1008.3.1 by Stewart Smith
move Item_default_value out into its own files under drizzled/item/ to make it easier to find and follow current convention
69
    goto error;
70
  memcpy(def_field, field_arg->field, field_arg->field->size_of());
1122.2.12 by Monty Taylor
Removed the silly my_ptrdiff_t typedef.
71
  def_field->move_field_offset((ptrdiff_t)
1660.1.3 by Brian Aker
Encapsulate Table in field
72
                               (def_field->getTable()->getDefaultValues() - def_field->getTable()->record[0]));
1008.3.1 by Stewart Smith
move Item_default_value out into its own files under drizzled/item/ to make it easier to find and follow current convention
73
  set_field(def_field);
74
  return false;
75
76
error:
77
  context->process_error(session);
78
  return true;
79
}
80
81
82
void Item_default_value::print(String *str, enum_query_type query_type)
83
{
84
  if (!arg)
85
  {
86
    str->append(STRING_WITH_LEN("default"));
87
    return;
88
  }
89
  str->append(STRING_WITH_LEN("default("));
90
  arg->print(str, query_type);
91
  str->append(')');
92
}
93
94
95
int Item_default_value::save_in_field(Field *field_arg, bool no_conversions)
96
{
97
  if (!arg)
98
  {
99
    if (field_arg->flags & NO_DEFAULT_VALUE_FLAG)
100
    {
101
      if (field_arg->reset())
102
      {
103
        my_message(ER_CANT_CREATE_GEOMETRY_OBJECT,
104
                   ER(ER_CANT_CREATE_GEOMETRY_OBJECT), MYF(0));
105
        return -1;
106
      }
107
108
      {
1660.1.3 by Brian Aker
Encapsulate Table in field
109
        push_warning_printf(field_arg->getTable()->in_use,
1008.3.1 by Stewart Smith
move Item_default_value out into its own files under drizzled/item/ to make it easier to find and follow current convention
110
                            DRIZZLE_ERROR::WARN_LEVEL_WARN,
111
                            ER_NO_DEFAULT_FOR_FIELD,
112
                            ER(ER_NO_DEFAULT_FOR_FIELD),
113
                            field_arg->field_name);
114
      }
115
      return 1;
116
    }
117
    field_arg->set_default();
118
    return 0;
119
  }
120
  return Item_field::save_in_field(field_arg, no_conversions);
121
}
122
123
124
/**
125
  This method like the walk method traverses the item tree, but at the
126
  same time it can replace some nodes in the tree.
127
*/
128
129
Item *Item_default_value::transform(Item_transformer transformer, unsigned char *args)
130
{
131
  Item *new_item= arg->transform(transformer, args);
132
  if (!new_item)
133
    return NULL;
134
135
  /*
136
    Session::change_item_tree() should be called only if the tree was
137
    really transformed, i.e. when a new item has been created.
138
    Otherwise we'll be allocating a lot of unnecessary memory for
139
    change records at each execution.
140
  */
141
  if (arg != new_item)
142
    current_session->change_item_tree(&arg, new_item);
143
  return (this->*transformer)(args);
144
}
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
145
146
147
} /* namespace drizzled */