BLOB и UDF

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
ivl
Сообщения: 59
Зарегистрирован: 22 мар 2006, 15:29

BLOB и UDF

Сообщение ivl » 04 июл 2006, 12:58

Столкнулся со странной проблемой: при попытке прочитать содержимое BLOB в собственной UDF функции получаю только 2^14 байт правильно, вместо остальных получаю нули. Если размер BLOB меньше 2^14, то всё нормально.
Может быть кто-нибудь подскажет в чем может быть проблема.

Заранее благодарю.

P.s. Используется Firebird 1.5.3, пример написания BLOB UDF взят с этого сайта

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 июл 2006, 15:09

Заранее благодарю.
не благодари. "функция с сайта" - это что конкретно? Она работает?

ivl
Сообщения: 59
Зарегистрирован: 22 мар 2006, 15:29

Сообщение ivl » 04 июл 2006, 15:30

"функция с сайта" - это что конкретно?
Пример написания BLOB UDF взят из статьи "Как научиться писать UDF для InterBase за 21 мин."
Хотя нет, подзабыл я.
Лучше я приведу фрагмент исходного кода который присутствует у меня

Код: Выделить всё

// Это вспомагательная функция
procedure BlobAsBuffer(Blob: PBlob; var Buffer: PChar; var BufferLength: Integer); cdecl;
var
  bytes_read, bytes_left, total_bytes_read: Integer;
begin
  with Blob^ do
  begin
    Buffer:=SysGetMem(TotalSize);
    total_bytes_read:=0;
    bytes_left:=TotalSize;
    BufferLength:=TotalSize;
    if (bytes_left = 0) then exit;
    repeat
      GetSegment(BlobHandle, @Buffer[total_bytes_read], bytes_left, bytes_read);
      Inc(total_bytes_read, bytes_read);
      Dec(bytes_left, bytes_read);
    until bytes_left <= 0;
  end;
end;


// Это главная функция
procedure MyFunction(InBlob, OutBlob: PBlob); cdecl; export;
var
  InBuffer: PChar;
begin
  OutBuffer:=nil;
  if (not Assigned(InBlob)) or
     (not Assigned(InBlob^.BlobHandle)) or
     (InBlob^.TotalSize=0) then exit;
  BlobAsBuffer(InBlob, InBuffer, InBufferLength);

//  В этом месте содержимое InBuffer содержит только 2^14 
// правильных байт,  остальная часть буфера содержит нули
 


ivl
Сообщения: 59
Зарегистрирован: 22 мар 2006, 15:29

Сообщение ivl » 07 июл 2006, 11:20

Ошибка мною найдена.
В используемом у меня модуле ib_externals было некорректное описание
функции GetSegment, а именно типов параметров BufferSize и ResultLength.
Если я бы был внимательнее, то наверно обратил бы внимание на это
freeudflib.zip (176K), 05.06.2001, Greg Deatz & C. Valderrama.
by KDV - 05.06.2003 исправлены декларация getsegment, функции

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 07 июл 2006, 11:31

GetSegment
которая была исправлена мной в FreeUDFLib очень давно. в udfdemo - да, не правил.

Ответить