Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Код возврата IBlob.GetSegment  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Есть такой код
function InternalRead(ABuffer: PByte; ACount: Integer): Integer;
var
  LRead: Cardinal;
begin
  Result := 0;
  if ACount = 0 then
    Exit;
  repeat
    case FBlob.GetSegment(FStatus, ACount, ABuffer, @LRead) of
      IStatus.RESULT_OK:
        FLogger.Log('GetSegment. Count: %d, Readed: %d, Result: RESULT_OK', [ACount, LRead], TLogLevel.TRACE);
      IStatus.RESULT_SEGMENT:
        FLogger.Log('GetSegment. Count: %d, Readed: %d, Result: RESULT_SEGMENT', [ACount, LRead], TLogLevel.TRACE);
      IStatus.RESULT_NO_DATA:
        FLogger.Log('GetSegment. Count: %d, Readed: %d, Result: RESULT_NO_DATA', [ACount, LRead], TLogLevel.TRACE);
    end;
    Inc(Result, LRead);
    Inc(ABuffer, LRead);
    Dec(ACount, LRead);
  until (ACount <= 0) or (LRead = 0);
  Inc(FPosition, Result);
  FLogger.Log('End Read. Count: %d, Position: %d', [Result, FPosition]);
end;

Передаю в него блоб размером 13585 байт и начинаю его читать буфером по 1000 байт. Вижу такой лог

[2020-06-02 16:31:50.024( 0)][12180] DEBUG TEST - isc_info_blob_total_length: 13585
[2020-06-02 16:31:50.024( 0)][12180] DEBUG TEST - isc_info_blob_max_segment: 13585
[2020-06-02 16:31:50.024( 0)][12180] TRACE TEST - GetSegment. Count: 1000, Readed: 1000, Result: RESULT_SEGMENT
[2020-06-02 16:31:50.024( 0)][12180] DEBUG TEST - End Read. Count: 1000, Position: 1000
[2020-06-02 16:31:50.024( 0)][12180] TRACE TEST - GetSegment. Count: 1000, Readed: 1000, Result: RESULT_SEGMENT
[2020-06-02 16:31:50.024( 0)][12180] DEBUG TEST - End Read. Count: 1000, Position: 2000
...............
[2020-06-02 16:31:50.024( 0)][12180] TRACE TEST - GetSegment. Count: 1000, Readed: 1000, Result: RESULT_SEGMENT
[2020-06-02 16:31:50.024( 0)][12180] DEBUG TEST - End Read. Count: 1000, Position: 13000
[2020-06-02 16:31:50.024( 0)][12180] TRACE TEST - GetSegment. Count: 1000, Readed: 585, Result: RESULT_OK
[2020-06-02 16:31:50.024( 0)][12180] TRACE TEST - GetSegment. Count: 415, Readed: 0, Result: RESULT_NO_DATA
[2020-06-02 16:31:50.024( 0)][12180] DEBUG TEST - End Read. Count: 585, Position: 13585
Т.е. получается, что при успешном чтении возвращается RESULT_SEGMENT, а при достижении конца сегмента RESULT_OK. Это так и задумывалось или все таки баг?

С уважением, Vasilisk
2 июн 20, 17:47    [22144453]     Ответить | Цитировать Сообщить модератору
 Re: Код возврата IBlob.GetSegment  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
А вот лог для сегмента 256 байт
[2020-06-02 17:51:21.538( 1)][12268] DEBUG TEST - isc_info_blob_total_length: 68399
[2020-06-02 17:51:21.538( 1)][12268] DEBUG TEST - isc_info_blob_max_segment: 256
[2020-06-02 17:51:21.538( 2)][12268] TRACE TEST - GetSegment. Count: 1000, Readed: 256, Result: RESULT_OK
[2020-06-02 17:51:21.538( 2)][12268] TRACE TEST - GetSegment. Count: 744, Readed: 256, Result: RESULT_OK
[2020-06-02 17:51:21.538( 2)][12268] TRACE TEST - GetSegment. Count: 488, Readed: 256, Result: RESULT_OK
[2020-06-02 17:51:21.538( 2)][12268] TRACE TEST - GetSegment. Count: 232, Readed: 232, Result: RESULT_SEGMENT
[2020-06-02 17:51:21.538( 2)][12268] DEBUG TEST - End Read. Count: 1000, Position: 1000

[2020-06-02 17:51:21.538( 2)][12268] TRACE TEST - GetSegment. Count: 1000, Readed: 24, Result: RESULT_OK
[2020-06-02 17:51:21.538( 2)][12268] TRACE TEST - GetSegment. Count: 976, Readed: 256, Result: RESULT_OK
[2020-06-02 17:51:21.539( 1)][12268] TRACE TEST - GetSegment. Count: 720, Readed: 256, Result: RESULT_OK
[2020-06-02 17:51:21.539( 1)][12268] TRACE TEST - GetSegment. Count: 464, Readed: 256, Result: RESULT_OK
[2020-06-02 17:51:21.539( 1)][12268] TRACE TEST - GetSegment. Count: 208, Readed: 208, Result: RESULT_SEGMENT
[2020-06-02 17:51:21.539( 1)][12268] DEBUG TEST - End Read. Count: 1000, Position: 2000
2 июн 20, 17:55    [22144456]     Ответить | Цитировать Сообщить модератору
 Re: Код возврата IBlob.GetSegment  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

_Vasilisk_
Это так и задумывалось или все таки баг?

Так и задумывалось. RESULT_SEGMENT возвращается, когда сегмент блоба в твой буфер не влез.
RESULT_OK - когда влез. Увеличь буфер до 64к и увидишь разницу.

Posted via ActualForum NNTP Server 1.5

2 июн 20, 17:59    [22144460]     Ответить | Цитировать Сообщить модератору
 Re: Код возврата IBlob.GetSegment  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Dimitry Sibiryakov
Так и задумывалось. RESULT_SEGMENT возвращается, когда сегмент блоба в твой буфер не влез. RESULT_OK - когда влез.
Ясно. Думал, что RESULT_OK когда все данные прочитались, а RESULT_SEGMENT когда при чтении большого буфера достигли конца сегмента

Тогда здесьнеправильный перевод
Последний параметр в userFunctionAcceptingBlobData() — это флаг достижения конца сегмента — когда getSegment() возвращает код завершения RESULT_SEGMENT, о чём будет уведомлена функция (в последний параметр передан false), то есть этот сегмент прочитан не полностью, и продолжение ожидается при следующем вызове.
Причем код выше соответствует фразе
Последний параметр в userFunctionAcceptingBlobData() — это флаг достижения конца сегмента 
2 июн 20, 18:20    [22144469]     Ответить | Цитировать Сообщить модератору
 Re: Код возврата IBlob.GetSegment  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

_Vasilisk_
неправильный перевод

Нет, это-то как раз абсолютно правильный перевод. И фраза тоже правильная. RESULT_SEGMENT
означает, что конец сегмента не достигнут, поскольку в буфер не влез.

Posted via ActualForum NNTP Server 1.5

2 июн 20, 18:28    [22144473]     Ответить | Цитировать Сообщить модератору
 Re: Код возврата IBlob.GetSegment  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Виноват. Фразу
сегмент прочитан не полностью
читал как "данные прочитаны не полностью"

Сообщение было отредактировано: 2 июн 20, 18:42
2 июн 20, 18:43    [22144482]     Ответить | Цитировать Сообщить модератору
 Re: Код возврата IBlob.GetSegment  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28886
_Vasilisk_,

Readed - серьёзно???
2 июн 20, 19:05    [22144491]     Ответить | Цитировать Сообщить модератору
 Re: Код возврата IBlob.GetSegment  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

kdv
Readed - серьёзно???

Я тоже так обычно пишу, хотя и знаю, что это не по-английски. Но получить конфликт имён с
библиотечной функцией - тот ещё геморрой в отладке.

Posted via ActualForum NNTP Server 1.5

2 июн 20, 19:07    [22144494]     Ответить | Цитировать Сообщить модератору
 Re: Код возврата IBlob.GetSegment  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
А вот еще вопрос. isc_info_blob_max_segment показывает, что размер сегмента блоба 256 байт. Читаю его буфером в 256 байт. В итоге мне в середине блоба (после чтения 54784 байт) попадается сегмент 255 байт. А потом идут сегменты опять по 256 байт

[2020-06-03 12:44:59.976(31)][ 1612] DEBUG TEST - Try Read. Count: 256
[2020-06-03 12:44:59.976(31)][ 1612] TRACE TEST - GetSegment. Count: 256, Readed: 256, Result: RESULT_OK
[2020-06-03 12:44:59.976(31)][ 1612] DEBUG TEST - End Read. Count: 256, Position: 54272
[2020-06-03 12:44:59.976(31)][ 1612] DEBUG TEST - Try Read. Count: 256
[2020-06-03 12:44:59.976(31)][ 1612] TRACE TEST - GetSegment. Count: 256, Readed: 256, Result: RESULT_OK
[2020-06-03 12:44:59.976(31)][ 1612] DEBUG TEST - End Read. Count: 256, Position: 54528
[2020-06-03 12:44:59.976(31)][ 1612] DEBUG TEST - Try Read. Count: 256
[2020-06-03 12:44:59.976(31)][ 1612] TRACE TEST - GetSegment. Count: 256, Readed: 256, Result: RESULT_OK
[2020-06-03 12:44:59.976(31)][ 1612] DEBUG TEST - End Read. Count: 256, Position: 54784
[2020-06-03 12:44:59.976(31)][ 1612] DEBUG TEST - Try Read. Count: 256
[2020-06-03 12:44:59.976(31)][ 1612] TRACE TEST - GetSegment. Count: 256, Readed: 255, Result: RESULT_OK
[2020-06-03 12:44:59.976(31)][ 1612] TRACE TEST - GetSegment. Count: 1, Readed: 1, Result: RESULT_SEGMENT
[2020-06-03 12:44:59.976(31)][ 1612] DEBUG TEST - End Read. Count: 256, Position: 55040
[2020-06-03 12:44:59.976(31)][ 1612] DEBUG TEST - Try Read. Count: 256
[2020-06-03 12:44:59.976(31)][ 1612] TRACE TEST - GetSegment. Count: 256, Readed: 255, Result: RESULT_OK
[2020-06-03 12:44:59.976(31)][ 1612] TRACE TEST - GetSegment. Count: 1, Readed: 1, Result: RESULT_SEGMENT
[2020-06-03 12:44:59.976(31)][ 1612] DEBUG TEST - End Read. Count: 256, Position: 55296

Как это получается? Сам блоб формируется так
CREATE OR ALTER PROCEDURE sp_d_test
AS
DECLARE VARIABLE var_cur_blob BLOB;
DECLARE VARIABLE var_blob BLOB;
BEGIN
  var_blob = '';
  FOR
    SELECT
      "DATA"
    FROM
      mytable
    ORDER BY
      CHAR_LENGTH("DATA") DESC
    ROWS 5
    INTO
      :var_cur_blob
  DO
    var_blob = :var_blob || :var_cur_blob;
  EXECUTE PROCEDURE udr_test_blob(
    :var_blob
  );
END
3 июн 20, 13:26    [22144849]     Ответить | Цитировать Сообщить модератору
 Re: Код возврата IBlob.GetSegment  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

Сегменты читаются так как записываются. Почему PSQL пишет такими мелкими сегментами -
вопрос к разработчикам.

Posted via ActualForum NNTP Server 1.5

3 июн 20, 13:28    [22144855]     Ответить | Цитировать Сообщить модератору
 Re: Код возврата IBlob.GetSegment  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Dimitry Sibiryakov
Сегменты читаются так как записываются
Спасибо
3 июн 20, 13:51    [22144875]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить