65
64
* or the last position (-1) in the calling order, for example it makes no sence
66
65
* to initially ask to be called in position 13.
68
typedef constrained_check<uint64_t, INT32_MAX-1, 1> position_constraint;
69
typedef constrained_check<int32_t, -1, INT32_MIN+1> post_drop_constraint;
71
static position_constraint sysvar_before_write_position; // Call this event observer first.
72
static position_constraint sysvar_before_update_position;
73
static post_drop_constraint sysvar_post_drop_db_position; // I want my event observer to be called last. No reason, I just do!
67
static int32_t sysvar_before_write_position= 1; // Call this event observer first.
68
static int32_t sysvar_before_update_position= 1;
69
static int32_t sysvar_post_drop_db_position= -1; // I want my event observer to be called last. No reason, I just do!
76
72
//==================================
203
211
|| !isDatabaseInteresting(table_share.getSchemaName()))
206
registerEvent(observers, BEFORE_INSERT_RECORD, sysvar_before_write_position.get());
207
// I want to be called first if passible
214
registerEvent(observers, BEFORE_INSERT_RECORD, sysvar_before_write_position); // I want to be called first if passible
208
215
registerEvent(observers, AFTER_INSERT_RECORD);
209
registerEvent(observers, BEFORE_UPDATE_RECORD, sysvar_before_update_position.get());
216
registerEvent(observers, BEFORE_UPDATE_RECORD, sysvar_before_update_position);
210
217
registerEvent(observers, AFTER_UPDATE_RECORD);
211
218
registerEvent(observers, BEFORE_DELETE_RECORD);
212
219
registerEvent(observers, AFTER_DELETE_RECORD);
319
326
/* Plugin initialization and system variables */
321
static void enable(Session*, sql_var_t)
328
static void enable(Session *,
323
333
if (hello_events)
325
if (sysvar_hello_events_enabled)
335
if (*(bool *)save != false)
327
337
hello_events->enable();
338
*(bool *) var_ptr= (bool) true;
331
342
hello_events->disable();
343
*(bool *) var_ptr= (bool) false;
337
static int set_db_list(Session *, set_var *var)
349
static void set_db_list(Session *,
339
const char *db_list= var->value->str_value.ptr();
343
354
if (hello_events)
345
hello_events->setDatabasesOfInterest(db_list);
346
sysvar_db_list.assign(db_list);
356
hello_events->setDatabasesOfInterest(*(const char **) save);
357
*(const char **) var_ptr= hello_events->getDatabasesOfInterest();
351
static int set_table_list(Session *, set_var *var)
361
static void set_table_list(Session *,
353
const char *table_list= var->value->str_value.ptr();
354
if (table_list == NULL)
357
366
if (hello_events)
359
hello_events->setTablesOfInterest(table_list);
360
sysvar_table_list.assign(table_list);
368
hello_events->setTablesOfInterest(*(const char **) save);
369
*(const char **) var_ptr= hello_events->getTablesOfInterest();
366
374
static int init(module::Context &context)
376
const module::option_map &vm= context.getOptions();
377
if (vm.count("before-write-position"))
379
if (sysvar_before_write_position < 1 || sysvar_before_write_position > INT32_MAX -1)
381
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value of before-write-position\n"));
386
if (vm.count("before-update-position"))
388
if (sysvar_before_update_position < 1 || sysvar_before_update_position > INT32_MAX -1)
390
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value of before-update-position\n"));
395
if (vm.count("post-drop-db-position"))
397
if (sysvar_post_drop_db_position > -1 || sysvar_post_drop_db_position < INT32_MIN+1)
399
errmsg_printf(ERRMSG_LVL_ERROR, _("Invalid value of before-update-position\n"));
404
if (vm.count("watch-databases"))
406
sysvar_db_list= strdup(vm["watch-databases"].as<string>().c_str());
411
sysvar_db_list= strdup("");
414
if (vm.count("watch-tables"))
416
sysvar_table_list= strdup(vm["watch-tables"].as<string>().c_str());
421
sysvar_table_list= strdup("");
368
423
hello_events= new HelloEvents(PLUGIN_NAME);
370
425
context.add(hello_events);
374
429
hello_events->enable();
377
context.registerVariable(new sys_var_bool_ptr("enable",
378
&sysvar_hello_events_enabled,
380
context.registerVariable(new sys_var_std_string("watch_databases",
383
context.registerVariable(new sys_var_std_string("watch_tables",
386
context.registerVariable(new sys_var_constrained_value<uint64_t>("before_write_position",
387
sysvar_before_write_position));
388
context.registerVariable(new sys_var_constrained_value<uint64_t>("before_update_position",
389
sysvar_before_update_position));
390
context.registerVariable(new sys_var_constrained_value<int32_t>("post_drop_position",
391
sysvar_post_drop_db_position));
397
435
static void init_options(drizzled::module::option_context &context)
437
context("watch-databases",
439
N_("A comma delimited list of databases to watch"));
440
context("watch-tables",
442
N_("A comma delimited list of databases to watch"));
399
443
context("enable",
400
444
po::value<bool>(&sysvar_hello_events_enabled)->default_value(false)->zero_tokens(),
401
445
N_("Enable Example Events Plugin"));
402
context("watch-databases",
403
po::value<string>(&sysvar_db_list)->default_value(""),
404
N_("A comma delimited list of databases to watch"));
405
context("watch-tables",
406
po::value<string>(&sysvar_table_list)->default_value(""),
407
N_("A comma delimited list of databases to watch"));
408
446
context("before-write-position",
409
po::value<position_constraint>(&sysvar_before_write_position)->default_value(1),
447
po::value<int32_t>(&sysvar_before_write_position)->default_value(1),
410
448
N_("Before write row event observer call position"));
411
449
context("before-update-position",
412
po::value<position_constraint>(&sysvar_before_update_position)->default_value(1),
450
po::value<int32_t>(&sysvar_before_update_position)->default_value(1),
413
451
N_("Before update row event observer call position"));
414
452
context("post-drop-db-position",
415
po::value<post_drop_constraint>(&sysvar_post_drop_db_position)->default_value(-1),
453
po::value<int32_t>(&sysvar_post_drop_db_position)->default_value(-1),
416
454
N_("After drop database event observer call position"));
457
static DRIZZLE_SYSVAR_STR(watch_databases,
460
N_("A comma delimited list of databases to watch"),
461
NULL, /* check func */
462
set_db_list, /* update func */
465
static DRIZZLE_SYSVAR_STR(watch_tables,
468
N_("A comma delimited list of tables to watch"),
469
NULL, /* check func */
470
set_table_list, /* update func */
473
static DRIZZLE_SYSVAR_BOOL(enable,
474
sysvar_hello_events_enabled,
476
N_("Enable Example Events Plugin"),
477
NULL, /* check func */
478
enable, /* update func */
479
false /* default */);
481
static DRIZZLE_SYSVAR_INT(before_write_position,
482
sysvar_before_write_position,
484
N_("Before write row event observer call position"),
485
NULL, /* check func */
486
NULL, /* update func */
489
INT32_MAX -1, /* max */
492
static DRIZZLE_SYSVAR_INT(before_update_position,
493
sysvar_before_update_position,
495
N_("Before update row event observer call position"),
496
NULL, /* check func */
497
NULL, /* update func */
500
INT32_MAX -1, /* max */
503
static drizzle_sys_var* system_var[]= {
504
DRIZZLE_SYSVAR(watch_databases),
505
DRIZZLE_SYSVAR(watch_tables),
506
DRIZZLE_SYSVAR(enable),
507
DRIZZLE_SYSVAR(before_write_position),
508
DRIZZLE_SYSVAR(before_update_position),
421
512
DRIZZLE_DECLARE_PLUGIN