1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2010 Monty Taylor
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.
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.
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
22
#include <drizzled/plugin/table_function.h>
23
#include <drizzled/table_function_container.h>
24
#include <drizzled/gettext.h>
25
#include "drizzled/plugin/registry.h"
26
#include "drizzled/global_charset_info.h"
32
using namespace drizzled;
34
static TableFunctionContainer table_functions;
36
void plugin::TableFunction::init()
38
drizzled::message::Table::StorageEngine *engine;
39
drizzled::message::Table::TableOptions *table_options;
41
proto.set_name(identifier.getTableName());
42
proto.set_type(drizzled::message::Table::FUNCTION);
44
table_options= proto.mutable_options();
45
table_options->set_collation_id(default_charset_info->number);
46
table_options->set_collation(default_charset_info->name);
48
engine= proto.mutable_engine();
49
engine->set_name("FunctionEngine");
52
bool plugin::TableFunction::addPlugin(plugin::TableFunction *tool)
55
table_functions.addFunction(tool);
59
plugin::TableFunction *plugin::TableFunction::getFunction(const string &arg)
61
return table_functions.getFunction(arg);
64
void plugin::TableFunction::getNames(const string &arg,
65
set<std::string> &set_of_names)
67
table_functions.getNames(arg, set_of_names);
70
plugin::TableFunction::Generator *plugin::TableFunction::generator(Field **arg)
72
return new Generator(arg);
75
void plugin::TableFunction::add_field(const char *label,
76
uint32_t field_length)
78
add_field(label, TableFunction::STRING, field_length);
81
void plugin::TableFunction::add_field(const char *label,
82
TableFunction::ColumnType type,
85
add_field(label, type, 5, is_default_null);
88
void plugin::TableFunction::add_field(const char *label,
89
TableFunction::ColumnType type,
90
uint32_t field_length,
93
drizzled::message::Table::Field *field;
94
drizzled::message::Table::Field::FieldOptions *field_options;
95
drizzled::message::Table::Field::FieldConstraints *field_constraints;
97
field= proto.add_field();
98
field->set_name(label);
100
field_options= field->mutable_options();
101
field_constraints= field->mutable_constraints();
102
field_options->set_default_null(is_default_null);
103
field_constraints->set_is_nullable(is_default_null);
108
case TableFunction::BOOLEAN:
110
case TableFunction::STRING:
111
drizzled::message::Table::Field::StringFieldOptions *string_field_options;
112
field->set_type(drizzled::message::Table::Field::VARCHAR);
114
string_field_options= field->mutable_string_options();
115
string_field_options->set_length(field_length);
118
case TableFunction::NUMBER:
119
field->set_type(drizzled::message::Table::Field::BIGINT);
124
plugin::TableFunction::Generator::Generator(Field **arg) :
127
scs= system_charset_info;
130
bool plugin::TableFunction::Generator::sub_populate()
132
columns_iterator= columns;
136
void plugin::TableFunction::Generator::push(uint64_t arg)
138
(*columns_iterator)->store(static_cast<int64_t>(arg), false);
142
void plugin::TableFunction::Generator::push(uint32_t arg)
144
(*columns_iterator)->store(static_cast<int64_t>(arg), false);
148
void plugin::TableFunction::Generator::push(int64_t arg)
150
(*columns_iterator)->store(arg, false);
154
void plugin::TableFunction::Generator::push(int32_t arg)
156
(*columns_iterator)->store(arg, false);
160
void plugin::TableFunction::Generator::push(const char *arg, uint32_t length)
162
assert(columns_iterator);
163
assert(*columns_iterator);
165
(*columns_iterator)->store(arg, length ? length : strlen(arg), scs);
169
void plugin::TableFunction::Generator::push(const std::string& arg)
171
(*columns_iterator)->store(arg.c_str(), arg.length(), scs);
175
void plugin::TableFunction::Generator::push(bool arg)
179
(*columns_iterator)->store("TRUE", 4, scs);
183
(*columns_iterator)->store("FALSE", 5, scs);