20
20
#ifndef DRIZZLED_PLUGIN_H
21
21
#define DRIZZLED_PLUGIN_H
23
#include <boost/program_options.hpp>
24
#include <boost/filesystem.hpp>
26
#include <drizzled/module/manifest.h>
27
#include <drizzled/module/module.h>
28
#include <drizzled/plugin/version.h>
29
#include <drizzled/module/context.h>
30
#include <drizzled/definitions.h>
23
#include <drizzled/global.h>
32
24
#include <drizzled/lex_string.h>
33
#include <drizzled/sys_var.h>
34
25
#include <drizzled/xid.h>
36
#include <drizzled/visibility.h>
43
struct charset_info_st;
45
30
/*************************************************************************
46
31
Plugin API. Common for all plugin types.
53
extern boost::filesystem::path plugin_dir;
55
namespace plugin { class StorageEngine; }
35
The allowable types of plugins
37
enum drizzle_plugin_type {
38
DRIZZLE_DAEMON_PLUGIN, /* Daemon / Raw */
39
DRIZZLE_STORAGE_ENGINE_PLUGIN, /* Storage Engine */
40
DRIZZLE_INFORMATION_SCHEMA_PLUGIN, /* Information Schema */
41
DRIZZLE_UDF_PLUGIN, /* User-Defined Function */
42
DRIZZLE_UDA_PLUGIN, /* User-Defined Aggregate Function */
43
DRIZZLE_AUDIT_PLUGIN, /* Audit */
44
DRIZZLE_LOGGER_PLUGIN, /* Query Logging */
45
DRIZZLE_ERRMSG_PLUGIN, /* Error Messages */
46
DRIZZLE_AUTH_PLUGIN, /* Authorization */
47
DRIZZLE_CONFIGVAR_PLUGIN, /* Configuration Variables */
48
DRIZZLE_QCACHE_PLUGIN, /* Query Cache */
49
DRIZZLE_PARSER_PLUGIN, /* Language Parser */
50
DRIZZLE_SCHEDULING_PLUGIN, /* Thread and Session Scheduling */
51
DRIZZLE_REPLICATOR_PLUGIN, /* Database Replication */
52
DRIZZLE_PLUGIN_MAX=DRIZZLE_REPLICATOR_PLUGIN
55
/* The number of plugin types */
56
const uint32_t DRIZZLE_MAX_PLUGIN_TYPE_NUM=DRIZZLE_PLUGIN_MAX+1;
58
/* We use the following strings to define licenses for plugins */
59
enum plugin_license_type {
60
PLUGIN_LICENSE_PROPRIETARY,
64
PLUGIN_LICENSE_MAX=PLUGIN_LICENSE_LGPL
67
const char * const PLUGIN_LICENSE_PROPRIETARY_STRING="PROPRIETARY";
68
const char * const PLUGIN_LICENSE_GPL_STRING="GPL";
69
const char * const PLUGIN_LICENSE_BSD_STRING="BSD";
70
const char * const PLUGIN_LICENSE_LGPL_STRING="LGPL";
58
73
Macros for beginning and ending plugin declarations. Between
59
DRIZZLE_DECLARE_PLUGIN and DRIZZLE_DECLARE_PLUGIN_END there should
60
be a module::Manifest for each plugin to be declared.
64
#define PANDORA_CPP_NAME(x) _drizzled_ ## x ## _plugin_
65
#define PANDORA_PLUGIN_NAME(x) PANDORA_CPP_NAME(x)
66
#define DRIZZLE_DECLARE_PLUGIN \
67
DRIZZLED_API ::drizzled::module::Manifest PANDORA_PLUGIN_NAME(PANDORA_MODULE_NAME)=
70
#define DRIZZLE_DECLARE_PLUGIN_END
71
#define DRIZZLE_PLUGIN(init,system,options) \
72
DRIZZLE_DECLARE_PLUGIN \
75
STRINGIFY_ARG(PANDORA_MODULE_NAME), \
76
STRINGIFY_ARG(PANDORA_MODULE_VERSION), \
77
STRINGIFY_ARG(PANDORA_MODULE_AUTHOR), \
78
STRINGIFY_ARG(PANDORA_MODULE_TITLE), \
79
PANDORA_MODULE_LICENSE, \
81
STRINGIFY_ARG(PANDORA_MODULE_DEPENDENCIES), \
74
drizzle_declare_plugin and drizzle_declare_plugin_end there should
75
be a st_mysql_plugin struct for each plugin to be declared.
79
#ifndef DRIZZLE_DYNAMIC_PLUGIN
80
#define __DRIZZLE_DECLARE_PLUGIN(NAME, DECLS) \
81
struct st_mysql_plugin DECLS[]= {
83
#define __DRIZZLE_DECLARE_PLUGIN(NAME, DECLS) \
84
struct st_mysql_plugin _mysql_plugin_declarations_[]= {
87
#define drizzle_declare_plugin(NAME) \
88
__DRIZZLE_DECLARE_PLUGIN(NAME, \
89
builtin_ ## NAME ## _plugin)
91
#define drizzle_declare_plugin_end ,{0,0,0,0,0,0,0,0,0,0,0}}
94
declarations for SHOW STATUS support in plugins
96
enum enum_mysql_show_type
98
SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG,
99
SHOW_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR,
100
SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE, SHOW_SIZE
103
struct st_mysql_show_var {
106
enum enum_mysql_show_type type;
110
#define SHOW_VAR_FUNC_BUFF_SIZE 1024
111
typedef int (*mysql_show_var_func)(Session *, struct st_mysql_show_var *, char *);
113
struct st_show_var_func_container {
114
mysql_show_var_func func;
87
117
declarations for server variables and command line options
143
175
and persist it in the provided pointer to the dynamic variable.
144
176
For example, strings may require memory to be allocated.
146
typedef void (*var_update_func)(Session *session,
147
drizzle_sys_var *var,
178
typedef void (*mysql_var_update_func)(Session *session,
179
struct st_mysql_sys_var *var,
148
180
void *var_ptr, const void *save);
153
skeleton of a plugin variable - portion of structure common to all.
155
struct drizzle_sys_var
159
void plugin_opt_set_limits(option *options, const drizzle_sys_var *opt);
163
int (*value_type)(drizzle_value *);
164
const char *(*val_str)(drizzle_value *, char *buffer, int *length);
165
int (*val_real)(drizzle_value *, double *realbuf);
166
int (*val_int)(drizzle_value *, int64_t *intbuf);
183
/* the following declarations are for internal use only */
186
#define PLUGIN_VAR_MASK \
187
(PLUGIN_VAR_READONLY | PLUGIN_VAR_NOSYSVAR | \
188
PLUGIN_VAR_NOCMDOPT | PLUGIN_VAR_NOCMDARG | \
189
PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC)
191
#define DRIZZLE_PLUGIN_VAR_HEADER \
194
const char *comment; \
195
mysql_var_check_func check; \
196
mysql_var_update_func update
198
#define DRIZZLE_SYSVAR_NAME(name) mysql_sysvar_ ## name
199
#define DRIZZLE_SYSVAR(name) \
200
((struct st_mysql_sys_var *)&(DRIZZLE_SYSVAR_NAME(name)))
203
for global variables, the value pointer is the first
204
element after the header, the default value is the second.
205
for thread variables, the value offset is the first
206
element after the header, the default value is the second.
210
#define DECLARE_DRIZZLE_SYSVAR_BASIC(name, type) struct { \
211
DRIZZLE_PLUGIN_VAR_HEADER; \
213
const type def_val; \
214
} DRIZZLE_SYSVAR_NAME(name)
216
#define DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, type) struct { \
217
DRIZZLE_PLUGIN_VAR_HEADER; \
218
type *value; type def_val; \
219
type min_val; type max_val; \
221
} DRIZZLE_SYSVAR_NAME(name)
223
#define DECLARE_DRIZZLE_SYSVAR_TYPELIB(name, type) struct { \
224
DRIZZLE_PLUGIN_VAR_HEADER; \
225
type *value; type def_val; \
227
} DRIZZLE_SYSVAR_NAME(name)
229
#define DECLARE_SessionVAR_FUNC(type) \
230
type *(*resolve)(Session *session, int offset)
232
#define DECLARE_DRIZZLE_SessionVAR_BASIC(name, type) struct { \
233
DRIZZLE_PLUGIN_VAR_HEADER; \
235
const type def_val; \
236
DECLARE_SessionVAR_FUNC(type); \
237
} DRIZZLE_SYSVAR_NAME(name)
239
#define DECLARE_DRIZZLE_SessionVAR_SIMPLE(name, type) struct { \
240
DRIZZLE_PLUGIN_VAR_HEADER; \
242
type def_val; type min_val; \
243
type max_val; type blk_sz; \
244
DECLARE_SessionVAR_FUNC(type); \
245
} DRIZZLE_SYSVAR_NAME(name)
247
#define DECLARE_DRIZZLE_SessionVAR_TYPELIB(name, type) struct { \
248
DRIZZLE_PLUGIN_VAR_HEADER; \
251
DECLARE_SessionVAR_FUNC(type); \
253
} DRIZZLE_SYSVAR_NAME(name)
257
the following declarations are for use by plugin implementors
260
#define DRIZZLE_SYSVAR_BOOL(name, varname, opt, comment, check, update, def) \
261
DECLARE_DRIZZLE_SYSVAR_BASIC(name, bool) = { \
262
PLUGIN_VAR_BOOL | ((opt) & PLUGIN_VAR_MASK), \
263
#name, comment, check, update, &varname, def}
265
#define DRIZZLE_SYSVAR_STR(name, varname, opt, comment, check, update, def) \
266
DECLARE_DRIZZLE_SYSVAR_BASIC(name, char *) = { \
267
PLUGIN_VAR_STR | ((opt) & PLUGIN_VAR_MASK), \
268
#name, comment, check, update, &varname, def}
270
#define DRIZZLE_SYSVAR_INT(name, varname, opt, comment, check, update, def, min, max, blk) \
271
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, int) = { \
272
PLUGIN_VAR_INT | ((opt) & PLUGIN_VAR_MASK), \
273
#name, comment, check, update, &varname, def, min, max, blk }
275
#define DRIZZLE_SYSVAR_UINT(name, varname, opt, comment, check, update, def, min, max, blk) \
276
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, unsigned int) = { \
277
PLUGIN_VAR_INT | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
278
#name, comment, check, update, &varname, def, min, max, blk }
280
#define DRIZZLE_SYSVAR_LONG(name, varname, opt, comment, check, update, def, min, max, blk) \
281
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, long) = { \
282
PLUGIN_VAR_LONG | ((opt) & PLUGIN_VAR_MASK), \
283
#name, comment, check, update, &varname, def, min, max, blk }
285
#define DRIZZLE_SYSVAR_ULONG(name, varname, opt, comment, check, update, def, min, max, blk) \
286
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, unsigned long) = { \
287
PLUGIN_VAR_LONG | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
288
#name, comment, check, update, &varname, def, min, max, blk }
290
#define DRIZZLE_SYSVAR_LONGLONG(name, varname, opt, comment, check, update, def, min, max, blk) \
291
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, int64_t) = { \
292
PLUGIN_VAR_LONGLONG | ((opt) & PLUGIN_VAR_MASK), \
293
#name, comment, check, update, &varname, def, min, max, blk }
295
#define DRIZZLE_SYSVAR_ULONGLONG(name, varname, opt, comment, check, update, def, min, max, blk) \
296
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, uint64_t) = { \
297
PLUGIN_VAR_LONGLONG | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
298
#name, comment, check, update, &varname, def, min, max, blk }
300
#define DRIZZLE_SYSVAR_ENUM(name, varname, opt, comment, check, update, def, typelib) \
301
DECLARE_DRIZZLE_SYSVAR_TYPELIB(name, unsigned long) = { \
302
PLUGIN_VAR_ENUM | ((opt) & PLUGIN_VAR_MASK), \
303
#name, comment, check, update, &varname, def, typelib }
305
#define DRIZZLE_SYSVAR_SET(name, varname, opt, comment, check, update, def, typelib) \
306
DECLARE_DRIZZLE_SYSVAR_TYPELIB(name, uint64_t) = { \
307
PLUGIN_VAR_SET | ((opt) & PLUGIN_VAR_MASK), \
308
#name, comment, check, update, &varname, def, typelib }
310
#define DRIZZLE_SessionVAR_BOOL(name, opt, comment, check, update, def) \
311
DECLARE_DRIZZLE_SessionVAR_BASIC(name, char) = { \
312
PLUGIN_VAR_BOOL | PLUGIN_VAR_SessionLOCAL | ((opt) & PLUGIN_VAR_MASK), \
313
#name, comment, check, update, -1, def, NULL}
315
#define DRIZZLE_SessionVAR_STR(name, opt, comment, check, update, def) \
316
DECLARE_DRIZZLE_SessionVAR_BASIC(name, char *) = { \
317
PLUGIN_VAR_STR | PLUGIN_VAR_SessionLOCAL | ((opt) & PLUGIN_VAR_MASK), \
318
#name, comment, check, update, -1, def, NULL}
320
#define DRIZZLE_SessionVAR_INT(name, opt, comment, check, update, def, min, max, blk) \
321
DECLARE_DRIZZLE_SessionVAR_SIMPLE(name, int) = { \
322
PLUGIN_VAR_INT | PLUGIN_VAR_SessionLOCAL | ((opt) & PLUGIN_VAR_MASK), \
323
#name, comment, check, update, -1, def, min, max, blk, NULL }
325
#define DRIZZLE_SessionVAR_UINT(name, opt, comment, check, update, def, min, max, blk) \
326
DECLARE_DRIZZLE_SessionVAR_SIMPLE(name, unsigned int) = { \
327
PLUGIN_VAR_INT | PLUGIN_VAR_SessionLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
328
#name, comment, check, update, -1, def, min, max, blk, NULL }
330
#define DRIZZLE_SessionVAR_LONG(name, opt, comment, check, update, def, min, max, blk) \
331
DECLARE_DRIZZLE_SessionVAR_SIMPLE(name, long) = { \
332
PLUGIN_VAR_LONG | PLUGIN_VAR_SessionLOCAL | ((opt) & PLUGIN_VAR_MASK), \
333
#name, comment, check, update, -1, def, min, max, blk, NULL }
335
#define DRIZZLE_SessionVAR_ULONG(name, opt, comment, check, update, def, min, max, blk) \
336
DECLARE_DRIZZLE_SessionVAR_SIMPLE(name, unsigned long) = { \
337
PLUGIN_VAR_LONG | PLUGIN_VAR_SessionLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
338
#name, comment, check, update, -1, def, min, max, blk, NULL }
340
#define DRIZZLE_SessionVAR_LONGLONG(name, opt, comment, check, update, def, min, max, blk) \
341
DECLARE_DRIZZLE_SessionVAR_SIMPLE(name, int64_t) = { \
342
PLUGIN_VAR_LONGLONG | PLUGIN_VAR_SessionLOCAL | ((opt) & PLUGIN_VAR_MASK), \
343
#name, comment, check, update, -1, def, min, max, blk, NULL }
345
#define DRIZZLE_SessionVAR_ULONGLONG(name, opt, comment, check, update, def, min, max, blk) \
346
DECLARE_DRIZZLE_SessionVAR_SIMPLE(name, uint64_t) = { \
347
PLUGIN_VAR_LONGLONG | PLUGIN_VAR_SessionLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
348
#name, comment, check, update, -1, def, min, max, blk, NULL }
350
#define DRIZZLE_SessionVAR_ENUM(name, opt, comment, check, update, def, typelib) \
351
DECLARE_DRIZZLE_SessionVAR_TYPELIB(name, unsigned long) = { \
352
PLUGIN_VAR_ENUM | PLUGIN_VAR_SessionLOCAL | ((opt) & PLUGIN_VAR_MASK), \
353
#name, comment, check, update, -1, def, NULL, typelib }
355
#define DRIZZLE_SessionVAR_SET(name, opt, comment, check, update, def, typelib) \
356
DECLARE_DRIZZLE_SessionVAR_TYPELIB(name, uint64_t) = { \
357
PLUGIN_VAR_SET | PLUGIN_VAR_SessionLOCAL | ((opt) & PLUGIN_VAR_MASK), \
358
#name, comment, check, update, -1, def, NULL, typelib }
360
/* accessor macros */
362
#define SYSVAR(name) \
363
(*(DRIZZLE_SYSVAR_NAME(name).value))
365
/* when session == null, result points to global value */
366
#define SessionVAR(session, name) \
367
(*(DRIZZLE_SYSVAR_NAME(name).resolve(session, DRIZZLE_SYSVAR_NAME(name).offset)))
371
Plugin description structure.
374
struct st_mysql_plugin
376
uint32_t type; /* the plugin type (a DRIZZLE_XXX_PLUGIN value) */
377
const char *name; /* plugin name (for SHOW PLUGINS) */
378
const char *version; /* plugin version (for SHOW PLUGINS) */
379
const char *author; /* plugin author (for SHOW PLUGINS) */
380
const char *descr; /* general descriptive text (for SHOW PLUGINS ) */
381
int license; /* the plugin license (PLUGIN_LICENSE_XXX) */
382
int (*init)(void *); /* the function to invoke when plugin is loaded */
383
int (*deinit)(void *);/* the function to invoke when plugin is unloaded */
384
struct st_mysql_show_var *status_vars;
385
struct st_mysql_sys_var **system_vars;
386
void *reserved1; /* reserved for dependency checking */
398
std::string description;
401
Plugin(std::string in_name, std::string in_version,
402
std::string in_author, std::string in_description)
403
: name(in_name), version(in_version),
404
author(in_author), description(in_description)
409
virtual void add_functions() {}
413
/*************************************************************************
414
st_mysql_value struct for reading values from mysqld.
415
Used by server variables framework to parse user-provided values.
416
Will be used for arguments when implementing UDFs.
418
Note that val_str() returns a string in temporary memory
419
that will be freed at the end of statement. Copy the string
420
if you need it to persist.
423
#define DRIZZLE_VALUE_TYPE_STRING 0
424
#define DRIZZLE_VALUE_TYPE_REAL 1
425
#define DRIZZLE_VALUE_TYPE_INT 2
427
struct st_mysql_value
429
int (*value_type)(struct st_mysql_value *);
430
const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length);
431
int (*val_real)(struct st_mysql_value *, double *realbuf);
432
int (*val_int)(struct st_mysql_value *, int64_t *intbuf);