37 #include <boost/program_options.hpp>
38 #include <drizzled/item.h>
40 #include <drizzled/session.h>
41 #include <drizzled/table/instance/base.h>
42 #include "hello_events.h"
43 #include <drizzled/plugin.h>
45 namespace po= boost::program_options;
46 using namespace drizzled;
47 using namespace plugin;
50 #define PLUGIN_NAME "hello_events1"
52 static bool sysvar_hello_events_enabled;
53 static HelloEvents *hello_events= NULL;
54 static string sysvar_db_list;
55 static string sysvar_table_list;
81 static bool observeBeforeInsertRecord(BeforeInsertRecordEventData &data)
86 data.session.setVariable(
"BEFORE_INSERT_RECORD", boost::lexical_cast<std::string>(count));
91 static void observeAfterInsertRecord(AfterInsertRecordEventData &data)
95 data.session.setVariable(
"AFTER_INSERT_RECORD", boost::lexical_cast<std::string>(count));
99 static bool observeBeforeDeleteRecord(BeforeDeleteRecordEventData &data)
103 data.session.setVariable(
"AFTER_DELETE_RECORD", boost::lexical_cast<std::string>(count));
108 static void observeAfterDeleteRecord(AfterDeleteRecordEventData &data)
112 data.session.setVariable(
"AFTER_DELETE_RECORD", boost::lexical_cast<std::string>(count));
116 static bool observeBeforeUpdateRecord(BeforeUpdateRecordEventData &data)
120 data.session.setVariable(
"BEFORE_UPDATE_RECORD", boost::lexical_cast<std::string>(count));
125 static void observeAfterUpdateRecord(AfterUpdateRecordEventData &data)
129 data.session.setVariable(
"AFTER_UPDATE_RECORD", boost::lexical_cast<std::string>(count));
134 static void observeAfterDropTable(AfterDropTableEventData &data)
138 data.session.setVariable(
"AFTER_DROP_TABLE", boost::lexical_cast<std::string>(count));
142 static void observeAfterRenameTable(AfterRenameTableEventData &data)
146 data.session.setVariable(
"AFTER_RENAME_TABLE", boost::lexical_cast<std::string>(count));
150 static void observeAfterCreateDatabase(AfterCreateDatabaseEventData &data)
154 data.session.setVariable(
"AFTER_CREATE_DATABASE", boost::lexical_cast<std::string>(count));
158 static void observeAfterDropDatabase(AfterDropDatabaseEventData &data)
162 data.session.setVariable(
"AFTER_DROP_DATABASE", boost::lexical_cast<std::string>(count));
166 static void observeConnectSession(ConnectSessionEventData &data)
170 data.session.setVariable(
"CONNECT_SESSION", boost::lexical_cast<std::string>(count));
174 static void observeDisconnectSession(DisconnectSessionEventData &data)
178 data.session.setVariable(
"DISCONNECT_SESSION", boost::lexical_cast<std::string>(count));
182 static void observeBeforeStatement(BeforeStatementEventData &data)
186 data.session.setVariable(
"BEFORE_STATEMENT", boost::lexical_cast<std::string>(count));
190 static void observeAfterStatement(AfterStatementEventData &data)
194 data.session.setVariable(
"AFTER_STATEMENT", boost::lexical_cast<std::string>(count));
197 HelloEvents::~HelloEvents()
202 void HelloEvents::registerTableEventsDo(
TableShare &table_share, EventObserverList &observers)
204 if ((is_enabled ==
false)
205 || !isTableInteresting(table_share.getTableName())
206 || !isDatabaseInteresting(table_share.getSchemaName()))
209 registerEvent(observers, BEFORE_INSERT_RECORD, sysvar_before_write_position.get());
211 registerEvent(observers, AFTER_INSERT_RECORD);
212 registerEvent(observers, BEFORE_UPDATE_RECORD, sysvar_before_update_position.get());
213 registerEvent(observers, AFTER_UPDATE_RECORD);
214 registerEvent(observers, BEFORE_DELETE_RECORD);
215 registerEvent(observers, AFTER_DELETE_RECORD);
220 void HelloEvents::registerSchemaEventsDo(
const std::string &db, EventObserverList &observers)
222 if ((is_enabled ==
false)
223 || !isDatabaseInteresting(db))
226 registerEvent(observers, AFTER_DROP_TABLE);
227 registerEvent(observers, AFTER_RENAME_TABLE);
232 void HelloEvents::registerSessionEventsDo(
Session &session, EventObserverList &observers)
234 if ((is_enabled ==
false)
235 || !isSessionInteresting(session))
238 registerEvent(observers, AFTER_CREATE_DATABASE);
239 registerEvent(observers, AFTER_DROP_DATABASE, sysvar_post_drop_db_position.get());
240 registerEvent(observers, DISCONNECT_SESSION);
241 registerEvent(observers, CONNECT_SESSION);
242 registerEvent(observers, BEFORE_STATEMENT);
243 registerEvent(observers, AFTER_STATEMENT);
249 bool HelloEvents::observeEventDo(EventData &data)
251 switch (data.event) {
252 case AFTER_DROP_TABLE:
253 observeAfterDropTable((AfterDropTableEventData &)data);
256 case AFTER_RENAME_TABLE:
257 observeAfterRenameTable((AfterRenameTableEventData &)data);
260 case BEFORE_INSERT_RECORD:
261 observeBeforeInsertRecord((BeforeInsertRecordEventData &)data);
264 case AFTER_INSERT_RECORD:
265 observeAfterInsertRecord((AfterInsertRecordEventData &)data);
268 case BEFORE_UPDATE_RECORD:
269 observeBeforeUpdateRecord((BeforeUpdateRecordEventData &)data);
272 case AFTER_UPDATE_RECORD:
273 observeAfterUpdateRecord((AfterUpdateRecordEventData &)data);
276 case BEFORE_DELETE_RECORD:
277 observeBeforeDeleteRecord((BeforeDeleteRecordEventData &)data);
280 case AFTER_DELETE_RECORD:
281 observeAfterDeleteRecord((AfterDeleteRecordEventData &)data);
284 case AFTER_CREATE_DATABASE:
285 observeAfterCreateDatabase((AfterCreateDatabaseEventData &)data);
288 case AFTER_DROP_DATABASE:
289 observeAfterDropDatabase((AfterDropDatabaseEventData &)data);
292 case CONNECT_SESSION:
293 observeConnectSession((ConnectSessionEventData &)data);
296 case DISCONNECT_SESSION:
297 observeDisconnectSession((DisconnectSessionEventData &)data);
300 case BEFORE_STATEMENT:
301 observeBeforeStatement((BeforeStatementEventData &)data);
304 case AFTER_STATEMENT:
305 observeAfterStatement((AfterStatementEventData &)data);
309 fprintf(stderr,
"HelloEvents: Unexpected event '%s'\n", EventObserver::eventName(data.event));
322 static void enable(
Session*, sql_var_t)
326 if (sysvar_hello_events_enabled)
328 hello_events->enable();
332 hello_events->disable();
340 const char *db_list= var->value->
str_value.ptr();
346 hello_events->setDatabasesOfInterest(db_list);
347 sysvar_db_list= db_list;
354 const char *table_list= var->value->
str_value.ptr();
355 if (table_list == NULL)
360 hello_events->setTablesOfInterest(table_list);
361 sysvar_table_list= table_list;
369 hello_events=
new HelloEvents(PLUGIN_NAME);
371 context.add(hello_events);
373 if (sysvar_hello_events_enabled)
375 hello_events->enable();
379 &sysvar_hello_events_enabled,
388 sysvar_before_write_position));
390 sysvar_before_update_position));
392 sysvar_post_drop_db_position));
401 po::value<bool>(&sysvar_hello_events_enabled)->default_value(
false)->zero_tokens(),
402 N_(
"Enable Example Events Plugin"));
403 context(
"watch-databases",
404 po::value<string>(&sysvar_db_list)->default_value(
""),
405 N_(
"A comma delimited list of databases to watch"));
406 context(
"watch-tables",
407 po::value<string>(&sysvar_table_list)->default_value(
""),
408 N_(
"A comma delimited list of databases to watch"));
409 context(
"before-write-position",
410 po::value<position_constraint>(&sysvar_before_write_position)->default_value(1),
411 N_(
"Before write row event observer call position"));
412 context(
"before-update-position",
413 po::value<position_constraint>(&sysvar_before_update_position)->default_value(1),
414 N_(
"Before update row event observer call position"));
415 context(
"post-drop-db-position",
416 po::value<post_drop_constraint>(&sysvar_post_drop_db_position)->default_value(-1),
417 N_(
"After drop database event observer call position"));
422 DRIZZLE_DECLARE_PLUGIN
428 N_(
"Example EventObserver plugin"),
434 DRIZZLE_DECLARE_PLUGIN_END;