Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как сделать CONVERSION на С?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 11:30 |
|
||
|
Как сделать CONVERSION на С?
|
|||
|---|---|---|---|
|
#18+
так 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2006, 13:59 |
|
||
|
Как сделать CONVERSION на С?
|
|||
|---|---|---|---|
|
#18+
Так а почему моя функция не вызывается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2006, 16:28 |
|
||
|
Как сделать CONVERSION на С?
|
|||
|---|---|---|---|
|
#18+
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 или ссылку на доку дать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2006, 08:46 |
|
||
|
Как сделать CONVERSION на С?
|
|||
|---|---|---|---|
|
#18+
После коннекта к серверу set client_encoding to 'WIN1251'; после этого для данного коннекта автоматом будет конвертиться с/на сервера в данном примере WIN во внутреннюю кодировку БД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2006, 12:01 |
|
||
|
Как сделать CONVERSION на С?
|
|||
|---|---|---|---|
|
#18+
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. обратите внимание на инфо макрос... (возврат тут убран) в проект добавляете дэф файл, если нема...в нём пишите нечто... Код: plaintext 1. 2. 3. обратите внимание на двойную(!) запись... линкуемся, если не достаёт ашников и библиотек - подключаем... 2) пэджэ админе, либо ручками делаем функцию...Важными моментами являются а) тип возврата б) наличие или отсутствие галочки (возвращает множество, пэджэадмин) в) имя функции с которой Вы её позовёте г) передаваемые параметры - их тип и кол-во д) символ линковки (в примере будет xru) е) полный путь (пока) к вашей дэлеле. 3) после этих операций достаточно дать запрос вида "Select xru();" и дэлеле должна грузиться... свидетельством загрузки являеться увеличенное(!) время выполнения первого запроса(!). далее время стабильно и занимает копейки. (подгрузка бинарника)... ВАЖНЫЕ моменты(!) 1) если Вы работаете с доработкой функции ОБЯЗАТЕЛЬНО(!) закрывайте консоль где запускали Ваши селекты, которые позвали внешнюю функцию. При этом терминируется отдельный процесс(!) обслуживающий данного клиента (консоль квэри), и дэлеле можно будет перезаписать. 2) для отладки замечательно идёт студия милкософта (если под форточками) в режиме дебага. Для этого в код вставляете азмовскую вставку типа "int 3h" (бряк отладчика) и ПОСЛЕ(!) открытия окошечка квэри и ДО(!) первого обращения, в студии открываете аттач ту процесс и выбираете САМЫЙ КРАЙНИЙ(!) процесс "postgre.exe". После этого при выполнении кода, где стоит бряк - студия легко подхватит и позволит трэйсить потроха Вашей внешней функции. ОЧЕНЬ(!) помогает при обработки не тривиальных типах данных - рекомендую...Да и ищё - НЕ ТЕРМИНИРУЙТЕ(!) процесс, дайте сначала упасть (закрыть) квэри окошечко и после этого - можете терминировать... удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2006, 16:20 |
|
||
|
Как сделать CONVERSION на С?
|
|||
|---|---|---|---|
|
#18+
2 kolobok0: Да серверных С-функций у меня масса, вопросов как собрать и куда совать нет. А вот с CONVERSION проблема возникла неожиданно - после того как в последних версиях постгреса уюрали автоматическую замену неизвестных символов на пробел, потому и родилась идея писать свой CONVERSION... Примеров нет, в доке два слова об этом... Тип возврата на ДАННОМ этапе не особо важен, т.к. она вообще не вызывается, при неправильном типе грохнулся бы посгрес, в крайнем случае видно было бы что что-то работает... Такие дела... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2006, 22:24 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33916986&tid=2006155]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
135ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
3ms |
| others: | 249ms |
| total: | 499ms |

| 0 / 0 |
