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 Brian Aker
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/information_schema_dictionary/dictionary.h>
23 
24 using namespace std;
25 using namespace drizzled;
26 
27 Columns::Columns() :
28  InformationSchema("COLUMNS")
29 {
30  add_field("TABLE_CATALOG", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
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  add_field("COLUMN_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
34  add_field("ORDINAL_POSITION", plugin::TableFunction::NUMBER, 0, false);
35  add_field("COLUMN_DEFAULT", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
36  add_field("IS_NULLABLE", plugin::TableFunction::BOOLEAN, 0, false);
37  add_field("DATA_TYPE", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
38  add_field("CHARACTER_MAXIMUM_LENGTH", plugin::TableFunction::NUMBER, 0, true);
39  add_field("CHARACTER_OCTET_LENGTH", plugin::TableFunction::NUMBER, 0, true);
40  add_field("NUMERIC_PRECISION", plugin::TableFunction::NUMBER, 0, true);
41  add_field("NUMERIC_PRECISION_RADIX", plugin::TableFunction::NUMBER, 0, true);
42  add_field("NUMERIC_SCALE", plugin::TableFunction::NUMBER, 0, true);
43  add_field("DATETIME_PRECISION", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
44  add_field("CHARACTER_SET_CATALOG", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
45  add_field("CHARACTER_SET_SCHEMA", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
46  add_field("CHARACTER_SET_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
47  add_field("COLLATION_CATALOG", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
48  add_field("COLLATION_SCHEMA", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
49  add_field("COLLATION_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
50  add_field("DOMAIN_CATALOG", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
51  add_field("DOMAIN_SCHEMA", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
52  add_field("DOMAIN_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
53 }
54 
55 Columns::Generator::Generator(drizzled::Field **arg) :
56  InformationSchema::Generator(arg),
57  field_generator(getSession())
58 {
59 }
60 
61 bool Columns::Generator::populate()
62 {
63  drizzled::generator::FieldPair field_pair;
64  while (!!(field_pair= field_generator))
65  {
66  const drizzled::message::Table *table_message= field_pair.first;
67  int32_t field_iterator= field_pair.second;
68  const message::Table::Field &field(table_message->field(field_pair.second));
69 
70  /* TABLE_CATALOG */
71  push(table_message->catalog());
72 
73  /* TABLE_SCHEMA */
74  push(table_message->schema());
75 
76  /* TABLE_NAME */
77  push(table_message->name());
78 
79  /* COLUMN_NAME */
80  push(field.name());
81 
82  /* ORDINAL_POSITION */
83  push(static_cast<int64_t>(field_iterator));
84 
85  /* COLUMN_NAME */
86  if (field.options().has_default_value())
87  {
88  push(field.options().default_value());
89  }
90  else
91  {
92  push();
93  }
94 
95  /* IS_NULLABLE */
96  push(not field.constraints().is_notnull());
97 
98  /* DATA_TYPE <-- display the type that the user is going to expect, which is not the same as the type we store internally */
99  push(drizzled::message::type(field));
100 
101  /* "CHARACTER_MAXIMUM_LENGTH" */
102  if (field.string_options().has_length())
103  {
104  push(static_cast<int64_t>(field.string_options().length()));
105  }
106  else
107  {
108  push();
109  }
110 
111  /* "CHARACTER_OCTET_LENGTH" */
112  if (field.string_options().has_length())
113  {
114  push(static_cast<int64_t>(field.string_options().length() * 4));
115  }
116  else
117  {
118  push();
119  }
120 
121  /* "NUMERIC_PRECISION" */
122  if (field.numeric_options().has_precision())
123  {
124  push(static_cast<int64_t>(field.numeric_options().precision()));
125  }
126  else
127  {
128  push();
129  }
130 
131  /* NUMERIC_PRECISION_RADIX */
132  push();
133 
134  /* "NUMERIC_SCALE" */
135  if (field.numeric_options().has_scale())
136  {
137  push(static_cast<int64_t>(field.numeric_options().scale()));
138  }
139  else
140  {
141  push();
142  }
143 
144  /* DATETIME_PRECISION */
145  push();
146 
147  /* CHARACTER_SET_CATALOG */
148  push();
149 
150  /* CHARACTER_SET_SCHEMA */
151  push();
152 
153  /* CHARACTER_SET_NAME */
154  push();
155 
156  /* COLLATION_CATALOG */
157  push();
158 
159  /* COLLATION_SCHEMA */
160  push();
161 
162  /* COLLATION_NAME */
163  if (field.string_options().has_collation())
164  {
165  push(field.string_options().collation());
166  }
167  else
168  {
169  push();
170  }
171 
172  /* DOMAIN_CATALOG */
173  push();
174 
175  /* DOMAIN_SCHEMA */
176  push();
177 
178  /* DOMAIN_NAME */
179  push();
180 
181  return true;
182  }
183 
184  return false;
185 }