在MySQL 5.1中開發一個存儲引擎已經是比較方便了。所謂存儲引擎實際上是按照MySQL的約定,提供某些接口的實現而已,如MySQL插入一條記錄時將調用write_row方法,通過索引檢索時將調用index_read和index_next方法等。MySQL與存儲引擎之間的接口主要由兩個類/結構約定,分別是在sql/handler.h中定義的handlerton結構和handler類。handlerton結構主要是約定事務操作接口,handler類主要約定表、索引及記錄操作接口。對不支持事務的存儲引擎只需要創建一個handler的派生類,並重載該引擎需要支持的方法。對於需要支持事務的存儲引擎,還需要實現handlerton結構中指定的接口。
實現了存儲引擎本身功能後,還需要按一定格式“聲明”一下存儲引擎的存在。首先需要定義一個類型為st_mysql_storage_engine的變量,其值為MySQL_HANDLERTON_INTERFACE_VERSION。如下所示:
struct st_MySQL_storage_engine foo_storage_engine=
{ MySQL_HANDLERTON_INTERFACE_VERSION };
然後需要用MySQL_declare_plugin宏來給出存儲引擎的聲明,如下所示:
MySQL_declare_plugin(foo) /* foo為存儲引擎名稱 */
{
MySQL_STORAGE_ENGINE_PLUGIN,
&foo_storage_engine, /* 這裡即為上面定義的st_MySQL_storage_engine變量 */
"FOO", /* SHOW ENGINES中顯示的存儲引擎名稱 */
"Author Here", /* 作者名 */
"Foo storage engine", /* SHOW ENGINES中顯示的存儲引擎說明 */
PLUGIN_LICENSE_GPL,
init_func, /* 某函數,將在加載存儲引擎時調用 */
done_func, /* 某函數,將在卸載存儲引擎時調用 */
0x0001 /* 版本號0.1 */,
NULL, /* status variables */
NULL, /* system variables */
NULL /* config options */
}
MySQL_declare_plugin_end;
照此聲明後,在加載存儲引擎時MySQL將調用init_func函數,此時會傳入一個handlerton變量,存儲引擎至少需要設置其中的 state、db_type、create、flags等屬性,其中create為一函數指針,將隨後被調用。若存儲引擎支持事務,則還需要設置 handlerton中事務接口函數指針指向相應的實現函數。
然後MySQL調用上面設置的create函數,該函數中,存儲引擎實現者構建一個該引擎對應的handler派生類實例並返回給 MySQL。至此存儲引擎初始化過程完成,存儲引擎與MySQL之間的接口也已經確定,此後MySQL即會在相應的時刻調用handlerton結構或 handler類約定的方法。
MySQL源代碼中的storage/example目錄給出了很好的示例,該目錄實現了一個“最小”的存儲引擎EXAMPLE,只是能加載進來玩玩,不能用來存儲記錄。開發新的存儲引擎時,最方便的方法也是拷貝一份example的代碼來改。