56
46
/* Possible flags of a StorageEngine (there can be 32 of them) */
57
47
enum engine_flag_bits {
58
48
HTON_BIT_ALTER_NOT_SUPPORTED, // Engine does not support alter
49
HTON_BIT_CAN_RECREATE, // Delete all is used for truncate
59
50
HTON_BIT_HIDDEN, // Engine does not appear in lists
51
HTON_BIT_FLUSH_AFTER_RENAME,
60
52
HTON_BIT_NOT_USER_SELECTABLE,
61
53
HTON_BIT_TEMPORARY_NOT_SUPPORTED, // Having temporary tables not supported
62
54
HTON_BIT_TEMPORARY_ONLY,
63
HTON_BIT_DOES_TRANSACTIONS,
64
HTON_BIT_STATS_RECORDS_IS_EXACT,
66
HTON_BIT_CAN_INDEX_BLOBS,
67
HTON_BIT_PRIMARY_KEY_IN_READ_INDEX,
68
HTON_BIT_PARTIAL_COLUMN_READ,
69
HTON_BIT_TABLE_SCAN_ON_INDEX,
70
HTON_BIT_FAST_KEY_READ,
73
HTON_BIT_NO_AUTO_INCREMENT,
74
HTON_BIT_DUPLICATE_POS,
75
HTON_BIT_AUTO_PART_KEY,
76
HTON_BIT_REQUIRE_PRIMARY_KEY,
77
HTON_BIT_REQUIRES_KEY_COLUMNS_FOR_DELETE,
78
HTON_BIT_PRIMARY_KEY_REQUIRED_FOR_DELETE,
79
HTON_BIT_NO_PREFIX_CHAR_KEYS,
80
HTON_BIT_HAS_CHECKSUM,
81
HTON_BIT_SKIP_STORE_LOCK,
82
HTON_BIT_SCHEMA_DICTIONARY,
83
HTON_BIT_FOREIGN_KEYS,
55
HTON_BIT_FILE_BASED, // use for check_lowercase_names
56
HTON_BIT_HAS_DATA_DICTIONARY,
87
60
static const std::bitset<HTON_BIT_SIZE> HTON_NO_FLAGS(0);
88
61
static const std::bitset<HTON_BIT_SIZE> HTON_ALTER_NOT_SUPPORTED(1 << HTON_BIT_ALTER_NOT_SUPPORTED);
62
static const std::bitset<HTON_BIT_SIZE> HTON_CAN_RECREATE(1 << HTON_BIT_CAN_RECREATE);
89
63
static const std::bitset<HTON_BIT_SIZE> HTON_HIDDEN(1 << HTON_BIT_HIDDEN);
64
static const std::bitset<HTON_BIT_SIZE> HTON_FLUSH_AFTER_RENAME(1 << HTON_BIT_FLUSH_AFTER_RENAME);
90
65
static const std::bitset<HTON_BIT_SIZE> HTON_NOT_USER_SELECTABLE(1 << HTON_BIT_NOT_USER_SELECTABLE);
91
66
static const std::bitset<HTON_BIT_SIZE> HTON_TEMPORARY_NOT_SUPPORTED(1 << HTON_BIT_TEMPORARY_NOT_SUPPORTED);
92
67
static const std::bitset<HTON_BIT_SIZE> HTON_TEMPORARY_ONLY(1 << HTON_BIT_TEMPORARY_ONLY);
93
static const std::bitset<HTON_BIT_SIZE> HTON_HAS_DOES_TRANSACTIONS(1 << HTON_BIT_DOES_TRANSACTIONS);
94
static const std::bitset<HTON_BIT_SIZE> HTON_STATS_RECORDS_IS_EXACT(1 << HTON_BIT_STATS_RECORDS_IS_EXACT);
95
static const std::bitset<HTON_BIT_SIZE> HTON_NULL_IN_KEY(1 << HTON_BIT_NULL_IN_KEY);
96
static const std::bitset<HTON_BIT_SIZE> HTON_CAN_INDEX_BLOBS(1 << HTON_BIT_CAN_INDEX_BLOBS);
97
static const std::bitset<HTON_BIT_SIZE> HTON_PRIMARY_KEY_IN_READ_INDEX(1 << HTON_BIT_PRIMARY_KEY_IN_READ_INDEX);
98
static const std::bitset<HTON_BIT_SIZE> HTON_PARTIAL_COLUMN_READ(1 << HTON_BIT_PARTIAL_COLUMN_READ);
99
static const std::bitset<HTON_BIT_SIZE> HTON_TABLE_SCAN_ON_INDEX(1 << HTON_BIT_TABLE_SCAN_ON_INDEX);
100
static const std::bitset<HTON_BIT_SIZE> HTON_FAST_KEY_READ(1 << HTON_BIT_FAST_KEY_READ);
101
static const std::bitset<HTON_BIT_SIZE> HTON_NO_BLOBS(1 << HTON_BIT_NO_BLOBS);
102
static const std::bitset<HTON_BIT_SIZE> HTON_HAS_RECORDS(1 << HTON_BIT_HAS_RECORDS);
103
static const std::bitset<HTON_BIT_SIZE> HTON_NO_AUTO_INCREMENT(1 << HTON_BIT_NO_AUTO_INCREMENT);
104
static const std::bitset<HTON_BIT_SIZE> HTON_DUPLICATE_POS(1 << HTON_BIT_DUPLICATE_POS);
105
static const std::bitset<HTON_BIT_SIZE> HTON_AUTO_PART_KEY(1 << HTON_BIT_AUTO_PART_KEY);
106
static const std::bitset<HTON_BIT_SIZE> HTON_REQUIRE_PRIMARY_KEY(1 << HTON_BIT_REQUIRE_PRIMARY_KEY);
107
static const std::bitset<HTON_BIT_SIZE> HTON_REQUIRES_KEY_COLUMNS_FOR_DELETE(1 << HTON_BIT_REQUIRES_KEY_COLUMNS_FOR_DELETE);
108
static const std::bitset<HTON_BIT_SIZE> HTON_PRIMARY_KEY_REQUIRED_FOR_DELETE(1 << HTON_BIT_PRIMARY_KEY_REQUIRED_FOR_DELETE);
109
static const std::bitset<HTON_BIT_SIZE> HTON_NO_PREFIX_CHAR_KEYS(1 << HTON_BIT_NO_PREFIX_CHAR_KEYS);
110
static const std::bitset<HTON_BIT_SIZE> HTON_HAS_CHECKSUM(1 << HTON_BIT_HAS_CHECKSUM);
111
static const std::bitset<HTON_BIT_SIZE> HTON_SKIP_STORE_LOCK(1 << HTON_BIT_SKIP_STORE_LOCK);
112
static const std::bitset<HTON_BIT_SIZE> HTON_HAS_SCHEMA_DICTIONARY(1 << HTON_BIT_SCHEMA_DICTIONARY);
113
static const std::bitset<HTON_BIT_SIZE> HTON_HAS_FOREIGN_KEYS(1 << HTON_BIT_FOREIGN_KEYS);
68
static const std::bitset<HTON_BIT_SIZE> HTON_FILE_BASED(1 << HTON_BIT_FILE_BASED);
69
static const std::bitset<HTON_BIT_SIZE> HTON_HAS_DATA_DICTIONARY(1 << HTON_BIT_HAS_DATA_DICTIONARY);
117
class NamedSavepoint;
122
typedef std::vector<StorageEngine *> EngineVector;
124
typedef std::set<std::string> TableNameList;
126
extern const std::string UNKNOWN_STRING;
127
extern DRIZZLED_API const std::string DEFAULT_DEFINITION_FILE_EXT;
78
const std::string UNKNOWN_STRING("UNKNOWN");
80
class TableNameIteratorImplementation;
131
82
StorageEngine is a singleton structure - one instance per storage engine -
132
83
to provide access to storage engine functionality that works on the
135
86
usually StorageEngine instance is defined statically in ha_xxx.cc as
137
88
static StorageEngine { ... } xxx_engine;
90
savepoint_*, prepare, recover, and *_by_xid pointers can be 0.
139
class DRIZZLED_API StorageEngine :
141
public MonitoredInTransaction
92
class StorageEngine : public Plugin
143
friend class SEAPITester;
145
typedef uint64_t Table_flags;
95
Name used for storage engine.
97
const bool two_phase_commit;
148
static EngineVector &getSchemaEngines();
149
100
const std::bitset<HTON_BIT_SIZE> flags; /* global Cursor flags */
152
virtual void setTransactionReadWrite(Session& session);
155
* Indicates to a storage engine the start of a
158
virtual void doStartStatement(Session *session)
164
* Indicates to a storage engine the end of
165
* the current SQL statement in the supplied
168
virtual void doEndStatement(Session *session)
174
std::string table_definition_ext;
177
const std::string& getTableDefinitionFileExtension()
179
return table_definition_ext;
183
std::vector<std::string> aliases;
186
const std::vector<std::string>& getAliases() const
191
void addAlias(std::string alias)
193
aliases.push_back(alias);
102
to store per-savepoint data storage engine is provided with an area
103
of a requested size (0 is ok here).
104
savepoint_offset must be initialized statically to the size of
105
the needed memory to store per-savepoint information.
106
After xxx_init it is changed to be an offset to savepoint storage
107
area and need not be used by storage engine.
108
see binlog_engine and binlog_savepoint_set/rollback for an example.
110
size_t savepoint_offset;
111
size_t orig_savepoint_offset;
113
void setTransactionReadWrite(Session* session);
200
Used as a protobuf storage currently by TEMP only engines.
202
typedef std::map <std::string, message::Table> ProtoCache;
203
ProtoCache proto_cache;
204
pthread_mutex_t proto_cache_mutex;
118
* Implementing classes should override these to provide savepoint
121
virtual int savepoint_set_hook(Session *, void *) { return 0; }
123
virtual int savepoint_rollback_hook(Session *, void *) { return 0; }
125
virtual int savepoint_release_hook(Session *, void *) { return 0; }
207
129
StorageEngine(const std::string name_arg,
208
const std::bitset<HTON_BIT_SIZE> &flags_arg= HTON_NO_FLAGS);
130
const std::bitset<HTON_BIT_SIZE> &flags_arg= HTON_NO_FLAGS,
131
size_t savepoint_offset_arg= 0,
132
bool support_2pc= false);
210
134
virtual ~StorageEngine();
213
virtual int doGetTableDefinition(Session &session,
214
const drizzled::identifier::Table &identifier,
215
message::Table &table_message)
224
/* Old style cursor errors */
225
void print_keydup_error(uint32_t key_nr, const char *msg, const Table &table) const;
226
virtual bool get_error_message(int error, String *buf) const;
229
virtual void print_error(int error, myf errflag, const Table& table) const;
136
virtual int getTableProtoImplementation(const char* path,
137
drizzled::message::Table *table_proto)
145
each storage engine has it's own memory area (actually a pointer)
146
in the session, for storing per-connection information.
149
session->ha_data[xxx_engine.slot]
151
slot number is initialized by MySQL after xxx_init() is called.
155
inline uint32_t getSlot (void) { return slot; }
156
inline void setSlot (uint32_t value) { slot= value; }
160
return two_phase_commit;
164
bool is_enabled() const
231
169
bool is_user_selectable() const
238
176
return flags.test(flag);
241
// @todo match check_flag interface
242
virtual uint32_t index_flags(enum ha_key_alg) const { return 0; }
243
virtual void startStatement(Session *session)
245
doStartStatement(session);
247
virtual void endStatement(Session *session)
249
doEndStatement(session);
179
void enable() { enabled= true; }
180
void disable() { enabled= false; }
253
* Called during Session::cleanup() for all engines
183
StorageEngine methods:
185
close_connection is only called if
186
session->ha_data[xxx_engine.slot] is non-zero, so even if you don't need
187
this storage area - set it to something, so that MySQL would know
188
this storage engine was accessed in this connection
255
190
virtual int close_connection(Session *)
260
virtual Cursor *create(Table &)= 0;
195
'all' is true if it's a real commit, that makes persistent changes
196
'all' is false if it's not in fact a commit but an end of the
197
statement that is part of the transaction.
198
NOTE 'all' is also false in auto-commit mode where 'end of statement'
199
and 'real commit' mean the same event.
201
virtual int commit(Session *, bool)
206
virtual int rollback(Session *, bool)
212
The void * points to an uninitialized storage area of requested size
213
(see savepoint_offset description)
215
int savepoint_set(Session *session, void *sp)
217
return savepoint_set_hook(session, (unsigned char *)sp+savepoint_offset);
221
The void * points to a storage area, that was earlier passed
222
to the savepoint_set call
224
int savepoint_rollback(Session *session, void *sp)
226
return savepoint_rollback_hook(session,
227
(unsigned char *)sp+savepoint_offset);
230
int savepoint_release(Session *session, void *sp)
232
return savepoint_release_hook(session,
233
(unsigned char *)sp+savepoint_offset);
236
virtual int prepare(Session *, bool) { return 0; }
237
virtual int recover(XID *, uint32_t) { return 0; }
238
virtual int commit_by_xid(XID *) { return 0; }
239
virtual int rollback_by_xid(XID *) { return 0; }
240
virtual Cursor *create(TableShare *, MEM_ROOT *)= 0;
242
virtual void drop_database(char*) { }
243
virtual int start_consistent_snapshot(Session *) { return 0; }
262
244
virtual bool flush_logs() { return false; }
263
245
virtual bool show_status(Session *, stat_print_fn *, enum ha_stat_type)
250
/* args: current_session, tables, cond */
251
virtual int fill_files_table(Session *, TableList *,
252
Item *) { return 0; }
253
virtual int release_temporary_latches(Session *) { return false; }
269
256
If frm_error() is called then we will use this to find out what file
270
257
extentions exist for the storage engine. This is also used by the default
279
266
virtual const char **bas_ext() const =0;
282
virtual int doCreateTable(Session &session,
284
const drizzled::identifier::Table &identifier,
285
message::Table &message)= 0;
287
virtual int doRenameTable(Session &session,
288
const drizzled::identifier::Table &from, const drizzled::identifier::Table &to)= 0;
290
virtual int doDropTable(Session &session,
291
const drizzled::identifier::Table &identifier)= 0;
293
virtual void doGetTableIdentifiers(CachedDirectory &directory,
294
const drizzled::identifier::Schema &schema_identifier,
295
identifier::Table::vector &set_of_identifiers)= 0;
297
virtual bool doDoesTableExist(Session& session, const drizzled::identifier::Table &identifier);
299
virtual bool doCanCreateTable(const drizzled::identifier::Table &identifier)
300
{ (void)identifier; return true; }
269
virtual int createTableImplementation(Session *session,
270
const char *table_name,
272
HA_CREATE_INFO *create_info,
273
drizzled::message::Table* proto)= 0;
275
virtual int renameTableImplementation(Session* session,
276
const char *from, const char *to);
278
virtual int deleteTableImplementation(Session* session,
279
const std::string table_path);
304
friend class AddSchemaNames;
305
friend class AddTableIdentifier;
306
friend class AlterSchema;
307
friend class CanCreateTable;
308
friend class CreateSchema;
309
friend class DropSchema;
310
friend class DropTable;
311
friend class DropTables;
312
friend class FindEngineByName;
313
friend class Ha_delete_table_error_handler;
314
friend class StorageEngineCloseConnection;
315
friend class StorageEngineDoesTableExist;
316
friend class StorageEngineGetSchemaDefinition;
317
friend class StorageEngineGetTableDefinition;
318
friend class DropTableByIdentifier;
320
int renameTable(Session &session, const drizzled::identifier::Table &from, const drizzled::identifier::Table &to);
282
int doCreateTable(Session *session, const char *path,
284
HA_CREATE_INFO *create_info,
285
drizzled::message::Table *proto)
287
char name_buff[FN_REFLEN];
288
const char *table_name;
290
table_name= checkLowercaseNames(path, name_buff);
292
setTransactionReadWrite(session);
294
return createTableImplementation(session, table_name, table_arg,
298
int renameTable(Session *session, const char *from, const char *to)
300
setTransactionReadWrite(session);
302
return renameTableImplementation(session, from, to);
305
int doDeleteTable(Session* session, const std::string table_path)
307
setTransactionReadWrite(session);
309
return deleteTableImplementation(session, table_path);
312
const char *checkLowercaseNames(const char *path, char *tmp_path);
314
virtual TableNameIteratorImplementation* tableNameIterator(const std::string &database)
322
321
/* Class Methods for operating on plugin */
323
322
static bool addPlugin(plugin::StorageEngine *engine);
324
323
static void removePlugin(plugin::StorageEngine *engine);
326
static int getTableDefinition(Session& session,
327
const drizzled::identifier::Table &identifier,
328
message::table::shared_ptr &table_proto,
329
bool include_temporary_tables= true);
330
static message::table::shared_ptr getTableMessage(Session& session,
331
const drizzled::identifier::Table &identifier,
332
drizzled::error_t &error,
333
bool include_temporary_tables= true);
334
static bool doesTableExist(Session &session,
335
const drizzled::identifier::Table &identifier,
336
bool include_temporary_tables= true);
338
static plugin::StorageEngine *findByName(const std::string &find_str);
339
static plugin::StorageEngine *findByName(Session& session, const std::string &find_str);
325
static int getTableProto(const char* path, message::Table *table_proto);
327
static plugin::StorageEngine *findByName(Session *session,
328
std::string find_str);
341
329
static void closeConnection(Session* session);
342
330
static void dropDatabase(char* path);
331
static int commitOrRollbackByXID(XID *xid, bool commit);
332
static int releaseTemporaryLatches(Session *session);
343
333
static bool flushLogs(plugin::StorageEngine *db_type);
345
static bool dropTable(Session& session,
346
const drizzled::identifier::Table &identifier);
347
static bool dropTable(Session& session,
348
const drizzled::identifier::Table &identifier,
349
drizzled::error_t &error);
351
static bool dropTable(Session& session,
352
StorageEngine &engine,
353
identifier::Table::const_reference identifier,
354
drizzled::error_t &error);
356
static void getIdentifiers(Session &session,
357
const identifier::Schema &schema_identifier,
358
identifier::Table::vector &set_of_identifiers);
360
// Check to see if any SE objects to creation.
361
static bool canCreateTable(const drizzled::identifier::Table &identifier);
363
// @note All schema methods defined here
364
static void getIdentifiers(Session &session, identifier::Schema::vector &schemas);
365
static bool getSchemaDefinition(const drizzled::identifier::Table &identifier, message::schema::shared_ptr &proto);
366
static bool getSchemaDefinition(const drizzled::identifier::Schema &identifier, message::schema::shared_ptr &proto);
367
static bool doesSchemaExist(const drizzled::identifier::Schema &identifier);
368
static const CHARSET_INFO *getSchemaCollation(const drizzled::identifier::Schema &identifier);
369
static bool createSchema(const drizzled::message::Schema &schema_message);
370
static bool dropSchema(drizzled::Session& session, identifier::Schema::const_reference identifier);
371
static bool alterSchema(const drizzled::message::Schema &schema_message);
373
// @note make private/protected
375
virtual void doGetSchemaIdentifiers(identifier::Schema::vector&)
378
virtual bool doGetSchemaDefinition(const drizzled::identifier::Schema&, drizzled::message::schema::shared_ptr&)
383
virtual bool doCreateSchema(const drizzled::message::Schema&)
386
virtual bool doAlterSchema(const drizzled::message::Schema&)
389
virtual bool doDropSchema(const drizzled::identifier::Schema&)
334
static int recover(HASH *commit_list);
335
static int startConsistentSnapshot(Session *session);
336
static int deleteTable(Session *session, const char *path, const char *db,
337
const char *alias, bool generate_warning);
393
338
static inline const std::string &resolveName(const StorageEngine *engine)
395
340
return engine == NULL ? UNKNOWN_STRING : engine->getName();
398
static bool createTable(Session &session,
399
const identifier::Table &identifier,
400
message::Table& table_message);
402
static void removeLostTemporaryTables(Session &session, const char *directory);
404
Cursor *getCursor(Table &share);
406
uint32_t max_record_length() const
407
{ return std::min((unsigned int)HA_MAX_REC_LENGTH, max_supported_record_length()); }
408
uint32_t max_keys() const
409
{ return std::min((unsigned int)MAX_KEY, max_supported_keys()); }
410
uint32_t max_key_parts() const
411
{ return std::min((unsigned int)MAX_REF_PARTS, max_supported_key_parts()); }
412
uint32_t max_key_length() const
413
{ return std::min((unsigned int)MAX_KEY_LENGTH, max_supported_key_length()); }
414
uint32_t max_key_part_length(void) const
415
{ return std::min((unsigned int)MAX_KEY_LENGTH, max_supported_key_part_length()); }
417
virtual uint32_t max_supported_record_length(void) const
418
{ return HA_MAX_REC_LENGTH; }
419
virtual uint32_t max_supported_keys(void) const { return 0; }
420
virtual uint32_t max_supported_key_parts(void) const { return MAX_REF_PARTS; }
421
virtual uint32_t max_supported_key_length(void) const { return MAX_KEY_LENGTH; }
422
virtual uint32_t max_supported_key_part_length(void) const { return 255; }
424
/* TODO-> Make private */
344
* Return the default storage engine plugin::StorageEngine for thread
346
* defaultStorageEngine(session)
347
* @param session current thread
350
* pointer to plugin::StorageEngine
352
static StorageEngine *defaultStorageEngine(Session *session);
354
static int createTable(Session *session, const char *path,
355
const char *db, const char *table_name,
356
HA_CREATE_INFO *create_info,
357
bool update_create_info,
358
drizzled::message::Table *table_proto);
360
Cursor *getCursor(TableShare *share, MEM_ROOT *alloc);
363
class TableNameIteratorImplementation
426
static int deleteDefinitionFromPath(const drizzled::identifier::Table &identifier);
427
static int renameDefinitionFromPath(const drizzled::identifier::Table &dest, const drizzled::identifier::Table &src);
428
static int writeDefinitionFromPath(const drizzled::identifier::Table &identifier, message::Table &proto);
429
static bool readTableFile(const std::string &path, message::Table &table_message);
433
* The below are simple virtual overrides for the plugin::MonitoredInTransaction
436
virtual bool participatesInSqlTransaction() const
438
return false; /* plugin::StorageEngine is non-transactional in terms of SQL */
440
virtual bool participatesInXaTransaction() const
442
return false; /* plugin::StorageEngine is non-transactional in terms of XA */
444
virtual bool alwaysRegisterForXaTransaction() const
449
virtual bool validateCreateTableOption(const std::string &key, const std::string &state)
457
virtual bool validateCreateSchemaOption(const std::string &key, const std::string &state)
466
std::ostream& operator<<(std::ostream& output, const StorageEngine &engine);
368
TableNameIteratorImplementation(const std::string &database) : db(database)
370
virtual ~TableNameIteratorImplementation() {};
372
virtual int next(std::string *name)= 0;
376
class TableNameIterator
379
NameMap<plugin::StorageEngine *>::iterator engine_iter;
380
plugin::TableNameIteratorImplementation *current_implementation;
381
plugin::TableNameIteratorImplementation *default_implementation;
382
std::string database;
384
TableNameIterator(const std::string &db);
385
~TableNameIterator();
387
int next(std::string *name);
468
391
} /* namespace plugin */
469
392
} /* namespace drizzled */