1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2010 Brian Aker
5
* Copyright (C) 2009 Sun Microsystems
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23
This is a "work in progress". The concept needs to be replicated throughout
24
the code, but we will start with baby steps for the moment. To not incur
25
cost until we are complete, for the moment it will do no allocation.
27
This is mainly here so that it can be used in the SE interface for
30
This will replace Table_ident.
33
#ifndef DRIZZLED_IDENTIFIER_TABLE_H
34
#define DRIZZLED_IDENTIFIER_TABLE_H
36
#include <drizzled/enum.h>
37
#include "drizzled/definitions.h"
38
#include "drizzled/message/table.pb.h"
40
#include "drizzled/identifier.h"
51
#include <boost/functional/hash.hpp>
57
class TableIdentifier : public SchemaIdentifier
60
typedef message::Table::TableType Type;
61
typedef std::vector <TableIdentifier> vector;
62
typedef const TableIdentifier& const_reference;
63
typedef TableIdentifier& reference;
67
std::vector<char> key_buffer;
77
const char *vector() const
79
return &key_buffer[0];
82
std::vector<char> &vectorPtr()
87
void set(size_t resize_arg, const std::string &a, const std::string &b);
89
friend bool operator==(const Key &left, const Key &right)
91
if (left.hash_value == right.hash_value and left.key_buffer.size() == right.key_buffer.size())
93
if (memcmp(&left.key_buffer[0], &right.key_buffer[0], left.key_buffer.size()) == 0)
100
friend bool operator<(const Key &left, const Key &right)
102
return left.key_buffer < right.key_buffer;
107
return key_buffer.size();
110
size_t getHashValue() const
120
std::string table_name;
126
size_t getKeySize() const
128
return getSchemaName().size() + getTableName().size() + 2;
132
TableIdentifier(const Table &table);
134
TableIdentifier( const SchemaIdentifier &schema,
135
const std::string &table_name_arg,
136
Type tmp_arg= message::Table::STANDARD) :
137
SchemaIdentifier(schema),
139
table_name(table_name_arg)
144
TableIdentifier( const std::string &db_arg,
145
const std::string &table_name_arg,
146
Type tmp_arg= message::Table::STANDARD) :
147
SchemaIdentifier(db_arg),
149
table_name(table_name_arg)
154
TableIdentifier( const std::string &schema_name_arg,
155
const std::string &table_name_arg,
156
const std::string &path_arg ) :
157
SchemaIdentifier(schema_name_arg),
158
type(message::Table::TEMPORARY),
160
table_name(table_name_arg)
165
using SchemaIdentifier::compare;
169
if (type == message::Table::TEMPORARY || type == message::Table::INTERNAL)
174
static bool isView(message::Table::TableType arg) // Not a SQL view, but a view for I_S
179
case message::Table::STANDARD:
180
case message::Table::TEMPORARY:
181
case message::Table::INTERNAL:
183
case message::Table::FUNCTION:
190
bool isView() const // Not a SQL view, but a view for I_S
200
virtual void getSQLPath(std::string &sql_path) const;
202
virtual const std::string &getPath() const;
204
void setPath(const std::string &new_path)
209
const std::string &getTableName() const
214
void copyToTableMessage(message::Table &message) const;
216
friend bool operator<(TableIdentifier::const_reference left, TableIdentifier::const_reference right)
218
if (left.getKey() < right.getKey())
226
friend std::ostream& operator<<(std::ostream& output, TableIdentifier::const_reference identifier)
228
const char *type_str;
230
output << "TableIdentifier:(";
231
output << identifier.getSchemaName();
233
output << identifier.getTableName();
236
switch (identifier.type) {
237
case message::Table::STANDARD:
238
type_str= "standard";
240
case message::Table::INTERNAL:
241
type_str= "internal";
243
case message::Table::TEMPORARY:
244
type_str= "temporary";
246
case message::Table::FUNCTION:
247
type_str= "function";
253
output << identifier.path;
255
output << identifier.getHashValue();
258
return output; // for multiple << operators.
261
friend bool operator==(TableIdentifier::const_reference left, TableIdentifier::const_reference right)
263
if (left.getHashValue() == right.getHashValue())
265
if (left.getKey() == right.getKey())
272
static uint32_t filename_to_tablename(const char *from, char *to, uint32_t to_length);
273
static size_t build_table_filename(std::string &path, const std::string &db, const std::string &table_name, bool is_tmp);
274
static size_t build_tmptable_filename(std::string &buffer);
275
static size_t build_tmptable_filename(std::vector<char> &buffer);
278
bool isValid() const;
280
size_t getHashValue() const
285
const Key &getKey() const
291
std::size_t hash_value(TableIdentifier const& b);
292
std::size_t hash_value(TableIdentifier::Key const& b);
294
} /* namespace drizzled */
296
#endif /* DRIZZLED_IDENTIFIER_TABLE_H */