|
|
|
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, сограждане! (В смысле https://geektimes.ru/post/274956/) Помогите! Собственно, сабж! Написал на EPGC функцию по 1-ой конвенции, строго как в https://habrahabr.ru/post/196544/ рекомендовано, но вернуть она должна поселекченное поле. Столкнулся с проблемами. Во-первых мне не понятно, как корректно распарсить хост-переменную (я её сделал просто char[240]) так, чтоб можно было сравнивать с нормальной стринговой константой. А то по факту она имеет какую-то странную структуру, которую я не в состоянии распознать. То ли дело в двухбайтной кодировке, которую мне не удаётся с помощью convert_to к ascii привести, то ли в волшебном префиксе, структуру которого я не знаю. Кто знает, подскажите! Во-вторых я не в состоянии осознать магические манипуляции для того, что сформировать значение для PG_RETURN_TEXT_P. Кстати, а где этот макрос описан? В postgres.h не нашёл... Кто реально писал функции на epgc, приведите пример работающего кода функции, возвращающей строковое значение, поселекченное из БД! ЗЫ. Я не блажу. Мне реально надо решить некую оптимизационную задачу, которая на pgPl/SQL благодаря рекурсии грозит оказаться неподъёмной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2016, 11:23 |
|
||
|
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
|
|||
|---|---|---|---|
|
#18+
ShiraЗдравствуйте, сограждане! (В смысле https://geektimes.ru/post/274956/) Помогите! Собственно, сабж! Написал на EPGC функцию по 1-ой конвенции, строго как в https://habrahabr.ru/post/196544/ рекомендовано, но вернуть она должна поселекченное поле. Столкнулся с проблемами. Во-первых мне не понятно, как корректно распарсить хост-переменную (я её сделал просто char[240]) так, чтоб можно было сравнивать с нормальной стринговой константой. А то по факту она имеет какую-то странную структуру, которую я не в состоянии распознать. То ли дело в двухбайтной кодировке, которую мне не удаётся с помощью convert_to к ascii привести, то ли в волшебном префиксе, структуру которого я не знаю. Кто знает, подскажите! Во-вторых я не в состоянии осознать магические манипуляции для того, что сформировать значение для PG_RETURN_TEXT_P. Кстати, а где этот макрос описан? В postgres.h не нашёл... Кто реально писал функции на epgc, приведите пример работающего кода функции, возвращающей строковое значение, поселекченное из БД! ЗЫ. Я не блажу. Мне реально надо решить некую оптимизационную задачу, которая на pgPl/SQL благодаря рекурсии грозит оказаться неподъёмной. Таки вы пишете клиентское приложение (которое с базой как клиента работает) и тогда да ECPG (но тогда не ясно причем тут упоминание pl/pgsql) Или вы пишете серверное приложение которое будет выполнятся внутри процесса базы и тогда не ясно причем тут ECPG который для написание клиентской части предназначен. А для написание серверной части нужен не ECPG а http://www.postgresql.org/docs/9.5/interactive/spi.html (а это как говорится две большие разницы). -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2016, 11:35 |
|
||
|
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
|
|||
|---|---|---|---|
|
#18+
Таки вы пишете клиентское приложение (которое с базой как клиента работает) Нет. Но первая проблема (сравнение селекченного значения хост-переменной с строковой константой) в равной мере касается и клиентского приложения. Или вы пишете серверное приложение которое будет выполнятся внутри процесса базы Да. тогда не ясно причем тут ECPG который для написание клиентской части предназначен. Я полагал, что ECPG это набор макросов для упрощения написания вызовов SQL на C. А что, эти вызовы (С-функции) для клиента и сервера различны? Или просто для сервера состав макросов другой (расширенный)? Поясните. Самые сложные ошибки возникают из непонимания концепции... А для написание серверной части нужен не ECPG а http://www.postgresql.org/docs/9.5/interactive/spi.html (а это как говорится две большие разницы). Вот-вот! А в чём разница? Действительно в наборе функций, или только в составе макросов их вызова? В любом случае, Вы не могли бы привести пример серверной функции, возвращающей значение строковой хост-переменной? А то мои шаманские пляски с бубном вокруг PG_MODULE_MAGIC точно до добра не доведут. Давеча даже Убунту свою несчастную завесил. Ну и про парсинг селекченного значения строковой хост-переменной, если можно, проясните. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2016, 12:45 |
|
||
|
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
|
|||
|---|---|---|---|
|
#18+
ShiraТаки вы пишете клиентское приложение (которое с базой как клиента работает) Нет. Но первая проблема (сравнение селекченного значения хост-переменной с строковой константой) в равной мере касается и клиентского приложения. Или вы пишете серверное приложение которое будет выполнятся внутри процесса базы Да. тогда не ясно причем тут ECPG который для написание клиентской части предназначен. Я полагал, что ECPG это набор макросов для упрощения написания вызовов SQL на C. А что, эти вызовы (С-функции) для клиента и сервера различны? Или просто для сервера состав макросов другой (расширенный)? Поясните. Самые сложные ошибки возникают из непонимания концепции... А для написание серверной части нужен не ECPG а http://www.postgresql.org/docs/9.5/interactive/spi.html (а это как говорится две большие разницы). Вот-вот! А в чём разница? Действительно в наборе функций, или только в составе макросов их вызова? В любом случае, Вы не могли бы привести пример серверной функции, возвращающей значение строковой хост-переменной? А то мои шаманские пляски с бубном вокруг PG_MODULE_MAGIC точно до добра не доведут. Давеча даже Убунту свою несчастную завесил. Ну и про парсинг селекченного значения строковой хост-переменной, если можно, проясните. Ну я же вам дал ссылку на доку. Прямо на этой странице есть ссылка на пример: http://www.postgresql.org/docs/9.5/interactive/spi-examples.html -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2016, 14:24 |
|
||
|
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
|
|||
|---|---|---|---|
|
#18+
Ну я же вам дал ссылку на доку. Спасибо, конечно, но эту доку я уже неоднократно просматривал. И не помогает. Там полно очень интересных и важных деталей. Но, поскольку я вне концептуального контекста, мне их просто некуда положить в своём сознании. Я просил уточнить, как соотносятся SPI и макросы вызовов функций в ECPG. То, что ECPG относится не только к программированию на клиенте, но и на сервере, я проверял. Во всяком случае для целочисленных, а не строковых значений, мне удалось создать ХП именно с помощью ECPG. И проблема возникла именно при попытке создать строковое возвращаемое значение. Прямо на этой странице есть ссылка на пример: http://www.postgresql.org/docs/9.5/interactive/spi-examples.html 1) В примере используется конвенция0. Вскользь упоминается, что её легко переделать под конвенцию1, но для меня не легко. Очевидно, дока предполагает куда большую погружённость в проблему. 2) Приведённая в примере функция возвращает целое значение. Я и без SPI такого результата добился с помощью ECPG. А с возвращением строкового значения в примере ни намёка. Более того, в рекомендованной в доке ссылке на src/test/regress/regress.c тоже ничего на эту тему не нашёл. 3) В примере упоминается функция text_to_cstring. Возможно, это и есть решение моей первой проблемы (с парсингом хост-переменной). Но мне нигде больше не удалось найти упоминание, а тем более описание этой функции. Не могли бы Вы пояснить, что за функция, где описана, как и в каких случаях ею пользоваться. Ну и главное - если Вам удавалось создать ХП, возвращающую строковое значение, уже не важно, с какими библиотеками, приведите пожалуйста хотя бы финальный фрагмент кода, в котором формируется буфер результата и вызывается собственно макрос возврата значения типа PG_RETURN_TEXT или PG_RETURN_VARCHAR. Кстати, а какие конкретно макросы в примере выцеплены из PG_MODULE_MAGIC? И вообще, зачем он в примере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2016, 09:21 |
|
||
|
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
|
|||
|---|---|---|---|
|
#18+
Ну помогите же, хоть кто-нибудь! Неужели никто не пробовал писать на С ХП, возвращающие строковые значения?!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2016, 11:38 |
|
||
|
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
|
|||
|---|---|---|---|
|
#18+
Shira, писал когдато хранимку на С, но потом переделал на SQL. с одной стороны быстрее, с другой апгрейд БД становится гемороем. вот фрагмент если чем поможет. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2016, 11:47 |
|
||
|
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
|
|||
|---|---|---|---|
|
#18+
Спасибо, добрый человек! писал когдато хранимку на С, но потом переделал на SQL. с одной стороны быстрее, с другой апгрейд БД становится гемороем. А в чём геморрой? Мне-то по-любому скорость приоритетна - весь проект на pgPL/SQL и Tcl/Tk, но некие рекурсивные оптимизационные алгоритмы кроме С доверить никому нельзя. вот фрагмент если чем поможет. Спасибо! Постараюсь разобраться. Сразу вопрос - кто такой strrev(n)? У меня-то проблема в том, что текст я селекчу из записи в таблице... Тоже проблема, как значение хост-переменной преобразовать к сишной строке. А уж потом вернуть её с помощью PG_RETURN_TEXT_P. Я думал, мне может text_to_cstring помочь, но не могу понять, с какими библиотеками линковаться, какие хедеры инклюдить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2016, 13:11 |
|
||
|
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
|
|||
|---|---|---|---|
|
#18+
Shira, геморой в том, что при каждом апгрейде, надо перекомпилить библиотеку. для багфиксовых версий ненадо, но для каждой минорной (если склероз не изменяет) - да, надо. далее, данный фрагмент кода взят из функции, которая получяла инпут текст, и работала с ним как с гексидецималом (боролся с высшим битом, если он так называется, BIGINT' а), да и вывод - текст. было дело ещё при 9.2, если правилшно помню, так что многого не помню, но если встретятся незнакомые функции, то может быть мои - утилитные (или как их там, опять...). P.S. дай мыло куда отослать, пришлю весь сишный файл. может чтото станет более понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2016, 14:34 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39229926&tid=1997261]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
157ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 505ms |

| 0 / 0 |
