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

Ответить