seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

postgreSQLのプログラミングI/F (perl篇)

結局、Pgモジュールの有りかは分らず。

apt-get install perl-DBI
apt-get install perl-DBD-Pg

DBIモジュールによるデータベースアクセスでやってみることにする。

途中、DBI->connect とすべきところを、DBI->conect とタイプミスし、@INC上でconectは存在しないと言われ「なんだよ、conectって? connectのまちがいだろ?」と思いつつ、自分がタイプミスしたことに気が付かず find したり、ネットで検索*1したりで30分ほど時間を浪費する。

use DBI;
my $connection = DBI->connect( "DBI:Pg:dbname=<<dbname>>" ) or die $DBI::errstr;
....
$connection->disconnect;

で無事、perlからのアクセスに成功した。

*1:ネットで検索:興味深いことに、同じようなことで躓いてるひとが世界には少くとももうひとりは居たことが判明した。おかげで、自分のタイプミスに気が付いた。

postgreSQLのプログラミングI/F (C言語篇)

あとはC言語I/FとJDBCが使えれば実用上問題なし。
apt-get install postgresql-devel でC言語I/Fがインストールされた。
manページをつかえるようにする方法が分らないが、libpq-fe.hをみたかぎりでは、それほど沢山のAPIがあるわけでは無さそうだ。
includeのパスもlibのパスも標準で問題無し。
データーベースをオープンしSELECTしてクローズするだけのもので試す。

#include <libpq-fe.h>

int main( int argc, char* argv[] ) {
    PGconn *connection = PQconnectdb( "dbname=<<dbname>>" );
    if( PQstatus( connection ) == CONNECTION_OK) {
        ....
    }
    else {
        printf( "connection failed\n" );
    }
    PQfinish( connection );
    return 0;
}

とくにむずかしいところはなし。

gcc pqtest.c -lpq

コンパイルOK。
pg_config というツールがあり、これはgnome-configとか、gtk-configみたいに使うようだ。ヘッダやライブラリ、あるいはツールの格納されているディレクトリを標準出力にプリントする。
しかし、とくに使わずともコンパイルできた。


リンクされている依存ライブラリをみてみると、かなりのものが付いている。

$ ldd a.out
        linux-gate.so.1 =>  (0x006bf000)
        libpq.so.3 => /usr/lib/libpq.so.3 (0x007a3000)
        libc.so.6 => /lib/libc.so.6 (0x00111000)
        libssl.so.4 => /lib/libssl.so.4 (0x00486000)
        libcrypto.so.4 => /lib/libcrypto.so.4 (0x00c4f000)
        libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00d83000)
        libcom_err.so.2 => /lib/libcom_err.so.2 (0x00c33000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x03334000)
        libresolv.so.2 => /lib/libresolv.so.2 (0x00bcc000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x0331f000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x0096c000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x0065d000)
        libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00c38000)
        libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x00d47000)
        libdl.so.2 => /lib/libdl.so.2 (0x0079d000)c
        libz.so.1 => /usr/lib/libz.so.1 (0x0087d000)


あと、libpq++なる、C++言語wrapperがあるらしいことが判明。
しかし、どこから入手するのか分らない。

postgreSQLのプログラミングI/F (JAVA篇)

jdbcドライバはapt-get install postgresql-jdbcでインストールできた。

$ rpm -q -l postgresql-jdbc
/usr/share/java/pg74.1jdbc1.jar
/usr/share/java/pg74.1jdbc2.jar
/usr/share/java/pg74.1jdbc2ee.jar
/usr/share/java/pg74.1jdbc3.jar

ということから、ここのjdbc2にクラスパスをとおせばよい。
ドライバクラスは「org.postgresql.Driver」とする。
接続urlは「jdbc:postgresql:<>」とする。

import java.util.*;
import java.sql.*;
 
public class TestJava {
 
    public static void main( final String[] argv ) throws Exception {
        Class.forName( "org.postgresql.Driver" );
         
        final Properties prop = new Properties();
        prop.setProperty( "user", "seraphy" );
        prop.setProperty( "password", "********" );
         
        final String url = "jdbc:postgresql:<<DBNAME>>";
        final Connection con = DriverManager.getConnection( url, prop );
        try{
            ....
        }
        finally {
            con.close();
        }
    }
}

で、コンパイルと実行。
ソース上にはorg.postgresql.Driverクラスへの参照はないのでコンパイル時にJDBCクラスパスをとおす必要は無いが、実行時にはクラスパス上にみつからないとClassNotFoundExceptionになる。

javac *.java
java -cp .:/usr/share/java/pg74.1jdbc2.jar TestJava

しかし、これだけではだめだった。
postgresqlの設定をかえないと動作しない。
既定ではtcpipによる接続を許可しないので、jdbcからアクセスできない。
Exception in thread "main" org.postgresql.util.PSQLException: Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
などというエラーとなる。
tcpipで接続できるようにするには、/var/lib/pgsql/data/postgresql.conf を編集し、tcpip_socket=true にする。

これだけではtcpipによるアクセスはできるようになるが、接続許可リストにないので拒否される。
Exception in thread "main" org.postgresql.util.PSQLException: A connection error has occurred: org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host "127.0.0.1", user "seraphy", database "postgres1", SSL off
接続許可をあたえるには、/var/lib/pgsql/data/pg_hba.conf を編集し、接続許可を追記する。

host all all 127.0.0.1 255.255.255.255 trust

これでローカルホストからのTCP/IP接続が許可される。
あとはpostgresqlを再起動すればjdbcpostgreSQLのデーターベースにアクセスできるようになる。

/etc/rc.d/init.d/postgresql restart