Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.07.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.006 c
3-9720
Corte ™
2002-06-11 12:07
2002.07.04
Может кто нить знает как организовать контекстный поиск в гриде


14-9974
Anatoly Shkodin
2002-06-01 11:30
2002.07.04
о flash


4-10053
minstrel
2002-04-26 14:55
2002.07.04
Соединение через модем


1-9793
I am
2002-06-22 11:35
2002.07.04
Вопрос по кнопкам типа


3-9737
lak_b
2002-06-11 23:57
2002.07.04
IB





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский