Объектная модель для генерации SQL команд в FBManager

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

В основном для этого использую Alter объекты. Наибольша сложность в этом смысле с PostgreSQL в силу его больших возможностей. Приходится сильно дорабатывать/переписывать уже существующий код.

Рубрика: FBManager, PosgreSQL, Программирование на Lazrus | Метки: , , | Комментарии к записи Объектная модель для генерации SQL команд в FBManager отключены

Поддержка SQLite 3 в FBManager

Работы по поддержке данной БД идут полным ходом.

Работа с таблицами уже продвинулась довольно хорошо. Основная трудность на данный момент — написание полноценного парсера sql команды CREATE TABLE. Сейчас ешё не реализованы FK и другие CONSTRAINT. Из-за этого не открываются базы, содержащие данные объекты.

Начата обработка представлений и триггеров.

Рубрика: FBManager | Метки: , , | Комментарии к записи Поддержка SQLite 3 в FBManager отключены

FBManager — начата поддержка SQLite3

Собственно — вот. Решил поизучать данный движок. Так сказать — пойти на поводу попсовости.

В принципе — наверное самый простой движок.

Рубрика: FBManager, Программирование на Lazrus | Метки: , | Комментарии к записи FBManager — начата поддержка SQLite3 отключены

Первый результат рефакторинга кода FBManager-а

Появился первый результат работы по разделению визуальной и не визуальной части FBManager

Полностью развязал 1-й и 2-й уровень из предыдущего поста.

И ещё — на будущее: появились планы реализовать движок для работы с SQLite.

Рубрика: FBManager, PosgreSQL, Программирование на Lazrus | Метки: , , | Комментарии к записи Первый результат рефакторинга кода FBManager-а отключены

Переработка исходников FBManager

Очередное большое перетряхивание исходников.

Текущая цель — выделить три слоя абстракции:

1 — Нижный уровень.  Примитивы SQL команд. Создаём объекты паскаля, содержащие формальные описание всех понимаемых программой SQL команд. Базовый класс — TSQLObjectAbstract.

Применение данного уровня — разбор текстов sql, формирование текстов sql команд.

2. Промежуточный уровень. Объекты, предназначенные для работы с физическими сущностями конкретной базы данных. Базовые классы — TDBObject, TSQLEngineAbstract.

Применение данного уровня — взаимодействие с физическими базами данных. Построение модели БД в программе. Выполнение запросов и команд к БД.

3. Верхний (визуальный уровень). Объекты предназначенные для построения визуального интерфейса и взаимодействия с пользователем. Базовые классы — TDBInspectorRecord, TDataBaseRecord.

Разделение 2-го и 3-го уровня позволяют создавать различные  приложения на общем ядре системы. Например — сам FBManager и программы командной строки для обработки скриптов.

Рубрика: FBManager, PosgreSQL | Метки: , , | Комментарии к записи Переработка исходников FBManager отключены

Почему в программе, написанной в Lazarus в Windows при отображении чисел выводится ? в разделителе тысяч.

Это проблема старая. И всё равно периодически возникает в вопросах новичков на форумах.

Эта ситуация вызвана тем, что программы, написанные с использованием Lazarus и LCL работают в кодовой странице строк UTF8. В windows же кодовая страница по умолчанию Win1251.

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

procedure ConvetToUTF8LocalConst;
var
 i:integer;
begin
 DefaultFormatSettings.ShortMonthNames[1]:='Январь';
 DefaultFormatSettings.ShortMonthNames[2]:='Февраль';
 DefaultFormatSettings.ShortMonthNames[3]:='Март';
 DefaultFormatSettings.ShortMonthNames[4]:='Апрель';
 DefaultFormatSettings.ShortMonthNames[5]:='Май';
 DefaultFormatSettings.ShortMonthNames[6]:='Июнь';
 DefaultFormatSettings.ShortMonthNames[7]:='Июль';
 DefaultFormatSettings.ShortMonthNames[8]:='Август';
 DefaultFormatSettings.ShortMonthNames[9]:='Сентябрь';
 DefaultFormatSettings.ShortMonthNames[10]:='Октябрь';
 DefaultFormatSettings.ShortMonthNames[11]:='Ноябрь';
 DefaultFormatSettings.ShortMonthNames[12]:='Декабрь';

for i:=1 to 12 do
 DefaultFormatSettings.LongMonthNames[i] := DefaultFormatSettings.ShortMonthNames[i];

 DefaultFormatSettings.LongDayNames[1]:='Воскресенье';
 DefaultFormatSettings.LongDayNames[2]:='Понедельник';
 DefaultFormatSettings.LongDayNames[3]:='Вторник';
 DefaultFormatSettings.LongDayNames[4]:='Среда';
 DefaultFormatSettings.LongDayNames[5]:='Четверг';
 DefaultFormatSettings.LongDayNames[6]:='Пятница';
 DefaultFormatSettings.LongDayNames[7]:='Суббота';
 
 DefaultFormatSettings.ShortDayNames[1]:='Вс';
 DefaultFormatSettings.ShortDayNames[2]:='Пн';
 DefaultFormatSettings.ShortDayNames[3]:='Вт';
 DefaultFormatSettings.ShortDayNames[4]:='Ср';
 DefaultFormatSettings.ShortDayNames[5]:='Чт';
 DefaultFormatSettings.ShortDayNames[6]:='Пт';
 DefaultFormatSettings.ShortDayNames[7]:='Сб';
end;

procedure InitLocale;
begin
 DefaultFormatSettings.LongDateFormat:='dd.mm.yyyy';
 DefaultFormatSettings.ShortDateFormat:=DefaultFormatSettings.LongDateFormat;
 DefaultFormatSettings.DateSeparator:='.';
 DefaultFormatSettings.TimeSeparator:=':';
 DefaultFormatSettings.ThousandSeparator:=' ';
 DefaultFormatSettings.CurrencyString:='р.';
 ConvetToUTF8LocalConst;
end;

При запуске программы достаточно реализовать вызов функции InitLocale;

Ещё полезно сделать вызов

Application.UpdateFormatSettings:=false;

после
Application.Initialize;

в главном файле проекта (*.lpr)

Вот образец фрагмента файла проекта, который получается с учётом этих рекомендаций:

  Application.Title:='Макошь - торговля и склад';
  Application.Initialize;
  Application.UpdateFormatSettings:=false;
  InitLocale;

Всё вышенаписанное относится к винде. В линуксе оно не нужно. Но код будет работать везде правильно.

Рубрика: Windows, Без рубрики, Программирование на Lazrus | Метки: , | Комментарии к записи Почему в программе, написанной в Lazarus в Windows при отображении чисел выводится ? в разделителе тысяч. отключены

Ночная сборка FBManager

Настроил автомат для сборки FBManager. Собранные бинарники будут размещаться по адресу http://w7site.ru/fpc/fbm/

Пока только сборка для платформы 32-х битной Linux платформы с библиотеками GTK2.

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

Рубрика: Linux - операционная система на рабочем месте, Программирование на Lazrus | Метки: , , , | Комментарии к записи Ночная сборка FBManager отключены

Орешки (без дрожжевое тесто)

Есть и другие увлекательные занятия, помимо программирования. Одно из них — выпечка.

Ингредиенты

Яйцо 2 шт
Кефир или простокваша 1 чашки (туда же яйцо)
Растительное масло 1/3 ст. ложки
Уксус (если кефир не кислый) 1/2 чайной ложки уксуса
Пшеничная мука 3 чашки
Соль 1 чайная ложка
Сахар 6 столовая ложка
Сода 1/3 чайной ложки

Для приготовления теста использую хлебопечку. Программу «Тесто», в случае если после начала замеса тесто получается жидки — досыпать муки. Тесто должно быть достаточно плотным.

После замеса раскатывать пышку толщиной 0.7 см, резать небольшими кусками.

В сковородку налить растительное масло, раскалить.

Рубрика: но не программирование... | Метки: | Комментарии к записи Орешки (без дрожжевое тесто) отключены

Установка pgAgent в Fedora 20

Возникла необходимость запуска заданий на сервере PostgreSQL. Простейший случай — запуск из CRON. Но хочется красивого. Сначала хотел создать свой велосипед, но после изучения советов из интернета, понял, поздно, велосипед уже изобретен, и стал изобретать колесо: остановился на pgAgent. Тем более — с ним хорошо дружит pgAdmin.

Пока данный инструмент не идёт в штатном комплекте пакетов. В качестве документа по установке использовал статью

В первую очередь установил недостающие утилиты и компоненты:

Это, чтобы было чем скачивать:

yum install wget

Непосредственно компилятор — собираем из исходников.

yum install gcc-c++ cmake

Честно говоря, сам не понял — зачем нужны графические библиотеки. Придется ломать домашний компьютер — проверить, может и без них будет работать?

yum install wxGTK wxGTK-devel wxWidgets

Это на случай, если ещё сам PostgreSQL не установлен:

 yum install postgresql-contrib postgresql-devel postgresql-libs postgresql-server

Дальше — если PostgreSQL ещё не установлен — инициализируем БД

postgresql-setup initdb

Запускаем сервер и устанавливаем ему автозапуск при старте системы.

systemctl start postgresql.service
 systemctl status postgresql.service
 systemctl enable postgresql.service

Теперь переходим непосредственно к развёртыванию самого pgAgent-а. Скачиваем исходники последней версии с ссылки http://www.postgresql.org/ftp/pgadmin3/release/pgagent/. В момент написания статьи — последняя версия имеет номер 3.4.0. Ссылка на файл — http://ftp.postgresql.org/pub/pgadmin3/release/pgagent/pgAgent-3.4.0-Source.tar.gz. После загрузки распаковываем архив.

 tar -xzf pgAgent-3.4.0-Source.tar.gz

Запускаем подготовку, компиляцию и установку.

cmake -D PG_CONFIG_PATH:FILEPATH=/usr/bin/pg_config -D STATIC_BUILD:BOOL=OFF .
 make
 su -c "make install"

Если всё было сделано верно — компиляция пройдёт успешно. Если нет — смотрим вывод и анализируем ошибки.

После установки необходимо создать таблицы для работы pgAgent-а в системной БД postgres. Скрипты на создание находятся в папке sql исходных текстов.

cd sql
psql -U postgres -d postgres -f pgagent.sql -h 127.0.0.1

На этом основная работа закончена. Можно проверить работу pgAgent-а запустив его в консоле.

/usr/local/bin/pgagent hostaddr=127.0.0.1 dbname=postgres user=postgres -f -l 2

В начале сообщений будет выдана информация по подключению к БД. После этого будет выдан протокол на каждую итерацию. Ключ -l 2 заставляет выводить в лог подробную информацию о работе. На первоначальном этапе рекомендую его включать. В будущем детализацию протокола можно понизить до уровня 0 — выдача только сообщений об ошибках.

В окончании работы обеспечиваем запуск агента средствами SystemD. Для этого создадим unit-файл для старта pgAgent-а — pgagent.service.

[Unit]
Description=PostgreSQL server agent
After=network.target
Requires=postgresql.service

[Service]
ExecStart=/usr/local/bin/pgagent hostaddr=127.0.0.1 dbname=postgres user=postgres -f -l 2
Type=simple

[Install]
WantedBy=network.target

Проверяем работу нашего сервиса

journalctl -u pgagent

При правильной установке видим:

[root@localhost system]# journalctl -u pgagent
-- Logs begin at Ср 2014-03-26 15:48:47 MSK, end at Ср 2014-09-24 11:38:00 MSK. --
сен 24 11:36:55 localhost.localdomain systemd[1]: Starting PostgreSQL server agent...
сен 24 11:36:55 localhost.localdomain systemd[1]: Started PostgreSQL server agent.
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG: Creating primary connection
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG: Connection Information:
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      user         : postgres
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      port         : 0
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      host         : 127.0.0.1
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      dbname       : postgres
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      password     :
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      conn timeout : 0
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG: Connection Information:
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      user         : postgres
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      port         : 0
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      host         : 127.0.0.1
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      dbname       : postgres
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      password     :
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG:      conn timeout : 0
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG: Creating DB connection: user=postgres hostaddr=127.0.0.1 dbname=postgres
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG: Database sanity check
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG: Clearing zombies
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG: Checking for jobs to run
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG: Sleeping...
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG: Clearing inactive connections
сен 24 11:38:00 localhost.localdomain pgagent[20593]: DEBUG: Connection stats: total - 1, free - 0, deleted - 0

Всё работает

Рубрика: PosgreSQL | Метки: , , , | Комментарии к записи Установка pgAgent в Fedora 20 отключены

Fedora 20 Gnome — Печать на PDF принтер

При типовой установке рабочего места на Fedora 20 с рабочим столом  Gnome по умолчанию нет возможность использовать в качестве принтера вывод в PDF файл.

Проблема решается просто:

sudo yum install cups-pdf

После этого в списке доступных принтеров появляется виртуальный PDF принтер.

Результат печати будет на рабочем столе. Если это поведение не нравится — то можно изменить настройки в файле /etc/cups/cups-pdf.conf.

Всё просто.

Рубрика: Linux - операционная система на рабочем месте, Печать | Метки: , , , | Комментарии к записи Fedora 20 Gnome — Печать на PDF принтер отключены