21
21
/* Structs that defines the Table */
25
23
#ifndef DRIZZLED_TABLE_H
26
24
#define DRIZZLED_TABLE_H
29
#include <boost/dynamic_bitset.hpp>
31
#include <drizzled/order.h>
32
#include <drizzled/filesort_info.h>
33
#include <drizzled/natural_join_column.h>
34
#include <drizzled/field_iterator.h>
35
#include <drizzled/cursor.h>
36
#include <drizzled/lex_string.h>
37
#include <drizzled/table/instance.h>
38
#include <drizzled/atomics.h>
39
#include <drizzled/query_id.h>
41
#include <drizzled/visibility.h>
28
#include "drizzled/order.h"
29
#include "drizzled/filesort_info.h"
30
#include "drizzled/natural_join_column.h"
31
#include "drizzled/field_iterator.h"
32
#include "drizzled/cursor.h"
33
#include "drizzled/lex_string.h"
34
#include "drizzled/table_list.h"
35
#include "drizzled/table_share.h"
36
#include "drizzled/atomics.h"
37
#include "drizzled/query_id.h"
49
43
class Item_subselect;
44
class Select_Lex_Unit;
50
47
class SecurityContext;
52
class Select_Lex_Unit;
54
namespace field { class Epoch; }
55
namespace plugin { class StorageEngine; }
49
class Field_timestamp;
52
extern uint64_t refresh_version;
57
54
typedef enum enum_table_category TABLE_CATEGORY;
58
55
typedef struct st_columndef MI_COLUMNDEF;
134
boost::dynamic_bitset<> *read_set; /* Active column sets */
135
boost::dynamic_bitset<> *write_set; /* Active column sets */
133
MyBitmap *read_set; /* Active column sets */
134
MyBitmap *write_set; /* Active column sets */
137
136
uint32_t tablenr;
138
137
uint32_t db_stat; /**< information about the cursor as in Cursor.h */
140
boost::dynamic_bitset<> def_read_set; /**< Default read set of columns */
141
boost::dynamic_bitset<> def_write_set; /**< Default write set of columns */
142
boost::dynamic_bitset<> tmp_set; /* Not sure about this... */
139
MyBitmap def_read_set; /**< Default read set of columns */
140
MyBitmap def_write_set; /**< Default write set of columns */
141
MyBitmap tmp_set; /* Not sure about this... */
144
143
Session *in_use; /**< Pointer to the current session using this object */
145
144
Session *getSession()
162
161
KeyInfo *key_info; /**< data of keys in database */
163
162
Field *next_number_field; /**< Set if next_number is activated. @TODO What the heck is the difference between this and the next member? */
164
163
Field *found_next_number_field; /**< Points to the "next-number" field (autoincrement field) */
165
field::Epoch *timestamp_field; /**< Points to the auto-setting timestamp field, if any */
164
Field_timestamp *timestamp_field; /**< Points to the auto-setting timestamp field, if any */
167
166
TableList *pos_in_table_list; /* Element referring to this table */
170
169
const char *getAlias() const
172
return _alias.c_str();
180
void setAlias(const char *arg)
186
std::string _alias; /**< alias or table name if no alias */
174
const char *alias; /**< alias or table name if no alias */
189
176
unsigned char *null_flags;
386
371
void resetTable(Session *session, TableShare *share, uint32_t db_stat_arg);
388
373
/* SHARE methods */
389
virtual const TableShare *getShare() const= 0; /* Get rid of this long term */
390
virtual TableShare *getMutableShare()= 0; /* Get rid of this long term */
391
virtual bool hasShare() const= 0; /* Get rid of this long term */
392
virtual void setShare(TableShare *new_share)= 0; /* Get rid of this long term */
394
virtual void release(void)= 0;
396
uint32_t sizeKeys() { return getMutableShare()->sizeKeys(); }
397
uint32_t sizeFields() { return getMutableShare()->sizeFields(); }
398
uint32_t getRecordLength() const { return getShare()->getRecordLength(); }
399
uint32_t sizeBlobFields() { return getMutableShare()->blob_fields; }
400
uint32_t *getBlobField() { return &getMutableShare()->blob_field[0]; }
403
virtual bool hasVariableWidth() const
405
return getShare()->hasVariableWidth(); // We should calculate this.
408
virtual void setVariableWidth(void);
374
inline const TableShare *getShare() const { assert(s); return s; } /* Get rid of this long term */
375
inline bool hasShare() const { return s ? true : false ; } /* Get rid of this long term */
376
inline TableShare *getMutableShare() { assert(s); return s; } /* Get rid of this long term */
377
inline void setShare(TableShare *new_share) { s= new_share; } /* Get rid of this long term */
378
inline uint32_t sizeKeys() { return s->sizeKeys(); }
379
inline uint32_t sizeFields() { return s->sizeFields(); }
380
inline uint32_t getRecordLength() const { return s->getRecordLength(); }
381
inline uint32_t sizeBlobFields() { return s->blob_fields; }
382
inline uint32_t *getBlobField() { return &s->blob_field[0]; }
410
384
Field_blob *getBlobFieldAt(uint32_t arg) const
412
if (arg < getShare()->blob_fields)
413
return (Field_blob*) field[getShare()->blob_field[arg]]; /*NOTE: Using 'Table.field' NOT SharedTable.field. */
386
if (arg < s->blob_fields)
387
return (Field_blob*) field[s->blob_field[arg]]; /*NOTE: Using 'Table.field' NOT SharedTable.field. */
417
inline uint8_t getBlobPtrSize() const { return getShare()->sizeBlobPtr(); }
418
inline uint32_t getNullBytes() const { return getShare()->null_bytes; }
419
inline uint32_t getNullFields() const { return getShare()->null_fields; }
420
inline unsigned char *getDefaultValues() { return getMutableShare()->getDefaultValues(); }
421
inline const char *getSchemaName() const { return getShare()->getSchemaName(); }
422
inline const char *getTableName() const { return getShare()->getTableName(); }
424
inline bool isDatabaseLowByteFirst() const { return getShare()->db_low_byte_first; } /* Portable row format */
425
inline bool isNameLock() const { return open_placeholder; }
427
uint32_t index_flags(uint32_t idx) const;
391
inline uint8_t getBlobPtrSize() { return s->blob_ptr_size; }
392
inline uint32_t getNullBytes() { return s->null_bytes; }
393
inline uint32_t getNullFields() { return s->null_fields; }
394
inline unsigned char *getDefaultValues() { return s->getDefaultValues(); }
395
inline const char *getSchemaName() const { return s->getSchemaName(); }
396
inline const char *getTableName() const { return s->getTableName(); }
398
inline bool isDatabaseLowByteFirst() { return s->db_low_byte_first; } /* Portable row format */
399
inline bool isNameLock() const { return s->isNameLock(); }
400
inline bool isReplaceWithNameLock() { return s->replace_with_name_lock; }
402
uint32_t index_flags(uint32_t idx) const
404
return s->storage_engine->index_flags(s->getKeyInfo(idx).algorithm);
429
407
inline plugin::StorageEngine *getEngine() const /* table_type for handler */
431
return getShare()->getEngine();
409
return s->storage_engine;
434
412
Cursor &getCursor() const /* table_type for handler */
418
/* For TMP tables, should be pulled out as a class */
419
void setup_tmp_table_column_bitmaps(unsigned char *bitmaps);
420
bool create_myisam_tmp_table(KeyInfo *keyinfo,
421
MI_COLUMNDEF *start_recinfo,
422
MI_COLUMNDEF **recinfo,
424
void free_tmp_table(Session *session);
425
bool open_tmp_table();
440
426
size_t max_row_length(const unsigned char *data);
441
427
uint32_t find_shortest_key(const key_map *usable_keys);
442
428
bool compare_record(Field **ptr);
443
bool records_are_comparable();
444
bool compare_records();
429
bool compare_record();
445
430
/* TODO: the (re)storeRecord's may be able to be further condensed */
446
431
void storeRecord();
447
432
void storeRecordAsInsert();
473
457
bool fill_item_list(List<Item> *item_list) const;
474
458
void clear_column_bitmaps(void);
475
459
void prepare_for_position(void);
476
void mark_columns_used_by_index_no_reset(uint32_t index, boost::dynamic_bitset<>& bitmap);
460
void mark_columns_used_by_index_no_reset(uint32_t index, MyBitmap *map);
477
461
void mark_columns_used_by_index_no_reset(uint32_t index);
478
462
void mark_columns_used_by_index(uint32_t index);
479
463
void restore_column_maps_after_mark_index();
481
465
void mark_columns_needed_for_update(void);
482
466
void mark_columns_needed_for_delete(void);
483
467
void mark_columns_needed_for_insert(void);
484
void column_bitmaps_set(boost::dynamic_bitset<>& read_set_arg,
485
boost::dynamic_bitset<>& write_set_arg);
487
void restore_column_map(const boost::dynamic_bitset<>& old);
489
const boost::dynamic_bitset<> use_all_columns(boost::dynamic_bitset<>& map);
468
inline void column_bitmaps_set(MyBitmap *read_set_arg,
469
MyBitmap *write_set_arg)
471
read_set= read_set_arg;
472
write_set= write_set_arg;
475
void restore_column_map(my_bitmap_map *old);
477
my_bitmap_map *use_all_columns(MyBitmap *bitmap);
490
478
inline void use_all_columns()
492
column_bitmaps_set(getMutableShare()->all_set, getMutableShare()->all_set);
480
column_bitmaps_set(&s->all_set, &s->all_set);
495
483
inline void default_column_bitmaps()
501
489
/* Both of the below should go away once we can move this bit to the field objects */
502
inline bool isReadSet(uint32_t index) const
490
inline bool isReadSet(uint32_t index)
504
return read_set->test(index);
492
return read_set->isBitSet(index);
507
495
inline void setReadSet(uint32_t index)
509
read_set->set(index);
497
read_set->setBit(index);
512
500
inline void setReadSet()
517
505
inline void clearReadSet(uint32_t index)
519
read_set->reset(index);
507
read_set->clearBit(index);
522
510
inline void clearReadSet()
512
read_set->clearAll();
527
515
inline bool isWriteSet(uint32_t index)
529
return write_set->test(index);
517
return write_set->isBitSet(index);
532
520
inline void setWriteSet(uint32_t index)
534
write_set->set(index);
522
write_set->setBit(index);
537
525
inline void setWriteSet()
542
530
inline void clearWriteSet(uint32_t index)
544
write_set->reset(index);
532
write_set->clearBit(index);
547
535
inline void clearWriteSet()
537
write_set->clearAll();
552
540
/* Is table open or should be treated as such by name-locking? */
574
564
status|= STATUS_NULL_ROW;
575
memset(null_flags, 255, getShare()->null_bytes);
565
memset(null_flags, 255, s->null_bytes);
578
568
void free_io_cache();
579
569
void filesort_free_buffers(bool full= false);
580
570
void intern_close_table();
582
void print_error(int error, myf errflag) const;
572
void print_error(int error, myf errflag)
574
s->storage_engine->print_error(error, errflag, *this);
586
579
key if error because of duplicated keys
588
uint32_t get_dup_key(int error) const
581
uint32_t get_dup_key(int error)
590
583
cursor->errkey = (uint32_t) -1;
591
584
if (error == HA_ERR_FOUND_DUPP_KEY || error == HA_ERR_FOREIGN_DUPLICATE_KEY ||
612
624
friend std::ostream& operator<<(std::ostream& output, const Table &table)
614
if (table.getShare())
617
output << table.getShare()->getSchemaName();
619
output << table.getShare()->getTableName();
621
output << table.getShare()->getTableTypeAsString();
626
output << "Table:(has no share)";
627
output << table.getShare()->getSchemaName();
629
output << table.getShare()->getTableName();
631
output << table.getShare()->getTableTypeAsString();
629
634
return output; // for multiple << operators.
638
bool is_placeholder_created;
633
virtual bool isPlaceHolder(void) const
643
return is_placeholder_created;
829
851
namespace optimizer { class SqlSelect; }
853
ha_rows filesort(Session *session,
855
st_sort_field *sortorder,
857
optimizer::SqlSelect *select,
860
ha_rows *examined_rows);
862
void filesort_free_buffers(Table *table, bool full);
831
863
void change_double_for_sort(double nr,unsigned char *to);
864
double my_double_round(double value, int64_t dec, bool dec_unsigned,
832
866
int get_quick_record(optimizer::SqlSelect *select);
834
868
void find_date(char *pos,uint32_t *vek,uint32_t flag);
835
869
TYPELIB *convert_strings_to_array_type(char * *typelibs, char * *end);
836
870
TYPELIB *typelib(memory::Root *mem_root, List<String> &strings);
837
871
ulong get_form_pos(int file, unsigned char *head, TYPELIB *save_names);
872
ulong next_io_size(ulong pos);
838
873
void append_unescaped(String *res, const char *pos, uint32_t length);
840
DRIZZLED_API int rename_file_ext(const char * from,const char * to,const char * ext);
875
int rename_file_ext(const char * from,const char * to,const char * ext);
841
876
bool check_column_name(const char *name);
877
bool check_db_name(Session *session, SchemaIdentifier &schema);
842
878
bool check_table_name(const char *name, uint32_t length);
844
880
} /* namespace drizzled */
846
#include <drizzled/table/singular.h>
847
#include <drizzled/table/concurrent.h>
849
882
#endif /* DRIZZLED_TABLE_H */