Загрузка рисунков в БД

В процессе работы, достаточно часто возникает ситуация, когда работать приходится не только со стандартными типами данных в базе, но и с изображениями, звуками и другими неструктурированными объектами. При этом можно выделить два основных подхода к хранению подобной информации: 1. В БД хранится только путь к файлу, сам файл хранится на жестком диске. 2. Весь объект хранится в БД в сециальном поле с типом blob
В ряде серверов БД, например Micro$oft SQL 2008 появилась возможность объединить эти подходы, отчасти устранив ряд недостатков первого и второго. Но как обычно у гибридов, решив несколько старых проблем, приобретаем несколько новых. Впрочем речь не об этом.
В этой статье я хотел бы еще раз рассмотреть тему сохранения и извлечения неструктурированной информации на примере сервера БД Firebird и Borland Builder C++ 6. Что бы не усложнять материал, я буду рассматривать работу с рисунками (точнее фотографиями) в формате bmp и jpeg. И затем расскажу как можно расширить приведенную схему.
Итак для работы на нужно создать таблицу, которая содержит идентификатор и связанное с ним изображение. Делает это следующий скрипт:
[code]
CREATE TABLE PEOPLE_PHOTOS (
PEOPLE_ID INTEGER NOT NULL,
PEOPLE_PHOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80 NOT NULL
);
[/code]
Для операции вставки (модификации) служит хранимая процедура:
[code]
CREATE OR ALTER PROCEDURE PEOPLE_PHOTO_INS (
people_id integer,
people_photo blob sub_type 0 segment size 80)
as
declare variable tmp_count integer = 0;
begin
/* Procedure Text */
select count(*) from people_photos where people_id = :people_id into :tmp_count;
if (:tmp_count = 1) then
begin
update people_photos set
people_photo = :people_photo where people_id = :people_id;
end
else if (:tmp_count = 0) then
begin
insert into people_photos (people_id, people_photo) values (:people_id, :people_photo);
end

suspend;
end

[/code]
Для выборки
[code]
CREATE OR ALTER PROCEDURE PEOPLE_PHOTO_SEL (
people_id integer)
returns (
people_photo blob sub_type 0 segment size 80)
as
begin
/* Procedure Text */
select people_photo from people_photos where people_id = :people_id into :people_photo;
suspend;
end

[/code]
Добавлению изображения в базу на стороне клиента служит следующий код:
[code]
//Заносим в параметр идентификатор
dmMain->fibPhotoIns->ParamByName(«people_id»)->Value = PeopleId;
TMemoryStream *pMS = new TMemoryStream;
Graphics::TBitmap *tmpBitmap = new Graphics::TBitmap;
TJPEGImage *tmpImg = new TJPEGImage();
try{
//Загружаем изображение из файла и сохраняем его в поток
//если это JPEG
tmpImg->LoadFromFile(opOpen->FileName);
tmpImg->SaveToStream(pMS);

}catch(…){
//если нет — то обрабатываем исключение и загружаем битмеп
tmpBitmap->LoadFromFile(opOpen->FileName);
tmpBitmap->SaveToStream(pMS);

}
//Загружаем из потока в параметр и вызываем процедуру
dmMain->fibPhotoIns->ParamByName(«people_photo»)->LoadFromStream(pMS);
dmMain->fibPhotoIns->ExecProc();
delete pMS;
delete tmpBitmap;
delete tmpImg;
[/code]
Соотвественно получение изображения из базы в компонент TImage
[code]
imPhoto->Picture->Bitmap->CleanupInstance();
dmMain->fibPhoto->ParamByName(«people_id»)->Value = tmp;
dmMain->fibPhoto->Active = true;
TMemoryStream *pMS = (TMemoryStream*)dmMain->fibPhoto->CreateBlobStream(dmMain->fibPhoto->FieldByName(«people_photo»),bmRead);
if(!pMS->Size){
dmMain->fibPhoto->Active = false;
return;
}
TJPEGImage *tmpImage = new TJPEGImage();
Graphics::TBitmap *tmpBitmap = new Graphics::TBitmap;

try{
pMS->Position = 0;
tmpImage->LoadFromStream(pMS);
imPhoto->Picture->Bitmap->Assign(tmpImage);

}
catch(…){
pMS->Position = 0;
tmpBitmap->LoadFromStream(pMS);
imPhoto->Picture->Bitmap->Assign(tmpBitmap);

}
delete pMS;
delete tmpImage;
delete tmpBitmap;
dmMain->fibPhoto->Active = false;
[/code]
Обращаю ваше внимание — не забывайте устанавливать позицию потока в 0. Если вы получаете ошибку «JPEG error #52» — значит либо вы забыли это сделать, либо ваш файл не JPEG.
Если в работе вам надо использовать более чем два типа файлов, то генерация исключений будет достаточно накладным решением. В таком случае нужно дополнительно вводить поле типа файла и обрабатывать его, оставляя исключения только для ошибок, либо же пытаться распознавать тип файла по сигнатуре.

Обсудить статью на форуме

Предлагаю работу

Мошенники, и в Интернет и в реальной жизни как правило играют на самых низменных инстинктах человека — жадности, похоти и т.п.
Методы, которые при этом различны. Например — предложить человеку работу, для которой не нужно ничего практически делать, как пишется —

«Это работа на дому, так как предполагает частичную занятость (3-4 часа в день).».
При этом обязательно —

«Просим не задерживаться с ответом, иначе нам придётся рассматривать другую кандидатуру.»
Сулят заработок 500 — 600 у.е. — так кто ж откажется. Нужно только одна мелочь, ну сущая безделица — для

«Наши рабочие счета (кошельки) должны обязательно иметь аттестат (Персональный). Получение Персонального аттестата — услуга платная и самая низкая цена ее 20$ (20 WMZ) или 700р (700 WMR). Таким образом, нам нужна гарантия того, что не получится так, что мы откроем счет, получим аттестат, затратив на это деньги, а Вы исчезните на следующий день. Такой гарантией выступает 20 WMZ (700 WMR), которые Вы оплачиваете нам за Аттестацию. Сумму аттестации мы в свою очередь оплачиваем компании Webmoney. Аттестация в таком случае занимаем 2-3 дня, после чего Вы сразу приступаете к работе по мере Вашей готовности. »

Все хорошо и прекрасно. Вот только одна странность — это письмо вы не заказывали, да и с чего собственно такой могучей компании вдруг собственно понадобились ваши услуги? Так же, далеко не каждый обратит внимание — адрес, с которого письмо пришло — это бесплатный почтовый сервер — странно, что столь продвинутая компания, готовая платить своим сотрудникам 500 долларов в месяц — но не в состоянии потратиться на почтовый сервис. Или же сознательно не желает этого делать.

Таким образом можно резюмировать несколько признаков мошенничества:

  1. Рассылка вами не запрашивалась (т.н. спам).
  2. Рассылка приходит с бесплатного почтового сервиса.
  3. Обязательным присутствует требование предоплаты (но сумма фактически не велика).
  4. Связь односторонняя — т.е. у вас нет никаких способов проверить предоставляемую информацию.

Поэтому получив подобное письмо — не торопитесь отправлять деньги и надеяться на удачную работу — по крайней мере попытайтесь проверить предоставленную информацию и как минимум получить информацию о «работодателе» из нескольких НЕЗАВИСИМЫХ источников. Если вы конечно еще верите в Деда Мороза.

Обсуждение статьи на форуме

Не укради

Об этой заповеди стоит помнить тем, кто польстившись на низкие цены, покупает технику на сайтах, занимающихся т.н. «кардигом» — т.е. якобы продажей дешевой техники. Что может быть слаще для нас, как купить ноутбук за 150 баксов? Практически «на шару». Причем на самом сайте — черным по белому написано что «техника куплена за ворованные деньги» — но при том наши «православные» даже не стесняются спросить — типа «как думаешь, стоит?». Конечно стоит мои дорогие. Обязательно. Всегда помните — без лоха жизнь плоха. Покупайте ворованное и вы обязательно убедитесь в верности евангельской заповеди. Получите ли вы желаемый ноутбук — как говорят наши «друзья» пендосы fifty/fifty. Но уж верности заповеди это вас научит.

Внимание! Проблемы с безопасностью

В WinXP существует уязвимость, связанная с выполнением удаленного кода. Причиной ее является неверная обработка службой сервера определенных запросов. Для устранения проблемы необходимо установить обновление, которое не входит в сервис-пак 3. Скачать обновление можно на сайте Microsoft.
Описание уязвимости можно прочесть здесь
Рекомендую всем пользователям установить данное обновление. При необходимости звоните 8067-5633196.

Утилита для удаления файлов

После того как проект закончен, откомпилирован, протестирован и сдан — его нужно отправлять в архив. Естественно в архиве не нужны объектные файлы, исполнимые и прочее.
Если проект небольшой — то проблемы особой конечно нет. Но если проект достаточно объемный — то делать это руками надоедает.
Для того что бы облегчить задачу и была создана данная утилита. Ее задача — удалить из директории и поддиректорий Файлы по указанной маске.
Набор масок можно загружать из файла, или создавать самому.
Исходные коды прилагаються.
Скриншот программы DeleteGUIСкриншот программы DeleteGUI

Здесь можно обсудить и задать вопрос

Обучение

Для оценки квалификации клиента в плане владения персональным компьютером я использую следующиие критерии:

1. Пользователь.

Предполагается:

  • знание клавиатуры (буквенно-цифровой блок, блок функциональных клавиш и расширеный блок — назначение и способы использования);
  • знание наиболее распространеных элементов управления пользовательского интерфейса и умение пользоваться ими в наиболее распространеных операционных системах (ОС).
  • знание и общее понимание основных характеристик пресонального компьютера.
  • умение получить количественные характеристики (размер файла, диска, свободное место) в наиболее распространеных системах.
  • основные навыки и принципы по выполнению базовых задач — открыть, копировать, переместить, удалить, сохранить, упаковать, распаковать, отправить по почте и т.п. — в наиболее распространеных операционных системах.
  • Работа с Интернетом — использование базовых сервисов (поиск, FTP, HTTP,P2P,IM).

2. Продвинутый пользователь.

Предполагается тоже что и пользователь, но дополнительно:

  • знание стандартных инструментов, как минимум одной операционной системы, для решения пользовательских задач, мониторинга, оценки производительности и восстановления системы.
  • Умение оценить необходимость и установить приложение.
  • Устанавливать устройства и драйвера.
  • Проводить базововое обслуживание системы, профилактику и востановление после сбоев.
  • Знание базовых механизмов как минимум одной операционной системы и умение это знание применять.

Вот тот минимальный набор критериев, который использую лично я, и в принципе стараюсь научить этому и своих клиентов так же. Не факт что он полностью совпадает с общепринятыми критериями (я не имею ввиду т.н. «курсы» и «обучения пользователей» которые в принципе руководствуются только одним критерием — есть деньги или нет) — особенно часто возникает момент непонимания в плане «найболее распространеных ОС». Общепризнаная точка зрения — Windows вполне достаточно. Я так не считаю. Большая часть операционных систем схожа по своим принципам взаимодествия с пользователем, поэтому человек, который использует компьютер как инструмент — должен уметь его использовать вне зависимости от ОС. Ведь у нас к счастью нет же автокурсов, которые учат вождению только на Daewoo Lanos или только на Mersedes. Предполагается и прямо о этом говорится — если вы научились ездить вам не нужно переучиваться под каждую машину. Тоже можно сказать и о компьтере — если вы прошли обучение как пользователь — то это предполагает что вы не будете выбрасывать лишние деньги за счастье учится если вдруг вы купили MacBook например.
Так что звоните.

Про Линукс

Ubuntu_wallpaper_1600x1200_19Обширный рынок пиратских программ в Украине сформировал своеобразное восприятие пользователей. С одной стороны — украинские пользователи владеют навыками работы в различных дорогостоящих программах. Что кстати, весьма не характерно для европейцев (например), где пиратство не так широко распространено. Вроде бы это не плохо. Но на самом деле, если копнуть глубже — все и не так хорошо. Во-первых, весьма низкая пользовательская культура. Которая хорошо описывается поговоркой — «Из пушки по воробьям…». Во-вторых, очень низкий профессиональный уровень — и в связи с этим — дорогая и неэффективная работа.

Читать далее