1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Definitions required for EventObserver plugin
6
* Copyright (C) 2010 PrimeBase Technologies GmbH, Germany
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; version 2 of the License.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
27
* How to add a new event:
30
* 1: Add your event to EventType.
31
* 2: Add it to EventObserver::eventName().
32
* 3: Cerate a EventData class for it based on SessionEventData, SchemaEventData,
33
* or TableEventData depending on the event type class.
34
* 4: Add a static method to the EventObserver class, similar to beforeInsertRecord() for example,
35
* that will be called by drizzle.
37
* In event_observer.cc
38
* 5: Impliment your static event method, similar to beforeInsertRecord() for example.
39
* 6: Depending on the event type class add an event vector for it to the SessionEventObservers,
40
* SchemaEventObservers, or TableEventObservers class.
43
#ifndef DRIZZLED_PLUGIN_EVENT_OBSERVER_H
44
#define DRIZZLED_PLUGIN_EVENT_OBSERVER_H
46
#include <drizzled/plugin/plugin.h>
50
#include <drizzled/visibility.h>
61
class EventObserverList;
65
typedef std::vector<EventObserver *> EventObserverVector;
66
typedef EventObserver* EventObserverPtr;
68
class DRIZZLED_API EventObserver : public Plugin
71
EventObserver(const EventObserver &);
72
EventObserver& operator=(const EventObserver &);
74
explicit EventObserver(std::string name_arg)
75
: Plugin(name_arg, "EventObserver")
77
virtual ~EventObserver() {}
81
BEFORE_CREATE_DATABASE, AFTER_CREATE_DATABASE,
82
BEFORE_DROP_DATABASE, AFTER_DROP_DATABASE,
89
BEFORE_DROP_TABLE, AFTER_DROP_TABLE,
90
BEFORE_RENAME_TABLE, AFTER_RENAME_TABLE,
93
BEFORE_INSERT_RECORD, AFTER_INSERT_RECORD,
94
BEFORE_UPDATE_RECORD, AFTER_UPDATE_RECORD,
95
BEFORE_DELETE_RECORD, AFTER_DELETE_RECORD,
97
/* The max event ID marker. */
101
static const char *eventName(EventType event)
105
case BEFORE_DROP_TABLE:
106
return "BEFORE_DROP_TABLE";
108
case AFTER_DROP_TABLE:
109
return "AFTER_DROP_TABLE";
111
case BEFORE_RENAME_TABLE:
112
return "BEFORE_RENAME_TABLE";
114
case AFTER_RENAME_TABLE:
115
return "AFTER_RENAME_TABLE";
117
case BEFORE_INSERT_RECORD:
118
return "BEFORE_INSERT_RECORD";
120
case AFTER_INSERT_RECORD:
121
return "AFTER_INSERT_RECORD";
123
case BEFORE_UPDATE_RECORD:
124
return "BEFORE_UPDATE_RECORD";
126
case AFTER_UPDATE_RECORD:
127
return "AFTER_UPDATE_RECORD";
129
case BEFORE_DELETE_RECORD:
130
return "BEFORE_DELETE_RECORD";
132
case AFTER_DELETE_RECORD:
133
return "AFTER_DELETE_RECORD";
135
case BEFORE_CREATE_DATABASE:
136
return "BEFORE_CREATE_DATABASE";
138
case AFTER_CREATE_DATABASE:
139
return "AFTER_CREATE_DATABASE";
141
case BEFORE_DROP_DATABASE:
142
return "BEFORE_DROP_DATABASE";
144
case AFTER_DROP_DATABASE:
145
return "AFTER_DROP_DATABASE";
147
case CONNECT_SESSION:
148
return "CONNECT_SESSION";
150
case DISCONNECT_SESSION:
151
return "DISCONNECT_SESSION";
153
case AFTER_STATEMENT:
154
return "AFTER_STATEMENT";
156
case BEFORE_STATEMENT:
157
return "BEFORE_STATEMENT";
159
case MAX_EVENT_COUNT:
166
/*==========================================================*/
167
/* registerEvents() must be implemented to allow the plugin to
168
* register which events it is interested in.
170
virtual void registerTableEventsDo(TableShare &, EventObserverList &){}
171
virtual void registerSchemaEventsDo(const std::string &/*db*/, EventObserverList &) {}
172
virtual void registerSessionEventsDo(Session &, EventObserverList &) {}
174
virtual bool observeEventDo(EventData &)= 0;
176
/*==========================================================*/
177
/* Static access methods called by drizzle: */
178
static bool addPlugin(EventObserver *handler);
179
static void removePlugin(EventObserver *handler);
181
/*==========================================================*/
182
/* Register an event of interest for this plugin.
183
* This is called from with in the plugin when registering itself.
185
* The position field is used to indicate the order the event observer is to be
186
* called. If the event observer must be called before any other observer then
187
* the position must be set to 1. If it must be called last then the position must be
188
* set to -1. A position of 0 indicated the position doesn't matter.
190
* If 2 plugins require the same position then which is called first in not guarenteed.
191
* In this case a warrning will be logged but execution will continue.
193
* It is good practice that if the event position matters not to hard code the position
194
* but supply a systen variable so that it can be set at runtime so that the user can
195
* decide which event should be called first.
197
void registerEvent(EventObserverList &observers, EventType event, int32_t position= 0);
199
/*==========================================================*/
200
/* Called from drizzle to register all events for all event plugins
201
* interested in this table.
203
static void registerTableEvents(TableShare &table_share);
204
static void deregisterTableEvents(TableShare &table_share);
206
/*==========================================================*/
207
/* Called from drizzle to register all events for all event plugins
208
* interested in this database.
210
static void registerSchemaEvents(Session &session, const std::string &db);
211
static void deregisterSchemaEvents(Session &session, const std::string &db);
213
/*==========================================================*/
214
/* Called from drizzle to register all events for all event plugins
215
* interested in this session.
217
static void registerSessionEvents(Session &session);
218
static void deregisterSessionEvents(Session &session);
221
/*==========================================================*/
222
/* Static meathods called by drizzle to notify interested plugins
223
* of a schema an event,
225
static bool beforeDropTable(Session &session, const drizzled::identifier::Table &table);
226
static bool afterDropTable(Session &session, const drizzled::identifier::Table &table, int err);
227
static bool beforeRenameTable(Session &session, const drizzled::identifier::Table &from, const drizzled::identifier::Table &to);
228
static bool afterRenameTable(Session &session, const drizzled::identifier::Table &from, const drizzled::identifier::Table &to, int err);
229
static bool connectSession(Session &session);
230
static bool disconnectSession(Session &session);
231
static bool beforeStatement(Session &session);
232
static bool afterStatement(Session &session);
234
/*==========================================================*/
235
/* Static meathods called by drizzle to notify interested plugins
236
* of a table an event,
238
static bool beforeInsertRecord(Table &table, unsigned char *buf);
239
static bool afterInsertRecord(Table &table, const unsigned char *buf, int err);
240
static bool beforeDeleteRecord(Table &table, const unsigned char *buf);
241
static bool afterDeleteRecord(Table &table, const unsigned char *buf, int err);
242
static bool beforeUpdateRecord(Table &table, const unsigned char *old_data, unsigned char *new_data);
243
static bool afterUpdateRecord(Table &table, const unsigned char *old_data, unsigned char *new_data, int err);
245
/*==========================================================*/
246
/* Static meathods called by drizzle to notify interested plugins
247
* of a table an event,
249
static bool beforeCreateDatabase(Session &session, const std::string &db);
250
static bool afterCreateDatabase(Session &session, const std::string &db, int err);
251
static bool beforeDropDatabase(Session &session, const std::string &db);
252
static bool afterDropDatabase(Session &session, const std::string &db, int err);
254
static const EventObserverVector &getEventObservers(void);
261
/* EventObserver data classes: */
262
//======================================
266
EventObserver::EventType event;
268
EventData(EventObserver::EventType event_arg):
272
virtual ~EventData(){}
274
// Call all the event observers that are registered for this event.
275
virtual bool callEventObservers();
278
EventObserverList *observerList;
283
class SessionEventData: public EventData
288
SessionEventData(EventObserver::EventType event_arg, Session &session_arg):
289
EventData(event_arg),
292
virtual ~SessionEventData(){}
295
// Call all the event observers that are registered for this event.
296
virtual bool callEventObservers();
298
static bool hasEvents(Session &in_session);
302
class SchemaEventData: public EventData
306
const std::string &db;
308
SchemaEventData(EventObserver::EventType event_arg, Session &session_arg, const std::string &db_arg):
309
EventData(event_arg),
310
session(session_arg),
313
virtual ~SchemaEventData(){}
316
// Call all the event observers that are registered for this event.
317
virtual bool callEventObservers();
322
class TableEventData: public EventData
328
TableEventData(EventObserver::EventType event_arg, Session &session_arg, Table &table_arg):
329
EventData(event_arg),
330
session(session_arg),
333
virtual ~TableEventData(){}
336
// Call all the event observers that are registered for this event.
337
virtual bool callEventObservers();
339
static bool hasEvents(Table &in_table);
343
class BeforeCreateDatabaseEventData: public SessionEventData
346
const std::string &db;
348
BeforeCreateDatabaseEventData(Session &session_arg, const std::string &db_arg):
349
SessionEventData(EventObserver::BEFORE_CREATE_DATABASE, session_arg),
355
class AfterCreateDatabaseEventData: public SessionEventData
358
const std::string &db;
361
AfterCreateDatabaseEventData(Session &session_arg, const std::string &db_arg, int err_arg):
362
SessionEventData(EventObserver::AFTER_CREATE_DATABASE, session_arg),
369
class BeforeDropDatabaseEventData: public SessionEventData
372
const std::string &db;
374
BeforeDropDatabaseEventData(Session &session_arg, const std::string &db_arg):
375
SessionEventData(EventObserver::BEFORE_DROP_DATABASE, session_arg),
381
class AfterDropDatabaseEventData: public SessionEventData
384
const std::string &db;
387
AfterDropDatabaseEventData(Session &session_arg, const std::string &db_arg, int err_arg):
388
SessionEventData(EventObserver::AFTER_DROP_DATABASE, session_arg),
395
class ConnectSessionEventData: public SessionEventData
399
ConnectSessionEventData(Session &session_arg):
400
SessionEventData(EventObserver::CONNECT_SESSION, session_arg)
405
class DisconnectSessionEventData: public SessionEventData
409
DisconnectSessionEventData(Session &session_arg):
410
SessionEventData(EventObserver::DISCONNECT_SESSION, session_arg)
415
class BeforeStatementEventData: public SessionEventData
419
BeforeStatementEventData(Session &session_arg):
420
SessionEventData(EventObserver::BEFORE_STATEMENT, session_arg)
425
class AfterStatementEventData: public SessionEventData
429
AfterStatementEventData(Session &session_arg):
430
SessionEventData(EventObserver::AFTER_STATEMENT, session_arg)
435
class BeforeDropTableEventData: public SchemaEventData
438
const drizzled::identifier::Table &table;
440
BeforeDropTableEventData(Session &session_arg, const drizzled::identifier::Table &table_arg):
441
SchemaEventData(EventObserver::BEFORE_DROP_TABLE, session_arg, table_arg.getSchemaName()),
447
class AfterDropTableEventData: public SchemaEventData
450
const drizzled::identifier::Table &table;
453
AfterDropTableEventData(Session &session_arg, const drizzled::identifier::Table &table_arg, int err_arg):
454
SchemaEventData(EventObserver::AFTER_DROP_TABLE, session_arg, table_arg.getSchemaName()),
461
class BeforeRenameTableEventData: public SchemaEventData
464
const drizzled::identifier::Table &from;
465
const drizzled::identifier::Table &to;
467
BeforeRenameTableEventData(Session &session_arg, const drizzled::identifier::Table &from_arg, const drizzled::identifier::Table &to_arg):
468
SchemaEventData(EventObserver::BEFORE_RENAME_TABLE, session_arg, from_arg.getSchemaName()),
475
class AfterRenameTableEventData: public SchemaEventData
478
const drizzled::identifier::Table &from;
479
const drizzled::identifier::Table &to;
482
AfterRenameTableEventData(Session &session_arg, const drizzled::identifier::Table &from_arg, const drizzled::identifier::Table &to_arg, int err_arg):
483
SchemaEventData(EventObserver::AFTER_RENAME_TABLE, session_arg, from_arg.getSchemaName()),
491
class BeforeInsertRecordEventData: public TableEventData
496
BeforeInsertRecordEventData(Session &session_arg, Table &table_arg, unsigned char *row_arg):
497
TableEventData(EventObserver::BEFORE_INSERT_RECORD, session_arg, table_arg),
503
class AfterInsertRecordEventData: public TableEventData
506
const unsigned char *row;
509
AfterInsertRecordEventData(Session &session_arg, Table &table_arg, const unsigned char *row_arg, int err_arg):
510
TableEventData(EventObserver::AFTER_INSERT_RECORD, session_arg, table_arg),
517
class BeforeDeleteRecordEventData: public TableEventData
520
const unsigned char *row;
522
BeforeDeleteRecordEventData(Session &session_arg, Table &table_arg, const unsigned char *row_arg):
523
TableEventData(EventObserver::BEFORE_DELETE_RECORD, session_arg, table_arg),
529
class AfterDeleteRecordEventData: public TableEventData
532
const unsigned char *row;
535
AfterDeleteRecordEventData(Session &session_arg, Table &table_arg, const unsigned char *row_arg, int err_arg):
536
TableEventData(EventObserver::AFTER_DELETE_RECORD, session_arg, table_arg),
543
class BeforeUpdateRecordEventData: public TableEventData
546
const unsigned char *old_row;
547
unsigned char *new_row;
549
BeforeUpdateRecordEventData(Session &session_arg, Table &table_arg,
550
const unsigned char *old_row_arg,
551
unsigned char *new_row_arg):
552
TableEventData(EventObserver::BEFORE_UPDATE_RECORD, session_arg, table_arg),
553
old_row(old_row_arg),
559
class AfterUpdateRecordEventData: public TableEventData
562
const unsigned char *old_row;
563
const unsigned char *new_row;
566
AfterUpdateRecordEventData(Session &session_arg, Table &table_arg,
567
const unsigned char *old_row_arg,
568
const unsigned char *new_row_arg,
570
TableEventData(EventObserver::AFTER_UPDATE_RECORD, session_arg, table_arg),
571
old_row(old_row_arg),
572
new_row(new_row_arg),
577
//=======================================================
579
} /* namespace plugin */
580
} /* namespace drizzled */
582
#endif /* DRIZZLED_PLUGIN_EVENT_OBSERVER_H */