[pgsql-jp: 36859] Re: client encoding と PQexec

Jun Kuriyama kuriyama @ imgsrc.co.jp
2006年 3月 10日 (金) 13:01:04 JST


At Fri, 10 Mar 2006 12:43:33 +0900 (JST),
Tatsuo Ishii wrote:
> >  これは主に昔の PostgreSQL (7.2.x 世代?) をサポートするため、だとは思
> > うのですが、現在の DBD::Pg では 7.4.x で PQexecPrepared が使える場合で
> > も、全てのパラメータの型を指定しないと PQexecPrepared を使いません(サー
> > バが 8.x なら大丈夫)。
> >  PQprepare の際に paramTypes[] に 0 を入れてサーバ側に型を推測させる、
> > という機能を正しく使えていないような箇所を見つけたので、それを直せばよ
> > り多くの場面で PQexecPrepared が使えるようになるかもしれませんので、
> > ちょっとそこを攻めてみます。
> 
> そういう実装なんですか.DBD::Pgの内部処理がサーバのバージョンによって
> 変わってしまうというのは,結構危険な感じがしますね.

 はい、かなり危険です。:-(

# しかもその辺の if 文の条件がかなり深いし

> >  libpq 側の PQescapeString が、client encoding と server (db)
> > encoding が異なる場合には、入力を server encoding に直した上で quote 
> > してさらに client encoding に戻してそれを返す、などとしてしまうと
> > PQescapeString の定義が変わってしまいますか?
> > 
> > # しかも遅くなりそう……。
> 
> それは無理と言うか,必要ありません.エンコーディング変換の機能は
> PostgreSQLのバックエンド内部でしか利用できません.
> # それとも,エンコーディング変換をPerlでやる話でしたっけ?

 まずはどちらの層でやるべきか、ということを知りたかったのと、DBD::Pg
側でやるべき場合にはそういうコードを入れようかな、と考えていました。

 そうか、libpq と backend って全然別の世界なんだ。

> PQescapeStringがクライアントエンコーディングを理解するように修正するか,
> 同等の処理をDBD::Pgでやれば良いと思います.

 で、[pgsql-jp: 36857] にあるように、今の PQescapeString の API だと
encoding が渡せない、ということですよね。やるとしたら別関数か……ちょっ
と話大きくしすぎになっちゃうなあ。
 やはり DBD::Pg 側でどうにかするのが楽そうですね。ちょっと考えてみま
す。


-- 
Jun Kuriyama <kuriyama @ imgsrc.co.jp> // IMG SRC, Inc.



pgsql-jp メーリングリストの案内