1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2009 Sun Microsystems
4
* Copyright (C) 2009 Sun Microsystems, Inc.
6
6
* This program is free software; you can redistribute it and/or modify
7
7
* it under the terms of the GNU General Public License as published by
32
31
#include <boost/thread/condition_variable.hpp>
33
32
#include <boost/dynamic_bitset.hpp>
34
33
#include <boost/shared_ptr.hpp>
36
#include "drizzled/typelib.h"
37
#include "drizzled/memory/root.h"
38
#include "drizzled/message/table.pb.h"
39
#include "drizzled/util/string.h"
41
#include "drizzled/table/cache.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");
34
#include <boost/scoped_ptr.hpp>
36
#include <drizzled/memory/root.h>
37
#include <drizzled/message.h>
38
#include <drizzled/util/string.h>
39
#include <drizzled/lex_string.h>
40
#include <drizzled/key_map.h>
41
#include <drizzled/field.h>
52
45
const static std::string NO_PROTOBUFFER_AVAILABLE("NO PROTOBUFFER AVAILABLE");
56
class EventObserverList;
63
49
typedef std::vector<std::string> StringVector;
66
52
typedef boost::shared_ptr<TableShare> shared_ptr;
67
53
typedef std::vector <shared_ptr> vector;
69
TableShare(const TableIdentifier::Type type_arg);
71
TableShare(const TableIdentifier &identifier, const TableIdentifier::Key &key); // Used by placeholder
73
TableShare(const TableIdentifier &identifier); // Just used during createTable()
75
TableShare(const TableIdentifier::Type type_arg,
76
const TableIdentifier &identifier,
55
TableShare(const identifier::Table::Type type_arg);
57
TableShare(const identifier::Table &identifier, const identifier::Table::Key &key); // Used by placeholder
59
TableShare(const identifier::Table &identifier); // Just used during createTable()
61
TableShare(const identifier::Table::Type type_arg,
62
const identifier::Table &identifier,
77
63
char *path_arg= NULL, uint32_t path_length_arg= 0); // Shares for cache
65
virtual ~TableShare();
82
68
/** Category of this table. */
83
69
enum_table_category table_category;
87
72
bool isTemporaryCategory() const
89
74
return (table_category == TABLE_CATEGORY_TEMPORARY);
97
82
/* The following is copied to each Table on OPEN */
98
83
typedef std::vector<Field *> Fields;
102
89
const Fields getFields() const
107
99
Field ** getFields(bool)
112
104
void setFields(uint32_t arg)
117
109
uint32_t positionFields(Field **arg) const
119
return (arg - (Field **)&field[0]);
111
return (arg - (Field **)&_fields[0]);
122
114
void pushField(Field *arg)
125
field.push_back(arg);
117
_fields.push_back(arg);
129
120
Field **found_next_number_field;
131
123
Field *timestamp_field; /* Used only during open */
134
127
Field *getTimestampField() const /* Used only during open */
152
146
std::vector<uint> blob_field; /* Index to blobs in Field arrray*/
154
149
/* hash of field names (contains pointers to elements of field array) */
156
150
typedef boost::unordered_map < std::string, Field **, util::insensitive_hash, util::insensitive_equal_to> FieldMap;
157
151
typedef std::pair< std::string, Field ** > FieldMapPair;
158
152
FieldMap name_hash; /* hash of field names */
160
155
size_t getNamedFieldSize() const
226
222
std::vector<TYPELIB> intervals; /* pointer to interval info */
228
boost::mutex mutex; /* For locking the share */
229
boost::condition_variable cond; /* To signal that share is ready */
228
virtual void unlock()
242
232
std::vector<unsigned char> default_values; /* row with default values */
244
235
// @note This needs to be made to be const in the future
245
236
unsigned char *getDefaultValues()
266
257
To ensure this one can use set_table_cache() methods.
269
TableIdentifier::Key private_key_for_cache; // This will not exist in the final design.
260
identifier::Table::Key private_key_for_cache; // This will not exist in the final design.
270
261
std::vector<char> private_normalized_path; // This will not exist in the final design.
271
262
LEX_STRING db; /* Pointer to db */
272
263
LEX_STRING table_name; /* Table name (for open) */
273
264
LEX_STRING path; /* Path to table (from datadir) */
274
265
LEX_STRING normalized_path; /* unpack_filename(path) */
277
269
const char *getNormalizedPath() const
346
339
uint64_t version;
348
342
uint64_t getVersion() const
353
void refreshVersion()
355
version= refresh_version;
347
void refreshVersion();
358
349
void resetVersion()
363
355
uint32_t timestamp_offset; /* Set to offset+1 of record */
365
uint32_t reclength; /* Recordlength */
357
uint32_t reclength; /* Recordlength */
358
uint32_t stored_rec_length; /* Stored record length*/
367
uint32_t stored_rec_length; /* Stored record length*/
361
uint32_t sizeStoredRecord() const
363
return stored_rec_length;
369
366
uint32_t getRecordLength() const
388
385
/* Max rows is a hint to HEAP during a create tmp table */
389
386
uint64_t max_rows;
391
message::Table *table_proto;
388
boost::scoped_ptr<message::Table> _table_message;
395
@note Without a table_proto, we assume we are building a STANDARD table.
392
@note Without a _table_message, we assume we are building a STANDARD table.
396
393
This will be modified once we use Identifiers in the Share itself.
398
395
message::Table::TableType getTableType() const
400
return table_proto ? table_proto->type() : message::Table::STANDARD;
397
return getTableMessage() ? getTableMessage()->type() : message::Table::STANDARD;
403
400
const std::string &getTableTypeAsString() const
407
switch (table_proto->type())
410
case message::Table::STANDARD:
411
return STANDARD_STRING;
412
case message::Table::TEMPORARY:
413
return TEMPORARY_STRING;
414
case message::Table::INTERNAL:
415
return INTERNAL_STRING;
416
case message::Table::FUNCTION:
417
return FUNCTION_STRING;
422
return NO_PROTOBUFFER_AVAILABLE;
402
if (getTableMessage())
403
return message::type(getTableMessage()->type());
405
return NO_PROTOBUFFER_AVAILABLE;
426
408
/* This is only used in one location currently */
427
inline message::Table *getTableProto() const
432
inline void setTableProto(message::Table *arg)
434
assert(table_proto == NULL);
409
inline message::Table *getTableMessage() const
411
return _table_message.get();
414
void setTableMessage(const message::Table &arg)
416
assert(not getTableMessage());
417
_table_message.reset(new message::Table(arg));
420
const message::Table::Field &field(int32_t field_position) const
422
assert(getTableMessage());
423
return getTableMessage()->field(field_position);
438
426
inline bool hasComment() const
440
return (table_proto) ? table_proto->options().has_comment() : false;
428
return getTableMessage() ? getTableMessage()->options().has_comment() : false;
443
431
inline const char *getComment()
445
return (table_proto && table_proto->has_options()) ? table_proto->options().comment().c_str() : NULL;
433
return (getTableMessage() && getTableMessage()->has_options()) ? getTableMessage()->options().comment().c_str() : NULL;
448
436
inline uint32_t getCommentLength() const
450
return (table_proto) ? table_proto->options().comment().length() : 0;
438
return (getTableMessage()) ? getTableMessage()->options().comment().length() : 0;
453
441
inline uint64_t getMaxRows() const
480
TableIdentifier::Type tmp_table;
468
identifier::Table::Type tmp_table;
483
TableIdentifier::Type getType() const
471
identifier::Table::Type getType() const
485
473
return tmp_table;
489
uint32_t ref_count; /* How many Table objects uses this */
477
uint32_t _ref_count; /* How many Table objects uses this */
492
480
uint32_t getTableCount() const
497
485
void incrementTableCount()
492
uint32_t decrementTableCount()
504
497
uint32_t null_bytes;
505
498
uint32_t last_null_bit_pos;
506
uint32_t fields; /* Number of fields */
500
uint32_t _field_size; /* Number of fields */
503
void setFieldSize(uint32_t arg)
508
508
uint32_t sizeFields() const
513
513
uint32_t rec_buff_length; /* Size of table->record[] buffer */
566
567
uint32_t next_number_keypart; /* autoinc keypart number in a key */
567
568
uint32_t error, open_errno, errarg; /* error from open_table_def() */
569
571
uint8_t blob_ptr_size; /* 4 or 8 */
574
uint8_t sizeBlobPtr() const
576
return blob_ptr_size;
570
579
bool db_low_byte_first; /* Portable row format */
580
589
event_observers is a class containing all the event plugins that have
581
590
registered an interest in this table.
584
plugin::EventObserverList *event_observers;
586
plugin::EventObserverList *getTableObservers()
592
virtual plugin::EventObserverList *getTableObservers()
588
return event_observers;
591
void setTableObservers(plugin::EventObserverList *observers)
593
event_observers= observers;
597
virtual void setTableObservers(plugin::EventObserverList *)
597
601
Set share's identifier information.
624
628
void init(const char *new_table_name,
625
629
const char *new_path);
628
632
void open_table_error(int pass_error, int db_errno, int pass_errarg);
630
static void release(TableShare *share);
631
static void release(TableShare::shared_ptr &share);
632
static void release(const TableIdentifier &identifier);
633
636
static TableShare::shared_ptr getShareCreate(Session *session,
634
const TableIdentifier &identifier,
637
const identifier::Table &identifier,
637
640
friend std::ostream& operator<<(std::ostream& output, const TableShare &share)
649
652
return output; // for multiple << operators.
652
Field *make_field(unsigned char *ptr,
656
friend class drizzled::table::Singular;
658
Field *make_field(const message::Table::Field &pfield,
653
660
uint32_t field_length,
654
661
bool is_nullable,
655
662
unsigned char *null_pos,
656
663
unsigned char null_bit,
657
664
uint8_t decimals,
658
665
enum_field_types field_type,
659
const CHARSET_INFO * field_charset,
666
const charset_info_st * field_charset,
660
667
Field::utype unireg_check,
661
668
TYPELIB *interval,
662
669
const char *field_name);
664
int open_table_def(Session& session, const TableIdentifier &identifier);
671
Field *make_field(const message::Table::Field &pfield,
673
uint32_t field_length,
675
unsigned char *null_pos,
676
unsigned char null_bit,
678
enum_field_types field_type,
679
const charset_info_st * field_charset,
680
Field::utype unireg_check,
682
const char *field_name,
686
int open_table_def(Session& session, const identifier::Table &identifier);
666
688
int open_table_from_share(Session *session,
667
const TableIdentifier &identifier,
689
const identifier::Table &identifier,
668
690
const char *alias,
669
691
uint32_t db_stat, uint32_t ha_open_flags,
670
692
Table &outparam);
673
695
const char *alias,
674
696
uint32_t db_stat,
675
697
Table &outparam);
676
int open_table_cursor_inner(const TableIdentifier &identifier,
698
int open_table_cursor_inner(const identifier::Table &identifier,
677
699
uint32_t db_stat, uint32_t ha_open_flags,
679
701
bool &error_reported);
681
int parse_table_proto(Session& session, message::Table &table);
683
int inner_parse_table_proto(Session& session, message::Table &table);
703
bool parse_table_proto(Session& session, const message::Table &table);
705
virtual bool is_replicated() const
686
711
} /* namespace drizzled */
688
#endif /* DRIZZLED_DEFINITION_TABLE_H */