1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems, Inc.
4
* Copyright (C) 2008 Sun Microsystems
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
21
21
/* Structs that defines the Table */
25
23
#ifndef DRIZZLED_TABLE_H
26
24
#define DRIZZLED_TABLE_H
29
27
#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>
29
#include "drizzled/order.h"
30
#include "drizzled/filesort_info.h"
31
#include "drizzled/natural_join_column.h"
32
#include "drizzled/field_iterator.h"
33
#include "drizzled/cursor.h"
34
#include "drizzled/lex_string.h"
35
#include "drizzled/table_list.h"
36
#include "drizzled/table_share.h"
37
#include "drizzled/atomics.h"
38
#include "drizzled/query_id.h"
49
44
class Item_subselect;
45
class Select_Lex_Unit;
50
48
class SecurityContext;
52
class Select_Lex_Unit;
54
namespace field { class Epoch; }
55
namespace plugin { class StorageEngine; }
50
class Field_timestamp;
53
extern uint64_t refresh_version;
57
55
typedef enum enum_table_category TABLE_CATEGORY;
58
56
typedef struct st_columndef MI_COLUMNDEF;
61
59
* Class representing a set of records, either in a temporary,
62
60
* normal, or derived table.
64
class DRIZZLED_API Table
64
TableShare *_share; /**< Pointer to the shared metadata about the table */
66
66
Field **field; /**< Pointer to fields collection */
69
69
Field **getFields() const
162
160
KeyInfo *key_info; /**< data of keys in database */
163
161
Field *next_number_field; /**< Set if next_number is activated. @TODO What the heck is the difference between this and the next member? */
164
162
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 */
163
Field_timestamp *timestamp_field; /**< Points to the auto-setting timestamp field, if any */
167
165
TableList *pos_in_table_list; /* Element referring to this table */
170
168
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 */
173
const char *alias; /**< alias or table name if no alias */
189
175
unsigned char *null_flags;
284
270
statement then the variable contains TIMESTAMP_NO_AUTO_SET (i.e. 0).
286
272
Value of this variable is set for each statement in open_table() and
287
if needed cleared later in statement processing code (see update_query()
273
if needed cleared later in statement processing code (see mysql_update()
290
276
timestamp_auto_set_type timestamp_field_type;
312
298
The set is implemented as a bitmap.
314
300
key_map keys_in_use_for_query;
316
301
/* Map of keys that can be used to calculate GROUP BY without sorting */
317
302
key_map keys_in_use_for_group_by;
319
303
/* Map of keys that can be used to calculate ORDER BY without sorting */
320
304
key_map keys_in_use_for_order_by;
386
370
void resetTable(Session *session, TableShare *share, uint32_t db_stat_arg);
388
372
/* 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]; }
373
virtual const TableShare *getShare() const { assert(_share); return _share; } /* Get rid of this long term */
374
virtual TableShare *getMutableShare() { assert(_share); return _share; } /* Get rid of this long term */
375
bool hasShare() const { return _share ? true : false ; } /* Get rid of this long term */
376
virtual void setShare(TableShare *new_share) { _share= new_share; } /* Get rid of this long term */
377
uint32_t sizeKeys() { return _share->sizeKeys(); }
378
uint32_t sizeFields() { return _share->sizeFields(); }
379
uint32_t getRecordLength() const { return _share->getRecordLength(); }
380
uint32_t sizeBlobFields() { return _share->blob_fields; }
381
uint32_t *getBlobField() { return &_share->blob_field[0]; }
403
384
virtual bool hasVariableWidth() const
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; }
398
inline uint8_t getBlobPtrSize() { return getShare()->blob_ptr_size; }
399
inline uint32_t getNullBytes() { return getShare()->null_bytes; }
400
inline uint32_t getNullFields() { return getShare()->null_fields; }
420
401
inline unsigned char *getDefaultValues() { return getMutableShare()->getDefaultValues(); }
421
402
inline const char *getSchemaName() const { return getShare()->getSchemaName(); }
422
403
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; }
405
inline bool isDatabaseLowByteFirst() { return getShare()->db_low_byte_first; } /* Portable row format */
406
inline bool isNameLock() const { return getShare()->isNameLock(); }
407
inline bool isReplaceWithNameLock() { return getShare()->replace_with_name_lock; }
427
uint32_t index_flags(uint32_t idx) const;
409
uint32_t index_flags(uint32_t idx) const
411
return getShare()->storage_engine->index_flags(getShare()->getKeyInfo(idx).algorithm);
429
414
inline plugin::StorageEngine *getEngine() const /* table_type for handler */
431
return getShare()->getEngine();
416
return getShare()->storage_engine;
434
419
Cursor &getCursor() const /* table_type for handler */
440
425
size_t max_row_length(const unsigned char *data);
441
426
uint32_t find_shortest_key(const key_map *usable_keys);
442
427
bool compare_record(Field **ptr);
443
bool records_are_comparable();
444
bool compare_records();
428
bool compare_record();
445
429
/* TODO: the (re)storeRecord's may be able to be further condensed */
446
430
void storeRecord();
447
431
void storeRecordAsInsert();
555
538
return db_stat || open_placeholder;
559
541
Is this instance of the table should be reopen or represents a name-lock?
561
bool needs_reopen_or_name_lock() const;
543
inline bool needs_reopen_or_name_lock()
545
return getShare()->getVersion() != refresh_version;
564
549
clean/setup table fields and map.
579
564
void filesort_free_buffers(bool full= false);
580
565
void intern_close_table();
582
void print_error(int error, myf errflag) const;
567
void print_error(int error, myf errflag)
569
getShare()->storage_engine->print_error(error, errflag, *this);
586
574
key if error because of duplicated keys
588
uint32_t get_dup_key(int error) const
576
uint32_t get_dup_key(int error)
590
578
cursor->errkey = (uint32_t) -1;
591
579
if (error == HA_ERR_FOUND_DUPP_KEY || error == HA_ERR_FOREIGN_DUPLICATE_KEY ||
602
590
bool operator<(const Table &right) const
604
return getShare()->getCacheKey() < right.getShare()->getCacheKey();
592
int result= strcasecmp(this->getShare()->getSchemaName(), right.getShare()->getSchemaName());
600
result= strcasecmp(this->getShare()->getTableName(), right.getShare()->getTableName());
608
if (this->getShare()->getTableProto()->type() < right.getShare()->getTableProto()->type())
607
614
static bool compare(const Table *a, const Table *b)
612
619
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)";
622
output << table.getShare()->getSchemaName();
624
output << table.getShare()->getTableName();
626
output << table.getShare()->getTableTypeAsString();
629
629
return output; // for multiple << operators.
829
829
namespace optimizer { class SqlSelect; }
831
ha_rows filesort(Session *session,
833
SortField *sortorder,
835
optimizer::SqlSelect *select,
838
ha_rows *examined_rows);
840
void filesort_free_buffers(Table *table, bool full);
831
841
void change_double_for_sort(double nr,unsigned char *to);
842
double my_double_round(double value, int64_t dec, bool dec_unsigned,
832
844
int get_quick_record(optimizer::SqlSelect *select);
834
846
void find_date(char *pos,uint32_t *vek,uint32_t flag);
835
847
TYPELIB *convert_strings_to_array_type(char * *typelibs, char * *end);
836
848
TYPELIB *typelib(memory::Root *mem_root, List<String> &strings);
837
849
ulong get_form_pos(int file, unsigned char *head, TYPELIB *save_names);
850
ulong next_io_size(ulong pos);
838
851
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);
853
int rename_file_ext(const char * from,const char * to,const char * ext);
841
854
bool check_column_name(const char *name);
855
bool check_db_name(Session *session, SchemaIdentifier &schema);
842
856
bool check_table_name(const char *name, uint32_t length);
844
858
} /* namespace drizzled */
846
#include <drizzled/table/singular.h>
847
#include <drizzled/table/concurrent.h>
860
#include "drizzled/table/instance.h"
861
#include "drizzled/table/concurrent.h"
849
863
#endif /* DRIZZLED_TABLE_H */