55
54
typedef enum enum_table_category TABLE_CATEGORY;
56
55
typedef struct st_columndef MI_COLUMNDEF;
57
bool create_myisam_from_heap(Session *session, Table *table,
58
MI_COLUMNDEF *start_recinfo,
59
MI_COLUMNDEF **recinfo,
60
int error, bool ignore_last_dupp_key_error);
59
63
* Class representing a set of records, either in a temporary,
60
64
* normal, or derived table.
70
TableShare *s; /**< Pointer to the shared metadata about the table */
64
71
Field **field; /**< Pointer to fields collection */
67
Field **getFields() const
72
Field *getField(uint32_t arg) const
77
void setFields(Field **arg)
82
void setFieldAt(Field *arg, uint32_t arg_pos)
87
73
Cursor *cursor; /**< Pointer to the storage engine's Cursor managing this table */
91
Table *getNext() const
101
void setNext(Table *arg)
108
getNext()->setPrev(getPrev()); /* remove from used chain */
109
getPrev()->setNext(getNext());
115
Table *getPrev() const
125
void setPrev(Table *arg)
130
boost::dynamic_bitset<> *read_set; /* Active column sets */
131
boost::dynamic_bitset<> *write_set; /* Active column sets */
77
MyBitmap *read_set; /* Active column sets */
78
MyBitmap *write_set; /* Active column sets */
134
81
uint32_t db_stat; /**< information about the cursor as in Cursor.h */
136
boost::dynamic_bitset<> def_read_set; /**< Default read set of columns */
137
boost::dynamic_bitset<> def_write_set; /**< Default write set of columns */
138
boost::dynamic_bitset<> tmp_set; /* Not sure about this... */
83
MyBitmap def_read_set; /**< Default read set of columns */
84
MyBitmap def_write_set; /**< Default write set of columns */
85
MyBitmap tmp_set; /* Not sure about this... */
140
87
Session *in_use; /**< Pointer to the current session using this object */
141
Session *getSession()
146
unsigned char *getInsertRecord()
151
unsigned char *getUpdateRecord()
156
89
unsigned char *record[2]; /**< Pointer to "records" */
157
std::vector<unsigned char> insert_values; /* used by INSERT ... UPDATE */
158
KeyInfo *key_info; /**< data of keys in database */
90
unsigned char *insert_values; /* used by INSERT ... UPDATE */
91
KEY *key_info; /**< data of keys in database */
159
92
Field *next_number_field; /**< Set if next_number is activated. @TODO What the heck is the difference between this and the next member? */
160
93
Field *found_next_number_field; /**< Points to the "next-number" field (autoincrement field) */
161
94
Field_timestamp *timestamp_field; /**< Points to the auto-setting timestamp field, if any */
163
96
TableList *pos_in_table_list; /* Element referring to this table */
166
const char *getAlias() const
168
return _alias.c_str();
176
void setAlias(const char *arg)
182
std::string _alias; /**< alias or table name if no alias */
98
const char *alias; /**< alias or table name if no alias */
185
99
unsigned char *null_flags;
187
101
uint32_t lock_position; /**< Position in DRIZZLE_LOCK.table */
188
102
uint32_t lock_data_start; /**< Start pos. in DRIZZLE_LOCK.locks */
189
103
uint32_t lock_count; /**< Number of locks */
190
104
uint32_t used_fields;
191
uint32_t status; /* What's in getInsertRecord() */
105
uint32_t status; /* What's in record[0] */
192
106
/* number of select if it is derived table */
193
107
uint32_t derived_select_number;
194
108
int current_lock; /**< Type of lock on table */
325
237
uint32_t quick_key_parts[MAX_KEY];
326
238
uint32_t quick_n_ranges[MAX_KEY];
329
240
memory::Root mem_root;
333
init_sql_alloc(&mem_root, TABLE_ALLOC_BLOCK_SIZE, 0);
336
memory::Root *getMemRoot()
338
if (not mem_root.alloc_root_inited())
346
void *alloc_root(size_t arg)
348
if (not mem_root.alloc_root_inited())
353
return mem_root.alloc_root(arg);
356
char *strmake_root(const char *str_arg, size_t len_arg)
358
if (not mem_root.alloc_root_inited())
363
return mem_root.strmake_root(str_arg, len_arg);
241
filesort_info_st sort;
371
245
int report_error(int error);
373
247
* Free information allocated by openfrm
375
249
* @param If true if we also want to free table_share
376
* @note this should all be the destructor
378
int delete_table(bool free_share= false);
251
int closefrm(bool free_share);
380
253
void resetTable(Session *session, TableShare *share, uint32_t db_stat_arg);
382
255
/* SHARE methods */
383
virtual const TableShare *getShare() const= 0; /* Get rid of this long term */
384
virtual TableShare *getMutableShare()= 0; /* Get rid of this long term */
385
virtual bool hasShare() const= 0; /* Get rid of this long term */
386
virtual void setShare(TableShare *new_share)= 0; /* Get rid of this long term */
388
virtual void release(void)= 0;
390
uint32_t sizeKeys() { return getMutableShare()->sizeKeys(); }
391
uint32_t sizeFields() { return getMutableShare()->sizeFields(); }
392
uint32_t getRecordLength() const { return getShare()->getRecordLength(); }
393
uint32_t sizeBlobFields() { return getMutableShare()->blob_fields; }
394
uint32_t *getBlobField() { return &getMutableShare()->blob_field[0]; }
397
virtual bool hasVariableWidth() const
399
return getShare()->hasVariableWidth(); // We should calculate this.
402
virtual void setVariableWidth(void);
404
Field_blob *getBlobFieldAt(uint32_t arg) const
406
if (arg < getShare()->blob_fields)
407
return (Field_blob*) field[getShare()->blob_field[arg]]; /*NOTE: Using 'Table.field' NOT SharedTable.field. */
411
inline uint8_t getBlobPtrSize() { return getShare()->blob_ptr_size; }
412
inline uint32_t getNullBytes() { return getShare()->null_bytes; }
413
inline uint32_t getNullFields() { return getShare()->null_fields; }
414
inline unsigned char *getDefaultValues() { return getMutableShare()->getDefaultValues(); }
415
inline const char *getSchemaName() const { return getShare()->getSchemaName(); }
416
inline const char *getTableName() const { return getShare()->getTableName(); }
418
inline bool isDatabaseLowByteFirst() { return getShare()->db_low_byte_first; } /* Portable row format */
419
inline bool isNameLock() const { return open_placeholder; }
256
inline TableShare *getShare() { return s; } /* Get rid of this long term */
257
inline void setShare(TableShare *new_share) { s= new_share; } /* Get rid of this long term */
258
inline uint32_t sizeKeys() { return s->keys; }
259
inline uint32_t sizeFields() { return s->fields; }
260
inline uint32_t getRecordLength() { return s->reclength; }
261
inline uint32_t sizeBlobFields() { return s->blob_fields; }
262
inline uint32_t *getBlobField() { return s->blob_field; }
263
inline uint32_t getNullBytes() { return s->null_bytes; }
264
inline uint32_t getNullFields() { return s->null_fields; }
265
inline unsigned char *getDefaultValues() { return s->default_values; }
267
inline bool isDatabaseLowByteFirst() { return s->db_low_byte_first; } /* Portable row format */
268
inline bool isNameLock() { return s->name_lock; }
269
inline bool isReplaceWithNameLock() { return s->replace_with_name_lock; }
270
inline bool isWaitingOnCondition() { return s->waiting_on_cond; } /* Protection against free */
421
272
uint32_t index_flags(uint32_t idx) const
423
return getShare()->storage_engine->index_flags(getShare()->getKeyInfo(idx).algorithm);
426
inline plugin::StorageEngine *getEngine() const /* table_type for handler */
428
return getShare()->storage_engine;
431
Cursor &getCursor() const /* table_type for handler */
274
return s->storage_engine->index_flags(s->key_info[idx].algorithm);
277
inline plugin::StorageEngine *getEngine() const /* table_type for handler */
279
return s->storage_engine;
282
/* For TMP tables, should be pulled out as a class */
283
void updateCreateInfo(message::Table *table_proto);
284
void setup_tmp_table_column_bitmaps(unsigned char *bitmaps);
285
bool create_myisam_tmp_table(KEY *keyinfo,
286
MI_COLUMNDEF *start_recinfo,
287
MI_COLUMNDEF **recinfo,
289
void free_tmp_table(Session *session);
290
bool open_tmp_table();
437
291
size_t max_row_length(const unsigned char *data);
438
292
uint32_t find_shortest_key(const key_map *usable_keys);
439
293
bool compare_record(Field **ptr);
440
bool records_are_comparable();
441
bool compare_records();
294
bool compare_record();
442
295
/* TODO: the (re)storeRecord's may be able to be further condensed */
443
296
void storeRecord();
444
297
void storeRecordAsInsert();
598
455
return(cursor->errkey);
602
This is a short term fix. Long term we will used the TableIdentifier to do the actual comparison.
604
bool operator<(const Table &right) const
606
return getShare()->getCacheKey() < right.getShare()->getCacheKey();
609
static bool compare(const Table *a, const Table *b)
614
friend std::ostream& operator<<(std::ostream& output, const Table &table)
616
if (table.getShare())
619
output << table.getShare()->getSchemaName();
621
output << table.getShare()->getTableName();
623
output << table.getShare()->getTableTypeAsString();
628
output << "Table:(has no share)";
631
return output; // for multiple << operators.
635
virtual bool isPlaceHolder(void) const
646
* This class defines the information for foreign keys.
459
Table *create_virtual_tmp_table(Session *session, List<CreateField> &field_list);
461
typedef struct st_foreign_key_info
653
* This is the constructor with all properties set.
655
* @param[in] in_foreign_id The id of the foreign key
656
* @param[in] in_referenced_db The referenced database name of the foreign key
657
* @param[in] in_referenced_table The referenced table name of the foreign key
658
* @param[in] in_update_method The update method of the foreign key.
659
* @param[in] in_delete_method The delete method of the foreign key.
660
* @param[in] in_referenced_key_name The name of referenced key
661
* @param[in] in_foreign_fields The foreign fields
662
* @param[in] in_referenced_fields The referenced fields
664
ForeignKeyInfo(LEX_STRING *in_foreign_id,
665
LEX_STRING *in_referenced_db,
666
LEX_STRING *in_referenced_table,
667
LEX_STRING *in_update_method,
668
LEX_STRING *in_delete_method,
669
LEX_STRING *in_referenced_key_name,
670
List<LEX_STRING> in_foreign_fields,
671
List<LEX_STRING> in_referenced_fields)
673
foreign_id(in_foreign_id),
674
referenced_db(in_referenced_db),
675
referenced_table(in_referenced_table),
676
update_method(in_update_method),
677
delete_method(in_delete_method),
678
referenced_key_name(in_referenced_key_name),
679
foreign_fields(in_foreign_fields),
680
referenced_fields(in_referenced_fields)
685
* This is the default constructor. All properties are set to default values for their types.
688
: foreign_id(NULL), referenced_db(NULL), referenced_table(NULL),
689
update_method(NULL), delete_method(NULL), referenced_key_name(NULL)
694
* Gets the foreign id.
696
* @ retval the foreign id
698
const LEX_STRING *getForeignId() const
705
* Gets the name of the referenced database.
707
* @ retval the name of the referenced database
709
const LEX_STRING *getReferencedDb() const
711
return referenced_db;
716
* Gets the name of the referenced table.
718
* @ retval the name of the referenced table
720
const LEX_STRING *getReferencedTable() const
722
return referenced_table;
727
* Gets the update method.
729
* @ retval the update method
731
const LEX_STRING *getUpdateMethod() const
733
return update_method;
738
* Gets the delete method.
740
* @ retval the delete method
742
const LEX_STRING *getDeleteMethod() const
744
return delete_method;
749
* Gets the name of the referenced key.
751
* @ retval the name of the referenced key
753
const LEX_STRING *getReferencedKeyName() const
755
return referenced_key_name;
760
* Gets the foreign fields.
762
* @ retval the foreign fields
764
const List<LEX_STRING> &getForeignFields() const
766
return foreign_fields;
771
* Gets the referenced fields.
773
* @ retval the referenced fields
775
const List<LEX_STRING> &getReferencedFields() const
777
return referenced_fields;
783
LEX_STRING *foreign_id;
785
* The name of the reference database.
787
LEX_STRING *referenced_db;
789
* The name of the reference table.
791
LEX_STRING *referenced_table;
795
LEX_STRING *update_method;
799
LEX_STRING *delete_method;
801
* The name of the referenced key.
803
LEX_STRING *referenced_key_name;
805
* The foreign fields.
807
List<LEX_STRING> foreign_fields;
809
* The referenced fields.
811
List<LEX_STRING> referenced_fields;
463
LEX_STRING *forein_id;
464
LEX_STRING *referenced_db;
465
LEX_STRING *referenced_table;
466
LEX_STRING *update_method;
467
LEX_STRING *delete_method;
468
LEX_STRING *referenced_key_name;
469
List<LEX_STRING> foreign_fields;
470
List<LEX_STRING> referenced_fields;
816
#define JOIN_TYPE_LEFT 1
817
#define JOIN_TYPE_RIGHT 2
477
#define JOIN_TYPE_LEFT 1
478
#define JOIN_TYPE_RIGHT 2
820
481
class select_union;
821
482
class Tmp_Table_Param;
484
struct open_table_list_st
491
open_table_list_st() :
498
TableShare *alloc_table_share(TableList *table_list, char *key,
499
uint32_t key_length);
500
int open_table_def(Session& session, TableShare *share);
501
void open_table_error(TableShare *share, int error, int db_errno, int errarg);
502
int open_table_from_share(Session *session, TableShare *share, const char *alias,
503
uint32_t db_stat, uint32_t ha_open_flags,
823
505
void free_blobs(Table *table);
824
506
int set_zone(int nr,int min_zone,int max_zone);
825
507
uint32_t convert_period_to_month(uint32_t period);
839
531
TYPELIB *convert_strings_to_array_type(char * *typelibs, char * *end);
840
532
TYPELIB *typelib(memory::Root *mem_root, List<String> &strings);
841
533
ulong get_form_pos(int file, unsigned char *head, TYPELIB *save_names);
534
ulong next_io_size(ulong pos);
842
535
void append_unescaped(String *res, const char *pos, uint32_t length);
844
537
int rename_file_ext(const char * from,const char * to,const char * ext);
845
538
bool check_column_name(const char *name);
846
bool check_db_name(Session *session, SchemaIdentifier &schema);
539
bool check_db_name(LEX_STRING *org_name);
847
540
bool check_table_name(const char *name, uint32_t length);
849
542
} /* namespace drizzled */
851
#include "drizzled/table/instance.h"
852
#include "drizzled/table/concurrent.h"
854
544
#endif /* DRIZZLED_TABLE_H */