Drizzled Public API Documentation

columns.cc
1 /* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3  *
4  * Copyright (C) 2010 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; 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 #include <config.h>
22 #include <plugin/schema_dictionary/dictionary.h>
23 
24 using namespace std;
25 using namespace drizzled;
26 
27 
28 ColumnsTool::ColumnsTool() :
29  DataDictionary("COLUMNS")
30 {
31  add_field("TABLE_SCHEMA", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
32  add_field("TABLE_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
33 
34  add_field("COLUMN_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
35  add_field("COLUMN_TYPE");
36  add_field("ORDINAL_POSITION", plugin::TableFunction::NUMBER, 0, false);
37  add_field("COLUMN_DEFAULT", plugin::TableFunction::VARBINARY, 65535, true);
38  add_field("COLUMN_DEFAULT_IS_NULL", plugin::TableFunction::BOOLEAN, 0, false);
39  add_field("COLUMN_DEFAULT_UPDATE");
40  add_field("IS_SIGNED", plugin::TableFunction::BOOLEAN, 0, true);
41  add_field("IS_AUTO_INCREMENT", plugin::TableFunction::BOOLEAN, 0, false);
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);
49  add_field("DATA_TYPE");
50  add_field("DATA_ARCHETYPE");
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);
55 
56  add_field("ENUM_VALUES", plugin::TableFunction::STRING, 1024, true);
57 
58  add_field("COLLATION_NAME");
59 
60  add_field("COLUMN_COMMENT", plugin::TableFunction::STRING, 1024, true);
61 }
62 
63 
64 ColumnsTool::Generator::Generator(Field **arg) :
65  DataDictionary::Generator(arg),
66  field_generator(getSession())
67 {
68 }
69 
70 bool ColumnsTool::Generator::populate()
71 {
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 
119  /* IS_SIGNED */
120  if (drizzled::message::is_numeric(column))
121  {
122  push(true);
123  }
124  else
125  {
126  push();
127  }
128 
129  /* IS_AUTO_INCREMENT */
130  push(column.numeric_options().is_autoincrement());
131 
132  /* IS_NULLABLE */
133  push(not column.constraints().is_notnull());
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++)
147  {
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)
151  {
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  }
168  }
169  }
170  }
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 
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 */
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;
237 }