Drizzled Public API Documentation

columns.cc
00001 /* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
00002  *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
00003  *
00004  *  Copyright (C) 2010 Brian Aker
00005  *
00006  *  This program is free software; you can redistribute it and/or modify
00007  *  it under the terms of the GNU General Public License as published by
00008  *  the Free Software Foundation; either version 2 of the License, or
00009  *  (at your option) any later version.
00010  *
00011  *  This program is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *  GNU General Public License for more details.
00015  *
00016  *  You should have received a copy of the GNU General Public License
00017  *  along with this program; if not, write to the Free Software
00018  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00019  */
00020 
00021 #include <config.h>
00022 #include <plugin/information_schema_dictionary/dictionary.h>
00023 
00024 using namespace std;
00025 using namespace drizzled;
00026 
00027 Columns::Columns() :
00028   InformationSchema("COLUMNS")
00029 {
00030   add_field("TABLE_CATALOG", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
00031   add_field("TABLE_SCHEMA", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
00032   add_field("TABLE_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
00033   add_field("COLUMN_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
00034   add_field("ORDINAL_POSITION", plugin::TableFunction::NUMBER, 0, false);
00035   add_field("COLUMN_DEFAULT", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00036   add_field("IS_NULLABLE", plugin::TableFunction::BOOLEAN, 0, false);
00037   add_field("DATA_TYPE", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, false);
00038   add_field("CHARACTER_MAXIMUM_LENGTH", plugin::TableFunction::NUMBER, 0, true);
00039   add_field("CHARACTER_OCTET_LENGTH", plugin::TableFunction::NUMBER, 0, true);
00040   add_field("NUMERIC_PRECISION", plugin::TableFunction::NUMBER, 0, true);
00041   add_field("NUMERIC_PRECISION_RADIX", plugin::TableFunction::NUMBER, 0, true);
00042   add_field("NUMERIC_SCALE", plugin::TableFunction::NUMBER, 0, true);
00043   add_field("DATETIME_PRECISION", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00044   add_field("CHARACTER_SET_CATALOG", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00045   add_field("CHARACTER_SET_SCHEMA", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00046   add_field("CHARACTER_SET_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00047   add_field("COLLATION_CATALOG", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00048   add_field("COLLATION_SCHEMA", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00049   add_field("COLLATION_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00050   add_field("DOMAIN_CATALOG", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00051   add_field("DOMAIN_SCHEMA", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00052   add_field("DOMAIN_NAME", plugin::TableFunction::STRING, MAXIMUM_IDENTIFIER_LENGTH, true);
00053 }
00054 
00055 Columns::Generator::Generator(drizzled::Field **arg) :
00056   InformationSchema::Generator(arg),
00057   field_generator(getSession())
00058 {
00059 }
00060 
00061 bool Columns::Generator::populate()
00062 {
00063   drizzled::generator::FieldPair field_pair;
00064   while (!!(field_pair= field_generator))
00065   {
00066     const drizzled::message::Table *table_message= field_pair.first;
00067     int32_t field_iterator= field_pair.second;
00068     const message::Table::Field &field(table_message->field(field_pair.second));
00069 
00070     /* TABLE_CATALOG */
00071     push(table_message->catalog());
00072 
00073     /* TABLE_SCHEMA */
00074     push(table_message->schema());
00075 
00076     /* TABLE_NAME */
00077     push(table_message->name());
00078 
00079     /* COLUMN_NAME */
00080     push(field.name());
00081 
00082     /* ORDINAL_POSITION */
00083     push(static_cast<int64_t>(field_iterator));
00084 
00085     /* COLUMN_NAME */
00086     if (field.options().has_default_value())
00087     {
00088       push(field.options().default_value());
00089     }
00090     else
00091     {
00092       push();
00093     }
00094 
00095     /* IS_NULLABLE */
00096     push(not field.constraints().is_notnull());
00097 
00098     /* DATA_TYPE <-- display the type that the user is going to expect, which is not the same as the type we store internally */
00099     push(drizzled::message::type(field));
00100 
00101     /* "CHARACTER_MAXIMUM_LENGTH" */
00102     if (field.string_options().has_length())
00103     {
00104       push(static_cast<int64_t>(field.string_options().length()));
00105     }
00106     else
00107     {
00108       push();
00109     }
00110 
00111     /* "CHARACTER_OCTET_LENGTH" */
00112     if (field.string_options().has_length())
00113     {
00114       push(static_cast<int64_t>(field.string_options().length() * 4));
00115     }
00116     else
00117     {
00118       push();
00119     }
00120 
00121     /* "NUMERIC_PRECISION" */
00122     if (field.numeric_options().has_precision())
00123     {
00124       push(static_cast<int64_t>(field.numeric_options().precision()));
00125     }
00126     else
00127     {
00128       push();
00129     }
00130 
00131     /* NUMERIC_PRECISION_RADIX */
00132     push();
00133 
00134     /* "NUMERIC_SCALE" */
00135     if (field.numeric_options().has_scale())
00136     {
00137       push(static_cast<int64_t>(field.numeric_options().scale()));
00138     }
00139     else
00140     {
00141       push();
00142     }
00143 
00144     /* DATETIME_PRECISION */
00145     push();
00146 
00147     /* CHARACTER_SET_CATALOG */
00148     push();
00149 
00150     /* CHARACTER_SET_SCHEMA */
00151     push();
00152 
00153     /* CHARACTER_SET_NAME */
00154     push();
00155 
00156     /* COLLATION_CATALOG */
00157     push();
00158 
00159     /* COLLATION_SCHEMA */
00160     push();
00161 
00162     /* COLLATION_NAME */
00163     if (field.string_options().has_collation())
00164     {
00165       push(field.string_options().collation());
00166     }
00167     else
00168     {
00169       push();
00170     }
00171 
00172     /* DOMAIN_CATALOG */
00173     push();
00174 
00175     /* DOMAIN_SCHEMA */
00176     push();
00177 
00178     /* DOMAIN_NAME */
00179     push();
00180 
00181     return true;
00182   }
00183 
00184   return false;
00185 }