Страница 1 из 1

Определение контекста вызова UDF ф-ции

Добавлено: 15 фев 2006, 23:56
Alexander
При реализации UDF (getvalue), многократно вытаскивающей из BLOB поля какие-то значения, например:

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

select getvalue(BLOB_FIELD,'param1') P1, getvalue(BLOB_FIELD,'param2') P2, getvalue(BLOB_FIELD,'param3') P3 from ...
,
в которой сначала производится ресурсоемкий разбор всего поля (парсинг XML), а затем быстрое получение значения, получается неэффективное повторение первоначального разбора поля...
Может ли каким нибудь образом UDF определить, что в качестве параметра в нее передано то же значение BLOB, что и для предыдущего вызова? Тогда в UDF можно было бы не вызывать разбор содержимого многократно. Если нет, то заложено ли что-нибудь подобное в будущих версиях сервера?

Добавлено: 16 фев 2006, 00:16
hvlad
Запоминай результат разбора блоба (или нескольких последних блобов) и используй повторно. Т.к. блобы не редактируются, то единственный шанс напороться на новое содержимое блоба - это его удаление, сборка мусора и вставка на его место нового блоба. Дабы избежать этого, можно передавать в UDF вместе с blob_id ещё и transaction_id.

Добавлено: 16 фев 2006, 00:45
Alexander
А как получить изнутри UDF или передать в UDF эти blob_id и transaction_id?

Добавлено: 16 фев 2006, 00:53
hvlad
У - как всё запущено ...
blob_id ты и так передаёшь. Для transaction_id заведи ещё один пар-р

Добавлено: 16 фев 2006, 09:08
Alexander
Дык, поскольку всё так запущено и обращаюсь...

Я передаю BLOB в UDF в виде var ABlob:TBlob, как оттуда получить blob_id?

C transaction_id все понятно.

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

  TBlob = record
    GetSegment: function(Handle: Pointer; Buffer: PChar;
      MaxLength: Long; var ReadLength: Long): WordBool; cdecl;
    Handle: Pointer; // BLOb handle
    SegCount, // Number of BLOb segments
    MaxSegLength, // Max length of BLOb segment
    TotalLength: Long; // Total BLOb length
    PutSegment: procedure(Handle: Pointer; Buffer: PChar;
      Length: Long); cdecl;
    // Seek : function : Long; cdecl; // I don'n know input parameters
  end;

procedure INIV_GetValue(var ABlob: TBlob; Param: PChar; v:PDSC); cdecl;