1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2009 Sun Microsystems
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.
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.
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
22
This class is shared between different table objects. There is one
23
instance of table share per one table in the database.
26
#ifndef DRIZZLED_TABLE_SHARE_H
27
#define DRIZZLED_TABLE_SHARE_H
31
#include <boost/unordered_map.hpp>
32
#include <boost/thread/condition_variable.hpp>
34
#include "drizzled/typelib.h"
35
#include "drizzled/memory/root.h"
36
#include "drizzled/message/table.pb.h"
37
#include "drizzled/util/string.h"
42
typedef boost::unordered_map< TableIdentifier::Key, TableShare *> TableDefinitionCache;
44
const static std::string STANDARD_STRING("STANDARD");
45
const static std::string TEMPORARY_STRING("TEMPORARY");
46
const static std::string INTERNAL_STRING("INTERNAL");
47
const static std::string FUNCTION_STRING("FUNCTION");
51
class EventObserverList;
58
typedef std::vector<std::string> StringVector;
60
TableShare(TableIdentifier::Type type_arg);
62
TableShare(TableIdentifier &identifier, const TableIdentifier::Key &key); // Used by placeholder
64
TableShare(const TableIdentifier &identifier); // Just used during createTable()
66
TableShare(TableIdentifier::Type type_arg,
67
TableIdentifier &identifier,
68
char *path_arg= NULL, uint32_t path_length_arg= 0); // Shares for cache
73
/** Category of this table. */
74
enum_table_category table_category;
76
uint32_t open_count; /* Number of tables in open list */
79
bool isTemporaryCategory() const
81
return (table_category == TABLE_CATEGORY_TEMPORARY);
84
void setTableCategory(enum_table_category arg)
89
/* The following is copied to each Table on OPEN */
90
typedef std::vector<Field *> Fields;
94
const Fields getFields() const
99
Field ** getFields(bool)
104
void setFields(uint32_t arg)
109
uint32_t positionFields(Field **arg) const
111
return (arg - (Field **)&field[0]);
114
void pushField(Field *arg)
117
field.push_back(arg);
121
Field **found_next_number_field;
123
Field *timestamp_field; /* Used only during open */
126
Field *getTimestampField() const /* Used only during open */
128
return timestamp_field;
131
void setTimestampField(Field *arg) /* Used only during open */
133
timestamp_field= arg;
138
KeyInfo *key_info; /* data of keys in database */
140
KeyInfo &getKeyInfo(uint32_t arg) const
142
return key_info[arg];
144
std::vector<uint> blob_field; /* Index to blobs in Field arrray*/
146
/* hash of field names (contains pointers to elements of field array) */
148
typedef boost::unordered_map < std::string, Field **, util::insensitive_hash, util::insensitive_equal_to> FieldMap;
149
typedef std::pair< std::string, Field ** > FieldMapPair;
150
FieldMap name_hash; /* hash of field names */
152
size_t getNamedFieldSize() const
154
return name_hash.size();
157
Field **getNamedField(const std::string &arg)
159
FieldMap::iterator iter= name_hash.find(arg);
161
if (iter == name_hash.end())
164
return (*iter).second;
168
memory::Root mem_root;
170
void *alloc_root(size_t arg)
172
return mem_root.alloc_root(arg);
175
char *strmake_root(const char *str_arg, size_t len_arg)
177
return mem_root.strmake_root(str_arg, len_arg);
180
memory::Root *getMemRoot()
186
std::vector<std::string> _keynames;
188
void addKeyName(std::string arg)
190
std::transform(arg.begin(), arg.end(),
191
arg.begin(), ::toupper);
192
_keynames.push_back(arg);
195
bool doesKeyNameExist(const char *name_arg, uint32_t name_length, uint32_t &position) const
197
std::string arg(name_arg, name_length);
198
std::transform(arg.begin(), arg.end(),
199
arg.begin(), ::toupper);
201
std::vector<std::string>::const_iterator iter= std::find(_keynames.begin(), _keynames.end(), arg);
203
if (iter == _keynames.end())
206
position= iter - _keynames.begin();
211
bool doesKeyNameExist(std::string arg, uint32_t &position) const
213
std::transform(arg.begin(), arg.end(),
214
arg.begin(), ::toupper);
216
std::vector<std::string>::const_iterator iter= std::find(_keynames.begin(), _keynames.end(), arg);
218
if (iter == _keynames.end())
220
position= -1; //historical, required for finding primary key from unique
224
position= iter - _keynames.begin();
230
std::vector<TYPELIB> intervals; /* pointer to interval info */
232
boost::mutex mutex; /* For locking the share */
233
boost::condition_variable cond; /* To signal that share is ready */
248
std::vector<unsigned char> default_values; /* row with default values */
250
unsigned char * getDefaultValues()
252
return &default_values[0];
254
void resizeDefaultValues(size_t arg)
256
default_values.resize(arg);
259
const CHARSET_INFO *table_charset; /* Default charset of string fields */
263
std::vector<my_bitmap_map> all_bitmap;
267
Key which is used for looking-up table in table cache and in the list
268
of thread's temporary tables. Has the form of:
269
"database_name\0table_name\0" + optional part for temporary tables.
271
Note that all three 'table_cache_key', 'db' and 'table_name' members
272
must be set (and be non-zero) for tables in table cache. They also
273
should correspond to each other.
274
To ensure this one can use set_table_cache() methods.
277
TableIdentifier::Key private_key_for_cache; // This will not exist in the final design.
278
std::vector<char> private_normalized_path; // This will not exist in the final design.
279
LEX_STRING db; /* Pointer to db */
280
LEX_STRING table_name; /* Table name (for open) */
281
LEX_STRING path; /* Path to table (from datadir) */
282
LEX_STRING normalized_path; /* unpack_filename(path) */
285
const char *getNormalizedPath() const
287
return normalized_path.str;
290
const char *getPath() const
295
const TableIdentifier::Key& getCacheKey() const // This should never be called when we aren't looking at a cache.
297
assert(private_key_for_cache.size());
298
return private_key_for_cache;
301
size_t getCacheKeySize() const
303
return private_key_for_cache.size();
306
void setPath(char *str_arg, uint32_t size_arg)
309
path.length= size_arg;
312
void setNormalizedPath(char *str_arg, uint32_t size_arg)
314
normalized_path.str= str_arg;
315
normalized_path.length= size_arg;
318
const char *getTableName() const
320
return table_name.str;
323
uint32_t getTableNameSize() const
325
return table_name.length;
328
const std::string &getTableName(std::string &name_arg) const
331
name_arg.append(table_name.str, table_name.length);
336
const char *getSchemaName() const
341
const std::string &getSchemaName(std::string &schema_name_arg) const
343
schema_name_arg.clear();
344
schema_name_arg.append(db.str, db.length);
346
return schema_name_arg;
349
uint32_t block_size; /* create information */
354
uint64_t getVersion() const
359
void refreshVersion()
361
version= refresh_version;
369
uint32_t timestamp_offset; /* Set to offset+1 of record */
371
uint32_t reclength; /* Recordlength */
373
uint32_t stored_rec_length; /* Stored record length*/
375
uint32_t getRecordLength() const
380
void setRecordLength(uint32_t arg)
385
const Field_blob *getBlobFieldAt(uint32_t arg) const
387
if (arg < blob_fields)
388
return (Field_blob*) field[blob_field[arg]];
394
/* Max rows is a hint to HEAP during a create tmp table */
397
message::Table *table_proto;
401
@note Without a table_proto, we assume we are building a STANDARD table.
402
This will be modified once we use Identifiers in the Share itself.
404
message::Table::TableType getTableType() const
406
return table_proto ? table_proto->type() : message::Table::STANDARD;
409
const std::string &getTableTypeAsString() const
411
switch (table_proto->type())
414
case message::Table::STANDARD:
415
return STANDARD_STRING;
416
case message::Table::TEMPORARY:
417
return TEMPORARY_STRING;
418
case message::Table::INTERNAL:
419
return INTERNAL_STRING;
420
case message::Table::FUNCTION:
421
return FUNCTION_STRING;
425
/* This is only used in one location currently */
426
inline message::Table *getTableProto() const
431
inline void setTableProto(message::Table *arg)
433
assert(table_proto == NULL);
437
inline bool hasComment() const
439
return (table_proto) ? table_proto->options().has_comment() : false;
442
inline const char *getComment()
444
return (table_proto && table_proto->has_options()) ? table_proto->options().comment().c_str() : NULL;
447
inline uint32_t getCommentLength() const
449
return (table_proto) ? table_proto->options().comment().length() : 0;
452
inline uint64_t getMaxRows() const
457
inline void setMaxRows(uint64_t arg)
463
* Returns true if the supplied Field object
464
* is part of the table's primary key.
466
bool fieldInPrimaryKey(Field *field) const;
468
plugin::StorageEngine *storage_engine; /* storage engine plugin */
469
inline plugin::StorageEngine *db_type() const /* table_type for handler */
471
return storage_engine;
473
inline plugin::StorageEngine *getEngine() const /* table_type for handler */
475
return storage_engine;
479
TableIdentifier::Type tmp_table;
482
TableIdentifier::Type getType() const
488
uint32_t ref_count; /* How many Table objects uses this */
490
uint32_t getTableCount() const
495
void incrementTableCount()
503
uint32_t last_null_bit_pos;
504
uint32_t fields; /* Number of fields */
506
uint32_t sizeFields() const
511
uint32_t rec_buff_length; /* Size of table->record[] buffer */
514
uint32_t sizeKeys() const
519
uint32_t max_key_length, max_unique_length, total_key_length;
520
uint32_t uniques; /* Number of UNIQUE index */
521
uint32_t null_fields; /* number of null fields */
522
uint32_t blob_fields; /* number of blob fields */
523
uint32_t timestamp_field_offset; /* Field number for timestamp field */
524
uint32_t varchar_fields; /* number of varchar fields */
525
uint32_t db_create_options; /* Create options from database */
526
uint32_t db_options_in_use; /* Options in use */
527
uint32_t db_record_offset; /* if HA_REC_IN_SEQ */
528
uint32_t rowid_field_offset; /* Field_nr +1 to rowid field */
532
* Currently the replication services component uses
533
* the primary_key member to determine which field is the table's
534
* primary key. However, as it exists, because this member is scalar, it
535
* only supports a single-column primary key. Is there a better way
536
* to ask for the fields which are in a primary key?
539
uint32_t primary_key;
542
uint32_t getPrimaryKey() const
547
bool hasPrimaryKey() const
549
return primary_key != MAX_KEY;
552
/* Index of auto-updated TIMESTAMP field in field array */
553
uint32_t next_number_index; /* autoincrement key number */
554
uint32_t next_number_key_offset; /* autoinc keypart offset in a key */
555
uint32_t next_number_keypart; /* autoinc keypart number in a key */
556
uint32_t error, open_errno, errarg; /* error from open_table_def() */
557
uint32_t column_bitmap_size;
559
uint8_t blob_ptr_size; /* 4 or 8 */
560
bool db_low_byte_first; /* Portable row format */
565
bool isNameLock() const
570
bool replace_with_name_lock;
573
bool waiting_on_cond; /* Protection against free */
575
bool isWaitingOnCondition()
577
return waiting_on_cond;
581
Set of keys in use, implemented as a Bitmap.
582
Excludes keys disabled by ALTER Table ... DISABLE KEYS.
585
key_map keys_for_keyread;
588
event_observers is a class containing all the event plugins that have
589
registered an interest in this table.
592
plugin::EventObserverList *event_observers;
594
plugin::EventObserverList *getTableObservers()
596
return event_observers;
599
void setTableObservers(plugin::EventObserverList *observers)
601
event_observers= observers;
605
Set share's identifier information.
613
void setIdentifier(TableIdentifier &identifier_arg);
615
inline bool honor_global_locks()
617
return (table_category == TABLE_CATEGORY_USER);
622
Initialize share for temporary tables
627
key Table_cache_key, as generated from create_table_def_key.
628
must start with db name.
629
key_length Length of key
630
table_name Table name
631
path Path to table (possible in lower case)
638
void init(const char *new_table_name,
639
const char *new_path);
642
void open_table_error(int pass_error, int db_errno, int pass_errarg);
644
static void cacheStart(void);
645
static void release(TableShare *share);
646
static void release(TableIdentifier &identifier);
647
static const TableDefinitionCache &getCache();
648
static TableShare *getShare(TableIdentifier &identifier);
649
static TableShare *getShareCreate(Session *session,
650
TableIdentifier &identifier,
653
friend std::ostream& operator<<(std::ostream& output, const TableShare &share)
655
output << "TableShare:(";
656
output << share.getSchemaName();
658
output << share.getTableName();
660
output << share.getTableTypeAsString();
662
output << share.getPath();
665
return output; // for multiple << operators.
668
Field *make_field(unsigned char *ptr,
669
uint32_t field_length,
671
unsigned char *null_pos,
672
unsigned char null_bit,
674
enum_field_types field_type,
675
const CHARSET_INFO * field_charset,
676
Field::utype unireg_check,
678
const char *field_name);
680
int open_table_def(Session& session, TableIdentifier &identifier);
682
int open_table_from_share(Session *session,
683
const TableIdentifier &identifier,
685
uint32_t db_stat, uint32_t ha_open_flags,
687
int parse_table_proto(Session& session, message::Table &table);
689
int inner_parse_table_proto(Session& session, message::Table &table);
692
} /* namespace drizzled */
694
#endif /* DRIZZLED_TABLE_SHARE_H */