5

plv8.elog() から正しい出力を取得する際に問題が発生しています。まず、Ubuntu 12.10 で pgxn によってインストールされた PostgreSQL 9.2、plv8 1.4.1 を使用しています。ネストされたカーソルループを含み、多数の準備済みステートメントを使用する関数を作成しています。カーソルを適切に閉じて、準備されたステートメントを解放しています。この機能はすべて、さまざまなテーブルに挿入されるレコードであるオブジェクトの配列を生成します。

壊れているのは、オブジェクト内のデータを使用してその配列をループしてクエリ文字列を生成するポイントです。私はコードのこの部分の構築段階にいるので、通常クエリ文字列を実行する時点で、代わりにコンソールに出力しようとします。ここで破損が発生します。

私のテストで生成された 9 つのクエリ文字列を出力すると、そのうちの 7 つだけが表示されます。postgres のログを調べると、2 つのクエリ文字列が欠落していて、最後にクエスチョン マークの付いたひし形のような文字があることがわかりました。基本的に、現在の文字セットでは表示できない文字です。クエリ ジェネレータ コードのすべての部分をテストしましたが、その理由が見つかりません。plv8.elog() 関数または plv8 エンジンの文字列連結機能が何らかの理由で壊れていると思います。

私が抱えている問題は、それが文字列連結機能である場合、クエリ文字列が正しく実行されることを信頼できないことです。関数からコードを削除し、配列内の静的情報を使用して、コードをテストしました。その状況下では問題なく動作するので、コードのその部分に問題がないことはわかっています。

まず、これを見た人はいますか?plv8.elog() からの破損または奇妙な動作? 関数が特定のサイズまたは複雑さになったときにデータが破損することはありませんか? もしそうなら、少なくともそれを回避する方法を見つけることができましたか?

また、 plv8.elog() 関数の場合、変数の値を取得する別の方法はありますか? v8 デバッガー機能があることはわかっていますが、それを機能させることに成功していません。誰かがそれを機能させた経験がある場合は、それも機能させるのを手伝ってもらえますか? ありがとう。

4

2 に答える 2

1

これは、plv8 のログ出力が特定のバイト/ビット数に制限されているために発生します。複数の長い文字列を連結して に送信する場合plv8.elog()、バイト/ビットの最大数に達すると、文字列が切り捨てられます。これを回避するために、私はこれを行います:

plv8.elog(INFO, myString.substring(0,800));
plv8.elog(INFO, myString.substring(801,1600));
plv8.elog(INFO, myString.substring(1601,2400));

制限は1024だと思いますがINFO:、ログ出力の一部でその一部が占められています。

于 2015-08-14T22:39:50.127 に答える
0

ベンディが言ったように、これはplv8 / postgresqlの制限のようです(plpgsqlで非常に大きな文字列を出力しようとしたことはありません...)。

解決策を何度も探しましたが、運が悪かったので、独自の回避策を作成しました。

plv8_console.js

完璧にはほど遠いですが、'NOTICE: ->' の部分を削除して結合 (vim では :s/\n//) すると、任意のサイズの有効な JSON を復元できます。

それが役に立つことを願っています...

于 2015-10-09T16:45:25.593 に答える