powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Передача Строки в UDF
13 сообщений из 13, страница 1 из 1
Передача Строки в UDF
    #38972283
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
Возникла необходимость написать UDF в FireBrid (Firebird 2.5.3 Win32).
Вод реализация UDF на 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.
function StrIsReservedWord(Str: PChar): SmallInt; cdecl; export;

implementation

function QBash_StrIsReservedWord(Str: PChar): SmallInt;
const Words: array[0..288] of string = 
                             ('ACTION', 'ACTIVE', 'ADD', 'ADMIN', 'AFTER', 'ALL', 'ALTER', 'AND', ...); // Далее все резервированные слова
var LFoundIndex : Integer;
     ResWord : String;
     Stream : TStringList; // Для отладка
    
begin
   ResWord := String(Str);
   Stream := TStringList.Create;
   try
     Stream.Add(ResWord);
     Stream.SaveToFile('c:\Program Files\Firebird\Firebird_2_5\UDF\Debug.txt');
   finally
     Stream.Free;
   end;
   
   if TArray.BinarySearch<String>(Words, ResWord, LFoundIndex, TStringComparer.Ordinal) then
    Result := 1
  else
    Result := 0;
end;



И создание в FireBrid:
Код: sql
1.
2.
3.
4.
5.
6.
DECLARE EXTERNAL FUNCTION UDF$STR_IS_RESERVED_WORD
    CSTRING(55) CHARACTER SET NONE NULL
RETURNS SMALLINT BY VALUE
ENTRY_POINT 'StrIsReservedWord' MODULE_NAME 'MyUDF';

COMMENT ON EXTERNAL FUNCTION UDF$STR_IS_RESERVED_WORD IS 'Return (1 = true) or (0 = false)';



И проверяю:
Код: sql
1.
  select UDF$STR_IS_RESERVED_WORD('DATE') from rdb$database



Результат 0

На файле Debug.txt попал вот такой текст : ??

Здесь что я не так сделал?

Функцию проверял на Delphi, отлично работает!
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972284
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На массиве Words слова 'DATE' существует!
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972300
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, Alimkulov.


Код: pascal
1.
function QBash_StrIsReservedWord(Str: PChar): SmallInt;



параметр Str передается, как PAnsiChar

С уважением, Polesov.
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972302
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
AlimkulovЗдесь что я не так сделал?
Как минимум нужно
Код: pascal
1.
function StrIsReservedWord(Str: PAnsiChar): SmallInt; cdecl; export;


Возможно ещё что-нибудь есть.

Конструкция
Код: sql
1.
CHARACTER SET NONE NULL

точно работает? Немного странная она.
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972314
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Вам ребята!

Убрал конструкцию
Код: sql
1.
CHARACTER SET NONE NULL



Переписал UDF так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function StrIsReservedWord(Str: PAnsiChar): SmallInt; cdecl; export;
const Words: array[0..288] of string = 
                             ('ACTION', 'ACTIVE', 'ADD', 'ADMIN', 'AFTER', 'ALL', 'ALTER', 'AND', ...); // Далее все резервированные слова
var LFoundIndex : Integer;
     ResWord : String;   
begin
   SetString(ResWord , Str, SizeOf(Str));   
   if TArray.BinarySearch<String>(Words, ResWord, LFoundIndex, TStringComparer.Ordinal) then
    Result := 1
  else
    Result := 0;
end;



Работает отлично!

Код: html
1.
2.
3.
4.
Поскольку в большинстве случаев вместо типа PChar можно использовать тип AnsiS-
tring, рекомендуется применять его везде, где это возможно. При этом удается из-
бежать множества неприятностей, связанных с выделением и освобождением памяти,
поскольку при работе с AnsiString компилятор берет заботу об этом на себя.
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972316
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov, я бы еще поменял бы описание массива

Код: pascal
1.
const Words: array[0..288] of AnsiString = 



Или принципиально важно, что там хранятся 2-байтовые символы?

С уважением, Polesov.
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972317
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,
Кстати, да Вы правы! Переписал.
И еще не большой совет новичкам:
Поскольку символ (Char) не является больше гарантированно однобитовым, не стоит рассчитывать, что длина строки в символах будет всегда соответствовать ее размеру в байтах. Поэтому, чтобы выяснить настоящий размер строки, используйте функцию SizeOf().
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972319
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказывается что в Delphi по умолчанию при объявлении в коде строковой переменной (тип string) компилятор полагает, что создается строка типа AnsiString:
Код: pascal
1.
2.
var
  S: string;   // Переменная S имеет тип AnsiString


Для изменения принимаемого по умолчанию типа строки используется директива компилятора $H.
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972324
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Вопрос к тем кто в курсе...
Код: sql
1.
2.
3.
4.
DECLARE EXTERNAL FUNCTION F 
VARCHAR(10) NULL 
RETURNS INTEGER BY VALUE 
ENTRY_POINT 'Func' MODULE_NAME 'Udf';


Что означает NULL?
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972333
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlimkulovОказывается что в Delphi по умолчанию при объявлении в коде строковой
переменной (тип string) компилятор полагает, что создается строка типа AnsiString:
Ты бы эта... начал пользоваться документацией к Delphi вместо статей двадцатилетней
давности, которые относятся к Delphi версии 2...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972336
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
AlimkulovОказывается что в Delphi по умолчанию при объявлении в коде строковой переменной (тип string) компилятор полагает, что создается строка типа AnsiString:
Код: pascal
1.
2.
var
  S: string;   // Переменная S имеет тип AnsiString


Для изменения принимаемого по умолчанию типа строки используется директива компилятора $H.
В новых версиях не так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TForm1.Button1Click(Sender: TObject);
var
  {$H-}
  S1: string;
  {$H+}
  S2: string;
begin
  S1 := 'xx';
  S2 := 'xx';
  ShowMessage(IntToStr(Integer(@S1[2]) - Integer(@S1[1])));
  // 2
  ShowMessage(IntToStr(Integer(@S2[2]) - Integer(@S2[1])));
  // 2
end;
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38972569
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
-Вопрос к тем кто в курсе...
Код: sql
1.
2.
3.
4.
DECLARE EXTERNAL FUNCTION F 
VARCHAR(10) NULL 
RETURNS INTEGER BY VALUE 
ENTRY_POINT 'Func' MODULE_NAME 'Udf';


Что означает NULL?
Написал про него тут: 17711684
...
Рейтинг: 0 / 0
Передача Строки в UDF
    #38973002
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Alimkulov]
Код: pascal
1.
2.
3.
4.
5.
6.
7.
   Stream := TStringList.Create;
   try
     Stream.Add(ResWord);
     Stream.SaveToFile('c:\Program Files\Firebird\Firebird_2_5\UDF\Debug.txt');
   finally
     Stream.Free;
   end;


Это самый странный способ записи строки в файл, что я когда-либо видел.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Передача Строки в UDF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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