29 #include <drizzled/session.h>
30 #include <drizzled/table_list.h>
31 #include <drizzled/table/instance.h>
32 #include <drizzled/module/registry.h>
33 #include <drizzled/plugin/event_observer.h>
34 #include <drizzled/util/functors.h>
40 EventObserverVector all_event_plugins;
42 const EventObserverVector &EventObserver::getEventObservers()
44 return all_event_plugins;
47 bool EventObserver::addPlugin(EventObserver *handler)
50 all_event_plugins.push_back(handler);
54 void EventObserver::removePlugin(EventObserver *handler)
57 all_event_plugins.erase(std::find(all_event_plugins.begin(), all_event_plugins.end(), handler));
73 typedef std::multimap<uint32_t, EventObserver *> ObserverMap;
77 std::vector<ObserverMap *> event_observer_lists;
84 event_observer_lists.assign(EventObserver::MAX_EVENT_COUNT, NULL);
89 std::for_each(event_observer_lists.begin(),
90 event_observer_lists.end(),
92 event_observer_lists.clear();
101 void addObserver(
EventObserver *eventObserver,
enum EventObserver::EventType event, int32_t position)
104 ObserverMap *observers;
106 observers= event_observer_lists[event];
107 if (observers == NULL)
109 observers=
new ObserverMap();
110 event_observer_lists[event]= observers;
114 event_pos= INT32_MAX;
116 event_pos= (uint32_t) position;
121 if (observers->count(event_pos))
123 errmsg_printf(error::WARN,
124 _(
"EventObserverList::addEventObserver() Duplicate event position %d for event '%s' from EventObserver plugin '%s'"),
126 EventObserver::eventName(event),
127 eventObserver->getName().c_str());
131 observers->insert(std::pair<uint32_t, EventObserver *>(event_pos, eventObserver) );
136 ObserverMap *getObservers(
enum EventObserver::EventType event)
138 return event_observer_lists[event];
147 void EventObserver::registerEvent(
EventObserverList &observers, EventType event, int32_t position)
149 observers.addObserver(
this, event, position);
167 table_share(table_share_arg), observers(observers_arg) {}
168 inline result_type operator() (argument_type eventObserver)
170 eventObserver->registerTableEventsDo(table_share, observers);
179 void EventObserver::registerTableEvents(
TableShare &table_share)
181 if (all_event_plugins.empty())
186 observers= table_share.getTableObservers();
188 if (observers != NULL)
190 errmsg_printf(error::WARN,
191 _(
"EventObserver::registerTableEvents(): Table already has events registered on it: probable programming error."));
192 table_share.setTableObservers(NULL);
196 observers=
new EventObserverList();
197 table_share.setTableObservers(observers);
200 std::for_each(all_event_plugins.begin(), all_event_plugins.end(),
201 RegisterTableEventsIterate(table_share, *observers));
207 void EventObserver::deregisterTableEvents(TableShare &table_share)
209 if (all_event_plugins.empty())
212 EventObserverList *observers= table_share.getTableObservers();
216 table_share.setTableObservers(NULL);
232 const std::string &db;
237 observers(observers_arg){}
239 inline result_type operator() (argument_type eventObserver)
241 eventObserver->registerSchemaEventsDo(db, observers);
250 void EventObserver::registerSchemaEvents(
Session &session,
const std::string &db)
252 if (all_event_plugins.empty())
255 if (observers == NULL)
258 std::for_each(all_event_plugins.begin(), all_event_plugins.end(),
265 void EventObserver::deregisterSchemaEvents(EventObserverList *observers)
284 session(session_arg), observers(observers_arg) {}
285 inline result_type operator() (argument_type eventObserver)
287 eventObserver->registerSessionEventsDo(session, observers);
296 void EventObserver::registerSessionEvents(
Session &session)
298 if (all_event_plugins.empty())
303 observers= session.getSessionObservers();
305 errmsg_printf(error::WARN,
306 _(
"EventObserver::registerSessionEvents(): Session already has events registered on it: probable programming error."));
307 session.setSessionObservers(NULL);
311 observers=
new EventObserverList();
312 session.setSessionObservers(observers);
314 std::for_each(all_event_plugins.begin(), all_event_plugins.end(),
315 RegisterSessionEventsIterate(session, *observers));
321 void EventObserver::deregisterSessionEvents(EventObserverList *observers)
329 class EventIterate :
public std::unary_function<std::pair<uint32_t, EventObserver *>, bool>
335 std::unary_function<std::pair<uint32_t, EventObserver *>,
bool>(),
339 inline result_type operator()(argument_type handler)
341 bool result= handler.second->observeEventDo(data);
346 errmsg_printf(error::ERROR,
347 _(
"EventIterate event handler '%s' failed for event '%s'"),
348 handler.second->getName().c_str(), handler.second->eventName(data.event));
362 bool EventData::callEventObservers()
364 EventObserverList::ObserverMap *eventObservers;
366 if (observerList == NULL)
369 eventObservers = observerList->getObservers(event);
371 if (eventObservers == NULL)
375 EventObserverList::ObserverMap::iterator iter=
376 std::find_if(eventObservers->begin(), eventObservers->end(),
382 return iter != eventObservers->end();
386 bool SessionEventData::callEventObservers()
388 observerList= session.getSessionObservers();
390 return EventData::callEventObservers();
393 bool SessionEventData::hasEvents(Session &in_session)
395 return (in_session.getSessionObservers() != NULL);
399 bool SchemaEventData::callEventObservers()
401 observerList= session.getSchemaObservers(db);
404 EventObserver::registerSchemaEvents(session, db);
405 observerList= session.getSchemaObservers(db);
408 return EventData::callEventObservers();
412 bool TableEventData::callEventObservers()
414 observerList= table.getMutableShare()->getTableObservers();
416 return EventData::callEventObservers();
419 bool TableEventData::hasEvents(Table &in_table)
421 return (in_table.getMutableShare()->getTableObservers() != NULL);
430 if (all_event_plugins.empty())
433 BeforeDropTableEventData eventData(session, table);
434 return eventData.callEventObservers();
439 if (all_event_plugins.empty())
442 AfterDropTableEventData eventData(session, table, err);
443 return eventData.callEventObservers();
448 if (all_event_plugins.empty())
451 BeforeRenameTableEventData eventData(session, from, to);
452 return eventData.callEventObservers();
457 if (all_event_plugins.empty())
460 AfterRenameTableEventData eventData(session, from, to, err);
461 return eventData.callEventObservers();
470 bool EventObserver::beforeInsertRecord(Table &table,
unsigned char *buf)
472 if (all_event_plugins.empty() || !TableEventData::hasEvents(table))
475 BeforeInsertRecordEventData eventData(*(table.in_use), table, buf);
476 return eventData.callEventObservers();
479 bool EventObserver::afterInsertRecord(Table &table,
const unsigned char *buf,
int err)
481 if (all_event_plugins.empty() || !TableEventData::hasEvents(table))
484 AfterInsertRecordEventData eventData(*(table.in_use), table, buf, err);
485 return eventData.callEventObservers();
488 bool EventObserver::beforeDeleteRecord(Table &table,
const unsigned char *buf)
490 if (all_event_plugins.empty() || !TableEventData::hasEvents(table))
493 BeforeDeleteRecordEventData eventData(*(table.in_use), table, buf);
494 return eventData.callEventObservers();
497 bool EventObserver::afterDeleteRecord(Table &table,
const unsigned char *buf,
int err)
499 if (all_event_plugins.empty() || !TableEventData::hasEvents(table))
502 AfterDeleteRecordEventData eventData(*(table.in_use), table, buf, err);
503 return eventData.callEventObservers();
506 bool EventObserver::beforeUpdateRecord(Table &table,
const unsigned char *old_data,
unsigned char *new_data)
508 if (all_event_plugins.empty() || !TableEventData::hasEvents(table))
511 BeforeUpdateRecordEventData eventData(*(table.in_use), table, old_data, new_data);
512 return eventData.callEventObservers();
515 bool EventObserver::afterUpdateRecord(Table &table,
const unsigned char *old_data,
unsigned char *new_data,
int err)
517 if (all_event_plugins.empty() || !TableEventData::hasEvents(table))
520 AfterUpdateRecordEventData eventData(*(table.in_use), table, old_data, new_data, err);
521 return eventData.callEventObservers();
530 bool EventObserver::beforeCreateDatabase(Session &session,
const std::string &db)
532 if (all_event_plugins.empty() || !SessionEventData::hasEvents(session))
535 BeforeCreateDatabaseEventData eventData(session, db);
536 return eventData.callEventObservers();
539 bool EventObserver::afterCreateDatabase(Session &session,
const std::string &db,
int err)
541 if (all_event_plugins.empty() || !SessionEventData::hasEvents(session))
544 AfterCreateDatabaseEventData eventData(session, db, err);
545 return eventData.callEventObservers();
548 bool EventObserver::beforeDropDatabase(Session &session,
const std::string &db)
550 if (all_event_plugins.empty() || !SessionEventData::hasEvents(session))
553 BeforeDropDatabaseEventData eventData(session, db);
554 return eventData.callEventObservers();
557 bool EventObserver::afterDropDatabase(Session &session,
const std::string &db,
int err)
559 if (all_event_plugins.empty() || !SessionEventData::hasEvents(session))
562 AfterDropDatabaseEventData eventData(session, db, err);
563 return eventData.callEventObservers();
566 bool EventObserver::connectSession(Session &session)
568 if (all_event_plugins.empty() || !SessionEventData::hasEvents(session))
571 ConnectSessionEventData eventData(session);
572 return eventData.callEventObservers();
575 bool EventObserver::disconnectSession(Session &session)
577 if (all_event_plugins.empty() || !SessionEventData::hasEvents(session))
580 DisconnectSessionEventData eventData(session);
581 return eventData.callEventObservers();
584 bool EventObserver::beforeStatement(Session &session)
586 if (all_event_plugins.empty() || !SessionEventData::hasEvents(session))
589 BeforeStatementEventData eventData(session);
590 return eventData.callEventObservers();
593 bool EventObserver::afterStatement(Session &session)
595 if (all_event_plugins.empty() || !SessionEventData::hasEvents(session))
598 AfterStatementEventData eventData(session);
599 return eventData.callEventObservers();