1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
4
* Copyright (C) 2008 Sun Microsystems
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
#ifndef DRIZZLED_PLUGIN_H
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"
32
#include "drizzled/lex_string.h"
33
#include "drizzled/sys_var.h"
34
#include "drizzled/xid.h"
1
/* Copyright (C) 2005 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
19
#include <drizzled/global.h>
41
struct charset_info_st;
24
#define DRIZZLE_THD THD*
26
#define DRIZZLE_THD void*
31
/* This definition must match the one given in m_string.h */
32
struct st_mysql_lex_string
37
#endif /* _m_string_h */
38
typedef struct st_mysql_lex_string DRIZZLE_LEX_STRING;
40
#define DRIZZLE_XIDDATASIZE 128
42
struct st_mysql_xid is binary compatible with the XID structure as
43
in the X/Open CAE Specification, Distributed Transaction Processing:
44
The XA Specification, X/Open Company Ltd., 1991.
45
http://www.opengroup.org/bookstore/catalog/c193.htm
47
@see XID in sql/handler.h
53
char data[DRIZZLE_XIDDATASIZE]; /* Not \0-terminated */
55
typedef struct st_mysql_xid DRIZZLE_XID;
43
57
/*************************************************************************
44
58
Plugin API. Common for all plugin types.
49
typedef drizzle_lex_string LEX_STRING;
52
extern boost::filesystem::path plugin_dir;
54
namespace plugin { class StorageEngine; }
57
Macros for beginning and ending plugin declarations. Between
58
DRIZZLE_DECLARE_PLUGIN and DRIZZLE_DECLARE_PLUGIN_END there should
59
be a module::Manifest for each plugin to be declared.
63
#define PANDORA_CPP_NAME(x) _drizzled_ ## x ## _plugin_
64
#define PANDORA_PLUGIN_NAME(x) PANDORA_CPP_NAME(x)
65
#define DRIZZLE_DECLARE_PLUGIN \
66
::drizzled::module::Manifest PANDORA_PLUGIN_NAME(PANDORA_MODULE_NAME)=
69
#define DRIZZLE_DECLARE_PLUGIN_END
70
#define DRIZZLE_PLUGIN(init,system,options) \
71
DRIZZLE_DECLARE_PLUGIN \
74
STRINGIFY_ARG(PANDORA_MODULE_NAME), \
75
STRINGIFY_ARG(PANDORA_MODULE_VERSION), \
76
STRINGIFY_ARG(PANDORA_MODULE_AUTHOR), \
77
STRINGIFY_ARG(PANDORA_MODULE_TITLE), \
78
PANDORA_MODULE_LICENSE, \
79
init, system, options \
62
The allowable types of plugins
64
#define DRIZZLE_DAEMON_PLUGIN 0 /* Daemon / Raw */
65
#define DRIZZLE_STORAGE_ENGINE_PLUGIN 1 /* Storage Engine */
66
#define DRIZZLE_INFORMATION_SCHEMA_PLUGIN 2 /* Information Schema */
67
#define DRIZZLE_UDF_PLUGIN 3 /* User-Defined Function */
68
#define DRIZZLE_UDA_PLUGIN 4 /* User-Defined Aggregate function */
69
#define DRIZZLE_AUDIT_PLUGIN 5 /* Audit */
70
#define DRIZZLE_LOGGER_PLUGIN 6 /* Logging */
71
#define DRIZZLE_AUTH_PLUGIN 7 /* Authorization */
73
#define DRIZZLE_MAX_PLUGIN_TYPE_NUM 8 /* The number of plugin types */
75
/* We use the following strings to define licenses for plugins */
76
#define PLUGIN_LICENSE_PROPRIETARY 0
77
#define PLUGIN_LICENSE_GPL 1
78
#define PLUGIN_LICENSE_BSD 2
80
#define PLUGIN_LICENSE_PROPRIETARY_STRING "PROPRIETARY"
81
#define PLUGIN_LICENSE_GPL_STRING "GPL"
82
#define PLUGIN_LICENSE_BSD_STRING "BSD"
85
Macros for beginning and ending plugin declarations. Between
86
mysql_declare_plugin and mysql_declare_plugin_end there should
87
be a st_mysql_plugin struct for each plugin to be declared.
91
#ifndef DRIZZLE_DYNAMIC_PLUGIN
92
#define __DRIZZLE_DECLARE_PLUGIN(NAME, DECLS) \
93
struct st_mysql_plugin DECLS[]= {
95
#define __DRIZZLE_DECLARE_PLUGIN(NAME, DECLS) \
96
struct st_mysql_plugin _mysql_plugin_declarations_[]= {
99
#define mysql_declare_plugin(NAME) \
100
__DRIZZLE_DECLARE_PLUGIN(NAME, \
101
builtin_ ## NAME ## _plugin)
103
#define mysql_declare_plugin_end ,{0,0,0,0,0,0,0,0,0,0,0}}
106
declarations for SHOW STATUS support in plugins
108
enum enum_mysql_show_type
110
SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG,
111
SHOW_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR,
112
SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE
115
struct st_mysql_show_var {
118
enum enum_mysql_show_type type;
122
#define SHOW_VAR_FUNC_BUFF_SIZE 1024
123
typedef int (*mysql_show_var_func)(DRIZZLE_THD, struct st_mysql_show_var*, char *);
125
struct st_show_var_func_container {
126
mysql_show_var_func func;
84
129
declarations for server variables and command line options
122
169
automatically at the end of the statement.
125
typedef int (*mysql_var_check_func)(Session *session,
126
drizzle_sys_var *var,
127
void *save, drizzle_value *value);
172
typedef int (*mysql_var_check_func)(DRIZZLE_THD thd,
173
struct st_mysql_sys_var *var,
174
void *save, struct st_mysql_value *value);
131
178
(*mysql_var_update_func)()
132
session thread handle
133
180
var dynamic variable being altered
134
181
var_ptr pointer to dynamic variable
135
182
save pointer to temporary storage
139
186
This function should use the validated value stored in the temporary store
140
187
and persist it in the provided pointer to the dynamic variable.
141
188
For example, strings may require memory to be allocated.
143
typedef void (*mysql_var_update_func)(Session *session,
144
drizzle_sys_var *var,
190
typedef void (*mysql_var_update_func)(DRIZZLE_THD thd,
191
struct st_mysql_sys_var *var,
145
192
void *var_ptr, const void *save);
150
skeleton of a plugin variable - portion of structure common to all.
152
struct drizzle_sys_var
195
/* the following declarations are for internal use only */
198
#define PLUGIN_VAR_MASK \
199
(PLUGIN_VAR_READONLY | PLUGIN_VAR_NOSYSVAR | \
200
PLUGIN_VAR_NOCMDOPT | PLUGIN_VAR_NOCMDARG | \
201
PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_MEMALLOC)
203
#define DRIZZLE_PLUGIN_VAR_HEADER \
206
const char *comment; \
207
mysql_var_check_func check; \
208
mysql_var_update_func update
210
#define DRIZZLE_SYSVAR_NAME(name) mysql_sysvar_ ## name
211
#define DRIZZLE_SYSVAR(name) \
212
((struct st_mysql_sys_var *)&(DRIZZLE_SYSVAR_NAME(name)))
215
for global variables, the value pointer is the first
216
element after the header, the default value is the second.
217
for thread variables, the value offset is the first
218
element after the header, the default value is the second.
222
#define DECLARE_DRIZZLE_SYSVAR_BASIC(name, type) struct { \
223
DRIZZLE_PLUGIN_VAR_HEADER; \
225
const type def_val; \
226
} DRIZZLE_SYSVAR_NAME(name)
228
#define DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, type) struct { \
229
DRIZZLE_PLUGIN_VAR_HEADER; \
230
type *value; type def_val; \
231
type min_val; type max_val; \
233
} DRIZZLE_SYSVAR_NAME(name)
235
#define DECLARE_DRIZZLE_SYSVAR_TYPELIB(name, type) struct { \
236
DRIZZLE_PLUGIN_VAR_HEADER; \
237
type *value; type def_val; \
239
} DRIZZLE_SYSVAR_NAME(name)
241
#define DECLARE_THDVAR_FUNC(type) \
242
type *(*resolve)(DRIZZLE_THD thd, int offset)
244
#define DECLARE_DRIZZLE_THDVAR_BASIC(name, type) struct { \
245
DRIZZLE_PLUGIN_VAR_HEADER; \
247
const type def_val; \
248
DECLARE_THDVAR_FUNC(type); \
249
} DRIZZLE_SYSVAR_NAME(name)
251
#define DECLARE_DRIZZLE_THDVAR_SIMPLE(name, type) struct { \
252
DRIZZLE_PLUGIN_VAR_HEADER; \
254
type def_val; type min_val; \
255
type max_val; type blk_sz; \
256
DECLARE_THDVAR_FUNC(type); \
257
} DRIZZLE_SYSVAR_NAME(name)
259
#define DECLARE_DRIZZLE_THDVAR_TYPELIB(name, type) struct { \
260
DRIZZLE_PLUGIN_VAR_HEADER; \
263
DECLARE_THDVAR_FUNC(type); \
265
} DRIZZLE_SYSVAR_NAME(name)
269
the following declarations are for use by plugin implementors
272
#define DRIZZLE_SYSVAR_BOOL(name, varname, opt, comment, check, update, def) \
273
DECLARE_DRIZZLE_SYSVAR_BASIC(name, bool) = { \
274
PLUGIN_VAR_BOOL | ((opt) & PLUGIN_VAR_MASK), \
275
#name, comment, check, update, &varname, def}
277
#define DRIZZLE_SYSVAR_STR(name, varname, opt, comment, check, update, def) \
278
DECLARE_DRIZZLE_SYSVAR_BASIC(name, char *) = { \
279
PLUGIN_VAR_STR | ((opt) & PLUGIN_VAR_MASK), \
280
#name, comment, check, update, &varname, def}
282
#define DRIZZLE_SYSVAR_INT(name, varname, opt, comment, check, update, def, min, max, blk) \
283
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, int) = { \
284
PLUGIN_VAR_INT | ((opt) & PLUGIN_VAR_MASK), \
285
#name, comment, check, update, &varname, def, min, max, blk }
287
#define DRIZZLE_SYSVAR_UINT(name, varname, opt, comment, check, update, def, min, max, blk) \
288
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, unsigned int) = { \
289
PLUGIN_VAR_INT | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
290
#name, comment, check, update, &varname, def, min, max, blk }
292
#define DRIZZLE_SYSVAR_LONG(name, varname, opt, comment, check, update, def, min, max, blk) \
293
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, long) = { \
294
PLUGIN_VAR_LONG | ((opt) & PLUGIN_VAR_MASK), \
295
#name, comment, check, update, &varname, def, min, max, blk }
297
#define DRIZZLE_SYSVAR_ULONG(name, varname, opt, comment, check, update, def, min, max, blk) \
298
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, unsigned long) = { \
299
PLUGIN_VAR_LONG | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
300
#name, comment, check, update, &varname, def, min, max, blk }
302
#define DRIZZLE_SYSVAR_LONGLONG(name, varname, opt, comment, check, update, def, min, max, blk) \
303
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, int64_t) = { \
304
PLUGIN_VAR_LONGLONG | ((opt) & PLUGIN_VAR_MASK), \
305
#name, comment, check, update, &varname, def, min, max, blk }
307
#define DRIZZLE_SYSVAR_ULONGLONG(name, varname, opt, comment, check, update, def, min, max, blk) \
308
DECLARE_DRIZZLE_SYSVAR_SIMPLE(name, uint64_t) = { \
309
PLUGIN_VAR_LONGLONG | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
310
#name, comment, check, update, &varname, def, min, max, blk }
312
#define DRIZZLE_SYSVAR_ENUM(name, varname, opt, comment, check, update, def, typelib) \
313
DECLARE_DRIZZLE_SYSVAR_TYPELIB(name, unsigned long) = { \
314
PLUGIN_VAR_ENUM | ((opt) & PLUGIN_VAR_MASK), \
315
#name, comment, check, update, &varname, def, typelib }
317
#define DRIZZLE_SYSVAR_SET(name, varname, opt, comment, check, update, def, typelib) \
318
DECLARE_DRIZZLE_SYSVAR_TYPELIB(name, uint64_t) = { \
319
PLUGIN_VAR_SET | ((opt) & PLUGIN_VAR_MASK), \
320
#name, comment, check, update, &varname, def, typelib }
322
#define DRIZZLE_THDVAR_BOOL(name, opt, comment, check, update, def) \
323
DECLARE_DRIZZLE_THDVAR_BASIC(name, char) = { \
324
PLUGIN_VAR_BOOL | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \
325
#name, comment, check, update, -1, def, NULL}
327
#define DRIZZLE_THDVAR_STR(name, opt, comment, check, update, def) \
328
DECLARE_DRIZZLE_THDVAR_BASIC(name, char *) = { \
329
PLUGIN_VAR_STR | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \
330
#name, comment, check, update, -1, def, NULL}
332
#define DRIZZLE_THDVAR_INT(name, opt, comment, check, update, def, min, max, blk) \
333
DECLARE_DRIZZLE_THDVAR_SIMPLE(name, int) = { \
334
PLUGIN_VAR_INT | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \
335
#name, comment, check, update, -1, def, min, max, blk, NULL }
337
#define DRIZZLE_THDVAR_UINT(name, opt, comment, check, update, def, min, max, blk) \
338
DECLARE_DRIZZLE_THDVAR_SIMPLE(name, unsigned int) = { \
339
PLUGIN_VAR_INT | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
340
#name, comment, check, update, -1, def, min, max, blk, NULL }
342
#define DRIZZLE_THDVAR_LONG(name, opt, comment, check, update, def, min, max, blk) \
343
DECLARE_DRIZZLE_THDVAR_SIMPLE(name, long) = { \
344
PLUGIN_VAR_LONG | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \
345
#name, comment, check, update, -1, def, min, max, blk, NULL }
347
#define DRIZZLE_THDVAR_ULONG(name, opt, comment, check, update, def, min, max, blk) \
348
DECLARE_DRIZZLE_THDVAR_SIMPLE(name, unsigned long) = { \
349
PLUGIN_VAR_LONG | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
350
#name, comment, check, update, -1, def, min, max, blk, NULL }
352
#define DRIZZLE_THDVAR_LONGLONG(name, opt, comment, check, update, def, min, max, blk) \
353
DECLARE_DRIZZLE_THDVAR_SIMPLE(name, int64_t) = { \
354
PLUGIN_VAR_LONGLONG | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \
355
#name, comment, check, update, -1, def, min, max, blk, NULL }
357
#define DRIZZLE_THDVAR_ULONGLONG(name, opt, comment, check, update, def, min, max, blk) \
358
DECLARE_DRIZZLE_THDVAR_SIMPLE(name, uint64_t) = { \
359
PLUGIN_VAR_LONGLONG | PLUGIN_VAR_THDLOCAL | PLUGIN_VAR_UNSIGNED | ((opt) & PLUGIN_VAR_MASK), \
360
#name, comment, check, update, -1, def, min, max, blk, NULL }
362
#define DRIZZLE_THDVAR_ENUM(name, opt, comment, check, update, def, typelib) \
363
DECLARE_DRIZZLE_THDVAR_TYPELIB(name, unsigned long) = { \
364
PLUGIN_VAR_ENUM | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \
365
#name, comment, check, update, -1, def, NULL, typelib }
367
#define DRIZZLE_THDVAR_SET(name, opt, comment, check, update, def, typelib) \
368
DECLARE_DRIZZLE_THDVAR_TYPELIB(name, uint64_t) = { \
369
PLUGIN_VAR_SET | PLUGIN_VAR_THDLOCAL | ((opt) & PLUGIN_VAR_MASK), \
370
#name, comment, check, update, -1, def, NULL, typelib }
372
/* accessor macros */
374
#define SYSVAR(name) \
375
(*(DRIZZLE_SYSVAR_NAME(name).value))
377
/* when thd == null, result points to global value */
378
#define THDVAR(thd, name) \
379
(*(DRIZZLE_SYSVAR_NAME(name).resolve(thd, DRIZZLE_SYSVAR_NAME(name).offset)))
383
Plugin description structure.
386
struct st_mysql_plugin
388
int type; /* the plugin type (a DRIZZLE_XXX_PLUGIN value) */
389
const char *name; /* plugin name (for SHOW PLUGINS) */
390
const char *version; /* plugin version (for SHOW PLUGINS) */
391
const char *author; /* plugin author (for SHOW PLUGINS) */
392
const char *descr; /* general descriptive text (for SHOW PLUGINS ) */
393
int license; /* the plugin license (PLUGIN_LICENSE_XXX) */
394
int (*init)(void *); /* the function to invoke when plugin is loaded */
395
int (*deinit)(void *);/* the function to invoke when plugin is unloaded */
396
struct st_mysql_show_var *status_vars;
397
struct st_mysql_sys_var **system_vars;
398
void * __reserved1; /* reserved for dependency checking */
156
void plugin_opt_set_limits(option *options, const drizzle_sys_var *opt);
404
/*************************************************************************
405
st_mysql_value struct for reading values from mysqld.
406
Used by server variables framework to parse user-provided values.
407
Will be used for arguments when implementing UDFs.
409
Note that val_str() returns a string in temporary memory
410
that will be freed at the end of statement. Copy the string
411
if you need it to persist.
414
#define DRIZZLE_VALUE_TYPE_STRING 0
415
#define DRIZZLE_VALUE_TYPE_REAL 1
416
#define DRIZZLE_VALUE_TYPE_INT 2
418
struct st_mysql_value
160
int (*value_type)(drizzle_value *);
161
const char *(*val_str)(drizzle_value *, char *buffer, int *length);
162
int (*val_real)(drizzle_value *, double *realbuf);
163
int (*val_int)(drizzle_value *, int64_t *intbuf);
420
int (*value_type)(struct st_mysql_value *);
421
const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length);
422
int (*val_real)(struct st_mysql_value *, double *realbuf);
423
int (*val_int)(struct st_mysql_value *, int64_t *intbuf);
201
453
@param prefix prefix for temporary file name
203
@retval >= 0 a file handle that can be passed to dup or internal::my_close
455
@retval >= 0 a file handle that can be passed to dup or my_close
205
457
int mysql_tmpfile(const char *prefix);
207
} /* namespace drizzled */
209
#endif /* DRIZZLED_PLUGIN_H */
460
Check the killed state of a connection
463
In MySQL support for the KILL statement is cooperative. The KILL
464
statement only sets a "killed" flag. This function returns the value
465
of that flag. A thread should check it often, especially inside
466
time-consuming loops, and gracefully abort the operation if it is
469
@param thd user thread connection handle
470
@retval 0 the connection is active
471
@retval 1 the connection has been killed
473
int thd_killed(const DRIZZLE_THD thd);
477
Return the thread id of a user thread
479
@param thd user thread connection handle
482
unsigned long thd_get_thread_id(const DRIZZLE_THD thd);
486
Allocate memory in the connection's local memory pool
489
When properly used in place of @c my_malloc(), this can significantly
490
improve concurrency. Don't use this or related functions to allocate
491
large chunks of memory. Use for temporary storage only. The memory
492
will be freed automatically at the end of the statement; no explicit
493
code is required to prevent memory leaks.
497
void *thd_alloc(DRIZZLE_THD thd, unsigned int size);
501
void *thd_calloc(DRIZZLE_THD thd, unsigned int size);
505
char *thd_strdup(DRIZZLE_THD thd, const char *str);
509
char *thd_strmake(DRIZZLE_THD thd, const char *str, unsigned int size);
513
void *thd_memdup(DRIZZLE_THD thd, const void* str, unsigned int size);
516
Create a LEX_STRING in this connection's local memory pool
518
@param thd user thread connection handle
519
@param lex_str pointer to LEX_STRING object to be initialized
520
@param str initializer to be copied into lex_str
521
@param size length of str, in bytes
522
@param allocate_lex_string flag: if TRUE, allocate new LEX_STRING object,
523
instead of using lex_str value
524
@return NULL on failure, or pointer to the LEX_STRING object
528
DRIZZLE_LEX_STRING *thd_make_lex_string(DRIZZLE_THD thd, DRIZZLE_LEX_STRING *lex_str,
529
const char *str, unsigned int size,
530
int allocate_lex_string);
533
Get the XID for this connection's transaction
535
@param thd user thread connection handle
536
@param xid location where identifier is stored
538
void thd_get_xid(const DRIZZLE_THD thd, DRIZZLE_XID *xid);
541
Invalidate the query cache for a given table.
543
@param thd user thread connection handle
544
@param key databasename\\0tablename\\0
545
@param key_length length of key in bytes, including the NUL bytes
546
@param using_trx flag: TRUE if using transactions, FALSE otherwise
548
void mysql_query_cache_invalidate4(DRIZZLE_THD thd,
549
const char *key, unsigned int key_length,
558
Provide a handler data getter to simplify coding
562
thd_get_ha_data(const DRIZZLE_THD thd, const struct handlerton *hton)
564
return *thd_ha_data(thd, hton);
568
Provide a handler data setter to simplify coding
572
thd_set_ha_data(const DRIZZLE_THD thd, const struct handlerton *hton,
575
*thd_ha_data(thd, hton)= (void*) ha_data;