powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция на С (pgc) должна вернуть значение varchar-поля таблицы
10 сообщений из 10, страница 1 из 1
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
    #39228924
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 благодаря рекурсии грозит оказаться неподъёмной.
...
Рейтинг: 0 / 0
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
    #39228934
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
    #39229033
Shira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таки вы пишете клиентское приложение (которое с базой как клиента работает)
Нет. Но первая проблема (сравнение селекченного значения хост-переменной с строковой константой) в равной мере касается и клиентского приложения.
Или вы пишете серверное приложение которое будет выполнятся внутри процесса базы
Да.
тогда не ясно причем тут ECPG который для написание клиентской части предназначен.
Я полагал, что ECPG это набор макросов для упрощения написания вызовов SQL на C.
А что, эти вызовы (С-функции) для клиента и сервера различны? Или просто для сервера состав макросов другой (расширенный)? Поясните. Самые сложные ошибки возникают из непонимания концепции...

А для написание серверной части нужен не ECPG а http://www.postgresql.org/docs/9.5/interactive/spi.html (а это как говорится две большие разницы).
Вот-вот! А в чём разница? Действительно в наборе функций, или только в составе макросов их вызова?
В любом случае, Вы не могли бы привести пример серверной функции, возвращающей значение строковой хост-переменной? А то мои шаманские пляски с бубном вокруг PG_MODULE_MAGIC точно до добра не доведут. Давеча даже Убунту свою несчастную завесил.
Ну и про парсинг селекченного значения строковой хост-переменной, если можно, проясните.
...
Рейтинг: 0 / 0
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
    #39229133
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
    #39229588
Shira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я же вам дал ссылку на доку.
Спасибо, конечно, но эту доку я уже неоднократно просматривал. И не помогает. Там полно очень интересных и важных деталей. Но, поскольку я вне концептуального контекста, мне их просто некуда положить в своём сознании.
Я просил уточнить, как соотносятся 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? И вообще, зачем он в примере?
...
Рейтинг: 0 / 0
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
    #39229715
Shira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну помогите же, хоть кто-нибудь!
Неужели никто не пробовал писать на С ХП, возвращающие строковые значения?!!
...
Рейтинг: 0 / 0
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
    #39229724
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
PGMODULEEXPORT Datum gpt_from_hex(PG_FUNCTION_ARGS){

    text *hex;
    text *r_str;
    char* n;
    char *hx;
    int i = 0;
    int stringLength;
    unsigned long long tmpNumber = 0;

    if( PG_ARGISNULL(0) ) {
        PG_RETURN_NULL();
        }
    hex = PG_GETARG_TEXT_P(0);

    hx = (char *)malloc((VARSIZE(hex) - VARHDRSZ) + 1);
    memset((void *)hx, 0, (VARSIZE(hex) - VARHDRSZ) + 1);
    memcpy(hx, VARDATA(hex), (VARSIZE(hex) - VARHDRSZ));
    n = (char *)malloc( 25 );
    memset((void *) n, 0, 25);

    tmpNumber = strHexToULongLong(hx); // onverting char string from hex to number...

    do {

        n[i] = (unsigned char) ((tmpNumber % 10) + 48);
        ++i;
        tmpNumber /= 10;

    } while (tmpNumber > 0);

    r_str = (text *)palloc( i + VARHDRSZ );
    memset((void *) r_str, 0, i );
    SET_VARSIZE( r_str, i + VARHDRSZ);
    
    strncpy(VARDATA(r_str), strrev(n), i);
    free(hx);
    free(n);

    PG_RETURN_TEXT_P( r_str );
}

...
Рейтинг: 0 / 0
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
    #39229829
Shira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, добрый человек!
писал когдато хранимку на С, но потом переделал на SQL. с одной стороны быстрее, с другой апгрейд БД становится гемороем. А в чём геморрой? Мне-то по-любому скорость приоритетна - весь проект на pgPL/SQL и Tcl/Tk, но некие рекурсивные оптимизационные алгоритмы кроме С доверить никому нельзя.
вот фрагмент если чем поможет.
Спасибо! Постараюсь разобраться.
Сразу вопрос - кто такой strrev(n)?
У меня-то проблема в том, что текст я селекчу из записи в таблице...
Тоже проблема, как значение хост-переменной преобразовать к сишной строке. А уж потом вернуть её с помощью PG_RETURN_TEXT_P. Я думал, мне может text_to_cstring помочь, но не могу понять, с какими библиотеками линковаться, какие хедеры инклюдить...
...
Рейтинг: 0 / 0
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
    #39229926
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shira,

геморой в том, что при каждом апгрейде, надо перекомпилить библиотеку. для багфиксовых версий ненадо, но для каждой минорной (если склероз не изменяет) - да, надо. далее, данный фрагмент кода взят из функции, которая получяла инпут текст, и работала с ним как с гексидецималом (боролся с высшим битом, если он так называется, BIGINT' а), да и вывод - текст. было дело ещё при 9.2, если правилшно помню, так что многого не помню, но если встретятся незнакомые функции, то может быть мои - утилитные (или как их там, опять...).
P.S.
дай мыло куда отослать, пришлю весь сишный файл. может чтото станет более понятно.
...
Рейтинг: 0 / 0
Функция на С (pgc) должна вернуть значение varchar-поля таблицы
    #39229939
Shira
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дай мыло куда отослать, пришлю весь сишный файл. может чтото станет более понятно. shirokovalexandr @ mail . ru
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция на С (pgc) должна вернуть значение varchar-поля таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]