共有ホスティングで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が使えなかったら厳しかった。