62
62
namespace drizzled {
65
static EngineVector vector_of_engines;
66
static EngineVector vector_of_schema_engines;
65
static EngineVector g_engines;
66
static EngineVector g_schema_engines;
68
68
const std::string DEFAULT_STRING("default");
69
69
const std::string UNKNOWN_STRING("UNKNOWN");
94
94
statement_ctx.markModifiedNonTransData();
98
97
int StorageEngine::renameTable(Session &session, const identifier::Table &from, const identifier::Table &to)
101
99
setTransactionReadWrite(session);
103
100
if (unlikely(plugin::EventObserver::beforeRenameTable(session, from, to)))
101
return ER_EVENT_OBSERVER_PLUGIN;
102
int error= doRenameTable(session, from, to);
103
if (unlikely(plugin::EventObserver::afterRenameTable(session, from, to, error)))
105
104
error= ER_EVENT_OBSERVER_PLUGIN;
109
error = doRenameTable(session, from, to);
110
if (unlikely(plugin::EventObserver::afterRenameTable(session, from, to, error)))
112
error= ER_EVENT_OBSERVER_PLUGIN;
171
158
if (engine->check_flag(HTON_BIT_SCHEMA_DICTIONARY))
172
vector_of_schema_engines.push_back(engine);
159
g_schema_engines.push_back(engine);
177
164
void StorageEngine::removePlugin(StorageEngine *)
179
if (shutdown_has_begun == false)
181
vector_of_engines.clear();
182
vector_of_schema_engines.clear();
184
shutdown_has_begun= true;
166
if (shutdown_has_begun)
168
shutdown_has_begun= true;
170
g_schema_engines.clear();
188
class FindEngineByName
189
: public std::unary_function<StorageEngine *, bool>
191
const std::string &predicate;
194
explicit FindEngineByName(const std::string &target_arg) :
195
predicate(target_arg)
199
result_type operator() (argument_type engine)
201
return boost::iequals(engine->getName(), predicate);
205
173
StorageEngine *StorageEngine::findByName(const std::string &predicate)
207
EngineVector::iterator iter= std::find_if(vector_of_engines.begin(),
208
vector_of_engines.end(),
209
FindEngineByName(predicate));
210
if (iter != vector_of_engines.end())
175
BOOST_FOREACH(EngineVector::reference it, g_engines)
212
StorageEngine *engine= *iter;
213
if (engine->is_user_selectable())
177
if (not boost::iequals(it->getName(), predicate))
179
if (it->is_user_selectable())
222
188
if (boost::iequals(predicate, DEFAULT_STRING))
223
189
return session.getDefaultStorageEngine();
225
EngineVector::iterator iter= std::find_if(vector_of_engines.begin(),
226
vector_of_engines.end(),
227
FindEngineByName(predicate));
228
if (iter != vector_of_engines.end())
230
StorageEngine *engine= *iter;
231
if (engine->is_user_selectable())
190
return findByName(predicate);
238
class StorageEngineCloseConnection : public std::unary_function<StorageEngine *, void>
242
StorageEngineCloseConnection(Session *session_arg) : session(session_arg) {}
244
there's no need to rollback here as all transactions must
245
be rolled back already
247
inline result_type operator() (argument_type engine)
249
if (*session->getEngineData(engine))
250
engine->close_connection(session);
256
195
don't bother to rollback here, it's done already
258
void StorageEngine::closeConnection(Session* session)
197
void StorageEngine::closeConnection(Session& session)
260
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
261
StorageEngineCloseConnection(session));
199
BOOST_FOREACH(EngineVector::reference it, g_engines)
201
if (*session.getEngineData(it))
202
it->close_connection(&session);
264
206
bool StorageEngine::flushLogs(StorageEngine *engine)
268
if (std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
269
std::mem_fun(&StorageEngine::flush_logs))
270
!= vector_of_engines.begin())
275
if (engine->flush_logs())
210
if (std::find_if(g_engines.begin(), g_engines.end(), std::mem_fun(&StorageEngine::flush_logs))
211
!= g_engines.begin()) // Shouldn't this be .end()?
214
else if (engine->flush_logs())
309
class StorageEngineDoesTableExist: public std::unary_function<StorageEngine *, bool>
312
const identifier::Table &identifier;
315
StorageEngineDoesTableExist(Session& session_arg, const identifier::Table &identifier_arg) :
316
session(session_arg),
317
identifier(identifier_arg)
320
result_type operator() (argument_type engine)
322
return engine->doDoesTableExist(session, identifier);
327
248
Utility method which hides some of the details of getTableDefinition()
330
251
const identifier::Table &identifier,
331
252
bool include_temporary_tables)
333
if (include_temporary_tables)
335
if (session.open_tables.doDoesTableExist(identifier))
339
EngineVector::iterator iter=
340
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
341
StorageEngineDoesTableExist(session, identifier));
343
if (iter == vector_of_engines.end())
254
if (include_temporary_tables && session.open_tables.doDoesTableExist(identifier))
256
BOOST_FOREACH(EngineVector::reference it, g_engines)
258
if (it->doDoesTableExist(session, identifier))
351
264
bool plugin::StorageEngine::doDoesTableExist(Session&, const drizzled::identifier::Table&)
359
272
const identifier::Table& identifier,
360
273
bool include_temporary_tables)
362
drizzled::error_t error;
363
error= static_cast<drizzled::error_t>(ENOENT);
275
drizzled::error_t error= static_cast<drizzled::error_t>(ENOENT);
365
276
if (include_temporary_tables)
367
Table *table= session.open_tables.find_temporary_table(identifier);
278
if (Table *table= session.open_tables.find_temporary_table(identifier))
370
280
return message::table::shared_ptr(new message::Table(*table->getShare()->getTableMessage()));
380
290
message::Table message;
381
291
EngineVector::iterator iter=
382
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
292
std::find_if(g_engines.begin(), g_engines.end(),
383
293
StorageEngineGetTableDefinition(session, identifier, message, error));
385
if (iter == vector_of_engines.end())
295
if (iter == g_engines.end())
387
297
return message::table::shared_ptr();
444
EngineVector::const_iterator iter= std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
354
EngineVector::const_iterator iter= std::find_if(g_engines.begin(), g_engines.end(),
445
355
DropTableByIdentifier(session, identifier, error));
451
else if (iter == vector_of_engines.end())
361
else if (iter == g_engines.end())
453
363
error= ER_BAD_TABLE_ERROR;
463
373
const identifier::Table &identifier)
465
375
drizzled::error_t error;
467
if (not dropTable(session, identifier, error))
376
return dropTable(session, identifier, error);
475
379
bool StorageEngine::dropTable(Session& session,
571
468
return create(arg);
574
class AddTableIdentifier :
575
public std::unary_function<StorageEngine *, void>
577
CachedDirectory &directory;
578
const identifier::Schema &identifier;
579
identifier::table::vector &set_of_identifiers;
583
AddTableIdentifier(CachedDirectory &directory_arg, const identifier::Schema &identifier_arg, identifier::table::vector &of_names) :
584
directory(directory_arg),
585
identifier(identifier_arg),
586
set_of_identifiers(of_names)
590
result_type operator() (argument_type engine)
592
engine->doGetTableIdentifiers(directory, identifier, set_of_identifiers);
597
471
void StorageEngine::getIdentifiers(Session &session, const identifier::Schema &schema_identifier, identifier::table::vector &set_of_identifiers)
599
473
CachedDirectory directory(schema_identifier.getPath(), set_of_table_definition_ext);
617
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
618
AddTableIdentifier(directory, schema_identifier, set_of_identifiers));
491
BOOST_FOREACH(EngineVector::reference it, g_engines)
492
it->doGetTableIdentifiers(directory, schema_identifier, set_of_identifiers);
620
494
session.open_tables.doGetTableIdentifiers(directory, schema_identifier, set_of_identifiers);
707
std::for_each(vector_of_engines.begin(), vector_of_engines.end(),
581
std::for_each(g_engines.begin(), g_engines.end(),
708
582
DropTables(session, table_identifiers));
716
590
std::set<std::string> all_exts= set_of_table_definition_ext;
718
for (EngineVector::iterator iter= vector_of_engines.begin();
719
iter != vector_of_engines.end() ; iter++)
592
for (EngineVector::iterator iter= g_engines.begin();
593
iter != g_engines.end() ; iter++)
721
595
for (const char **ext= (*iter)->bas_ext(); *ext ; ext++)
722
596
all_exts.insert(*ext);
1119
993
bool StorageEngine::canCreateTable(const identifier::Table &identifier)
1121
995
EngineVector::iterator iter=
1122
std::find_if(vector_of_engines.begin(), vector_of_engines.end(),
996
std::find_if(g_engines.begin(), g_engines.end(),
1123
997
CanCreateTable(identifier));
1125
if (iter == vector_of_engines.end())
999
if (iter == g_engines.end())