49
51
#include <boost/functional/hash.hpp>
51
#include <drizzled/visibility.h>
53
53
namespace drizzled {
56
namespace identifier {
58
class DRIZZLED_API Table : public Schema
57
class TableIdentifier : public SchemaIdentifier
61
60
typedef message::Table::TableType Type;
62
typedef std::vector <Table> vector;
63
typedef const Table& const_reference;
64
typedef Table& reference;
68
std::vector<char> key_buffer;
78
const char *vector() const
80
return &key_buffer[0];
83
std::vector<char> &vectorPtr()
88
void set(size_t resize_arg, const std::string &a, const std::string &b);
90
friend bool operator==(const Key &left, const Key &right)
92
if (left.hash_value == right.hash_value and left.key_buffer.size() == right.key_buffer.size())
94
if (memcmp(&left.key_buffer[0], &right.key_buffer[0], left.key_buffer.size()) == 0)
101
friend bool operator<(const Key &left, const Key &right)
103
return left.key_buffer < right.key_buffer;
108
return key_buffer.size();
111
size_t getHashValue() const
61
typedef std::vector<char> Key;
121
std::string key_path;
122
66
std::string table_name;
67
std::string lower_table_name;
124
70
size_t hash_value;
135
Table(const drizzled::Table &table);
80
TableIdentifier(const Table &table);
137
Table(const identifier::Schema &schema,
138
const std::string &table_name_arg,
139
Type tmp_arg= message::Table::STANDARD) :
142
table_name(table_name_arg)
147
Table( const std::string &db_arg,
148
const std::string &table_name_arg,
149
Type tmp_arg= message::Table::STANDARD) :
152
table_name(table_name_arg)
157
Table( const std::string &schema_name_arg,
82
TableIdentifier( const SchemaIdentifier &schema,
83
const std::string &table_name_arg,
84
Type tmp_arg= message::Table::STANDARD) :
85
SchemaIdentifier(schema),
87
table_name(table_name_arg)
92
TableIdentifier( const std::string &db_arg,
93
const std::string &table_name_arg,
94
Type tmp_arg= message::Table::STANDARD) :
95
SchemaIdentifier(db_arg),
97
table_name(table_name_arg)
102
TableIdentifier( const std::string &schema_name_arg,
158
103
const std::string &table_name_arg,
159
104
const std::string &path_arg ) :
160
Schema(schema_name_arg),
105
SchemaIdentifier(schema_name_arg),
161
106
type(message::Table::TEMPORARY),
163
108
table_name(table_name_arg)
168
using Schema::compare;
113
using SchemaIdentifier::compare;
114
bool compare(std::string schema_arg, std::string table_arg) const;
170
116
bool isTmp() const
172
118
if (type == message::Table::TEMPORARY || type == message::Table::INTERNAL)
178
static bool isView(message::Table::TableType arg) // Not a SQL view, but a view for I_S
183
case message::Table::STANDARD:
184
case message::Table::TEMPORARY:
185
case message::Table::INTERNAL:
187
case message::Table::FUNCTION:
194
123
bool isView() const // Not a SQL view, but a view for I_S
125
if (type == message::Table::FUNCTION)
199
130
Type getType() const
219
149
void copyToTableMessage(message::Table &message) const;
221
friend bool operator<(Table::const_reference left, Table::const_reference right)
151
friend bool operator<(const TableIdentifier &left, const TableIdentifier &right)
223
if (left.getKey() < right.getKey())
153
// Compare the schema names. You must use schema, path is not valid for
155
int first= left.getLower().compare(right.getLower());
231
friend bool operator==(Table::const_reference left, Table::const_reference right)
233
if (left.getHashValue() == right.getHashValue())
235
if (left.getKey() == right.getKey())
166
// Compare the tables names.
167
int val= left.lower_table_name.compare(right.lower_table_name);
179
if (left.type < right.type)
189
friend std::ostream& operator<<(std::ostream& output, const TableIdentifier &identifier)
191
const char *type_str;
193
output << "TableIdentifier:(";
194
output << identifier.getSchemaName();
196
output << identifier.getTableName();
199
switch (identifier.type) {
200
case message::Table::STANDARD:
201
type_str= "standard";
203
case message::Table::INTERNAL:
204
type_str= "internal";
206
case message::Table::TEMPORARY:
207
type_str= "temporary";
209
case message::Table::FUNCTION:
210
type_str= "function";
216
output << identifier.path;
218
output << identifier.getHashValue();
221
return output; // for multiple << operators.
224
friend bool operator==(TableIdentifier &left, TableIdentifier &right)
226
if (left.type == right.type)
228
if (static_cast<SchemaIdentifier &>(left) == static_cast<SchemaIdentifier &>(right))
230
if (left.lower_table_name == right.lower_table_name)
242
240
static uint32_t filename_to_tablename(const char *from, char *to, uint32_t to_length);
243
static size_t build_table_filename(std::string &path, const std::string &db, const std::string &table_name, bool is_tmp);
241
static size_t build_table_filename(std::string &buff, const char *db, const char *table_name, bool is_tmp);
244
242
static size_t build_tmptable_filename(std::string &buffer);
245
243
static size_t build_tmptable_filename(std::vector<char> &buffer);
248
bool isValid() const;
246
Create a table cache key
250
key Create key here (must be of size MAX_DBKEY_LENGTH)
251
table_list Table definition
254
The table cache_key is created from:
258
if the table is a tmp table, we add the following to make each tmp table
261
4 bytes for master thread id
262
4 bytes pseudo thread id
267
static uint32_t createKey(char *key, const char *db_arg, const char *table_name_arg)
272
key_pos= strcpy(key_pos, db_arg) + strlen(db_arg);
273
key_pos= strcpy(key_pos+1, table_name_arg) +
274
strlen(table_name_arg);
275
key_length= (uint32_t)(key_pos-key)+1;
280
static uint32_t createKey(char *key, const TableIdentifier &identifier)
285
key_pos= strcpy(key_pos, identifier.getSchemaName().c_str()) + identifier.getSchemaName().length();
286
key_pos= strcpy(key_pos + 1, identifier.getTableName().c_str()) + identifier.getTableName().length();
287
key_length= (uint32_t)(key_pos-key)+1;
250
292
size_t getHashValue() const
261
std::ostream& operator<<(std::ostream& output, Table::const_reference identifier);
262
std::size_t hash_value(Table const& b);
263
std::size_t hash_value(Table::Key const& b);
265
} /* namespace identifier */
303
std::size_t hash_value(TableIdentifier const& b);
305
typedef std::vector <TableIdentifier> TableIdentifiers;
266
307
} /* namespace drizzled */
268
309
#endif /* DRIZZLED_IDENTIFIER_TABLE_H */