Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
UDF аргументы больше 256 байт (Вадим) 21/12/2011 - 12:42:44
      Re: UDF аргументы больше 256 байт (Akina) 21/12/2011 - 16:29:33
      Re: UDF аргументы больше 256 байт (Вадим) 22/12/2011 - 10:11:00
      Re: UDF аргументы больше 256 байт (Akina) 22/12/2011 - 17:03:24
      Re: И ещё... (Akina) 23/12/2011 - 09:14:34
      Re: И ещё... (Вадим) 23/12/2011 - 11:44:54
      Re: Я, конечно, в Дельфах не спец (Akina) 23/12/2011 - 22:29:18
      Re: Да! (Akina) 23/12/2011 - 22:49:37
      Re: Да! (Вадим) 26/12/2011 - 13:19:25

> Original message text:
> From: Вадим - 21/12/2011 - 12:42:44
> Subject:UDF аргументы больше 256 байт
> -----------------
> Ох и намучился я уже с UDF не могу передать аргументы длинной больше 256 байт.
> Возможно ли это в принципе?
> Среда разработки UDF (Embarcadero DELPHI 2010)
>
>


From: Вадим - 23/12/2011 - 11:44:54
Subject:И ещё...
-----------------
> Original message text:
> From: Akina - 22/12/2011 - 17:03:24
> Subject:UDF аргументы больше 256 байт
> -----------------
> У тебя контент поля value длиннее 256 байт? а какой у него тип? и как именно описана функция в библиотеке?

Да, размер поля value типа varchar длиннее 256 байт. Функция описана аналогично примеру: http://forums.mysql.com/read.php?118,57815,73364#msg-73364 (пример также вешает сервер, если длина строки больше 256).

Мой код:

library lib3;

uses
SysUtils, Classes, text_rule;

const
STRING_RESULT = 0;
REAL_RESULT = 1;
INT_RESULT = 2;
ROW_RESULT = 3;
DECIMAL_RESULT= 4;

type
my_bool = byte;
uint = LongWord;
ulong = LongWord;
ppChar = ^pansiChar; // pointer to an array of pChars
puint = ^uint; // pointer to an array of uints
pUlong = ^ulong;

ItemResult = STRING_RESULT..DECIMAL_RESULT;
pItemResult = ^ItemResult;

pByte = ^byte;
pDouble = ^Double;
pInteger = ^integer;

ItemResultArr = array [1..1000] of integer; // ItemResult;
CharArr = array [1..1000] of pAnsiChar;
uintArr = array [1..1000] of uint;
ByteArr = array [1..1000] of byte;
Int64Arr = array [1..1000] of int64;

pItemResultArr = ^ItemResultArr;
pAnsiCharArr = ^CharArr;
puintArr = ^uintArr;
pByteArr = ^ByteArr;
pInt64Arr= ^Int64Arr;

pUDF_ARGS = ^UDF_ARGS;
UDF_ARGS = packed record
arg_count : uint; // Number of arguments
arg_type : pItemResultArr; // Pointer to item_results
args : pAnsiCharArr; // Pointer to argument
lengths : puintArr; // Length of string arguments
maybe_null: pByteArr; // Set to 1 for all maybe_null args
attributes: pAnsiCharArr; // Pointer to attribute names
attribute_lengths: puintArr;// Length of attribute arguments
end;

// This holds information about the result

pUDF_INIT = ^UDF_INIT;
UDF_INIT = packed record
maybe_null: my_bool; // 1 if function can return NULL
decimals : uint; // for real functions
max_length: uint; // For string functions
ptr : pAnsiChar; // free pointer for function data
const_item: my_bool; // 0 if result is independent of arguments
end;


// _init обязательная для определения требуемой памяти

function damlev_init (initid: pUDF_INIT;
_args: pUDF_ARGS;
_message: pAnsiChar): my_bool; cdecl;
var
i: integer;

begin
result := 0;

with initid^ do
begin
// decimals := 5;
max_length := 512; //длина результата
const_item := 1;
end;

with _args^ do
for i := 1 to arg_count do
arg_type[i] := STRING_RESULT ;
end;

procedure damlev_deinit (initid: pUDF_INIT); cdecl;

begin
FreeMem(initid^.ptr);
end;


function damlev (initid: pUDF_INIT; // параметры MySQL
_args: pUDF_ARGS; // параметры MySQL
res: pAnsiChar; // только для string
len: ulong; // только для string
is_null: pByte;
is_error: pByte): pAnsiChar; cdecl;

var
a,s,t:ansistring;
n:integer;
begin

with _args^ do
try
begin
s:=pAnsiChar(copy(ansistring(args[1]),1,lengths[1])+#0); //первый аргумент - поле таблицы
t:=pAnsiChar(args[2]+#0); //второй аргумент - строка, #0 - символ конца строки pAnsiChar

n:=dam_lev2(s,t); //функция из модуля text_rule
a:=inttostr(n)+#0;
Res:=pansichar(a);
Len:=length(a); //lengths[1]; //поиск длины результата
result:=res;

end;
except
pByte(is_null)^:=1;
end;

end;

exports
damlev_init,
damlev_deinit,
damlev;
end.

> From: Akina - 23/12/2011 - 09:14:34
> Subject:И ещё...
> -----------------
> а вызов той же функции (и всей обвязки) НЕ ИЗ MySQL работает нормально?
Да. И если тип поля value меньше 256 байт всё тоже работает нормально.


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
40849



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |