擴展 MySQL 8.4  /  ...  /  客戶端外掛程式描述符

4.4.2.3 客戶端外掛程式描述符

每個客戶端外掛程式都必須有一個描述符,向客戶端外掛程式 API 提供資訊。描述符結構以所有客戶端外掛程式通用的固定成員集開始,後接特定於外掛程式類型的任何成員。

client_plugin.h 檔案中的 st_mysql_client_plugin 結構定義了一個 通用描述符,其中包含通用成員

struct st_mysql_client_plugin
{
  int type;
  unsigned int interface_version;
  const char *name;
  const char *author;
  const char *desc;
  unsigned int version[3];
  const char *license;
  void *mysql_api;
  int (*init)(char *, size_t, int, va_list);
  int (*deinit)();
  int (*options)(const char *option, const void *);
};

通用的 st_mysql_client_plugin 描述符結構成員的使用方式如下。char * 成員應指定為以 null 結尾的字串。

  • type:外掛程式類型。這必須是 client_plugin.h 中的外掛程式類型值之一,例如 MYSQL_CLIENT_AUTHENTICATION_PLUGIN

  • interface_version:外掛程式介面版本。例如,驗證外掛程式的此值為 MYSQL_CLIENT_AUTHENTICATION_PLUGIN_INTERFACE_VERSION

  • name:提供外掛程式名稱的字串。當您使用 MYSQL_DEFAULT_AUTH 選項呼叫 mysql_options() 或向 MySQL 客戶端程式指定 --default-auth 選項時,會使用此名稱來參考外掛程式。

  • author:命名外掛程式作者的字串。這可以是任何您喜歡的內容。

  • desc:提供外掛程式一般描述的字串。這可以是任何您喜歡的內容。

  • version:外掛程式版本,表示為三個整數的陣列,表示主要版本、次要版本和微小版本。例如,{1,2,3} 表示版本 1.2.3。

  • license:指定授權類型的字串。

  • mysql_api:供內部使用。在外掛程式描述符中將其指定為 NULL

  • init:一次性初始化函式,如果沒有此類函式,則為 NULL。客戶端程式庫在載入外掛程式時會執行此函式。該函式成功時會傳回零,失敗時會傳回非零值。

    init 函式會使用其前兩個引數,在發生錯誤時傳回錯誤訊息。第一個引數是指向 char 緩衝區的指標,第二個引數表示緩衝區長度。init 函式傳回的任何訊息都必須以 null 結尾,因此最大訊息長度為緩衝區長度減一。接下來的引數會傳遞給 mysql_load_plugin()。第一個表示還有多少個引數(如果沒有,則為 0),後接任何剩餘引數。

  • deinit:一次性取消初始化函式,如果沒有此類函式,則為 NULL。客戶端程式庫在卸載外掛程式時會執行此函式。該函式不接受任何引數。它成功時會傳回零,失敗時會傳回非零值。

  • options:用於處理傳遞給外掛程式的選項的函式,如果沒有此類函式,則為 NULL。該函式接受兩個引數,表示選項名稱和指向其值的指標。該函式成功時會傳回零,失敗時會傳回非零值。

對於給定的客戶端外掛程式類型,通用描述符成員後面可能會有額外的成員,這些成員對於實作該類型的外掛程式是必要的。例如,驗證外掛程式的 st_mysql_client_plugin_AUTHENTICATION 結構的末尾有一個函式,客戶端程式庫會呼叫該函式來執行驗證。

若要宣告外掛程式,請使用 mysql_declare_client_plugin()mysql_end_client_plugin 巨集

mysql_declare_client_plugin(plugin_type)
   ... members common to all client plugins ...
   ... type-specific extra members ...
mysql_end_client_plugin;

請勿明確指定 typeinterface_version 成員。mysql_declare_client_plugin() 巨集會使用 plugin_type 引數自動產生它們的值。例如,像這樣宣告驗證客戶端外掛程式

mysql_declare_client_plugin(AUTHENTICATION)
  "my_auth_plugin",
  "Author Name",
  "My Client Authentication Plugin",
  {1,0,0},
  "GPL",
  NULL,
  my_auth_init,
  my_auth_deinit,
  my_auth_options,
  my_auth_main
mysql_end_client_plugin;

此宣告會使用 AUTHENTICATION 引數,將 typeinterface_version 成員設定為 MYSQL_CLIENT_AUTHENTICATION_PLUGINMYSQL_CLIENT_AUTHENTICATION_PLUGIN_INTERFACE_VERSION

根據外掛程式類型,描述符在通用成員之後可能會有其他成員。例如,對於驗證外掛程式,有一個函式(剛才顯示的描述符中的 my_auth_main())處理與伺服器的通訊。請參閱第 4.4.9 節,〈編寫驗證外掛程式〉

一般來說,支援使用驗證外掛程式的客戶端程式會呼叫 mysql_options() 以設定 MYSQL_DEFAULT_AUTHMYSQL_PLUGIN_DIR 選項,來載入外掛程式

char *plugin_dir = "path_to_plugin_dir";
char *default_auth = "plugin_name";

/* ... process command-line options ... */

mysql_options(&mysql, MYSQL_PLUGIN_DIR, plugin_dir);
mysql_options(&mysql, MYSQL_DEFAULT_AUTH, default_auth);

通常,該程式也會接受 --plugin-dir--default-auth 選項,讓使用者可以覆寫預設值。

如果客戶端程式需要較低層級的外掛程式管理,客戶端程式庫包含接受 st_mysql_client_plugin 引數的函式。請參閱C API 客戶端外掛程式介面