Как получить значение переменной в plv8 без использования plv8.elog()?
У меня проблема с получением правильного вывода из plv8.elog(). Для начала я использую PostgreSQL 9.2, plv8 1.4.1, установленный pgxn, в Ubuntu 12.10. У меня есть функция, которую я создаю, которая включает в себя вложенные циклы курсора и использует ряд подготовленных операторов. Я правильно закрываю курсоры и освобождаю готовые утверждения. Все эти функции генерируют массив объектов, которые являются записями, которые будут вставлены в несколько разных таблиц.
Там, где он ломается, я перебираю этот массив, используя данные в объектах для генерации строк запроса. Я нахожусь на этапе построения этой части кода, поэтому в тот момент, когда я обычно выполняю строку запроса, я вместо этого пытаюсь вывести ее на консоль. Вот где происходит коррупция.
При выводе 9 строк запроса, которые он генерирует в моем тесте, отображаются только 7 из них. Когда я захожу в журналы postgres, я обнаруживаю, что в конце двух пропущенных строк запроса есть символ, похожий на ромб с вопросительным знаком в нем. По сути, это какой-то символ, который не может быть отображен в текущем наборе символов. Я проверил все части кода генератора запросов и не могу найти никакой причины для этого. Я считаю, что функция plv8.elog () или функция конкатенации строк в движке plv8 по какой-то причине портятся.
У меня проблема в том, что если это функциональность объединения строк, я не могу доверять строкам запросов для правильного выполнения. Я проверил код, удалив его из функции и используя статическую информацию в массиве. При таких обстоятельствах он работает нормально, поэтому я знаю, что с этой частью кода что-то не так.
Во-первых, кто-нибудь еще видел это? Повреждение или странное поведение от plv8.elog()? Повреждение данных, когда ваша функция достигла определенного размера или сложности? Если да, то смогли ли вы найти способ хотя бы обойти это?
Кроме того, если это функция plv8.elog (), есть ли другой способ получения значений в переменных? Я знаю, что должна быть функциональность отладчика v8, но мне не удалось заставить это работать. Если у кого-то есть опыт, чтобы заставить это работать, не могли бы вы помочь мне также заставить это работать? Благодарю.
2 ответа
Это происходит потому, что вывод журнала 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:
часть журнала вывода.
Как сказал Бенди, это похоже на ограничение plv8/postgresql (я никогда не пытался выводить такие большие строки в plpgsql...).
Я слишком много раз искал решение, но безуспешно, поэтому я сделал свой обходной путь:
Это далеко от совершенства, но удалив часть NOTICE: -> и присоединившись (:s/\n// в vim), можно восстановить действительный JSON любого размера.
Надеюсь, что это может быть полезно...