82
78
return vector_of_schema_engines;
85
StorageEngine::StorageEngine(const std::string name_arg,
86
const std::bitset<HTON_BIT_SIZE> &flags_arg) :
81
StorageEngine::StorageEngine(const string name_arg,
82
const bitset<HTON_BIT_SIZE> &flags_arg) :
87
83
Plugin(name_arg, "StorageEngine"),
88
84
MonitoredInTransaction(), /* This gives the storage engine a "slot" or ID */
194
190
class FindEngineByName
195
: public std::unary_function<StorageEngine *, bool>
191
: public unary_function<StorageEngine *, bool>
197
const std::string &predicate;
193
const string ⌖
200
explicit FindEngineByName(const std::string &target_arg) :
201
predicate(target_arg)
196
explicit FindEngineByName(const string &target_arg) :
205
200
result_type operator() (argument_type engine)
207
return boost::iequals(engine->getName(), predicate);
202
string engine_name(engine->getName());
204
transform(engine_name.begin(), engine_name.end(),
205
engine_name.begin(), ::tolower);
206
return engine_name == target;
211
StorageEngine *StorageEngine::findByName(const std::string &predicate)
210
StorageEngine *StorageEngine::findByName(const string &find_str)
213
EngineVector::iterator iter= std::find_if(vector_of_engines.begin(),
214
vector_of_engines.end(),
215
FindEngineByName(predicate));
212
string search_string(find_str);
213
transform(search_string.begin(), search_string.end(),
214
search_string.begin(), ::tolower);
217
EngineVector::iterator iter= find_if(vector_of_engines.begin(),
218
vector_of_engines.end(),
219
FindEngineByName(search_string));
216
220
if (iter != vector_of_engines.end())
218
222
StorageEngine *engine= *iter;
226
StorageEngine *StorageEngine::findByName(Session& session, const std::string &predicate)
230
StorageEngine *StorageEngine::findByName(Session& session, const string &find_str)
228
if (boost::iequals(predicate, DEFAULT_STRING))
232
string search_string(find_str);
233
transform(search_string.begin(), search_string.end(),
234
search_string.begin(), ::tolower);
236
if (search_string.compare("default") == 0)
229
237
return session.getDefaultStorageEngine();
231
EngineVector::iterator iter= std::find_if(vector_of_engines.begin(),
232
vector_of_engines.end(),
233
FindEngineByName(predicate));
239
EngineVector::iterator iter= find_if(vector_of_engines.begin(),
240
vector_of_engines.end(),
241
FindEngineByName(search_string));
234
242
if (iter != vector_of_engines.end())
236
244
StorageEngine *engine= *iter;
264
272
void StorageEngine::closeConnection(Session* session)
266
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
267
StorageEngineCloseConnection(session));
274
for_each(vector_of_engines.begin(), vector_of_engines.end(),
275
StorageEngineCloseConnection(session));
270
278
bool StorageEngine::flushLogs(StorageEngine *engine)
272
280
if (engine == NULL)
274
if (std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
275
std::mem_fun(&StorageEngine::flush_logs))
282
if (find_if(vector_of_engines.begin(), vector_of_engines.end(),
283
mem_fun(&StorageEngine::flush_logs))
276
284
!= vector_of_engines.begin())
287
class StorageEngineGetTableDefinition: public std::unary_function<StorageEngine *,bool>
295
class StorageEngineGetTableDefinition: public unary_function<StorageEngine *,bool>
289
297
Session& session;
290
const TableIdentifier &identifier;
298
TableIdentifier &identifier;
291
299
message::Table &table_message;
295
303
StorageEngineGetTableDefinition(Session& session_arg,
296
const TableIdentifier &identifier_arg,
304
TableIdentifier &identifier_arg,
297
305
message::Table &table_message_arg,
299
307
session(session_arg),
315
class StorageEngineDoesTableExist: public std::unary_function<StorageEngine *, bool>
323
class StorageEngineDoesTableExist: public unary_function<StorageEngine *, bool>
317
325
Session& session;
318
const TableIdentifier &identifier;
326
TableIdentifier &identifier;
321
StorageEngineDoesTableExist(Session& session_arg, const TableIdentifier &identifier_arg) :
329
StorageEngineDoesTableExist(Session& session_arg, TableIdentifier &identifier_arg) :
322
330
session(session_arg),
323
331
identifier(identifier_arg)
345
353
EngineVector::iterator iter=
346
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
347
StorageEngineDoesTableExist(session, identifier));
354
find_if(vector_of_engines.begin(), vector_of_engines.end(),
355
StorageEngineDoesTableExist(session, identifier));
349
357
if (iter == vector_of_engines.end())
367
375
or any dropped tables that need to be removed from disk
369
377
int StorageEngine::getTableDefinition(Session& session,
370
const TableIdentifier &identifier,
371
message::table::shared_ptr &table_message,
378
TableIdentifier &identifier,
379
message::Table &table_message,
372
380
bool include_temporary_tables)
376
384
if (include_temporary_tables)
378
Table *table= session.find_temporary_table(identifier);
381
table_message.reset(new message::Table(*table->getShare()->getTableProto()));
386
if (session.doGetTableDefinition(identifier, table_message) == EEXIST)
386
drizzled::message::table::shared_ptr table_ptr;
387
if ((table_ptr= drizzled::message::Cache::singleton().find(identifier)))
389
table_message= table_ptr;
392
message::Table message;
393
390
EngineVector::iterator iter=
394
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
395
StorageEngineGetTableDefinition(session, identifier, message, err));
391
find_if(vector_of_engines.begin(), vector_of_engines.end(),
392
StorageEngineGetTableDefinition(session, identifier, table_message, err));
397
394
if (iter == vector_of_engines.end())
401
table_message.reset(new message::Table(message));
403
drizzled::message::Cache::singleton().insert(identifier, table_message);
439
433
returns ENOENT if the file doesn't exists.
441
435
int StorageEngine::dropTable(Session& session,
442
const TableIdentifier &identifier)
436
TableIdentifier &identifier)
446
message::table::shared_ptr src_proto;
440
message::Table src_proto;
447
441
StorageEngine *engine;
449
443
error_proto= StorageEngine::getTableDefinition(session, identifier, src_proto);
451
445
if (error_proto == ER_CORRUPT_TABLE_DEFINITION)
453
std::string error_message;
454
identifier.getSQLPath(error_message);
447
string error_message;
449
error_message.append(identifier.getSQLPath());
456
450
error_message.append(" : ");
457
error_message.append(src_proto->InitializationErrorString());
451
error_message.append(src_proto.InitializationErrorString());
459
453
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), error_message.c_str());
461
455
return ER_CORRUPT_TABLE_DEFINITION;
465
engine= StorageEngine::findByName(session, src_proto->engine().name());
467
engine= StorageEngine::findByName(session, "");
458
engine= StorageEngine::findByName(session, src_proto.engine().name());
471
std::string error_message;
472
identifier.getSQLPath(error_message);
473
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), error_message.c_str());
462
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), identifier.getSQLPath().c_str());
475
464
return ER_CORRUPT_TABLE_DEFINITION;
521
509
int StorageEngine::createTable(Session &session,
522
const TableIdentifier &identifier,
510
TableIdentifier &identifier,
523
511
message::Table& table_message)
526
TableShare share(identifier);
527
table::Shell table(share);
515
TableShare share(identifier.getSchemaName().c_str(), 0, identifier.getTableName().c_str(), identifier.getPath().c_str());
528
516
message::Table tmp_proto;
530
if (share.parse_table_proto(session, table_message) || share.open_table_from_share(&session, identifier, "", 0, 0, table))
518
if (share.parse_table_proto(session, table_message) || share.open_table_from_share(&session, "", 0, 0, table))
532
520
// @note Error occured, we should probably do a little more here.
560
identifier.getSQLPath(path);
561
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), path.c_str(), error);
547
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), identifier.getSQLPath().c_str(), error);
564
table.delete_table();
550
table.delete_table(false);
567
553
return(error != 0);
570
Cursor *StorageEngine::getCursor(Table &arg)
556
Cursor *StorageEngine::getCursor(TableShare &share, memory::Root *alloc)
558
return create(share, alloc);
562
public unary_function<StorageEngine *, void>
564
CachedDirectory &directory;
565
SchemaIdentifier &identifier;
566
TableNameList &set_of_names;
570
AddTableName(CachedDirectory &directory_arg, SchemaIdentifier &identifier_arg, set<string>& of_names) :
571
directory(directory_arg),
572
identifier(identifier_arg),
573
set_of_names(of_names)
577
result_type operator() (argument_type engine)
579
engine->doGetTableNames(directory, identifier, set_of_names);
575
583
class AddTableIdentifier :
576
public std::unary_function<StorageEngine *, void>
584
public unary_function<StorageEngine *, void>
578
586
CachedDirectory &directory;
579
const SchemaIdentifier &identifier;
580
TableIdentifier::vector &set_of_identifiers;
587
SchemaIdentifier &identifier;
588
TableIdentifiers &set_of_identifiers;
584
AddTableIdentifier(CachedDirectory &directory_arg, const SchemaIdentifier &identifier_arg, TableIdentifier::vector &of_names) :
592
AddTableIdentifier(CachedDirectory &directory_arg, SchemaIdentifier &identifier_arg, TableIdentifiers &of_names) :
585
593
directory(directory_arg),
586
594
identifier(identifier_arg),
587
595
set_of_identifiers(of_names)
598
void StorageEngine::getIdentifiers(Session &session, const SchemaIdentifier &schema_identifier, TableIdentifier::vector &set_of_identifiers)
600
static SchemaIdentifier INFORMATION_SCHEMA_IDENTIFIER("information_schema");
601
static SchemaIdentifier DATA_DICTIONARY_IDENTIFIER("data_dictionary");
603
CachedDirectory directory(schema_identifier.getPath(), set_of_table_definition_ext);
605
if (schema_identifier == INFORMATION_SCHEMA_IDENTIFIER)
607
else if (schema_identifier == DATA_DICTIONARY_IDENTIFIER)
611
if (directory.fail())
613
errno= directory.getError();
617
schema_identifier.getSQLPath(path);
618
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), path.c_str());
622
my_error(ER_CANT_READ_DIR, MYF(ME_BELL+ME_WAITTANG), directory.getPath(), errno);
629
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
630
AddTableIdentifier(directory, schema_identifier, set_of_identifiers));
606
static SchemaIdentifier INFORMATION_SCHEMA_IDENTIFIER("information_schema");
607
static SchemaIdentifier DATA_DICTIONARY_IDENTIFIER("data_dictionary");
609
void StorageEngine::getTableNames(Session &session, SchemaIdentifier &schema_identifier, TableNameList &set_of_names)
611
CachedDirectory directory(schema_identifier.getPath(), set_of_table_definition_ext);
613
if (schema_identifier == INFORMATION_SCHEMA_IDENTIFIER)
615
else if (schema_identifier == DATA_DICTIONARY_IDENTIFIER)
619
if (directory.fail())
621
errno= directory.getError();
623
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), schema_identifier.getSQLPath().c_str());
625
my_error(ER_CANT_READ_DIR, MYF(ME_BELL+ME_WAITTANG), directory.getPath(), errno);
630
for_each(vector_of_engines.begin(), vector_of_engines.end(),
631
AddTableName(directory, schema_identifier, set_of_names));
633
session.doGetTableNames(directory, schema_identifier, set_of_names);
636
void StorageEngine::getTableIdentifiers(Session &session, SchemaIdentifier &schema_identifier, TableIdentifiers &set_of_identifiers)
638
CachedDirectory directory(schema_identifier.getPath(), set_of_table_definition_ext);
640
if (schema_identifier == INFORMATION_SCHEMA_IDENTIFIER)
642
else if (schema_identifier == DATA_DICTIONARY_IDENTIFIER)
646
if (directory.fail())
648
errno= directory.getError();
650
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), schema_identifier.getSQLPath().c_str());
652
my_error(ER_CANT_READ_DIR, MYF(ME_BELL+ME_WAITTANG), directory.getPath(), errno);
657
for_each(vector_of_engines.begin(), vector_of_engines.end(),
658
AddTableIdentifier(directory, schema_identifier, set_of_identifiers));
632
660
session.doGetTableIdentifiers(directory, schema_identifier, set_of_identifiers);
635
class DropTable: public std::unary_function<TableIdentifier&, bool>
663
class DropTable: public unary_function<TableIdentifier&, bool>
637
665
Session &session;
638
666
StorageEngine *engine;
653
681
/* This will later be converted to TableIdentifiers */
654
class DropTables: public std::unary_function<StorageEngine *, void>
682
class DropTables: public unary_function<StorageEngine *, void>
656
684
Session &session;
657
TableIdentifier::vector &table_identifiers;
685
TableIdentifierList &table_identifiers;
661
DropTables(Session &session_arg, TableIdentifier::vector &table_identifiers_arg) :
689
DropTables(Session &session_arg, TableIdentifierList &table_identifiers_arg) :
662
690
session(session_arg),
663
691
table_identifiers(table_identifiers_arg)
668
696
// True returning from DropTable means the table has been successfully
669
697
// deleted, so it should be removed from the list of tables to drop
670
table_identifiers.erase(std::remove_if(table_identifiers.begin(),
671
table_identifiers.end(),
672
DropTable(session, engine)),
698
table_identifiers.erase(remove_if(table_identifiers.begin(),
699
table_identifiers.end(),
700
DropTable(session, engine)),
673
701
table_identifiers.end());
719
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
720
DropTables(session, table_identifiers));
747
for_each(vector_of_engines.begin(), vector_of_engines.end(),
748
DropTables(session, table_identifiers));
723
751
Now we just clean up anything that might left over.
725
753
We rescan because some of what might have been there should
726
754
now be all nice and cleaned up.
728
std::set<std::string> all_exts= set_of_table_definition_ext;
756
set<string> all_exts= set_of_table_definition_ext;
730
758
for (EngineVector::iterator iter= vector_of_engines.begin();
731
759
iter != vector_of_engines.end() ; iter++)
1008
int StorageEngine::deleteDefinitionFromPath(const TableIdentifier &identifier)
1043
int StorageEngine::deleteDefinitionFromPath(TableIdentifier &identifier)
1010
std::string path(identifier.getPath());
1045
string path(identifier.getPath());
1012
1047
path.append(DEFAULT_DEFINITION_FILE_EXT);
1014
1049
return internal::my_delete(path.c_str(), MYF(0));
1017
int StorageEngine::renameDefinitionFromPath(const TableIdentifier &dest, const TableIdentifier &src)
1052
int StorageEngine::renameDefinitionFromPath(TableIdentifier &dest, TableIdentifier &src)
1019
1054
message::Table table_message;
1020
std::string src_path(src.getPath());
1021
std::string dest_path(dest.getPath());
1055
string src_path(src.getPath());
1056
string dest_path(dest.getPath());
1023
1058
src_path.append(DEFAULT_DEFINITION_FILE_EXT);
1024
1059
dest_path.append(DEFAULT_DEFINITION_FILE_EXT);
1136
1160
@note on success table can be created.
1138
bool StorageEngine::canCreateTable(const TableIdentifier &identifier)
1162
bool StorageEngine::canCreateTable(drizzled::TableIdentifier &identifier)
1140
1164
EngineVector::iterator iter=
1141
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
1142
CanCreateTable(identifier));
1165
find_if(vector_of_engines.begin(), vector_of_engines.end(),
1166
CanCreateTable(identifier));
1144
1168
if (iter == vector_of_engines.end())
1152
1176
bool StorageEngine::readTableFile(const std::string &path, message::Table &table_message)
1154
std::fstream input(path.c_str(), std::ios::in | std::ios::binary);
1178
fstream input(path.c_str(), ios::in | ios::binary);
1156
1180
if (input.good())
1159
if (table_message.ParseFromIstream(&input))
1182
if (table_message.ParseFromIstream(&input))
1166
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
1167
table_message.InitializationErrorString().empty() ? "": table_message.InitializationErrorString().c_str());
1187
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0),
1188
table_message.InitializationErrorString().c_str());