Что такое код ifx_free_blob

ifx_create_blob

(PHP 4, PHP ifx_create_blob — Creates an blob object

Описание

Creates a blob object.

Список параметров

1 = TEXT, 0 = BYTE

0 = blob-object holds the content in memory, 1 = blob-object holds the content in file.

if mode = 0: pointer to the content, if mode = 1: pointer to the filestring.

Возвращаемые значения

Returns the new BLOB object-id, or FALSE on errors.

Смотрите также

  • ifx_copy_blob() — Duplicates the given blob object
  • ifx_free_blob() — Deletes the blob object
НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

FPublisher

Web-технологии: База знаний

Документация PHP

ifx_free_blob

(No version information available, might be only in CVS)

ifx_free_blob — Deletes the blob object

Описание

bool ifx_free_blob ( int $bid )

Deletes the blobobject for the given blob object-id.

Список параметров

The BLOB object id.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Смотрите также

Последние поступления:

ТехЗадание на Землю

Размещена 14 марта 2020 года

Пpоект Genesis (из коpпоpативной пеpеписки)

Шпаргалка по работе с Vim

Размещена 05 декабря 2020 года

Vim довольно мощный редактор, но работа с ним не всегда наглядна.
Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.

Ошибка: Error: Cannot find a val >Размещена 13 сентабря 2020 года

Если возникает ошибка на centos 5 вида
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/

Linux Optimization

Размещена 30 июля 2012 года

Что такое код ifx_free_blob

Объект Blob представляет из себя объект наподобие файла с неизменяемыми, необработанными данными. Blob-ы представляют данные, которые могут быть не в родном формате JavaScript. Интерфейс File основан на Blob , наследует функциональность Blob и расширяет его для поддержки файлов на стороне пользователя.

Для создания Blob не из blob-ных объектов и данных, используйте конструктор Blob() . Для того чтобы создать blob из подмножества данных из другого blob-а, используйте метод slice() . Для того чтобы получить объект Blob для файла на пользовательской файловой системе, смотрите докуметацию File .

API принимающие Blob объекты также перечислены в документации File .

Заметка: Метод slice() имеет изначально задаваемую длину как второй аргумент, что используется для указания числа байт копируемых в новый Blob. Если указать такие параметры start + length , которые превышают размер исходного Blob , то возвращаемый Blob будет содержать данные от начального индекса (start index) до конца исходного Blob.

Конструктор

Свойства

Методы

Примеры

Пример использования конструктора Blob

Blob() constructor позволяет создавать blob-ы из других объектов. Например, чтобы сконструировать blob из строки:

До того как конструктор Blob стал доступен, это могло быть выполнено через устаревший API BlobBuilder :

Пример для создания URL для типизированного массива используя blob

Пример извлечения данных из Blob

Есть только один способ прочесть содержимое из Blob-а — это использовать FileReader . Следующий код читает содержимое Blob-а как типизированный массив.

Используя другие методы FileReader , возможно прочесть содержимое blob-а как строку или как data URL.

blob code

Англо-русский словарь промышленной и научной лексики . 2014 .

Смотреть что такое «blob code» в других словарях:

Binary blob — In open source culture, binary blob is a pejorative term for an object file loaded into the kernel of a free or open source operating system without publicly available source code. The term is not usually applied to code running outs >Wikipedia

Opaque binary blob — (OBB) is a term used in network engineering and computer science to refer to a sizeable piece of data, which looks like binary garbage from outs >Wikipedia

de Blob — North American Wii cover art Developer(s) Blue Tongue Entertainment (Wii) Universomo (iOS) Helixe (DS) Publisher(s) … Wikipedia

Google Code — Not to be confused with Google Code Search. Google Code Google Code URL code.google.com … Wikipedia

Comparison of relational database management systems — Programming language comparisons General comparison Basic syntax Basic instructions Arrays Associative arrays String operations … Wikipedia

Список свободных игр — Основная статья: Свободные игры Это список игр, исходный код которых является свободным программным обеспечением. Он включает несколько типов свободных игр: изначально выпущенных как свободные (free software) и бывших платных, код для которых был … Википедия

Manaul — Title Manaul Description Crypt >Wikipedia

Tikbalang — Title Tikbalang the demon horse Description The Benevolent horse … Wikipedia

Что такое URL-адрес blob и почему он используется?

У меня очень много проблем с URL-адресом blob.

Я искал src видео-тега на YouTube, и я обнаружил, что видео src было похоже:

Я открыл URL-адрес blob, который был в src видео, он дал ошибку, и я не могу открыть, но работал с тегом src . Как это возможно?

  • Что такое URL-адрес blob?
  • Почему он используется?
  • Могу ли я создать свой собственный URL-адрес blob на сервере?
  • Если у вас есть дополнительные сведения

URL-адреса Blob (ref W3C , официальное имя) или Object-URLs (ссылка MDN и имя метода) используются с объектом Blob или File .

src = «blob: https: //crap.crap » Я открыл url blob, который был в src видео, он дал ошибку, и я не могу открыть, но работал с тегом src, как это возможно?

URL-адреса Blob могут генерироваться только браузером. URL.createObjectURL() создаст специальную ссылку на объект Blob или File, который позже может быть выпущен с помощью URL.revokeObjectURL() . Эти URL-адреса могут использоваться только локально в одном экземпляре браузера и в том же сеансе (т. Е. В жизни страницы / документа).

Что такое URL-адрес blob?
Почему он используется?

URL-адрес Blob URL / Object – псевдопротокол, позволяющий использовать объекты Blob и File в качестве источника URL-адреса для таких вещей, как изображения, ссылки для загрузки для двоичных данных и т. Д.

Например, вы не можете передать исходные байтовые данные объекта Image, поскольку он не знал, что с ним делать. Для загрузки URL-адресов требуется, например, изображения (которые являются двоичными данными). Это относится ко всему, что требует URL-адреса в качестве источника. Вместо того, чтобы загружать двоичные данные, затем отсылайте их обратно через URL-адрес, лучше использовать дополнительный локальный шаг, чтобы иметь возможность напрямую обращаться к данным, не проходя через сервер.

Это также лучшая альтернатива Data-URI, которые являются строками, закодированными как Base-64 . Проблема с Data-URI заключается в том, что каждый символ принимает два байта в JavaScript. Кроме того, из-за кодировки Base-64 добавляется 33%. Blobs – это чистые двоичные байт-массивы, которые не имеют значительных служебных данных, как Data-URI, что делает их более быстрыми и меньшими для обработки.

Могу ли я создать свой собственный код blob на сервере?

Нет, URL-адреса Blob / URL-адреса объектов могут быть сделаны только внутри браузера. Вы можете сделать Blobs и получить объект File через API чтения файлов, хотя BLOB просто означает Binary Large OBject и хранится в виде байтовых массивов. Клиент может запросить отправку данных как ArrayBuffer или как Blob. Сервер должен отправлять данные как чистые двоичные данные. Базы данных часто используют Blob для описания двоичных объектов, и в основном мы говорим в основном о байтовых массивах.

если у вас есть дополнительная информация

Вам необходимо инкапсулировать двоичные данные как объект BLOB, а затем использовать URL.createObjectURL() для создания локального URL-адреса для него:

Обратите внимание, что URL может быть префикс в webkit-браузерах, поэтому используйте:

Что такое URL-адрес blob? Почему он используется?

BLOB – это просто последовательность байтов. Браузер распознает его как поток байтов. Он используется для получения байтового потока из источника.

Объект Blob представляет собой файловый объект неизменных необработанных данных. Blob представляют собой данные, которые не обязательно в формате JavaScript. Интерфейс File основан на Blob, наследует функциональность blob и расширяет ее для поддержки файлов в системе пользователя.

Могу ли я создать свой собственный код blob на сервере?

Что такое код ifx_free_blob

(PHP 3 >= 3.0.4, PHP 4, PHP 5)

ifx_free_blob — Deletes the blob object

Description int ifx_free_blob ( int bid )

Deletes the blobobject for the given blob object-id bid . Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Пред. Начало След.
ifx_fieldtypes Уровень выше ifx_free_char

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

XLIV. Функции Informix

Драйвер Informix для Informix (IDS) 7.x, SE 7.x, Universal Server (IUS) 9.x и IDS 2000 реализован в «ifx.ec» и «php3_ifx.h» в директории расширения informix. Поддержка IDS 7.x весьма основательна, с полной поддержкой столбцов BYTE и TEXT. Поддержка IUS 9.x частично завершена: введены новые типы данных, но поддержка SLOB и CLOB всё ещё в стадии разработки.

Замечания по конфигурации: вам необходима версия ESQL/C для компиляции драйвера Informix для РНР. ESQL/C версии с 7.2x должны работать нормально. ESQL/C является теперь частью Informix Client SDK.

Убедитесь, что переменная «INFORMIXDIR» установлена и что $INFORMIXDIR/bin имеется в вашей переменной окружения PATH, прежде чем запускать скрипт «configure».

Примечание: скрипт configure будет автоматически определять директории библиотек и include, если вы запустите configure —with_informix=yes . Вы можете переопределить это автоопределение, специфицировав «IFX_LIBDIR», «IFX_LIBS» и «IFX_INCDIR» в окружении. Скрипт configure также попытается определить версию вашего сервера Informix. Он установит переменную условной компиляции «HAVE_IFX_IUS», если ваша версия Informix >= 9.00.

Примечание: убедитесь, что переменные окружения Informix INFORMIXDIR и INFORMIXSERVER доступны для PHP ifx-драйвера и что директория INFORMIX bin находится в PATH. Проверьте это, запустив скрипт, содержащий вызов phpinfo() , прежде чем начать тестирование. На выводе phpinfo() эти переменные должны быть перечислены. Это TRUE как для CGI php, так и для Apache mod_php. Вам может понадобиться установить эти переменные окружения в стартовом скрипте вашего Apache.

Совместно используемые библиотеки Informix также должны быть доступны загрузчику (проверьте LD_LINBRARY_PATH или ld.so.conf/ldconfig).

Некоторые замечания об использовании BLOB’ов (столбцы TEXT и BYTE): BLOB’ы нормально адресуются BLOB-идентификаторами. Запросы выборки возвращают «blob даст вам filename. Используйте нормальный I/O файлов для получения содержимого blob.

Для запросов insert/update вы обязаны создать эти «blob id’ы» самостоятельно с помощью » ifx_create_blob() ;». Затем подключите blob id’ы в массив и заместите blob-столбцы знаком вопроса (?) в строке запроса. Для update/insert вы ответственны за установку blob-содержимого с помощью ifx_update_blob() .

Поведение BLOB-столбцов может быть изменено переменными конфигурации, что также можно сделать на этапе прогона программы:

переменная конфигурации : ifx.textasvarchar

переменная конфигурации : ifx.byteasvarchar

ifx_textasvarchar(0) : использовать blob id’ы для select-запросов со столбцами TEXT

ifx_byteasvarchar(0) : использовать blob id’ы для select-запросов со столбцами BYTE

ifx_textasvarchar(1) : возвращать столбцы TEXT, как если бы они были столбцами VARCHAR, чтобы вам не нужно было использовать blob id’ы дляselect-запросов

ifx_byteasvarchar(1) : возвращать столбцы BYTE, как если бы они были столбцами VARCHAR, чтобы вам не нужно было использовать blob id’ы для select-запросов

переменная конфигурации : ifx.blobinfile

ifx_blobinfile_mode(0) : возвращать столбцы BYTE в памяти, blob id позволяет получать содержимое

ifx_blobinfile_mode(1) : возвращать столбцы BYTE в файле, blob id позволяет получать имя файла

Если вы устанавливаете для ifx_text/byteasvarchar значение 1, вы можете использовать столбцы TEXT и BYTE в select-запросах, как нормальные (но всё же long) поля VARCHAR. Поскольку все строки «подсчитаны» в PHP, он остаётся «binary safe». Вы обязаны обработать это корректно. Возвращаемые данные могут содержать всё что угодно, вы отвечаете за содержимое.

Если вы устанавливаете для ifx_blobinfile значение 1, используйте имя файла, возвращаемое ifx_get_blob(..), для получения blob-содержимого. Заметьте, что в этом случае ВЫ ОТВЕЧАЕТЕ ЗА УДАЛЕНИЕ ВРЕМЕННЫХ ФАЙЛОВ, СОЗДАННЫХ INFORMIX, когда извлекаете ряды. Каждый новый извлечённый ряд создаст новый временный файл для каждого столбца BYTE.

Размещение временных файлов может быть настроено переменной окружения «blobdir», по умолчанию «.» (текущая директория). Что-то вроде putenv(blobdir=tmpblob»); облегчит зачистку временных файлов, случайно пропущенных (имена их всех начинаются с «blb»).

Автоматическая доводка «char»-данных (SQLCHAR и SQLNCHAR): это можно установить переменной окружения

ifx.charasvarchar : если установлено 1, ведомые пробелы автоматически удаляются, давая вам некоторое подобие «отсечения/chopping».

NULL -значения: переменная конфигурации ifx.nullformat (и функция времени выполнения ifx_nullformat() ), если установлена в TRUE , возвратит NULL -столбцы как строку » NULL «, если установлена FALSE , они возвратят пустую строку. Это позволяет вам выбирать между NULL -столбцами и пустыми столбцами.

Это расширение не определяет никаких констант.

Новые книги

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

Книга позволит вам, даже не имея специальных знаний, создать очередь клиентов на своем интернет-сайте.

Большинство из приведенных в ней примеров – это примеры из нашего опыта, а так же истории, с которыми к нам приходили клиенты, обманутые горе-рекламщиками и доморощенными сайтостроителями.

Структура книги повторяет алгоритм, по которому мы создаем

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

интернет-сайты, посещаемые, продающие и наполненные качественной информацией.

XLIV. Функции Informix

Драйвер Informix для Informix (IDS) 7.x, SE 7.x, Universal Server (IUS) 9.x и IDS 2000 реализован в «ifx.ec» и «php3_ifx.h» в директории расширения informix. Поддержка IDS 7.x весьма основательна, с полной поддержкой столбцов BYTE и TEXT. Поддержка IUS 9.x частично завершена: введены новые типы данных, но поддержка SLOB и CLOB всё ещё в стадии разработки.

Замечания по конфигурации: вам необходима версия ESQL/C для компиляции драйвера Informix для РНР. ESQL/C версии с 7.2x должны работать нормально. ESQL/C является теперь частью Informix Client SDK.

Убедитесь, что переменная «INFORMIXDIR» установлена и что $INFORMIXDIR/bin имеется в вашей переменной окружения PATH, прежде чем запускать скрипт «configure».

Примечание: скрипт configure будет автоматически определять директории библиотек и include, если вы запустите configure —with_informix=yes . Вы можете переопределить это автоопределение, специфицировав «IFX_LIBDIR», «IFX_LIBS» и «IFX_INCDIR» в окружении. Скрипт configure также попытается определить версию вашего сервера Informix. Он установит переменную условной компиляции «HAVE_IFX_IUS», если ваша версия Informix >= 9.00.

Примечание: убедитесь, что переменные окружения Informix INFORMIXDIR и INFORMIXSERVER доступны для PHP ifx-драйвера и что директория INFORMIX bin находится в PATH. Проверьте это, запустив скрипт, содержащий вызов phpinfo() , прежде чем начать тестирование. На выводе phpinfo() эти переменные должны быть перечислены. Это TRUE как для CGI php, так и для Apache mod_php. Вам может понадобиться установить эти переменные окружения в стартовом скрипте вашего Apache.

Совместно используемые библиотеки Informix также должны быть доступны загрузчику (проверьте LD_LINBRARY_PATH или ld.so.conf/ldconfig).

Некоторые замечания об использовании BLOB’ов (столбцы TEXT и BYTE): BLOB’ы нормально адресуются BLOB-идентификаторами. Запросы выборки возвращают «blob даст вам filename. Используйте нормальный I/O файлов для получения содержимого blob.

Для запросов insert/update вы обязаны создать эти «blob id’ы» самостоятельно с помощью » ifx_create_blob() ;». Затем подключите blob id’ы в массив и заместите blob-столбцы знаком вопроса (?) в строке запроса. Для update/insert вы ответственны за установку blob-содержимого с помощью ifx_update_blob() .

Поведение BLOB-столбцов может быть изменено переменными конфигурации, что также можно сделать на этапе прогона программы:

переменная конфигурации : ifx.textasvarchar

переменная конфигурации : ifx.byteasvarchar

ifx_textasvarchar(0) : использовать blob id’ы для select-запросов со столбцами TEXT

ifx_byteasvarchar(0) : использовать blob id’ы для select-запросов со столбцами BYTE

ifx_textasvarchar(1) : возвращать столбцы TEXT, как если бы они были столбцами VARCHAR, чтобы вам не нужно было использовать blob id’ы дляselect-запросов

ifx_byteasvarchar(1) : возвращать столбцы BYTE, как если бы они были столбцами VARCHAR, чтобы вам не нужно было использовать blob id’ы для select-запросов

переменная конфигурации : ifx.blobinfile

ifx_blobinfile_mode(0) : возвращать столбцы BYTE в памяти, blob id позволяет получать содержимое

ifx_blobinfile_mode(1) : возвращать столбцы BYTE в файле, blob id позволяет получать имя файла

Если вы устанавливаете для ifx_text/byteasvarchar значение 1, вы можете использовать столбцы TEXT и BYTE в select-запросах, как нормальные (но всё же long) поля VARCHAR. Поскольку все строки «подсчитаны» в PHP, он остаётся «binary safe». Вы обязаны обработать это корректно. Возвращаемые данные могут содержать всё что угодно, вы отвечаете за содержимое.

Если вы устанавливаете для ifx_blobinfile значение 1, используйте имя файла, возвращаемое ifx_get_blob(..), для получения blob-содержимого. Заметьте, что в этом случае ВЫ ОТВЕЧАЕТЕ ЗА УДАЛЕНИЕ ВРЕМЕННЫХ ФАЙЛОВ, СОЗДАННЫХ INFORMIX, когда извлекаете ряды. Каждый новый извлечённый ряд создаст новый временный файл для каждого столбца BYTE.

Размещение временных файлов может быть настроено переменной окружения «blobdir», по умолчанию «.» (текущая директория). Что-то вроде putenv(blobdir=tmpblob»); облегчит зачистку временных файлов, случайно пропущенных (имена их всех начинаются с «blb»).

Автоматическая доводка «char»-данных (SQLCHAR и SQLNCHAR): это можно установить переменной окружения

ifx.charasvarchar : если установлено 1, ведомые пробелы автоматически удаляются, давая вам некоторое подобие «отсечения/chopping».

NULL -значения: переменная конфигурации ifx.nullformat (и функция времени выполнения ifx_nullformat() ), если установлена в TRUE , возвратит NULL -столбцы как строку » NULL «, если установлена FALSE , они возвратят пустую строку. Это позволяет вам выбирать между NULL -столбцами и пустыми столбцами.

Это расширение не определяет никаких констант.

Delphi-Help

Работа с BLOB-полями в клиентских приложениях InterBase и Firebird на основе компонентов FIBPlus

  • размер шрифта уменьшить размер шрифтаувеличить размер шрифта
  • Печать

Работа с BLOB-полями в клиентских приложениях InterBase и Firebird на основе компонентов FIBPlus

Достаточно часто желательно хранить в базе данных разнообразные неструктурированные данные: изображения, OLE-объекты, звук и т.д. Специально для этих целей существует специальный тип данных — BLOB. Прежде чем рассматривать работу FIBPlus с полями этого типа на примерах, вспомним о том, как сам сервер реализовывает работу с ними. Важно знать и помнить следующее: В отличие от всех других полей, данные BLOB поля не хранятся непосредственно в записи таблицы. В записи таблицы хранится лишь идентификатор BLOB (BLOB_ID), а само тело BLOB хранится на отдельных страницах базы данных и доступ к ним осуществляется специальными функциями IB API. Эта особенность позволяет хранить в BLOB полях данные нефиксированного размера. FIBPlus максимально скрывает эти нюансы непосредственно от разработчика, от вас не требуется самостоятельно вызывать вышеупомянутые функции IB API, но, тем не менее, полезно знать, что происходит «за кулисами» .

Итак, продемонстрируем использование BLOB-полей на примере следующей таблицы:

Использование TpFIBDataSet при работе с BLOB-полями

Рис . 1. Внешний вид формы приложения для работы с BLOB-полями.

Для вывода изображений, сохраненных в поле GRAPHIC, мы будем использовать стандартный компонент DBIMage1: TDBImage. Очевидно также, что запросы при работе с BLOB-полями внешне ничем не отличаются от запросов со стандартными типами полей:

Нюансы при чтении:

Сразу же акцентируем внимание на первом скрытом нюансе. Выполнение «SELECT * FROM BIOLIFE» не вычитывает данные из BLOB полей на клиента. В поле «GRAPHIC» возвращается идентификатор BLOB’a. Далее «за кулисами» происходит следующее: Компонент DBImage1 хочет отобразить содержимое поля из первой записи. Он обращается к pFIBDataSet1 за этим содержимым, и тот «втайне» от нас обращается к серверу через специальные функции IB API непосредственно за телом BLOB поля, пользуясь Blob_ID поля из ПЕРВОЙ записи. Таким образом, мы должны понимать, что в отображенной на иллюстрации ситуации мы «вытащили» на клиента содержимое BLOB поля только первой записи. По мере скроллирования по записям в TpFIBDataSet, DBImage1 будет обращаться за данными других записей, и эти обращения будут транслироваться к серверу.

Нюансы при модификации:

BLOB- поля в TFIBDataSet представлены потомками от TBlobField , и как следствие, наследуют четыре специальных метода модификации таких полей: методы LoadFromFile, LoadFromStream, SaveToFile и SaveToStream.

Первый метод (LoadFromFile) используется для сохранения в поле данных из внешнего файла, второй (LoadFromStream) — для сохранения из любого объекта типа TStream.

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

Обратите внимание на важный момент: перед тем, как присваивать значение BLOB-полю, необходимо перевести pFIBDataSet в состояние редактирования данных. В данном случае это делается безусловным вызовом метода Edit. После загрузки данных остается только сохранить изменения вызовом метода Post.

Второй важный момент — необходимо прописать явное приведение поля к типу TBlobField. Дело в том, что FieldByName возвращает объект типа TField, а он не имеет нужных нам методов.

Помимо специальных методов LoadFromXXX, для модификации BLOB полей можно использовать и простые методы типа FieldByName(…).AsString:=’asfdsafsadfsad’;

Методами SaveToFile, SaveToStream мы можем сохранить значение BLOB-поля в некоторый внешний файл или TStream.

Пример сохранения в файл:

Пример очистки поля.

Иногда также нужно знать, является ли BLOB-поле пустым или нет. При использовании визуальных компонентов типа TDBImage мы не можем быть в этом уверены. Согласитесь, что никто не мешает нам «нарисовать» пустую картинку и сохранить ее в BLOB-поле. В этом случае, мы не сможем отличить «на глаз»: есть ли какое-то изображение в BLOB-поле, или нет. Однако мы можем написать обработчик события OnDataChange компонента DataSource1: TDataSource:

Это событие вызывается, в частности, при навигации по DBGrid1, таким образом, мы всегда можем узнать, является ли текущее поле пустым или нет.

Итак, с внешней стороной дела мы разобрались, давайте теперь заглянем «за кулисы». Что происходит при модификациях записи, содержащей BLOB поле?

Вариант 1. Если BLOB поле не изменялось в процессе редактирования, то в соответствующий параметр UPDATE SQL попадет прежний BLOB_ID. Само содержимое BLOB поля на сервер не передается.

Вариант 2. BLOB поле подверглось модификации. Фактически для записи нового содержимого производится несколько действий. Во-первых, с помощью IB API функций isc_create_blob2, isc_put_segment, isc_close_blob в базе данных сохраняется тело НОВОГО BLOB. Так же при этом действии клиент узнает и запоминает BLOB_ID для нового поля. Во-вторых, в UPDATE SQL передается этот новый BLOB_ID, и UPDATE запускается на выполнение. В-третьих (ОЧЕНЬ НЕОЧЕВИДНЫЙ НЮАНС), сервер при фиксации изменений записи ПРЕОБРАЗУЕТ полученный BLOB_ID. То есть, тот BLOB_ID, который передавался клиентом, становится негодным к повторному использованию.

Из упомянутых нюансов, можно сделать несколько практических выводов. Во-первых, для TpDataSet, в которых вы будете модифицировать BLOB поля, просто необходимо использовать опцию poRefreshAfterPost (если используются две транзакции и не используется AutoCommit, то свойство датасета «RefreshTransactionKind» должно иметь значение «tkUpdateTransaction»). При этом действии FIBPlus получит преобразованный сервером BLOB_ID и подменит им тот, который уже стал невалидным. Во-вторых, мы видим, что тело BLOB поля передается на сервер ДО выполнения модификации записи. Если по каким-либо причинам последующая модификация записи будет отвергнута сервером (например, через constraints), то при повторной попытке модификации нам придется передавать тело BLOB поля заново. Это может быть накладно и с точки зрения сетевого трафика, и с точки зрения «разбухания» базы. Поэтому иногда имеет смысл разделить два процесса: отдельным запросом делать модификации всех не BLOB полей, a после успешного завершения этих модификацй отдельно отправлять изменения BLOB полей. (для TpFIBDataSet с автогенерацией модифицирующих запросов в FIBPlus есть специальная опция, регулирующая такое поведение: AutoUpdateOptions. SeparateBlobUpdate).

Использование TpFIBQuery при работе с BLOB-полями

Если вы используете TpFIBQuery для работы с BLOB-полями, то общий принцип остается тем же — можно использовать либо файлы, либо методы работы с TStream. Например, мы можем написать следующую процедуру для сохранения всех изображений из нашей таблицы в файлы:

pFIBQuery.SQL: SELECT * FROM BIOLIFE

Примечание: Метод FN является аналогом метода FieldByName.

Смысл кода, приведенного выше, совершенно очевиден: мы получаем все записи из таблицы BIOLIFE, в цикле берем от сервера очередную запись из запроса, сохраняем в файл значение поля GRAPHIC при помощи метода SaveToFile и запрашиваем следующую запись при помощи метода Next. Аналогичным образом мы могли бы присваивать значение BLOB-параметру:

Данный пример вставляет три новые записи в таблицу BIOLIFE и сохраняет в них изображения из некоторых файлов “1.bmp”, “2.bmp” и “3.bmp”.

Примечание: поскольку в данном примере для сохранения изменений использовался метод Commit, то необходимо перезапустить приложение, чтобы увидеть вставленные записи в DBGrid1.

Поиск по BLOB полям

До сих пор мы рассматривали только операции чтения/модификации BLOB полей. Рассмотрим ситуацию, когда BLOB поля присутствуют в условиях выборки. Если BLOB параметр присутствует в where клаузе, то нужно понимать, что при выполнении запроса сравниваются не содержимое BLOB поля и параметра, а BLOB_ID поля и BLOB_ID параметра. Поэтому нам следует избегать появления BLOB параметров и не пользоваться методами LoadFromFile или LoadFromStream.
Поскольку если вы загружаете в параметр значения через TStream, в реальности вы создаете НОВЫЙ BLOB на сервере с НОВЫМ BLOB_ID. BLOB_ID получается ВРЕМЕННЫЙ, и не предназначен для сравнения с чем-либо. Поэтому сервер в ответ на такую попытку, выдает сообщение о внутренней ошибке. Если вам крайне необходимо сравнивать BLOB поле с неким содержимым, то у вас есть две возможности:

Ситуация, когда нужно найти записи, в которых BLOB поле сравнивается со строкой менее 32 Kб.

Вам необходимо присвоить искомое значение в параметр через свойство AsString. В этом случае на сервер уйдет параметр типа SQL_TEXT и сервер сам произведет необходимую конвертацию значения, необходимую для сравнения.
Например, так::

Если нужно сравнить BLOB поле со значением большим, чем 32 Кб, то придется использовать специальные udf.
Например, так::

В этом примере blobCRC -это udf, а blobCRCPas — функция Pascal.
Обе функции должны быть идентичными, то есть возвращать один и тот же результат для одних и тех же входных данных.

И последнее (почти очевидное) замечание: «Волшебная» цифра 32 Кб — это максимальный размер значений типа CHAR и VARCHAR.

Уникальные возможности FIBPlus: Client BLOB-filters. «Прозрачное» сжатие BLOB-полей..

Многие из вас знают о технологии BLOB фильтров в Firebird/InterBase. Эти пользовательские функции позволяют обрабатывать (т.е. кодировать/декодировать, сжимать и т.д.) BLOB поля на сервере прозрачно для клиентского приложения. Особенно это полезно, если вам нужно заархивировать BLOB поля в базе данных, так как для этого не нужно вносить изменения в клиентскую программу. Но, используя такой подход, вы не сможете снизить сетевой трафик, потому что сервер и приложение в любом случае будут обмениваться несжатыми полями.

В FIBPlus есть механизм клиентских BLOB фильтров, очень схожий с аналогичным механизмом на серерве. Но преимущество локальных BLOB фильтров FIBPlus в том, что они значительно снижают сетевой трафик приложения, если BLOB поле сжимается до отправки на клиентское приложение и распаковывается после того, как оно получено на клиенте. Вы можете сделать это путем регистрации двух процедур: чтения и записи BLOB полей в TpFIBDatabase. После этого FIBPlus будет автоматически использовать эти процедуры для того, чтобы обрабатывать все BLOB поля заданного типа во всех TpFIBDataSet’ах, используя один экземпляр TpFIBDatabase. Проиллюстрируем этот механизм примером:

Сначала мы создадим таблицу с BLOB полями и триггер для генерации уникальных значений первичного ключа:

Обратите внимание, что sub_type должен иметь отрицательное значение!

Примечание: «Существует несколько предопределенных подтипов BLOB, которые встроены в InterBase. Все эти подтипы имеют неотрицательные номера, например subtype 0 — это данные неопределенного типа, subtype 1 — текст, subtype 2 — BLR (Binary Language Representation, см. глоссарий и главу «Структура базы данных InterBase») и т. д. Пользователь также может определять свои подтипы BLOB, которые могут иметь отрицательные значения.». Мир InterBase, А. Ковязин, С. Востриков.

Теперь положите следующие компоненты на форму:

Свяжите компоненты FIBPlus и сгенерируйте запросы для pFIBDataSet1 (только для таблицы “BlobTable”) с SQL Generator. Получится следующая форма:

Рис.2. Приложение с использованием BLOB-фильтров FIBPlus

Напишем обработчик нажатия на кнопку:

Теперь создадим функции сжатия/распаковки BLOB полей:

Не забудьте добавить два модуля в секцию uses: zStream, IBBlobFilter. Первый модель предназначен доя создания архива с данными, второй входит в FIBPlus и отвечает за контроль над BLOB фильтрами. Теперь нам остается только зарегистрировать BLOB фильтры. Это можно сделать путем вызова функции RegisterBlobFilter. Значение первого параметра — это тип BLOB поля (в нашем случае оно равно -15). Второй и третий параметры — это функции кодирования и декодирования BLOB поля:

Запустите приложение, удалите записи, которые уже содержались в нем и добавьте новые. Вы не увидите никакой разницы, но если заглянуть на то, что реально было сохранено в BLOB поле, станет ясно, что данные были заархивированы:

Рис. 3. Данные в BLOB-поле, упакованные при помощи локального фильтра FIBPlus.

Итак, приложение отсылает на сервер (и получает с сервера) уже заархивированные BLOB поля, и, таким образом, сетевой трафик значительно снижается! Конечно, вы можете упаковывать BLOB поля, не используя вышеописанный механизм BLOB фильтров. Например, вы можете сжимать поле в процедуре Button1Click перед его сохранением, а затем распаковывать его в обработчике AfterScroll (или делать что-то подобное). Но, во-первых, предлагаемый централизованный механизм значительно упрощает ваш код (так как BLOB поля обрабатываются независимо от других частей программы), а, во-вторых, он помогает избежать типичных ошибок (например, когда вы пакуете BLOB поля в одной части программы и не делаете то же самое в другой).

Если запись «фильтрованных» BLOB осуществляется через хранимые процедуры, то в процедуре обязательно должен быть указан подтип входного параметра. Например:

В том случае, если подтип входного параметра не будет указан, при вызове этой процедуры BLOB-параметр будет иметь подтип ноль, и, соответственно, фильтрации на клиенте не произойдет.

Илон Маск рекомендует:  Что такое код dbx_connect
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL