Mac OS X に MySQL/Ruby をインストール + 高速化パッチ

2006/12/28 3:14am

長かった Ruby on Rails 環境構築シリーズもやっと終盤です。

Ruby から MySQL につなぐためのバインディングである MySQL/Ruby をインストールすれば、Ruby on Rails の開発環境構築は一段落。

なお、同様のバインディングである Ruby/MySQL もあり、こちらは Ruby で書かれているためコンパイルが不要。MySQL/Ruby とも、ほぼ互換性がある。ただ、今回はパフォーマンス優先でいきたいと思う。

さて、ダウンロードページから最新版をダウンロード。現時点では mysql-ruby-2.7.3.tar.gz が最新版のようだ。

% curl --location -O http://tmtm.org/downloads/mysql/ruby/mysql-ruby-2.7.3.tar.gz
% tar xvzf mysql-ruby-2.7.3.tar.gz
% cd mysql-ruby-2.7.3

さきほど「パフォーマンス優先」と書いたけど、RailsExpress.blog の人が MySQL/Ruby を 30% 高速にするパッチを公開している。記事を読んだときから試してみたかったので、これを機会に使ってみよう。

パッチをダウンロードして、MySQL/Ruby の展開先に置いたら、patch コマンドでパッチを適用する。

% curl -O http://railsexpress.de/downloads/mysql-ruby-2.7-less-string-copies-in-each-hash.diff
% patch < mysql-ruby-2.7-less-string-copies-in-each-hash.diff
patching file mysql.c.in
Hunk #1 succeeded at 1009 (offset -1 lines).
Hunk #2 succeeded at 1027 (offset -1 lines).
Hunk #3 succeeded at 1059 (offset -1 lines).
Hunk #4 succeeded at 1136 (offset -1 lines).
Hunk #5 succeeded at 2079 (offset 3 lines).

無事、パッチを適用できたようなので、そのままインストールに進む。extconf.rb を実行するときに、--with-mysql-dir オプションで MySQL のインストール先ディレクトリを指定する必要があった。

% ruby extconf.rb --with-mysql-dir=/usr/local/mysql
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... yes
checking for mysql_ssl_set()... yes
checking for mysql.h... no
checking for mysql/mysql.h... yes
creating Makefile

さて、コンパイル …

% make
...
mysql.c: In function 'Init_mysql':
mysql.c:2018: error: 'ulong' undeclared (first use in this function)

怒られてしまった。ulong 型が定義されていないようだ。 検索してみて、ここに書かれている解決策を採用。ただし unsigned long ではなく u_long にしておく。

mysql.c の最初(16 行目くらい)に

#define ulong u_long

を追加してリトライ。

% make
gcc -I. -I. -I/usr/local/lib/ruby/1.8/i686-darwin8.8.3 -I. -DHAVE_MYSQL_SSL_SET -DHAVE_MYSQL_MYSQL_H -I/usr/local/mysql/include  -fno-common -g -O2 -pipe -fno-common  -c mysql.c
cc -dynamic -bundle -undefined suppress -flat_namespace  -L"/usr/local/mysql/lib" -L"/usr/local/lib" -L"/usr/local/mysql/lib/mysql" -o mysql.bundle mysql.o  -lmysqlclient -lz -lm  -ldl -lobjc

無事コンパイルできた。 しかし、テストが通らない …

% ruby ./test.rb localhost ishikawa password
...
113 tests, 44 assertions, 3 failures, 177 errors

うーむ。つづきは今度