3. writing MySql plugins for the information schema

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/