擴展 MySQL 8.4  /  ...  /  外掛資料結構

4.4.2 外掛資料結構

外掛程式庫檔案包含描述符資訊,以指示它包含哪些外掛。

如果外掛程式庫包含任何伺服器外掛,則必須包含以下描述符資訊

  • 程式庫描述符指示程式庫所使用的一般伺服器外掛 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 陳述式會明確提供程式庫檔案名稱,因此程式庫名稱和它包含的任何伺服器外掛的名稱之間不需要明確的關聯性。