32
32
#include <boost/thread/condition_variable.hpp>
33
33
#include <boost/dynamic_bitset.hpp>
34
34
#include <boost/shared_ptr.hpp>
35
#include <boost/scoped_ptr.hpp>
37
36
#include "drizzled/typelib.h"
38
37
#include "drizzled/memory/root.h"
39
#include "drizzled/message.h"
38
#include "drizzled/message/table.pb.h"
40
39
#include "drizzled/util/string.h"
42
#include "drizzled/lex_string.h"
43
#include "drizzled/key_map.h"
45
41
#include "drizzled/table/cache.h"
47
#include <drizzled/field.h>
46
extern uint64_t refresh_version;
48
const static std::string STANDARD_STRING("STANDARD");
49
const static std::string TEMPORARY_STRING("TEMPORARY");
50
const static std::string INTERNAL_STRING("INTERNAL");
51
const static std::string FUNCTION_STRING("FUNCTION");
53
52
const static std::string NO_PROTOBUFFER_AVAILABLE("NO PROTOBUFFER AVAILABLE");
57
56
class EventObserverList;
72
70
typedef boost::shared_ptr<TableShare> shared_ptr;
73
71
typedef std::vector <shared_ptr> vector;
75
TableShare(const identifier::Table::Type type_arg);
77
TableShare(const identifier::Table &identifier, const identifier::Table::Key &key); // Used by placeholder
79
TableShare(const identifier::Table &identifier); // Just used during createTable()
81
TableShare(const identifier::Table::Type type_arg,
82
const identifier::Table &identifier,
73
TableShare(const TableIdentifier::Type type_arg);
75
TableShare(const TableIdentifier &identifier, const TableIdentifier::Key &key); // Used by placeholder
77
TableShare(const TableIdentifier &identifier); // Just used during createTable()
79
TableShare(const TableIdentifier::Type type_arg,
80
const TableIdentifier &identifier,
83
81
char *path_arg= NULL, uint32_t path_length_arg= 0); // Shares for cache
85
virtual ~TableShare();
88
86
/** Category of this table. */
89
87
enum_table_category table_category;
92
91
bool isTemporaryCategory() const
94
93
return (table_category == TABLE_CATEGORY_TEMPORARY);
166
161
std::vector<uint> blob_field; /* Index to blobs in Field arrray*/
169
163
/* hash of field names (contains pointers to elements of field array) */
170
165
typedef boost::unordered_map < std::string, Field **, util::insensitive_hash, util::insensitive_equal_to> FieldMap;
171
166
typedef std::pair< std::string, Field ** > FieldMapPair;
172
167
FieldMap name_hash; /* hash of field names */
175
169
size_t getNamedFieldSize() const
242
235
std::vector<TYPELIB> intervals; /* pointer to interval info */
248
virtual void unlock()
237
boost::mutex mutex; /* For locking the share */
238
boost::condition_variable cond; /* To signal that share is ready */
252
251
std::vector<unsigned char> default_values; /* row with default values */
255
253
// @note This needs to be made to be const in the future
256
254
unsigned char *getDefaultValues()
277
275
To ensure this one can use set_table_cache() methods.
280
identifier::Table::Key private_key_for_cache; // This will not exist in the final design.
278
TableIdentifier::Key private_key_for_cache; // This will not exist in the final design.
281
279
std::vector<char> private_normalized_path; // This will not exist in the final design.
282
280
LEX_STRING db; /* Pointer to db */
283
281
LEX_STRING table_name; /* Table name (for open) */
284
282
LEX_STRING path; /* Path to table (from datadir) */
285
283
LEX_STRING normalized_path; /* unpack_filename(path) */
289
286
const char *getNormalizedPath() const
359
355
uint64_t version;
362
357
uint64_t getVersion() const
367
void refreshVersion();
362
void refreshVersion()
364
version= refresh_version;
369
367
void resetVersion()
375
372
uint32_t timestamp_offset; /* Set to offset+1 of record */
377
uint32_t reclength; /* Recordlength */
378
uint32_t stored_rec_length; /* Stored record length*/
374
uint32_t reclength; /* Recordlength */
381
uint32_t sizeStoredRecord() const
383
return stored_rec_length;
376
uint32_t stored_rec_length; /* Stored record length*/
386
378
uint32_t getRecordLength() const
405
397
/* Max rows is a hint to HEAP during a create tmp table */
406
398
uint64_t max_rows;
408
boost::scoped_ptr<message::Table> _table_message;
400
message::Table *table_proto;
412
@note Without a _table_message, we assume we are building a STANDARD table.
404
@note Without a table_proto, we assume we are building a STANDARD table.
413
405
This will be modified once we use Identifiers in the Share itself.
415
407
message::Table::TableType getTableType() const
417
return getTableMessage() ? getTableMessage()->type() : message::Table::STANDARD;
409
return table_proto ? table_proto->type() : message::Table::STANDARD;
420
412
const std::string &getTableTypeAsString() const
422
if (getTableMessage())
423
return message::type(getTableMessage()->type());
425
return NO_PROTOBUFFER_AVAILABLE;
416
switch (table_proto->type())
419
case message::Table::STANDARD:
420
return STANDARD_STRING;
421
case message::Table::TEMPORARY:
422
return TEMPORARY_STRING;
423
case message::Table::INTERNAL:
424
return INTERNAL_STRING;
425
case message::Table::FUNCTION:
426
return FUNCTION_STRING;
431
return NO_PROTOBUFFER_AVAILABLE;
428
435
/* This is only used in one location currently */
429
inline message::Table *getTableMessage() const
431
return _table_message.get();
434
void setTableMessage(const message::Table &arg)
436
assert(not getTableMessage());
437
_table_message.reset(new(std::nothrow) message::Table(arg));
436
inline message::Table *getTableProto() const
440
441
const message::Table::Field &field(int32_t field_position) const
442
assert(getTableMessage());
443
return getTableMessage()->field(field_position);
444
return table_proto->field(field_position);
447
inline void setTableProto(message::Table *arg)
449
assert(table_proto == NULL);
446
453
inline bool hasComment() const
448
return (getTableMessage()) ? getTableMessage()->options().has_comment() : false;
455
return (table_proto) ? table_proto->options().has_comment() : false;
451
458
inline const char *getComment()
453
return (getTableMessage() && getTableMessage()->has_options()) ? getTableMessage()->options().comment().c_str() : NULL;
460
return (table_proto && table_proto->has_options()) ? table_proto->options().comment().c_str() : NULL;
456
463
inline uint32_t getCommentLength() const
458
return (getTableMessage()) ? getTableMessage()->options().comment().length() : 0;
465
return (table_proto) ? table_proto->options().comment().length() : 0;
461
468
inline uint64_t getMaxRows() const
488
identifier::Table::Type tmp_table;
495
TableIdentifier::Type tmp_table;
491
identifier::Table::Type getType() const
498
TableIdentifier::Type getType() const
493
500
return tmp_table;
497
uint32_t _ref_count; /* How many Table objects uses this */
504
uint32_t ref_count; /* How many Table objects uses this */
500
507
uint32_t getTableCount() const
505
512
void incrementTableCount()
512
uint32_t decrementTableCount()
517
519
uint32_t null_bytes;
518
520
uint32_t last_null_bit_pos;
587
588
uint32_t next_number_keypart; /* autoinc keypart number in a key */
588
589
uint32_t error, open_errno, errarg; /* error from open_table_def() */
591
591
uint8_t blob_ptr_size; /* 4 or 8 */
594
uint8_t sizeBlobPtr() const
596
return blob_ptr_size;
599
592
bool db_low_byte_first; /* Portable row format */
609
602
event_observers is a class containing all the event plugins that have
610
603
registered an interest in this table.
612
virtual plugin::EventObserverList *getTableObservers()
606
plugin::EventObserverList *event_observers;
608
plugin::EventObserverList *getTableObservers()
610
return event_observers;
617
virtual void setTableObservers(plugin::EventObserverList *)
613
void setTableObservers(plugin::EventObserverList *observers)
615
event_observers= observers;
621
619
Set share's identifier information.
648
646
void init(const char *new_table_name,
649
647
const char *new_path);
652
650
void open_table_error(int pass_error, int db_errno, int pass_errarg);
652
static void release(TableShare *share);
653
static void release(TableShare::shared_ptr &share);
654
static void release(const TableIdentifier &identifier);
656
655
static TableShare::shared_ptr getShareCreate(Session *session,
657
const identifier::Table &identifier,
656
const TableIdentifier &identifier,
660
659
friend std::ostream& operator<<(std::ostream& output, const TableShare &share)
683
682
unsigned char null_bit,
684
683
uint8_t decimals,
685
684
enum_field_types field_type,
686
const charset_info_st * field_charset,
685
const CHARSET_INFO * field_charset,
687
686
Field::utype unireg_check,
688
687
TYPELIB *interval,
689
688
const char *field_name);
696
695
unsigned char null_bit,
697
696
uint8_t decimals,
698
697
enum_field_types field_type,
699
const charset_info_st * field_charset,
698
const CHARSET_INFO * field_charset,
700
699
Field::utype unireg_check,
701
700
TYPELIB *interval,
702
701
const char *field_name,
703
702
bool is_unsigned);
706
int open_table_def(Session& session, const identifier::Table &identifier);
705
int open_table_def(Session& session, const TableIdentifier &identifier);
708
707
int open_table_from_share(Session *session,
709
const identifier::Table &identifier,
708
const TableIdentifier &identifier,
710
709
const char *alias,
711
710
uint32_t db_stat, uint32_t ha_open_flags,
712
711
Table &outparam);
715
714
const char *alias,
716
715
uint32_t db_stat,
717
716
Table &outparam);
718
int open_table_cursor_inner(const identifier::Table &identifier,
717
int open_table_cursor_inner(const TableIdentifier &identifier,
719
718
uint32_t db_stat, uint32_t ha_open_flags,
721
720
bool &error_reported);
723
bool parse_table_proto(Session& session, message::Table &table);
722
int parse_table_proto(Session& session, message::Table &table);
724
int inner_parse_table_proto(Session& session, message::Table &table);
726
727
} /* namespace drizzled */
728
#endif /* DRIZZLED_TABLE_INSTANCE_BASE_H */
729
#endif /* DRIZZLED_DEFINITION_TABLE_H */