If you can't read please download the document
Upload
roland-bouman
View
582
Download
0
Embed Size (px)
Citation preview
Writing MySQL 5.1 Information Schema Plugins
Tasks Before Implementing Information Schema Plugins
Standard headers,
Non-specific MySQL headers:,
Extra headers for Information Schema plug-ins
Implementing Information Schema Plug-ins
Setup the column layoutDefines the column names and data types
Implement a fill functionIs called to fill the (in-memory) table
Hook up table object with colum layout and fill functionPlug-in initialization function
Information Schema Plug-ins:
Column Layout
Array of ST_FIELD_INFOtypedef struct st_field_info
Defined in sql/table.h
typedef struct st_field_info{ const char* field_name; uint field_length; enum enum_field_types field_type; int value; uint field_flags; const char* old_name; uint open_method;} ST_FIELD_INFO;
ST_FIELD_INFO members (1/2)
field_name: Column name
field_length:String type columns: #characters
Non-string types: 'display length'
field_type: type constantenum_field_types (mysql_com.h)
field_flags:MY_I_S_MAYBE_NULL
MY_I_S_UNSIGNED
ST_FIELD_INFO members (2/2)
open_method: (sql/table.h)SKIP_OPEN_TABLE
OPEN_FRM_ONLY
OPEN_FULL_TABLE
old_name: Column name for SHOW command
value: ??
Information Schema Plug-ins:
Column Layout Example
information_schema.SCHEMATA
ST_FIELD_INFO schema_fields_info[]={
{"CATALOG_NAME", FN_REFLEN, MYSQL_TYPE_STRING, 0, 1, 0,
SKIP_OPEN_TABLE}, {"SCHEMA_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING,
0, 0, "Database", SKIP_OPEN_TABLE}, {"DEFAULT_CHARACTER_SET_NAME",
MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE},
{"DEFAULT_COLLATION_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0,
0, 0, SKIP_OPEN_TABLE}, {"SQL_PATH", FN_REFLEN, MYSQL_TYPE_STRING,
0, 1, 0, SKIP_OPEN_TABLE}, {0, 0, MYSQL_TYPE_STRING, 0, 0, 0,
SKIP_OPEN_TABLE}}
Information Schema Plug-ins:
Fill Function (1/4)
fill_table(
THD *thd,
TABLE_LIST *tables,
COND *cond
)
THD: thread descriptor (sql/sql_class.h)
TABLE_LIST: (sql/sql_table.h)List of struct st_table (a.k.a. TABLE)
COND: Condition.
Information Schema Plug-ins:
Fill Function (2/4)
Grab first table from the list:
TABLE *table= (TABLE *)tables->table;
Store data in fields:
table->field[i]->store(...);
Store row in table
schema_table_store_record(thd, table);
Information Schema Plug-ins:
Fill Function (3/4)
schema_table_store_record(
THD *thd
, TABLE *table
)
Forward declaration in mysql_priv.h
Defined in sql/sql_show.cc
Information Schema Plug-ins:
Fill Function (4/4)
int myplugin_fill_table( THD *thd, TABLE_LIST *tables, COND *cond){ int status; CHARSET_INFO *scs= system_charset_info; TABLE *table= (TABLE *)tables->table; for ( ... ) { // table->field[0]->store( ... ); ... table->field[X]->store( ... ); status= schema_table_store_record( thd, table ); } return status;}
Information Schema Plug-ins:
Hookup Column Layout and Filler
plugin_init
static int myplugin_init(void *p){ ST_SCHEMA_TABLE *schema= (ST_SCHEMA_TABLE *)p;
schema->fields_info= myplugin_field_info; schema->fill_table= myplugin_fill_table;
return 0;}
Information Schema Plug-ins:
ST_SCHEMA_TABLE
ST_SCHEMA_TABLE a.k.a st_schema_table
typedef struct st_schema_table{ const char* table_name; ST_FIELD_INFO *fields_info; TABLE *(*create_table)(THD *thd, TABLE_LIST *table_list); int (*fill_table) ( THD *thd, TABLE_LIST *tables, COND *cond); int (*old_format) ( THD *thd, struct st_schema_table *schema_table); int (*process_table) ( THD *thd, TABLE_LIST *tables,TABLE *table, bool res, LEX_STRING *db_name, LEX_STRING *table_name); int idx_field1, idx_field2; bool hidden; uint i_s_requested_object;} ST_SCHEMA_TABLE;
Information Schema Plug-ins:
Hookup Column Layout and Filler
plugin_init
static int myplugin_init(void *p){ ST_SCHEMA_TABLE *schema= (ST_SCHEMA_TABLE *)p;
schema->fields_info= myplugin_field_info; schema->fill_table= myplugin_fill_table;
return 0;}
Information Schema Plug-ins:
Hookup Column Layout and Filler
plugin_init
static int myplugin_init(void *p){ ST_SCHEMA_TABLE *schema= (ST_SCHEMA_TABLE *)p;
schema->fields_info= myplugin_field_info; schema->fill_table= myplugin_fill_table;
return 0;}
Information Schema Plug-ins:
Hookup Column Layout and Filler
plugin_init
static int myplugin_init(void *p){ ST_SCHEMA_TABLE *schema= (ST_SCHEMA_TABLE *)p;
schema->fields_info= myplugin_field_info; schema->fill_table= myplugin_fill_table;
return 0;}
Roland Bouman http://rpbouman.blogspot.com/