23 #include <drizzled/definition/cache.h>
24 #include <drizzled/error.h>
25 #include <drizzled/message/schema.h>
26 #include <drizzled/plugin/event_observer.h>
27 #include <drizzled/table/instance/shared.h>
28 #include <drizzled/plugin/storage_engine.h>
34 Shared::Shared(
const identifier::Table::Type type_arg,
35 const identifier::Table &identifier,
36 char *path_arg, uint32_t path_length_arg) :
37 TableShare(type_arg, identifier, path_arg, path_length_arg),
42 Shared::Shared(
const identifier::Table &identifier,
43 message::schema::shared_ptr schema_message) :
44 TableShare(message::Table::STANDARD, identifier, NULL, 0),
45 _schema(schema_message),
50 Shared::Shared(
const identifier::Table &identifier) :
51 TableShare(identifier, identifier.getKey()),
56 bool Shared::is_replicated()
const
60 if (not message::is_replicated(*_schema))
64 assert(getTableMessage());
65 return message::is_replicated(*getTableMessage());
69 Shared::shared_ptr Shared::foundTableShare(Shared::shared_ptr share)
78 share->open_table_error(share->error, share->open_errno, share->errarg);
80 return Shared::shared_ptr();
83 share->incrementTableCount();
113 Shared::shared_ptr Shared::make_shared(Session *session,
114 const identifier::Table &identifier,
117 Shared::shared_ptr share;
122 if ((share= definition::Cache::find(identifier.getKey())))
123 return foundTableShare(share);
125 drizzled::message::schema::shared_ptr schema_message_ptr= plugin::StorageEngine::getSchemaDefinition(identifier);
127 if (not schema_message_ptr)
129 drizzled::my_error(ER_SCHEMA_DOES_NOT_EXIST, identifier);
130 return Shared::shared_ptr();
133 share.reset(
new Shared(identifier, schema_message_ptr));
135 if (share->open_table_def(*session, identifier))
137 in_error= share->error;
139 return Shared::shared_ptr();
141 share->incrementTableCount();
143 plugin::EventObserver::registerTableEvents(*share);
145 bool ret= definition::Cache::insert(identifier.getKey(), share);
149 drizzled::my_error(ER_UNKNOWN_ERROR);
150 return Shared::shared_ptr();
158 assert(getTableCount() == 0);
159 plugin::EventObserver::deregisterTableEvents(*
this);
179 void release(TableShare *share)
181 bool to_be_deleted=
false;
185 if (not share->decrementTableCount())
193 definition::Cache::erase(share->getCacheKey());
197 void release(TableShare::shared_ptr &share)
199 bool to_be_deleted=
false;
201 safe_mutex_assert_owner(table::Cache::mutex().native_handle);
205 if (not share->decrementTableCount())
213 definition::Cache::erase(share->getCacheKey());
217 void release(
const identifier::Table &identifier)
219 TableShare::shared_ptr share= definition::Cache::find(identifier.getKey());
222 share->resetVersion();
223 if (share->getTableCount() == 0)
225 definition::Cache::erase(identifier.getKey());