外掛程式函式庫檔案包含描述符資訊,以指示它包含哪些外掛程式。
如果外掛程式函式庫包含任何伺服器外掛程式,則必須包含下列描述符資訊
-
函式庫描述符會指示函式庫使用的通用伺服器外掛程式 API 版本號碼,並包含函式庫中每個伺服器外掛程式的通用外掛程式描述符。為了提供此描述符的架構,請從
plugin.h
標頭檔中呼叫兩個巨集mysql_declare_plugin(name) ... one or more server plugin descriptors here ... mysql_declare_plugin_end;
這些巨集會展開以自動提供 API 版本的宣告。您必須提供外掛程式描述符。
在函式庫描述符中,每個通用伺服器外掛程式都由
st_mysql_plugin
結構描述。此外掛程式描述符結構包含每個伺服器外掛程式通用的資訊:指示外掛程式類型的值;外掛程式名稱、作者、描述和授權類型;伺服器在載入和卸載外掛程式時呼叫的初始化和反初始化函式的指標,以及外掛程式實作的任何狀態或系統變數的指標。函式庫描述符中的每個通用伺服器外掛程式描述符也包含指向類型特定外掛程式描述符的指標。類型特定描述符的結構因外掛程式類型而異,因為每種類型的外掛程式都可以有自己的 API。類型特定外掛程式描述符包含類型特定的 API 版本號碼和實作該外掛程式類型所需的函式指標。例如,全文剖析器外掛程式具有初始化和反初始化函式,以及主要的剖析函式。伺服器會在使用外掛程式剖析文字時呼叫這些函式。
外掛程式函式庫也包含函式庫中每個外掛程式的通用和類型特定描述符所參照的介面函式。
如果外掛程式函式庫包含用戶端外掛程式,則必須包含此外掛程式的描述符。描述符開頭是一組所有用戶端外掛程式通用的固定成員,然後是任何外掛程式類型特定的成員。為了提供描述符架構,請從 client_plugin.h
標頭檔中呼叫兩個巨集
mysql_declare_client_plugin(plugin_type)
... members common to all client plugins ...
... type-specific extra members ...
mysql_end_client_plugin;
外掛程式函式庫也包含用戶端描述符參照的任何介面函式。
mysql_declare_plugin()
和 mysql_declare_client_plugin()
巨集的呼叫方式略有不同,這會影響外掛程式函式庫的內容。下列準則摘要說明了規則
mysql_declare_plugin()
和mysql_declare_client_plugin()
都可以用於同一個原始程式檔中,這表示外掛程式函式庫可以同時包含伺服器和用戶端外掛程式。但是,mysql_declare_plugin()
和mysql_declare_client_plugin()
的每一個最多只能使用一次。mysql_declare_plugin()
允許多個伺服器外掛程式宣告,因此外掛程式函式庫可以包含多個伺服器外掛程式。mysql_declare_client_plugin()
只允許單一用戶端外掛程式宣告。若要建立多個用戶端外掛程式,必須使用個別的外掛程式函式庫。
當用戶端程式尋找位於外掛程式函式庫中,而非內建於 libmysqlclient
的用戶端外掛程式時,它會尋找基礎名稱與外掛程式名稱相同之檔案。例如,如果程式需要在使用 .so
作為函式庫尾碼的系統上使用名為 auth_xxx
的用戶端身分驗證外掛程式,則它會在名為 auth_xxx.so
的檔案中尋找。(在 macOS 上,程式會先尋找 auth_xxx.dylib
,然後再尋找 auth_xxx.so
。) 因此,如果外掛程式函式庫包含用戶端外掛程式,則函式庫的基礎名稱必須與此外掛程式相同。
對於包含伺服器外掛程式的函式庫,情況並非如此。--plugin-load
選項和 INSTALL PLUGIN
陳述式明確提供函式庫檔案名稱,因此函式庫名稱與它包含的任何伺服器外掛程式的名稱之間不需要有明確的關聯性。