57
57
#include <drizzled/table/shell.h>
59
#include "drizzled/message/cache.h"
61
59
#include <boost/algorithm/string/compare.hpp>
63
61
static bool shutdown_has_begun= false; // Once we put in the container for the vector/etc for engines this will go away.
82
82
return vector_of_schema_engines;
85
StorageEngine::StorageEngine(const std::string name_arg,
86
const std::bitset<HTON_BIT_SIZE> &flags_arg) :
85
StorageEngine::StorageEngine(const string name_arg,
86
const bitset<HTON_BIT_SIZE> &flags_arg) :
87
87
Plugin(name_arg, "StorageEngine"),
88
88
MonitoredInTransaction(), /* This gives the storage engine a "slot" or ID */
194
194
class FindEngineByName
195
: public std::unary_function<StorageEngine *, bool>
195
: public unary_function<StorageEngine *, bool>
197
const std::string &predicate;
197
const string &predicate;
200
explicit FindEngineByName(const std::string &target_arg) :
200
explicit FindEngineByName(const string &target_arg) :
201
201
predicate(target_arg)
211
StorageEngine *StorageEngine::findByName(const std::string &predicate)
211
StorageEngine *StorageEngine::findByName(const string &predicate)
213
EngineVector::iterator iter= std::find_if(vector_of_engines.begin(),
214
vector_of_engines.end(),
215
FindEngineByName(predicate));
213
EngineVector::iterator iter= find_if(vector_of_engines.begin(),
214
vector_of_engines.end(),
215
FindEngineByName(predicate));
216
216
if (iter != vector_of_engines.end())
218
218
StorageEngine *engine= *iter;
226
StorageEngine *StorageEngine::findByName(Session& session, const std::string &predicate)
226
StorageEngine *StorageEngine::findByName(Session& session, const string &predicate)
228
228
if (boost::iequals(predicate, DEFAULT_STRING))
229
229
return session.getDefaultStorageEngine();
231
EngineVector::iterator iter= std::find_if(vector_of_engines.begin(),
232
vector_of_engines.end(),
233
FindEngineByName(predicate));
231
EngineVector::iterator iter= find_if(vector_of_engines.begin(),
232
vector_of_engines.end(),
233
FindEngineByName(predicate));
234
234
if (iter != vector_of_engines.end())
236
236
StorageEngine *engine= *iter;
264
264
void StorageEngine::closeConnection(Session* session)
266
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
267
StorageEngineCloseConnection(session));
266
for_each(vector_of_engines.begin(), vector_of_engines.end(),
267
StorageEngineCloseConnection(session));
270
270
bool StorageEngine::flushLogs(StorageEngine *engine)
272
272
if (engine == NULL)
274
if (std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
275
std::mem_fun(&StorageEngine::flush_logs))
274
if (find_if(vector_of_engines.begin(), vector_of_engines.end(),
275
mem_fun(&StorageEngine::flush_logs))
276
276
!= vector_of_engines.begin())
287
class StorageEngineGetTableDefinition: public std::unary_function<StorageEngine *,bool>
287
class StorageEngineGetTableDefinition: public unary_function<StorageEngine *,bool>
289
289
Session& session;
290
290
const TableIdentifier &identifier;
345
345
EngineVector::iterator iter=
346
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
347
StorageEngineDoesTableExist(session, identifier));
346
find_if(vector_of_engines.begin(), vector_of_engines.end(),
347
StorageEngineDoesTableExist(session, identifier));
349
349
if (iter == vector_of_engines.end())
357
357
bool plugin::StorageEngine::doDoesTableExist(Session&, const drizzled::TableIdentifier&)
359
std::cerr << " Engine was called for doDoesTableExist() and does not implement it: " << this->getName() << "\n";
359
cerr << " Engine was called for doDoesTableExist() and does not implement it: " << this->getName() << "\n";
369
369
int StorageEngine::getTableDefinition(Session& session,
370
370
const TableIdentifier &identifier,
371
message::table::shared_ptr &table_message,
371
message::Table &table_message,
372
372
bool include_temporary_tables)
376
376
if (include_temporary_tables)
378
Table *table= session.find_temporary_table(identifier);
381
table_message.reset(new message::Table(*table->getShare()->getTableProto()));
378
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
382
EngineVector::iterator iter=
394
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
395
StorageEngineGetTableDefinition(session, identifier, message, err));
383
find_if(vector_of_engines.begin(), vector_of_engines.end(),
384
StorageEngineGetTableDefinition(session, identifier, table_message, err));
397
386
if (iter == vector_of_engines.end())
401
table_message.reset(new message::Table(message));
403
drizzled::message::Cache::singleton().insert(identifier, table_message);
446
message::table::shared_ptr src_proto;
432
message::Table src_proto;
447
433
StorageEngine *engine;
449
435
error_proto= StorageEngine::getTableDefinition(session, identifier, src_proto);
451
437
if (error_proto == ER_CORRUPT_TABLE_DEFINITION)
453
std::string error_message;
454
identifier.getSQLPath(error_message);
439
string error_message;
441
error_message.append(const_cast<TableIdentifier &>(identifier).getSQLPath());
456
442
error_message.append(" : ");
457
error_message.append(src_proto->InitializationErrorString());
443
error_message.append(src_proto.InitializationErrorString());
459
445
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), error_message.c_str());
461
447
return ER_CORRUPT_TABLE_DEFINITION;
465
engine= StorageEngine::findByName(session, src_proto->engine().name());
467
engine= StorageEngine::findByName(session, "");
450
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());
454
my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), const_cast<TableIdentifier &>(identifier).getSQLPath().c_str());
475
456
return ER_CORRUPT_TABLE_DEFINITION;
560
identifier.getSQLPath(path);
561
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), path.c_str(), error);
539
my_error(ER_CANT_CREATE_TABLE, MYF(ME_BELL+ME_WAITTANG), const_cast<TableIdentifier &>(identifier).getSQLPath().c_str(), error);
564
542
table.delete_table();
575
553
class AddTableIdentifier :
576
public std::unary_function<StorageEngine *, void>
554
public unary_function<StorageEngine *, void>
578
556
CachedDirectory &directory;
579
557
const SchemaIdentifier &identifier;
580
TableIdentifier::vector &set_of_identifiers;
558
TableIdentifiers &set_of_identifiers;
584
AddTableIdentifier(CachedDirectory &directory_arg, const SchemaIdentifier &identifier_arg, TableIdentifier::vector &of_names) :
562
AddTableIdentifier(CachedDirectory &directory_arg, const SchemaIdentifier &identifier_arg, TableIdentifiers &of_names) :
585
563
directory(directory_arg),
586
564
identifier(identifier_arg),
587
565
set_of_identifiers(of_names)
598
void StorageEngine::getIdentifiers(Session &session, const SchemaIdentifier &schema_identifier, TableIdentifier::vector &set_of_identifiers)
576
void StorageEngine::getIdentifiers(Session &session, const SchemaIdentifier &schema_identifier, TableIdentifiers &set_of_identifiers)
600
578
static SchemaIdentifier INFORMATION_SCHEMA_IDENTIFIER("information_schema");
601
579
static SchemaIdentifier DATA_DICTIONARY_IDENTIFIER("data_dictionary");
613
591
errno= directory.getError();
614
592
if (errno == ENOENT)
617
schema_identifier.getSQLPath(path);
618
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), path.c_str());
593
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), const_cast<SchemaIdentifier &>(schema_identifier).getSQLPath().c_str());
622
595
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));
600
for_each(vector_of_engines.begin(), vector_of_engines.end(),
601
AddTableIdentifier(directory, schema_identifier, set_of_identifiers));
632
603
session.doGetTableIdentifiers(directory, schema_identifier, set_of_identifiers);
635
class DropTable: public std::unary_function<TableIdentifier&, bool>
606
class DropTable: public unary_function<TableIdentifier&, bool>
637
608
Session &session;
638
609
StorageEngine *engine;
653
624
/* This will later be converted to TableIdentifiers */
654
class DropTables: public std::unary_function<StorageEngine *, void>
625
class DropTables: public unary_function<StorageEngine *, void>
656
627
Session &session;
657
TableIdentifier::vector &table_identifiers;
628
TableIdentifiers &table_identifiers;
661
DropTables(Session &session_arg, TableIdentifier::vector &table_identifiers_arg) :
632
DropTables(Session &session_arg, TableIdentifiers &table_identifiers_arg) :
662
633
session(session_arg),
663
634
table_identifiers(table_identifiers_arg)
668
639
// True returning from DropTable means the table has been successfully
669
640
// 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)),
641
table_identifiers.erase(remove_if(table_identifiers.begin(),
642
table_identifiers.end(),
643
DropTable(session, engine)),
673
644
table_identifiers.end());
682
653
void StorageEngine::removeLostTemporaryTables(Session &session, const char *directory)
684
655
CachedDirectory dir(directory, set_of_table_definition_ext);
685
TableIdentifier::vector table_identifiers;
656
TableIdentifiers table_identifiers;
719
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
720
DropTables(session, table_identifiers));
690
for_each(vector_of_engines.begin(), vector_of_engines.end(),
691
DropTables(session, table_identifiers));
723
694
Now we just clean up anything that might left over.
725
696
We rescan because some of what might have been there should
726
697
now be all nice and cleaned up.
728
std::set<std::string> all_exts= set_of_table_definition_ext;
699
set<string> all_exts= set_of_table_definition_ext;
730
701
for (EngineVector::iterator iter= vector_of_engines.begin();
731
702
iter != vector_of_engines.end() ; iter++)
1017
988
int StorageEngine::renameDefinitionFromPath(const TableIdentifier &dest, const TableIdentifier &src)
1019
990
message::Table table_message;
1020
std::string src_path(src.getPath());
1021
std::string dest_path(dest.getPath());
991
string src_path(src.getPath());
992
string dest_path(dest.getPath());
1023
994
src_path.append(DEFAULT_DEFINITION_FILE_EXT);
1024
995
dest_path.append(DEFAULT_DEFINITION_FILE_EXT);
1046
1017
int StorageEngine::writeDefinitionFromPath(const TableIdentifier &identifier, message::Table &table_message)
1048
1019
char definition_file_tmp[FN_REFLEN];
1049
std::string file_name(identifier.getPath());
1020
string file_name(identifier.getPath());
1051
1022
file_name.append(DEFAULT_DEFINITION_FILE_EXT);
1138
1108
bool StorageEngine::canCreateTable(const TableIdentifier &identifier)
1140
1110
EngineVector::iterator iter=
1141
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
1142
CanCreateTable(identifier));
1111
find_if(vector_of_engines.begin(), vector_of_engines.end(),
1112
CanCreateTable(identifier));
1144
1114
if (iter == vector_of_engines.end())
1152
1122
bool StorageEngine::readTableFile(const std::string &path, message::Table &table_message)
1154
std::fstream input(path.c_str(), std::ios::in | std::ios::binary);
1124
fstream input(path.c_str(), ios::in | ios::binary);
1156
1126
if (input.good())