powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как сделать CONVERSION на С?
7 сообщений из 7, страница 1 из 1
Как сделать CONVERSION на С?
    #33912628
Hordi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.Написал такую функцию на С.

Datum conv_1251_KOI8(PG_FUNCTION_ARGS)
{
char buf[64];
int s_ID = PG_GETARG_INT32(0);
int d_ID = PG_GETARG_INT32(1);
text *s_str = PG_GETARG_TEXT_P(2);

elog(INFO,"TEST");
}

2.Зарегистрил эту функцию.
CREATE OR REPLACE FUNCTION conv_1251_koi8(int4, int4, cstring, internal, int4)
RETURNS void AS
'/var/lib/postgresql/data/funcs/conv', 'conv_1251_KOI8'
LANGUAGE 'c' IMMUTABLE;

3.Создал правило конвертации
CREATE DEFAULT CONVERSION conv_win_koi8
FOR 'WIN1251'
TO 'KOI8'
FROM conv_1251_koi8;


Ожидал, что после запроса
set client_encoding to 'WIN1251';
будет вызываться моя функция, но ничего не происходит...
Что я сделал не так?
pg-8.1.4
...
Рейтинг: 0 / 0
Как сделать CONVERSION на С?
    #33913254
akie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так koi8r -> cp1251 по умолчанию уже задан:

template1=# select * from pg_conversion where conname = 'koi8_r_to_windows_1251';
conname | connamespace | conowner | conforencoding | contoencoding | conproc | condefault
------------------------+--------------+----------+----------------+---------------+------------------+------------
koi8_r_to_windows_1251 | 11 | 10 | 22 | 23 | koi8r_to_win1251 | t
(1 row)
...
Рейтинг: 0 / 0
Как сделать CONVERSION на С?
    #33916986
Hordi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так а почему моя функция не вызывается?
...
Рейтинг: 0 / 0
Как сделать CONVERSION на С?
    #33917939
httt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
akieтак koi8r -> cp1251 по умолчанию уже задан:

template1=# select * from pg_conversion where conname = 'koi8_r_to_windows_1251';
conname | connamespace | conowner | conforencoding | contoencoding | conproc | condefault
------------------------+--------------+----------+----------------+---------------+------------------+------------
koi8_r_to_windows_1251 | 11 | 10 | 22 | 23 | koi8r_to_win1251 | t
(1 row)
Можете рассказать как при выводе из БД конвертить из KOI8 в CP1251 или ссылку на доку дать?
...
Рейтинг: 0 / 0
Как сделать CONVERSION на С?
    #33918532
landy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После коннекта к серверу
set client_encoding to 'WIN1251';

после этого для данного коннекта автоматом будет конвертиться с/на сервера
в данном примере WIN во внутреннюю кодировку БД
...
Рейтинг: 0 / 0
Как сделать CONVERSION на С?
    #33919433
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hordi1.Написал такую функцию на С.

Datum conv_1251_KOI8(PG_FUNCTION_ARGS)
{
char buf[64];
int s_ID = PG_GETARG_INT32(0);
int d_ID = PG_GETARG_INT32(1);
text *s_str = PG_GETARG_TEXT_P(2);

elog(INFO,"TEST");
}

2.Зарегистрил эту функцию.
CREATE OR REPLACE FUNCTION conv_1251_koi8(int4, int4, cstring, internal, int4)
RETURNS void AS
'/var/lib/postgresql/data/funcs/conv', 'conv_1251_KOI8'
LANGUAGE 'c' IMMUTABLE;

3.Создал правило конвертации
CREATE DEFAULT CONVERSION conv_win_koi8
FOR 'WIN1251'
TO 'KOI8'
FROM conv_1251_koi8;


Ожидал, что после запроса
set client_encoding to 'WIN1251';
будет вызываться моя функция, но ничего не происходит...
Что я сделал не так?
pg-8.1.4

для написания своей функции на сях нуна...
1) написать код типа (лучше сначало болванку)...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
PG_FUNCTION_INFO_V1(xru);

Datum xru(PG_FUNCTION_ARGS)
{
    elog (INFO, "xruuuuuuu!");

//    PG_RETURN_INT32( 0 );
}


обратите внимание на инфо макрос... (возврат тут убран)

в проект добавляете дэф файл, если нема...в нём пишите нечто...
Код: plaintext
1.
2.
3.
EXPORTS
   xru
	pg_finfo_xru

обратите внимание на двойную(!) запись...

линкуемся, если не достаёт ашников и библиотек - подключаем...

2) пэджэ админе, либо ручками делаем функцию...Важными моментами являются а) тип возврата б) наличие или отсутствие галочки (возвращает множество, пэджэадмин) в) имя функции с которой Вы её позовёте г) передаваемые параметры - их тип и кол-во д) символ линковки (в примере будет xru) е) полный путь (пока) к вашей дэлеле.

3) после этих операций достаточно дать запрос вида
"Select xru();"
и дэлеле должна грузиться... свидетельством загрузки являеться увеличенное(!) время выполнения первого запроса(!). далее время стабильно и занимает копейки. (подгрузка бинарника)...

ВАЖНЫЕ моменты(!)
1) если Вы работаете с доработкой функции ОБЯЗАТЕЛЬНО(!) закрывайте консоль где запускали Ваши селекты, которые позвали внешнюю функцию. При этом терминируется отдельный процесс(!) обслуживающий данного клиента (консоль квэри), и дэлеле можно будет перезаписать.
2) для отладки замечательно идёт студия милкософта (если под форточками) в режиме дебага. Для этого в код вставляете азмовскую вставку типа
"int 3h" (бряк отладчика)
и ПОСЛЕ(!) открытия окошечка квэри и ДО(!) первого обращения, в студии открываете аттач ту процесс и выбираете САМЫЙ КРАЙНИЙ(!) процесс "postgre.exe". После этого при выполнении кода, где стоит бряк - студия легко подхватит и позволит трэйсить потроха Вашей внешней функции. ОЧЕНЬ(!) помогает при обработки не тривиальных типах данных - рекомендую...Да и ищё - НЕ ТЕРМИНИРУЙТЕ(!) процесс, дайте сначала упасть (закрыть) квэри окошечко и после этого - можете терминировать...


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Как сделать CONVERSION на С?
    #33920129
Hordi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 kolobok0:
Да серверных С-функций у меня масса, вопросов как собрать и куда совать нет. А вот с CONVERSION проблема возникла неожиданно - после того как в последних версиях постгреса уюрали автоматическую замену неизвестных символов на пробел, потому и родилась идея писать свой CONVERSION... Примеров нет, в доке два слова об этом...

Тип возврата на ДАННОМ этапе не особо важен, т.к. она вообще не вызывается, при неправильном типе грохнулся бы посгрес, в крайнем случае видно было бы что что-то работает...

Такие дела...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как сделать CONVERSION на С?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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