Postgres gem -- LoadError

I’m at a loss to explain why the postgres gem will not work on my new
server. I’ve gotten it working on several other servers in the past.
The major difference between then and now is that I’m using a newer
version of PostgreSQL. 8.x as opposed to 7.x.

=== Server setup

OS: Fedora Core 6

(Commands shown with “$” are performed as the same user that mongrel
is running as. “#” are commands from root.)

$ /usr/local/pgsql/bin/psql --version
psql (PostgreSQL) 8.2.4
contains support for command-line editing

=== The error message

I’m currently running a Rails app with mongrel_cluster on ports
8000-8002. When I try to access a page, I get the following in my
production.log file.

LoadError (libpq.so.5: cannot open shared object file: No such file or
directory - /usr/lib/ruby/gems/1.8/gems/postgres-0.7.1/./postgres.so):
/usr/lib/ruby/gems/1.8/gems/postgres-0.7.1/./postgres.so

Oddly, I can do the following.

$ irb
irb(main):001:0> require ‘postgres’
=> true

Why would that work for the mongrel user at the command line, but not
from the mongrel_rails process?

=== Installing the postgres gem.

First I did a “gem install postgres” and then I tried the following.

echo $LD_LIBRARY_PATH

/usr/local/pgsql/lib

pwd

/usr/lib/ruby/gems/1.8/gems/postgres-0.7.1

make clean

ruby extconf.rb --with-pgsql-dir=/usr/local/pgsql

checking for cygwin32_socket() in -lwsock32… no
checking for socket() in -lsocket… no
checking for gethostbyname() in -linet… no
checking for gethostbyname() in -lnsl… yes
checking for sys/un.h… yes
checking for socket()… yes
checking for hsterror()… no
checking for gethostname()… yes
checking for PQsetdbLogin() in -lpq… yes
checking for PQsetClientEncoding()… yes
checking for pg_encoding_to_char()… yes
checking for PQescapeString()… yes
creating Makefile

make

gcc -I. -I. -I/usr/lib/ruby/1.8/i386-linux -I. -DHAVE_SYS_UN_H -
DHAVE_SOCKET -DHAVE_GETHOSTNAME -DHAVE_PQSETCLIENTENCODING -
DHAVE_PG_ENCODING_TO_CHAR -DHAVE_PQESCAPESTRING -I/usr/local/pgsql/
include -fPIC -c postgres.c
gcc -shared -L"/usr/local/pgsql/lib" -L"/usr/lib" -o postgres.so
postgres.o -lruby -lpq -lnsl -lpthread -ldl -lcrypt -lm -lc

make install

/usr/bin/install -c -m 0755 postgres.so /usr/lib/ruby/site_ruby/1.8/
i386-linux

ldd ./postgres.so

    linux-gate.so.1 =>  (0x0091b000)
    libruby.so.1.8 => /usr/lib/libruby.so.1.8 (0x00ef8000)
    libpq.so.5 => /usr/local/pgsql/lib/libpq.so.5 (0x009b7000)
    libnsl.so.1 => /lib/libnsl.so.1 (0x0085d000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00110000)
    libdl.so.2 => /lib/libdl.so.2 (0x00b1f000)
    libcrypt.so.1 => /lib/libcrypt.so.1 (0x009d3000)
    libm.so.6 => /lib/libm.so.6 (0x00127000)
    libc.so.6 => /lib/libc.so.6 (0x0023b000)
    /lib/ld-linux.so.2 (0x00531000)

As the mongrel user, I get the same result from ldd. I can also do
the following:

$ cd /usr/lib/ruby/gems/1.8/gems/postgres-0.7.1/

$ ls -al
total 164
drwxr-xr-x 4 root root 4096 Jun 3 11:06 .
drwxr-xr-x 17 root root 4096 Jun 3 10:50 …
-rw-r–r-- 1 root root 5289 Jun 3 10:50 ChangeLog
drwxr-xr-x 2 root root 4096 Jun 3 10:50 doc
-rw-r–r-- 1 root root 1232 Jun 3 10:50 extconf.rb
-rw-r–r-- 1 root root 3545 Jun 3 11:06 Makefile
-rw-r–r-- 1 root root 198 Jun 3 10:50 MANIFEST
-rw-r–r-- 1 root root 7643 Jun 3 11:06 mkmf.log
-rw-r–r-- 1 root root 34307 Jun 3 10:50 postgres.c
-rw-r–r-- 1 root root 32004 Jun 3 11:06 postgres.o
-rw-r–r-- 1 root root 684 Jun 3 10:50 postgres-ruby.gemspec
-rwxr-xr-x 1 root root 33624 Jun 3 11:06 postgres.so
-rw-r–r-- 1 root root 2980 Jun 3 10:50 README
-rw-r–r-- 1 root root 4347 Jun 3 10:50 README.ja
drwxr-xr-x 2 root root 4096 Jun 3 10:50 sample

So I don’t think that it’s a permissions problem.

Is this something as simple as “PostgreSQL 8.2.4 doesn’t work with
Ruby” or am I missing something else obvious here?

– James

On Jun 3, 11:25 am, jdl [email protected] wrote:

is running as. “#” are commands from root.)

Why would that work for the mongrel user at the command line, but not
/usr/lib/ruby/gems/1.8/gems/postgres-0.7.1
checking for hsterror()… no
DHAVE_PG_ENCODING_TO_CHAR -DHAVE_PQESCAPESTRING -I/usr/local/pgsql/
libruby.so.1.8 => /usr/lib/libruby.so.1.8 (0x00ef8000)
the following:
-rw-r–r-- 1 root root 3545 Jun 3 11:06 Makefile
So I don’t think that it’s a permissions problem.

Is this something as simple as “PostgreSQL 8.2.4 doesn’t work with
Ruby” or am I missing something else obvious here?

– James

Follow-up.
I removed the following packages via ‘yum remove foo’.

ruby-irb
ruby-devel
ruby-libs
ruby

I then removed the /usr/lib/ruby directory.

Then I compiled a new copy of ruby with the tried-and-true
‘configure / make / make install’.

Re-ran the setup for ruby gems.

Installed the gems that I needed: postgres, rails, mongrel, etc.

Some old executables where hanging around in /usr/bin (Yay for yum not
removing them as instructed.)
/usr/bin/ruby
/usr/bin
/usr/bin/mongrel_rails
/usr/bin/mongrel_cluster_ctl

I removed those files, and made symlinks in their place.
/usr/bin/ruby → /usr/local/bin/ruby
etc…

The gem install postgres process still needed some hand-holding, with
the step of going into the gem directory and running everything by
hand (see my original post).

Everything works fine now.

Moral: package managers suck.

– James