Doctor пишет:
Теперь осталось узнать, как получить в
UDF параметры
status_vector,
&db_handle,
&trans
для вызова API-функции isc_create_blob2
- и, думаю, всё получится.
Антон, не надо вызывать isc_create_blob2.
Вот описанные структуры:
TISC_BlobGetSegment = function(BlobHandle: PInt;
Buffer: PChar;
BufferSize: Long;
var ResultLength: Long): Short; cdecl;
TISC_BlobPutSegment = procedure(BlobHandle: PInt;
Buffer: PChar;
BufferLength: Short); cdecl;
TBlob = packed record
GetSegment : TISC_BlobGetSegment;
BlobHandle : PInt;
SegmentCount : Long;
MaxSegmentLength : Long;
TotalSize : Long;
PutSegment : TISC_BlobPutSegment;
end;
В выше описанной процедуре:
procedure String2Blob(VChar: PChar; const BLOB: TBLOB); cdecl; export;
параметр BLOB - это _уже инициализированная_ структура TBLOB c
BLOB.TotalSize = 0. Т. е. мы можем записать блоб последовательно вызывая
BLOB.PutSegment.
Вот обратный случай:
/* Записывает Blob в VarChar
DECLARE EXTERNAL FUNCTION UDF_BLOB2STRING
BLOB
RETURNS VARCHAR(32765) FREE_IT
ENTRY_POINT 'Blob2String' MODULE_NAME 'RSUDF';
*/
function Blob2String(const BLOB: TBLOB): PChar; cdecl; export;
Этот BLOB изменять нельзя, зато можно читать (BLOB.GetSegment).
Т. е. если ты хочешь изменить блоб в UDF, то ты должен передать туда два
параметра: один "старый" и один "новый".
Если ты хочешь склеить два блоба в UDF, то ты должен передать туда три
параметра: два "старых" и один "новый".
И т. д.
--
Удачи!
Shiliaev Ruslan