共有ホスティングでruby-postgresを使いたい

某、共有ホスティングサービスでruby-postgresを利用したいと要求が。どうも、sshも使えるしPostgreSQLも入っているらしい。今時だとrubyのモジュールを使うときはgems経由だなとおもい、rubygemsをインストール(前に日記で書いたので省略)。

・・・つかrubyのバージョンが低くて入らないorz

$ /ruby -v
$ ruby 1.8.1 (2003-12-25) [i686-linux]

最新のバージョンを入れてしまおう。

$ mkdir -p ~/usr/local/src
$ cd ~/usr/local/src
$ wget http://www.t.ring.gr.jp/archives/lang/ruby/ruby-1.8.7-p174.tar.gz
$ tar zxvf ruby-1.8.7-p174.tar.gz
$ cd ruby-1.8.7-p174
$ ./configure --prefix=$HOME/usr/local
$ make
$ make install |tee make-install.log
$ vi ~/.bash_profile
export PATH="$HOME/usr/local/bin:$PATH"

$ ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux]

$ cd ../rubygems-1.3.5
$ ruby setup.rb --prefix=${GEM_HOME}
$ gem help

つぎはruby-postgresをgemsで入れる。

$ gem install ruby-postgres --remote

irbで試してみると./postgres.so: undefined symbol: PQserverVersionこんなエラーが出る。メンドーだな・・・。

postgres.cを見てみると、PQserverVersionを使っているところが2カ所ほど。バージョンを取得するところと、lastvalを定義するかどうかの判断部分。lastvalってあってもあまり使わないから、その体でコンパイルしよう。

PostgreSQLのバージョンが7.4.18なので、PQserverVersionの代わりに70418とハードにコーディングしてしまう。

$ gem uninstall ruby-postgres
$ cd ~/usr/local/src
$ wget http://rubyforge.org/frs/download.php/9552/ruby-postgres-20060406.tar.gz
$ tar zxvf ruby-postgres-20060406.tar.gz
$ cd ruby-postgres

$ vi postgres.c
    179 /* コメントにする
    180     if (PQserverVersion(conn) >= 80100) {
    181         rb_define_singleton_method(self, "lastval", pgconn_lastval, 0);
    182     }
    183 */

   1141 pgconn_server_version(obj)
   1142     VALUE obj;
   1143 {
   1144     //ここコメントにして下記を追加 return INT2NUM(PQserverVersion(get_pgconn(obj)));
   1145     return INT2NUM(70418);
   1146 }

   1157 /* lastvalは定義しないので、コメントにしてしまう。どっちでも良いけど。
   1158 static VALUE
   1159 pgconn_lastval(obj)
   1160     VALUE obj;
   1161 {   
   1162     PGconn *conn = get_pgconn(obj);
   1163     PGresult *result;
   1164     VALUE lastval, error;
   1165     
   1166     result = PQexec(conn, "select lastval()");
   1167     if (!result) rb_raise(rb_ePGError, PQerrorMessage(conn));
   1168     
   1169     switch (PQresultStatus(result)) {
   1170     case PGRES_TUPLES_OK:
   1171       lastval = rb_cstr2inum(PQgetvalue(result, 0, 0), 10);
   1172       PQclear(result);
   1173       return lastval;
   1174     
   1175     case PGRES_BAD_RESPONSE:
   1176     case PGRES_FATAL_ERROR:
   1177     case PGRES_NONFATAL_ERROR:
   1178       error = rb_str_new2(PQresultErrorMessage(result));
   1179       PQclear(result);
   1180       rb_raise(rb_ePGError, StringValuePtr(error));
   1181     
   1182     default:
   1183       PQclear(result);
   1184       rb_raise(rb_ePGError, "unknown lastval");
   1185     }
   1186 }
   1187 */

$ ruby exrconf.rb
$ make #問題が無いことを確認する。
$ gem build ruby-postgres.gemspec
$ gem install ruby-postgres

今度は大丈夫なようだ。がしかし、ぼちぼちアップデートしてもらいたいものだ・・・
これでshellが使えなかったら厳しかった。