6.5 客戶機程序4—在運行時獲取連接參數
現在我們有了容易修改的防止出現錯誤的連接代碼,我們要了解一些如何做某些比使用NULL 連接參數更靈巧的事情,如在運行時允許用戶指定一些值。客戶機程序3由於固定連接參數方面的缺陷,要想更改那些值中的任何一個,都必須編輯源文件並重新編譯。這十分不方便,特別是想使程序用於其他人時。在運行時指定連接參數的一個通用的方法是使用命令行選項。MySQL分發包中的程序接受兩種形式的連接參數,如表6 - 1所示。
與標准的MySQL客戶機程序一致,客戶機程序將接受同樣的格式。這很容易,那是因為客戶機庫包括了實現選項分析的函數。
除此之外,客戶機程序具有從選項文件中抽取信息的能力。這允許將連接參數放在-/.my. c n f(也就是主目錄中的.my.cnf 文件)中,以便不用在命令行中指定它們。客戶機庫使檢查MySQL選項文件和從它們中抽取任何相關的值變得非常容易。只在程序中增加幾行代碼,就可以使選項文件識別它,並且通過編寫自己的代碼而不必重新改造這個框架來進行操作。附錄E “MySQL程序參考”中說明了選項文件的語法。
6.5.1訪問選項文件內容
使用load_default() 函數為連接參數值讀取選項文件, load_default() 尋找選項文件、分析任何感興趣的可選組的內容,以及重新編寫程序的參數向量( a rgv[] 數組),以便把來自於那些組的信息以命令行選項的形式放置在argv[] 的開頭。這就是說,在命令行指定出現的選項。因此,當分析命令選項時,就得到了作為常規選項分析循環部分的連接參數。選項加到argv[] 的開頭而不是加到末尾,所以,如果連接參數真的在命令行指定,它們要比load_defaults() 增加的任何選項晚一些出現(因而忽略)。面的小程序show _ argv 顯示了如何使用load _ defaults ( ),並舉例說明了對參數向量如何做出這樣的修改:
該處理選項文件的代碼包括:
■ groups[] 是一個字符串數組,表示所感興趣的選項文件組。對於客戶機程序,始終至少指定“client” ([client] 組)。數組的最後一個元素必須是NULL。
■ my_init() 是load_defaults() 所需的執行一些設置操作的初始化例程。
■ load_defaults() 有四個參數:選項文件的前綴(這裡應該始終是“ my”),列出感興趣的可選組的數組、程序參數的數目和向量的地址。不傳數目和向量的值,而是傳地址,因為load_defaults() 需要改變它們的值。特別注意的是,雖然a rgv 是一個指針,但還是要傳& argv ,它是指針的地址。
show _ argv打印參數兩次,第一次是在命令行指定它們的時候,第二次是在load _ defaults( )修改它們的時候。為了查看load_defaults() 的運行效果,應確信在主目錄中有一個具有[client] 組指定設置的. my.cnf 文件。假設. my.cnf 文件如下:
有可能會從不在命令行或~ /.my.cnf 文件中的s h o w _ a rgv 所產生的輸出結果中看到一些選項。如果是這樣,它們或許是在系統范圍的選項文件中指定的。在主目錄中讀取.my.cnf 之前,load_defaults() 實際上是在MySQL數據目錄中尋找/ e t c / my.cnf 和my.cnf 文件(在Windows中, load_defaults() 在Windows 系統目錄中尋找文件C : my. c n f、C : mysql d a t a my.cnf 和my.ini )。
使用load_defaults() 的客戶機程序幾乎始終是在選項組列表中指定“ c l i e n t”(以便從選項文件中獲取任何通用的客戶機設置),但是也可以為請求自己的程序請求特定值。可將下列代碼:
修改為:
然後將[ show _ argv] 組加到~ / . my.cnf 文件中:
有了這些改變,再次調用show _ argv 就得到了一個不同的結果,如下所示: