Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.04;
Скачать: CL | DM;

Вниз

BLOB как параметр UDF   Найти похожие ветки 

 
Patrick ©   (2002-06-10 13:49) [0]

Во входных параметрах UDF использую тип BLOB, UDF компилируется прекрасно. Она должна добавлять строку в поле типа BLOB.

DECLARE EXTERNAL FUNCTION ADDTOBLOB
CSTRING(256),
BLOB
RETURNS PARAMETER 2
ENTRY_POINT "AddToBlob" MODULE_NAME "FreeUDFLib.dll";

исходный текст библиотеки:

export
function InternalPutBlob(Blob: PBlob; Buffer: Pointer; Size: Integer): ULong; cdecl; export;
function AddToBlob(Value: PChar; Blob: PBlob): PBlob; cdecl; export;
.....

function InternalPutBlob(Blob: PBlob; Buffer: Pointer; Size: Integer): ULong; cdecl; export;
var
BytesToWrite: Integer;
begin
Result:= 0;
if Assigned(Blob) then
with Blob^ do
if (Assigned(BlobHandle)) and (Assigned(PutSegment))
then while (Size > 0) do begin
BytesToWrite:= Min(MaxSegmentLength, Size);
PutSegment(BlobHandle, PChar(Buffer) + Result, BytesToWrite);
Dec(Size, BytesToWrite);
Inc(Result, BytesToWrite);
end;
end;

function AddToBlob(Value: PChar; Blob: PBlob): PBlob; cdecl; export;
begin
Result:= Blob;
if Assigned(Result) and Assigned(Value) then
with Result^ do
try
if Assigned(BlobHandle) and Assigned(PutSegment) then
InternalPutBlob(Result, Value, StrLen(Value) + 1)
else
Result:= nil;
except
Result:= nil;
end;
end;


а при вызове UDF в запросе
например

update complect
set history = addtoblob("строка",history)
where complectcode = 0;

выдается ошибка
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
A fatal exception occurred during the execution of a user defined function.
cannot update old BLOB.

и причем подобное сообщение выдается при вызове любой процедуры в данной библиотеке. Ранее всё работало, но добавив вышеописанные функции, всё съехало.


 
Digitman ©   (2002-06-10 17:14) [1]

примерно так.
код InternalGetBlob() на предмет проверок, предотвращающих утечку, причесывай сам.


function InternalGetBlob(Blob: PBlob; Buffer: Pointer; Size: Integer): ULong;
var
BytesRead: Integer;
begin
Result:= 0;
if Assigned(Blob) then with Blob^ do
if Assigned(BlobHandle) and Assigned(GetSegment) then
while (Size > 0) and Boolean(GetSegment(BlobHandle, PChar(Buffer) + Result, Size, BytesRead)) do begin
Inc(Result, BytesRead);
Dec(Size, BytesRead);
end;
end;


function AddToBlob(Value: PChar; SRCBlob, DSTBlob: PBlob): PBlob; cdecl; export;
var
p: PChar;
begin
Result:= DSTBlob;
if Assigned(Result) and Assigned(Value) then
with Result^ do
try
p := nil;
if Assigned(SRCBlob) and (SRCBlob.TotalSize > 0) then begin
GetMem(p, SRCBlob.TotalSize);
SRCBlob.TotalSize := InternalGetBlob(SRCBlob, p, SRCBlob.TotalSize);
if Assigned(BlobHandle) and Assigned(PutSegment) then begin
if Assigned(p) then begin
InternalPutBlob(Result, p, SRCBlob.TotalSize);
FreeMem(p);
end;
InternalPutBlob(Result, Value, StrLen(Value) + 1);
end else
Result:= nil;
except
Result:= nil;
end;
end


DECLARE EXTERNAL FUNCTION AddToBlob
CSTRING(32767),
BLOB,
BLOB
RETURNS PARAMETER 3
ENTRY_POINT "StringToBlob" MODULE_NAME "audf.dll";







Страницы: 1 вся ветка

Текущий архив: 2002.07.04;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.008 c
1-9833
AMQ
2002-06-14 17:26
2002.07.04
JPEG in EXE


3-9710
PTE
2002-06-07 20:24
2002.07.04
Подскажите что надо сделать, что бы при коннекте к базе


6-9951
Donal_Graeme
2002-04-24 18:47
2002.07.04
HTTP-прокси - получение данных


6-9960
konrads
2002-04-22 13:35
2002.07.04
Сетевой трафик, в принципе возможно или нет контролировать его


3-9725
fofa
2002-06-10 20:05
2002.07.04
TQuery ??? Help pls....