UDF Firebird. Работа со строками.

Модератор: Модераторы

UDF Firebird. Работа со строками.

Сообщение set » 27.04.2015 22:54:14

есть простенький пример DLL на Lazarus
Код: Выделить всё
library project1;

{$mode objfpc}{$H+}

uses
  Classes { you can add units after this };

  function F1(s: PChar): PChar; cdecl; export;
  begin
    Result := s;
  end;

exports F1;
begin
end.               


База данных Firebird 2.5 (UTF8)
В базе данных

Код: Выделить всё
DECLARE EXTERNAL FUNCTION TEST
    VARCHAR(255)
RETURNS VARCHAR(255)
ENTRY_POINT 'F1' MODULE_NAME 'project1';


Выполняем запрос

Код: Выделить всё
SELECT test('ddd') from rdb$database


Результат ПОЛЕ с именем "TEST" и значением "ddd" - т.е. то, что и передали.

Если немного изменить DLL, указав в качестве входного параметра тип дпнных "UTF8String"
Код: Выделить всё
function F1(s: UTF8String): PChar; cdecl; export;
  begin
    Result := PChar(s);
  end;                             

Результата такой же, как и в предыдущем случае.
Однако, если присвоить значение S к коде
Код: Выделить всё
function F1(s: UTF8String): PChar; cdecl; export;
  begin
   [b] s:='бла-бла-бла';[/b]
    Result := PChar(s);
  end;             

То получается ошибка

Код: Выделить всё
/*------ SYSDBA 27.04.2015 21:50:52 --------*/

/*!!! Ошибка !!!
Invalid token.
Malformed string.

*/

И возвращается пустой результат запроса.

Как получить результат запроса (корректный), присвоив значение переменной S в коде?
Т.е. выполнить какие-то действия в коде DLL и отобразить строку запроса.

Добавлено спустя 12 часов 52 минуты 14 секунд:
Вот, получилось.
Пример UDF, которая возвращает строку в MD5

Текст DLL
Код: Выделить всё
uses
  Classes,
  md5,
  strings { you can add units after this };



  function MD_5(s: Pchar): PChar; cdecl; export;
  var
    v:UTF8String;
  begin
    v:=strpas(s);
    v:=MD5Print(MD5String(v));
    Result := Pchar(v);

  end;

exports MD_5;


{$R *.res}

begin
  IsMultiThread := True;
end.                             


Регистрация в Firebird

Код: Выделить всё
DECLARE EXTERNAL FUNCTION TEST
    CSTRING(255)
RETURNS CSTRING(255)
ENTRY_POINT 'MD_5' MODULE_NAME 'isd_md5';


Копируем библиотеку в каталог UDF - куда установлен Firebird

Вызов функции
Код: Выделить всё
SELECT test('454fgn566') from rdb$database

Результат
Код: Выделить всё
127406ffefd4b224e2a79b7e754ab388


В принципе то, что и ожидалось.
set
новенький
 
Сообщения: 11
Зарегистрирован: 23.12.2013 14:11:29

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru