Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Oracleの場合にepcがエラーを起こす #1

Closed
buzztaiki opened this issue Feb 17, 2012 · 5 comments
Closed

Oracleの場合にepcがエラーを起こす #1

buzztaiki opened this issue Feb 17, 2012 · 5 comments

Comments

@buzztaiki
Copy link
Contributor

Oracleの場合、以下の理由でエラーが起きるようです。

  • DBD::Oracleは文字列にutf-8 flagを付けて返す
  • AnyEventはutf-8 flagが付いてるとエラーを起こす

以下のコードでOracle関係なしに再現できます。

サーバ側::

use RPC::EPC::Service;                                                                                                                                

my $server = RPC::EPC::Service->new(8888, {
  'identity' => sub {
    my ($args) = @_; return $args;                                                                                                                    
  }});                                                                                                                                                
$server->start;                                                                                                                                       

クライアント側::

use RPC::EPC::Service;                                                                                                                                
use Data::Dumper;                                                                                                                                     
use Encode;                                                                                                                                           

my $client = RPC::EPC::Service->new(8888, {});                                                                                                        
$client->client_start;                                                                                                                                
foreach my $text ('abcd', '日本語', 'efgh') {
  print Dumper $client->call_method('identity', [Encode.decode_utf8($text)])->recv;                                                                   
}
$client->stop;                                                                                                                                        
@buzztaiki
Copy link
Contributor Author

とりあえず edbi-bridge 側で回避するパッチを作ってみました。https://gist.github.com/1850059 です。

ただ、epc側で回避できるならそっちの方がいい気がします。

@kiwanami
Copy link
Owner

調査していただいてありがとうございます。epc側でいれる方向で考えます。
Perlはまだ初心者なので、Perlの utf8-flag について勉強してみます。

encode_utf8($_) if Encode::is_utf8($str);
という処理を AnyEvent に通す前に入れればいいのかな。
きっと往復で必要になるんですよね。うーん。

@kiwanami
Copy link
Owner

Perl側への入口と出口にEncodeいれてみました。
kiwanami/emacs-epc@35d4762

今までは、文字列がエンコーディング関係なしでバイト列で扱われていて、たまたま全員UTF8になっていたから動いていたのかなという理解です。
手元の SQLite, Pg では日本語を含めて動いているみたいなのですが、ちょっと自身が無いです。

まだ、あんまり使ってる人が居ないようなので shipit してしまおうかな。

@buzztaiki
Copy link
Contributor Author

動作確認しました。手元の Oracle では動いてるみたいです。日本語の条件も大丈夫。

エンコーディングに関しては僕も Perl に詳しくないのでなんとも。多分そいう理解であってるんだとは思いますが。

この issue は閉じちゃってもいいのかな。

@kiwanami
Copy link
Owner

すいません。わざわざ確認してもらってありがとうございます。
まだまだバグがいっぱいありそうなので、とりあえずこれは一旦閉じます。後ほどCPAN更新しておきます!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants