powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Написание UDF для PostgreSQL под Windows на Delphi
4 сообщений из 4, страница 1 из 1
Написание UDF для PostgreSQL под Windows на Delphi
    #39150151
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

PostgreSQL 9.4.5 32 bit под Windows.

Потребовалось написать UDF. Т.к. C не владею, решено было использовать Delphi.

В документации упоминается обязательность наличия магического блока PG_MODULE_MAGIC.
Для обеспечения его наличия портируем в Delphi из модуля fmgr.h описание структуры:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type
  Pg_magic_struct = packed record
    len          : integer; // sizeof(this struct)
    version      : integer; // PostgreSQL major version
    funcmaxargs  : integer; // FUNC_MAX_ARGS
    indexmaxkeys : integer; // INDEX_MAX_KEYS
    namedatalen  : integer; // NAMEDATALEN
    float4byval  : integer; // FLOAT4PASSBYVAL
    float8byval  : integer; // FLOAT8PASSBYVAL
  end;
  Pg_magic_struct_ptr = ^Pg_magic_struct;



И реализуем экспортируемую функцию Pg_magic_func, которая по сути является сигнатурной и без нее подключить DLL не получится:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
function Pg_magic_func : Pg_magic_struct_ptr; assembler; export;
const
  Pg_module_magic_data : Pg_magic_struct =
    (len:28; version:904; funcmaxargs:100; indexmaxkeys:32; namedatalen:64; float4byval:1; float8byval:0);
asm
    Lea    EAX,  Pg_module_magic_data
end;



Модуль pg_config.h содержит значения, которыми заполняем поля типизированной константы Pg_module_magic_data. Думаю, от версии к версии их значения могут отличаться.

Далее реализуем собственно UDF:
Код: pascal
1.
2.
3.
4.
5.
6.
function my_first_udf( aparam : pAnsiChar ) : integer; cdecl; export;
begin
  :
  :
  Result := 1;
end;


В моеv случае требовалась передача а UDF одного строкового параметра. В DLL тип параметра указывается pAnsiChar, а в PostgreSQL - cstring.

Собственно, заготовка для написания DLL на Delphi:
Код: pascal
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.
library my_first_dll;

type
  Pg_magic_struct = packed record
    len          : integer; // sizeof(this struct)
    version      : integer; // PostgreSQL major version
    funcmaxargs  : integer; // FUNC_MAX_ARGS
    indexmaxkeys : integer; // INDEX_MAX_KEYS
    namedatalen  : integer; // NAMEDATALEN
    float4byval  : integer; // FLOAT4PASSBYVAL
    float8byval  : integer; // FLOAT8PASSBYVAL
  end;
  Pg_magic_struct_ptr = ^Pg_magic_struct;

function Pg_magic_func : Pg_magic_struct_ptr; assembler; export;
const
  Pg_module_magic_data : Pg_magic_struct =
    (len:28; version:904; funcmaxargs:100; indexmaxkeys:32; namedatalen:64; float4byval:1; float8byval:0);
asm
    Lea    EAX,  Pg_module_magic_data
end;

function my_first_udf( aparam : pAnsiChar ) : integer; cdecl; export;
begin
  :
  :
  Result := 1;
end;

exports
  Pg_magic_func,
  my_first_udf;

end.



Для регистрации UDF запускаем скрипт:
Код: plsql
1.
2.
3.
4.
5.
CREATE OR REPLACE FUNCTION
  my_first_udf ( aparam cstring )
RETURNS integer AS
'my_first_udf', 'my_first_dll'
LANGUAGE C STRICT VOLATILE COST 100;



Собственно, это все. Буду признателен, если кто укажет на ошибки и несоответствия.

С уважением, Polesov.
...
Рейтинг: 0 / 0
Написание UDF для PostgreSQL под Windows на Delphi
    #39150154
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибся: в объявлении функции первым указывается имя модуля my_first_dll , затем экспортируемое имя функции my_first_udf

Код: plsql
1.
2.
3.
4.
5.
CREATE OR REPLACE FUNCTION
  my_first_udf ( aparam cstring )
RETURNS integer AS
'my_first_dll', 'my_first_udf'
LANGUAGE C STRICT VOLATILE COST 100;
...
Рейтинг: 0 / 0
Написание UDF для PostgreSQL под Windows на Delphi
    #39150525
uranic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так заработала dll или нет?
...
Рейтинг: 0 / 0
Написание UDF для PostgreSQL под Windows на Delphi
    #39150693
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uranic, заработала.

Но я не разобрался в соглашениях о передаче параметров другого типа, например при объявлении в postrges тип параметра как varchar в UDF передается значение в виде 4-байтового integer, за которым следует собственно текстовое значение. Величина в 4-х байтовом integer не соответствует длине передаваемого в UDF текста, и сам текст не заканчивается ASCIIZ. В общем, еще предстоит разбираться. Но при объявлении типа как cstring все передается корректно.

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


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