~drizzle-trunk/drizzle/development

1273.13.5 by Brian Aker
Additional definitions.
1
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
1999.6.1 by kalebral at gmail
update Copyright strings to a more common format to help with creating the master debian copyright file
4
 *  Copyright (C) 2010 Sun Microsystems, Inc.
1273.13.5 by Brian Aker
Additional definitions.
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
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
21
#include <config.h>
22
#include <plugin/schema_dictionary/dictionary.h>
1273.13.5 by Brian Aker
Additional definitions.
23
24
using namespace std;
25
using namespace drizzled;
26
1273.13.17 by Brian Aker
Pass through rewrite.
27
1273.13.7 by Brian Aker
Updates to the classes (first pass).
28
ColumnsTool::ColumnsTool() :
1861.4.6 by Brian Aker
Switched columns to use AllFields.
29
  DataDictionary("COLUMNS")
1273.13.5 by Brian Aker
Additional definitions.
30
{
2338.2.11 by Stewart Smith
use MAXIMUM_IDENTIFIER_LENGTH for DATA_DICTIONARY.COLUMNS columns
31
  add_field("TABLE_SCHEMA", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
32
  add_field("TABLE_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
1273.13.8 by Brian Aker
Second pass through the interface.
33
2338.2.11 by Stewart Smith
use MAXIMUM_IDENTIFIER_LENGTH for DATA_DICTIONARY.COLUMNS columns
34
  add_field("COLUMN_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
1273.19.5 by Brian Aker
Remove the old columns I_S table.
35
  add_field("COLUMN_TYPE");
1643.3.10 by Brian Aker
Column support, clean up of IS/DD for NULL type.
36
  add_field("ORDINAL_POSITION", plugin::TableFunction::NUMBER, 0, false);
1337.1.2 by Stewart Smith
make DATA_DICTIONARY.COLUMNS.COLUMN_DEFAULT be a VARBINARY column that can be null. Add a test for binary default values as well as non-binary default values.
37
  add_field("COLUMN_DEFAULT", plugin::TableFunction::VARBINARY, 65535, true);
1643.3.10 by Brian Aker
Column support, clean up of IS/DD for NULL type.
38
  add_field("COLUMN_DEFAULT_IS_NULL", plugin::TableFunction::BOOLEAN, 0, false);
1273.19.1 by Brian Aker
Update for show fields.
39
  add_field("COLUMN_DEFAULT_UPDATE");
1999.4.11 by Brian Aker
Fix issues with some columns incorrectly reporting NULL if they were of
40
  add_field("IS_SIGNED", plugin::TableFunction::BOOLEAN, 0, true);
1779.3.4 by Andrew Hutchings
Add auto_incrememnt boolean and enum values string to data_dictionary.columns
41
  add_field("IS_AUTO_INCREMENT", plugin::TableFunction::BOOLEAN, 0, false);
1643.3.10 by Brian Aker
Column support, clean up of IS/DD for NULL type.
42
  add_field("IS_NULLABLE", plugin::TableFunction::BOOLEAN, 0, false);
43
  add_field("IS_INDEXED", plugin::TableFunction::BOOLEAN, 0, false);
44
  add_field("IS_USED_IN_PRIMARY", plugin::TableFunction::BOOLEAN, 0, false);
45
  add_field("IS_UNIQUE", plugin::TableFunction::BOOLEAN, 0, false);
46
  add_field("IS_MULTI", plugin::TableFunction::BOOLEAN, 0, false);
47
  add_field("IS_FIRST_IN_MULTI", plugin::TableFunction::BOOLEAN, 0, false);
48
  add_field("INDEXES_FOUND_IN", plugin::TableFunction::NUMBER, 0, false);
1273.13.41 by Brian Aker
Updating from additional schemas added.
49
  add_field("DATA_TYPE");
1999.4.10 by Brian Aker
This fixes the bug where we were not displaying the correct field type in
50
  add_field("DATA_ARCHETYPE");
1273.13.32 by Brian Aker
Big ole patch. This covers moving information_schema to old_* table names
51
  add_field("CHARACTER_MAXIMUM_LENGTH", plugin::TableFunction::NUMBER);
52
  add_field("CHARACTER_OCTET_LENGTH", plugin::TableFunction::NUMBER);
53
  add_field("NUMERIC_PRECISION", plugin::TableFunction::NUMBER);
54
  add_field("NUMERIC_SCALE", plugin::TableFunction::NUMBER);
1273.13.18 by Brian Aker
Update code, first pass through cleaner method for recursing through
55
1779.3.8 by Andrew Hutchings
ok, so a varchar(65535) is a really bad idea in data_dictionary in some platforms. Doesn't need to be that long anyway, shrinked to 1024.
56
  add_field("ENUM_VALUES", plugin::TableFunction::STRING, 1024, true);
1779.3.4 by Andrew Hutchings
Add auto_incrememnt boolean and enum values string to data_dictionary.columns
57
1273.13.18 by Brian Aker
Update code, first pass through cleaner method for recursing through
58
  add_field("COLLATION_NAME");
1273.16.4 by Brian Aker
Added columsn for COLUMNS
59
1567.1.1 by Brian Aker
This fixes bug 586009, increases the size of the log files so that the UNION
60
  add_field("COLUMN_COMMENT", plugin::TableFunction::STRING, 1024, true);
1273.13.5 by Brian Aker
Additional definitions.
61
}
1273.13.15 by Brian Aker
First pass through making columns work.
62
1273.13.18 by Brian Aker
Update code, first pass through cleaner method for recursing through
63
64
ColumnsTool::Generator::Generator(Field **arg) :
1861.4.6 by Brian Aker
Switched columns to use AllFields.
65
  DataDictionary::Generator(arg),
66
  field_generator(getSession())
67
{
1273.13.18 by Brian Aker
Update code, first pass through cleaner method for recursing through
68
}
69
1273.13.21 by Brian Aker
Fix interface (we no longer need Fields passed around).
70
bool ColumnsTool::Generator::populate()
1273.13.18 by Brian Aker
Update code, first pass through cleaner method for recursing through
71
{
1861.4.6 by Brian Aker
Switched columns to use AllFields.
72
  drizzled::generator::FieldPair field_pair;
73
74
  while (!!(field_pair= field_generator))
75
  {
76
    const drizzled::message::Table *table_message= field_pair.first;
77
    int32_t field_iterator= field_pair.second;
78
    const message::Table::Field &column(table_message->field(field_pair.second));
79
80
    /* TABLE_SCHEMA */
81
    push(table_message->schema());
82
83
    /* TABLE_NAME */
84
    push(table_message->name());
85
86
    /* COLUMN_NAME */
87
    push(column.name());
88
89
    /* COLUMN_TYPE */
90
    push(drizzled::message::type(column.type()));
91
92
    /* ORDINAL_POSITION */
93
    push(static_cast<int64_t>(field_iterator));
94
95
    /* COLUMN_DEFAULT */
96
    if (column.options().has_default_value())
97
    {
98
      push(column.options().default_value());
99
    }
100
    else if (column.options().has_default_bin_value())
101
    {
102
      push(column.options().default_bin_value().c_str(), column.options().default_bin_value().length());
103
    }
104
    else if (column.options().has_default_expression())
105
    {
106
      push(column.options().default_expression());
107
    }
108
    else
109
    {
110
      push();
111
    }
112
113
    /* COLUMN_DEFAULT_IS_NULL */
114
    push(column.options().default_null());
115
116
    /* COLUMN_DEFAULT_UPDATE */
117
    push(column.options().update_expression());
118
1999.4.11 by Brian Aker
Fix issues with some columns incorrectly reporting NULL if they were of
119
    /* IS_SIGNED */
120
    if (drizzled::message::is_numeric(column))
121
    {
122
      push(true);
123
    }
124
    else 
125
    {
126
      push();
127
    }
128
1861.4.6 by Brian Aker
Switched columns to use AllFields.
129
    /* IS_AUTO_INCREMENT */
130
    push(column.numeric_options().is_autoincrement());
131
132
    /* IS_NULLABLE */
2064.2.1 by Brian Aker
Fixes naming conventions and issues around notnull being "true" by default.
133
    push(not column.constraints().is_notnull());
1861.4.6 by Brian Aker
Switched columns to use AllFields.
134
135
    /* IS_INDEXED, IS_USED_IN_PRIMARY, IS_UNIQUE, IS_MULTI, IS_FIRST_IN_MULTI, INDEXES_FOUND_IN */
136
    bool is_indexed= false;
137
    bool is_primary= false;
138
    bool is_unique= false;
139
    bool is_multi= false;
140
    bool is_multi_first= false;
141
    int64_t indexes_found_in= 0;
142
    for (int32_t x= 0; x < table_message->indexes_size() ; x++)
143
    {
144
      const drizzled::message::Table::Index &index(table_message->indexes(x));
145
146
      for (int32_t y= 0; y < index.index_part_size() ; y++)
1309.4.2 by Brian Aker
Updates to schema dictionary for lee
147
      {
1861.4.6 by Brian Aker
Switched columns to use AllFields.
148
        const drizzled::message::Table::Index::IndexPart &index_part(index.index_part(y));
149
150
        if (static_cast<int32_t>(index_part.fieldnr()) == field_iterator)
1309.4.2 by Brian Aker
Updates to schema dictionary for lee
151
        {
1861.4.6 by Brian Aker
Switched columns to use AllFields.
152
          indexes_found_in++;
153
          is_indexed= true;
154
155
          if (index.is_primary())
156
            is_primary= true;
157
158
          if (index.is_unique())
159
            is_unique= true;
160
161
          if (index.index_part_size() > 1)
162
          {
163
            is_multi= true;
164
165
            if (y == 0)
166
              is_multi_first= true;
167
          }
1309.4.2 by Brian Aker
Updates to schema dictionary for lee
168
        }
169
      }
170
    }
1861.4.6 by Brian Aker
Switched columns to use AllFields.
171
    /* ...IS_INDEXED, IS_USED_IN_PRIMARY, IS_UNIQUE, IS_MULTI, IS_FIRST_IN_MULTI, INDEXES_FOUND_IN */
172
    push(is_indexed);
173
    push(is_primary);
174
    push(is_unique);
175
    push(is_multi);
176
    push(is_multi_first);
177
    push(indexes_found_in);
178
1999.4.10 by Brian Aker
This fixes the bug where we were not displaying the correct field type in
179
    /* DATA_TYPE <-- display the type that the user is going to expect, which is not the same as the type we store internally */
180
    push(drizzled::message::type(column));
181
182
    /* DATA_ARCHETYPE */
1861.4.6 by Brian Aker
Switched columns to use AllFields.
183
    push(drizzled::message::type(column.type()));
184
185
    /* "CHARACTER_MAXIMUM_LENGTH" */
186
    push(static_cast<int64_t>(column.string_options().length()));
187
188
    /* "CHARACTER_OCTET_LENGTH" */
189
    push(static_cast<int64_t>(column.string_options().length()) * 4);
190
191
    /* "NUMERIC_PRECISION" */
192
    push(static_cast<int64_t>(column.numeric_options().precision()));
193
194
    /* "NUMERIC_SCALE" */
195
    push(static_cast<int64_t>(column.numeric_options().scale()));
196
197
    /* "ENUM_VALUES" */
198
    if (column.type() == drizzled::message::Table::Field::ENUM)
199
    {
200
      string destination;
201
      size_t num_field_values= column.enumeration_values().field_value_size();
202
      for (size_t x= 0; x < num_field_values; ++x)
203
      {
204
        const string &type= column.enumeration_values().field_value(x);
205
206
        if (x != 0)
207
          destination.push_back(',');
208
209
        destination.push_back('\'');
210
        destination.append(type);
211
        destination.push_back('\'');
212
      }
213
      push(destination);
214
    }
215
    else
216
    {
217
      push();
218
    }
219
220
    /* "COLLATION_NAME" */
221
    push(column.string_options().collation());
222
223
    /* "COLUMN_COMMENT" */
224
    if (column.has_comment())
225
    {
226
      push(column.comment());
227
    }
228
    else
229
    {
230
      push();
231
    }
232
233
    return true;
234
  }
235
236
  return false;
1273.13.15 by Brian Aker
First pass through making columns work.
237
}