BLOB Фильтр
Модератор: kdv
BLOB Фильтр
Написал BLOB фильтр.
Положил dll'ку в UDF
Выполнил DECLARE FILTER ...
Но он не работает. (Не вызывается)
Может подскажете, что я упустил в этой цепочке и где взять подробную информацию по BLOB фильтрам.
Заране спасибо
Положил dll'ку в UDF
Выполнил DECLARE FILTER ...
Но он не работает. (Не вызывается)
Может подскажете, что я упустил в этой цепочке и где взять подробную информацию по BLOB фильтрам.
Заране спасибо
Вообщем-то явно никак: я, по глупости, думал, что при совпадении исходного и результирующего подтипов он должен вызваться автоматически.kdv писал(а):как вызываешь?Но он не работает. (Не вызывается)
Единственый способ, который мне известен, явно вызвать - это применение курсора
(что-то типа этого DECLARE ВС CURSOR FOR
INSERT BLOB BLOB1 INTO TABLE1
FILTER FROM -1 TO -2; )
но как его применить, учитывая, что я использую IBX я не знаю.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Это я прекрасно понимаю. Для того и писал. Хотел хранить в одном формате, а при чтении, прозрачо дляkdv писал(а):собственно, фильтр это конвертер между разными blob_subtype.
клиента получать в другом.
Тогда возникает вопрос: возможно ли применение фильтра в хранимой процедуре (Вызов внутри хранимой процедуры)?Dimitry Sibiryakov писал(а):В IBX - никак. Фильтр указывается в bpb на уровне API. IBX эту возможность не реализует, ЕМНИП.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Это, конечно, не вселяет оптимизма, но может имеется у кого-нибудь информация о том планируется ли такая возможностьDimitry Sibiryakov писал(а):Насколько я знаю - тоже нет.
(вызова в хранимых процедурах или неявного вызова по совпадению
подтипов BLOB) в будущих версиях Interbase или Firebird (Например Firebird 2.0 или более поздних)?
Предположить можно, конечно.kdv писал(а):в Firebird 2.0 нет, в более поздних - не совсем понятно, какую "возможность" ты имеешь в виду. пример приведи - запрос и как бы оно должно работать.
Например:
1. При создании таблицы указать для каких полей какие фильтры должны срабатывать автоматически, без какого-либо дополнительного вызова.
2. Или, как вариант, в операторе SQL что-то типа такого
SELECT blob_field1 FILTRED BY <имя фильтра>,
field2, field3
FROM teble1
3. Или, если с использованием курсора, то создать курсор и хранить его в базе данных (не в процедуре или триггере).
4. Ну на крайний случай, с тем же курсором в хранимой процедуре, но без какого-либо дополнительного вызова API. Только с использованием SQL.
все это очень мутно, т.к. фильтры, повторюсь, предназначены для автоматической конвертации из одного типа блоба в другой. Фильтр, один, конвертирует только в одну сторону. Откуда и куда.
потом, вызов фильтра осуществляется хитрой конструкцией embedded sql - DECLARE CURSOR FOR READ BLOB/INSERT BLOB/FILTER FROM TO.
то есть, в SQL это недоступно. Я бы сделал на твоем месте вот что - написал бы на embedded sql вот такой кусок, и посмотрел бы, в какие вызовы API это конвертируется. Понятно, что никакие компоненты в данный момент это не поддерживают.
я бы лучше предложил разработчикам FB, чтобы фильтры звались при CAST(FIELD AS BLOB SUBTYPE X), автоматом из типа блоба FIELD в тип SUBTYPE X. возможно, это наименее проблемный вариант, чем введение каких то специальных конструкций SQL на тему совершенно нестандартных фильтров....
потом, вызов фильтра осуществляется хитрой конструкцией embedded sql - DECLARE CURSOR FOR READ BLOB/INSERT BLOB/FILTER FROM TO.
то есть, в SQL это недоступно. Я бы сделал на твоем месте вот что - написал бы на embedded sql вот такой кусок, и посмотрел бы, в какие вызовы API это конвертируется. Понятно, что никакие компоненты в данный момент это не поддерживают.
я бы лучше предложил разработчикам FB, чтобы фильтры звались при CAST(FIELD AS BLOB SUBTYPE X), автоматом из типа блоба FIELD в тип SUBTYPE X. возможно, это наименее проблемный вариант, чем введение каких то специальных конструкций SQL на тему совершенно нестандартных фильтров....
Это не совсем так. Один фильтр может и туда и обратно (в него передаются исходный и результирующие подтипы)kdv писал(а):все это очень мутно, т.к. фильтры, повторюсь, предназначены для автоматической конвертации из одного типа блоба в другой. Фильтр, один, конвертирует только в одну сторону. Откуда и куда.
Жаль, что так. Я уже подумываю передетать фильтр в UDF'ки. И использовать в представлении вместе с триггерами замещения на вставку и редактирование. Но тут вся прозрачность потеряется.kdv писал(а): то есть, в SQL это недоступно. Я бы сделал на твоем месте вот что - написал бы на embedded sql вот такой кусок, и посмотрел бы, в какие вызовы API это конвертируется. Понятно, что никакие компоненты в данный момент это не поддерживают.
Да, наверное, это более корректно. Я бы тоже предложил, знал бы как и комуkdv писал(а): я бы лучше предложил разработчикам FB, чтобы фильтры звались при CAST(FIELD AS BLOB SUBTYPE X), автоматом из типа блоба FIELD в тип SUBTYPE X.

Так и есть. База содержит большой объём "рыхлых" данны в BLOB полях.kdv писал(а):ты, часом, не паковать-распаковывать блобы собрался? Забей.И использовать в представлении вместе с триггерами замещения на вставку и редактирование.
Таблицы с такими данными использоваться должны не очень часто (даже редко), а занимают места много. Так почему же их не паковать?
Почему "забить"? Есть какие-то рациональные предпосылки отказаться от приблизительно 30%-й экономии места? Паковать в клиенте я не могу.
Здесь бы очень помог бы BLOB фильтр, но не судьба наверно. Может какой другой способ компрессии есть?
О FIBPLus я, конечно, знаю. Но мало того, что это отдельная библиотека, так это ещё и нарушает единообразный доступ к данным (из различных приложений) завязывая всё на конкретный клиент.
Что касается отдельного хранения файлов, то я не совсем понял, что конкретно имеется в виду?
1. Хранение файлов отдельно с доступом к ним минуя СУБД?
(плохой вариант, по-моему)
2. Хранение файлов отдельно с доступом к ним через СУБД, например через UDF или те же фильтры? (вариант, по-моему, тоже не особо лучше).
3. Хранение данных во внешних таблицах?
Может я упустил ещё какой-то вариант?
В моем же случае пункты 1 и 2 привли бы к появлению тысяч относительно мелких файлов.
Ниужели никто не хранит упакованные на сервере данные в BLOB полях?
Что касается отдельного хранения файлов, то я не совсем понял, что конкретно имеется в виду?
1. Хранение файлов отдельно с доступом к ним минуя СУБД?
(плохой вариант, по-моему)
2. Хранение файлов отдельно с доступом к ним через СУБД, например через UDF или те же фильтры? (вариант, по-моему, тоже не особо лучше).
3. Хранение данных во внешних таблицах?
Может я упустил ещё какой-то вариант?
В моем же случае пункты 1 и 2 привли бы к появлению тысяч относительно мелких файлов.
Ниужели никто не хранит упакованные на сервере данные в BLOB полях?
Спасибо, конечно, что обратили внимание на мою ошибку, но мне бы всё-таки хотелсь узнать какие механизмы испольуются при храненни файлов отдельно от самой базы.
Почему я считаю хранение отдельных от базы файлов с доступом к ним, например, через UDF неудачным? На мой взгляд это нарушает механизм транзакций.
Если я упускаю какой-то другой вариант с отдельными файлами, то приведите пример как это можно сделать. Заранее благодарю.
Почему я считаю хранение отдельных от базы файлов с доступом к ним, например, через UDF неудачным? На мой взгляд это нарушает механизм транзакций.
Если я упускаю какой-то другой вариант с отдельными файлами, то приведите пример как это можно сделать. Заранее благодарю.
нарушает. но иногда это бывает не надо. особенно если файлы не модифицируются. или их очень много, и к ним надо в том числе обеспечивать внешний доступ.это нарушает механизм транзакций.
В общем, совсем не улыбается перечислять тебе все то, что обсуждалось по этой теме как на этом форуме, так и на sql.ru. Твой вопрос возникает раз в полгода минимум, так что тему обмусолили уже до невозможности.
Если ты хочешь совета, то опиши, что ты хочешь сделать. Не хочешь совета - копай сам. Заранее предупрежу что в этом топике мое письмо последнее - есть другие дела...