2012年9月14日 星期五

讓 Qt 連上 MySQL

這過程實在太痛苦了,故筆記一篇。
兩年半前曾經搞過一次,但沒記錄。我還清晰地記得,自己成功地編譯安裝Qt,是我進入UNIX世界的契機。
當時的OS是雪豹,跟的一些文件也不曉得跑哪兒去了。

----

OS: 10.8.1 Mountain Lion
Qt 4.8.1 (抓官網dmg下來裝)
MySQL 5.5.27 (抓官網dmg下來裝)

故事是這樣的:我在寫一支Qt程式,需要資料庫。一開始抱著玩玩新玩具的心情選了SQLite,很順利的連接運作彷彿一切都是這麼自然。

然後得知該應用會需要處理非常大量的資料,我不確定SQLite有沒有辦法處理,且未來有可能需要做成multi-client存取一個資料庫的情況,我決定換成MySQL。
這就是苦難的開始。

Qt 需要個別DBMS的「driver」,而這東西並不隨Qt一併散佈,需要抓Qt source code 下來編譯(只需編譯driver的那一小部分即可)。

抓下source tar ball了,README告訴你:要編譯MySQL driver,請提供MySQL header。
這意味XAMPP武功全廢,請在系統上真的安裝MySQL。

抓下來安裝好,你有了全套MySQL與該有的header與library。

然後照著Qt官網寫的步驟把driver編出來也安裝好了。


但為什麼還是不能動!!!!

App在console上噴的錯誤訊息從來就沒有變過:


QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC QPSQL7 QPSQL
("QSQLITE", "QODBC3", "QODBC", "QPSQL7", "QPSQL")
("/Users/mac/QtSDK/Desktop/Qt/4.8.1/gcc/plugins", "/Users/mac/learnQt/ManageSystem-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Debug/ManageSystem.app/Contents/MacOS")
QSqlQuery::exec: database not open


 這太令人無力了。
怎麼Google都無解的狀況讓人沮喪,我整個下午都在處理這個鳥問題!

最後終於google到一個討論串解決了我的問題。
解法是3行shell script,先export兩個環境變數,接著一個 install_name_tool指令。

我目前仍然不曉得原理為何,看指令令人疑惑。
man page上寫 install_name_tool -change 接受兩個參數, old和new。
但上述討論串給了3個參數。我不確定最後一個是不是默默忽略了。
我猜想,這個指令的功能是把 libmysqlclient.18.dylib 這個檔案重新指向正確的位置、亦即mysql在系統上的安裝位置。


不曉得以後發佈到Window上這樣的過程要不要再來一次(抖)

噢對了,到這裡後,無論是系統的MySQL或XAMPP的MySQL都連得上了。
不過XAMPP的需要額外一行:
db.setConnectOptions("UNIX_SOCKET=/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock");

2012年9月10日 星期一

失控的 mds


查看process開啟檔案的指令
sudo fs_usage -w -f filesys mdworker

似乎某些有問題的檔案會讓 mds 一直替它 reindex. 解決之道是將其納入 private tab.


有些造成問題的目錄請放到 系統偏好設定中,Spolitght 的 private tab.
http://ischack.net/2011/07/mds-mdworker-running-wild-on-os-x-10-6-and-10-7-again/
http://tumblr.amitgupta.com/post/262471673/stopping-runaway-cpu-usage-by-mds-mdworker-and

List Open Files (lsof)

ls -c mds