powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Код возврата IBlob.GetSegment
11 сообщений из 11, страница 1 из 1
Код возврата IBlob.GetSegment
    #39965401
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 байт. Вижу такой лог

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[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
...
Рейтинг: 0 / 0
Код возврата IBlob.GetSegment
    #39965403
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот лог для сегмента 256 байт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
[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
...
Рейтинг: 0 / 0
Код возврата IBlob.GetSegment
    #39965405
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Это так и задумывалось или все таки баг?

Так и задумывалось. RESULT_SEGMENT возвращается, когда сегмент блоба в твой буфер не влез.
RESULT_OK - когда влез. Увеличь буфер до 64к и увидишь разницу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Код возврата IBlob.GetSegment
    #39965409
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Так и задумывалось. RESULT_SEGMENT возвращается, когда сегмент блоба в твой буфер не влез. RESULT_OK - когда влез.
Ясно. Думал, что RESULT_OK когда все данные прочитались, а RESULT_SEGMENT когда при чтении большого буфера достигли конца сегмента

Тогда здесь неправильный переводПоследний параметр в userFunctionAcceptingBlobData() — это флаг достижения конца сегмента — когда getSegment() возвращает код завершения RESULT_SEGMENT , о чём будет уведомлена функция (в последний параметр передан false), то есть этот сегмент прочитан не полностью, и продолжение ожидается при следующем вызове .Причем код выше соответствует фразеПоследний параметр в userFunctionAcceptingBlobData() — это флаг достижения конца сегмента 
...
Рейтинг: 0 / 0
Код возврата IBlob.GetSegment
    #39965411
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_неправильный перевод

Нет, это-то как раз абсолютно правильный перевод. И фраза тоже правильная. RESULT_SEGMENT
означает, что конец сегмента не достигнут, поскольку в буфер не влез.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Код возврата IBlob.GetSegment
    #39965417
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виноват. Фразусегмент прочитан не полностьючитал как "данные прочитаны не полностью"
...
Рейтинг: 0 / 0
Код возврата IBlob.GetSegment
    #39965420
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Readed - серьёзно???
...
Рейтинг: 0 / 0
Код возврата IBlob.GetSegment
    #39965423
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvReaded - серьёзно???

Я тоже так обычно пишу, хотя и знаю, что это не по-английски. Но получить конфликт имён с
библиотечной функцией - тот ещё геморрой в отладке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Код возврата IBlob.GetSegment
    #39965634
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот еще вопрос. isc_info_blob_max_segment показывает, что размер сегмента блоба 256 байт. Читаю его буфером в 256 байт. В итоге мне в середине блоба (после чтения 54784 байт) попадается сегмент 255 байт. А потом идут сегменты опять по 256 байт

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
[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

Как это получается? Сам блоб формируется так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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
...
Рейтинг: 0 / 0
Код возврата IBlob.GetSegment
    #39965638
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегменты читаются так как записываются. Почему PSQL пишет такими мелкими сегментами -
вопрос к разработчикам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Код возврата IBlob.GetSegment
    #39965650
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Сегменты читаются так как записываются
Спасибо
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Код возврата IBlob.GetSegment
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]