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

Jun Kuriyama kuriyama @ imgsrc.co.jp
2006年 3月 10日 (金) 09:42:14 JST


At Fri, 10 Mar 2006 09:07:45 +0900,
Koichi Hyodo wrote:
> >  libpq を使うクライアント側が入力の escape を行う、というのはもちろん
> > なんですが、(少なくとも私の場合)多くの場合は placeholder を使うので、
> > 明示的に値を escape する、ということはその場合はしていません。
> 
> 外しているかもしれませんが、エスケープ処理をlibpqの
> PQescapeString関数で行うように修正できないでしょうか ?
> 
> http://www.postgresql.jp/document/pg813doc/html/libpq-exec.html#LIBPQ-EXEC-E
> SCAPE-STRING
> 
> この関数はそれなりに古いバージョンのlibpqにも用意されているようです。
> 少なくともencodingに関わらず決め打ちでquoteするよりはよさそうに思います。

 一応 DBD::Pg も、7.2.x 以降の場合は libpq 側の PQescapeString を使う
ようになっているようです。

# 前のメールでの DBD::Pg が自前で quote してる、というのはかなり古いサー
# バ相手のみのようです。迂闊でした。

 今確認してみたのですが、7.4.12 の PQescapeString はバイト単位で単純
に ' と \ をエスケープしているだけのようです。8.1.3 の PQescapeString
はマクロを使ってシンプルに書き換えられていましたが、

----- src/include/c.h
#define SQL_STR_DOUBLE(ch)      ((ch) == '\'' || (ch) == '\\')

----- src/interfaces/libpq/fe-exec.c
        while (remaining > 0 && *source != '\0')
        {
                if (SQL_STR_DOUBLE(*source))
                        *target++ = *source;
                *target++ = *source++;
                remaining--;
        }
-----

となっていましたので、これも特に encoding を意識しているわけではなさそ
うです。


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



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