Stream blobs: можно юзать или лучше не стоит?

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
3m
Сообщения: 13
Зарегистрирован: 05 ноя 2006, 19:48

Stream blobs: можно юзать или лучше не стоит?

Сообщение 3m » 05 ноя 2006, 20:14

Пишу приложение, используется Firebird embedded 1.5.3-win32 + IBPP.
сейчас дело дошло до полей blob. В блобах будут сохраняться бинарные данные (аудио в нестандартном формате), на чтение обязательно нужен потоковый доступ с возможностью позиционирования. Возможный объем данных в одном блобе - от единиц килобайт до десятков мегабайт (типовая запись ~0,2-0,5Мб), общий объем ограничен лишь степенью маниакальности юзера и объемом винчестера в его распоряжении. На первый взгляд для моих целей хорошо подходят Stream blobs.
Хочется узнать, нет ли в Firebird каких-либо граблей при использовании stream blobs, например:
* багов при резервном копировании и ремонте БД;
* не будет ли катастрофмчески разрастаться объем БД при наличии большого количества уничтоженных многомегабайтных blob;
* другие проблемы?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 05 ноя 2006, 22:07

по поводу "разрастаться" - как ни крути, блоб любого типа подвержен транзакционности, т.е при обновлении блоба ВСЕГДА будет создаваться в новой версии его копия, потоковый это блоб или нет.
кроме того, вроде как streamed blob нигде кроме fb 2 нет возможности использовать, да и там кажется не все гладко.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 06 ноя 2006, 11:28

позиционирование в stream-блобах ограничено 2ГБ

3m
Сообщения: 13
Зарегистрирован: 05 ноя 2006, 19:48

Сообщение 3m » 06 ноя 2006, 12:07

kdv писал(а):по поводу "разрастаться" - как ни крути, блоб любого типа подвержен транзакционности, т.е при обновлении блоба ВСЕГДА будет создаваться в новой версии его копия, потоковый это блоб или нет.
кроме того, вроде как streamed blob нигде кроме fb 2 нет возможности использовать, да и там кажется не все гладко.
Обновлений блобов не будет. Блоб 1 раз создается, потом произвольное количество раз читается в режиме произвольного доступа, после чего уничтожается (юзером или автоматически по устареванию).
dimitr писал(а):позиционирование в stream-блобах ограничено 2ГБ
2Гб на каждый блоб или на все блобы в БД?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 06 ноя 2006, 13:30

3m писал(а):
dimitr писал(а):позиционирование в stream-блобах ограничено 2ГБ
2Гб на каждый блоб или на все блобы в БД?
На каждый конечно

3m
Сообщения: 13
Зарегистрирован: 05 ноя 2006, 19:48

Сообщение 3m » 08 ноя 2006, 00:14

Немного поэкспериментировал и теперь сижу в непонятках.
У меня не получилось создать stream blob средcтвами API (в соответсвии с http://www.ibphoenix.com/main.nfs?a=ibp ... tream_blob' ).
Создаю блоб функцией Bopen c c параметром "w", пишу - putx, закрываю - BLOB_close.
Все работает, бинарные данные пишутся и читаются правильно, только блоб создается сегментированный, а не потоковый.
isc_seek_blob соотвественно не работает ругается "invalid handle", isc_blob_info рапортует, что блоб сегментированный, смотрел дамп fdb файла - четко просмативется сегментированность и заголовки сегментов.

Как все-таки правильно создавать и открывать stream blob средствами API?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 08 ноя 2006, 16:58

3m писал(а):Как все-таки правильно создавать и открывать stream blob средствами API?
Что-то типа этого :

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

const char bpb[] = {isc_bpb_version1,  isc_bpb_type, isc_bpb_type_stream};
...

isc_create_blob2(..., sizeof(bpb), bpb)

3m
Сообщения: 13
Зарегистрирован: 05 ноя 2006, 19:48

Сообщение 3m » 08 ноя 2006, 22:28

hvlad писал(а):
3m писал(а):Как все-таки правильно создавать и открывать stream blob средствами API?
Что-то типа этого :

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

const char bpb[] = {isc_bpb_version1,  isc_bpb_type, isc_bpb_type_stream};
...
isc_create_blob2(..., sizeof(bpb), bpb)
Уже разобрался, stream blob создается именно так, но чтобы писать в поток после isc_create_blob2 надо повторить все, что делается в функции Bopen (файл jrd\utl.cpp по исходнику FB1.5.3.4870).
Еще выяснилось, чт isc_seek_blob не считывает в буфер новые данные и чтобы позиционирование работало надо обнулить blob_stream->bstr_cnt, тогда следующий getb считает новые данные.
Сегодня писал тесты, пока ничего плохого не обнаружил.
Удручает полное отсутсвие документации по stream blobs. Непонятно, как люди пишут всякие компоненты для FB с поддержкой потоковых блобов.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 08 ноя 2006, 22:50

3m писал(а):
hvlad писал(а):
3m писал(а):Как все-таки правильно создавать и открывать stream blob средствами API?
Что-то типа этого :

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

const char bpb[] = {isc_bpb_version1,  isc_bpb_type, isc_bpb_type_stream};
...
isc_create_blob2(..., sizeof(bpb), bpb)
Уже разобрался, stream blob создается именно так,
Дык :)
3m писал(а):но чтобы писать в поток после isc_create_blob2 надо повторить все, что делается в функции Bopen (файл jrd\utl.cpp по исходнику FB1.5.3.4870).
Зачем вообще туда было смотреть ? BSTREAM совсем не обязателен к использованию. Я вообще не нашёл где это используется и для чего эти ф-ции в utl.cpp нужны. Какие-то осколки непонятно от чего
3m писал(а):Удручает полное отсутсвие документации по stream blobs.
Вся необходимая документация состоит из 2-х пунктов - как создавать (выше) и то, что с ним seek работает. Это всё. В остальном stream blob не отличается от segmented
3m писал(а):Непонятно, как люди пишут всякие компоненты для FB с поддержкой потоковых блобов.
Не знаю таких

3m
Сообщения: 13
Зарегистрирован: 05 ноя 2006, 19:48

Сообщение 3m » 09 ноя 2006, 13:52

hvlad писал(а):...
BSTREAM совсем не обязателен к использованию. Я вообще не нашёл где это используется и для чего эти ф-ции в utl.cpp нужны. Какие-то осколки непонятно от чего
Тем не менее если бы не ошибка в Bopen при создании блоба то все работало бы как задумывалось. (туда всего-то нужно добавить const char bpb[] = {isc_bpb_version1, isc_bpb_type, 1, isc_bpb_type_stream};).
Использование BSTREAM освобождает от необходимости написания аналогичного кода для буферизации при чтении/записи по одному байту. Если в приложении операции блочные - тогда согласен, BSTREAM не нужен.
hvlad писал(а):
3m писал(а):Непонятно, как люди пишут всякие компоненты для FB с поддержкой потоковых блобов.
Не знаю таких
Firebird PHP5 API (http://www.janus-software.com), jaybird jdbc driver и по моему есть еще среди коммерческих.

Ответить