====== database ====== Добавляет возможность работы с базами данных через JDBC подключение. На текущий момент поддерживаются следующие СУБД: * Firebird Данный модуль предназначен для использования другими модулями: * [[doc:jroboplc:modules:arcsvr]] * [[doc:jroboplc:modules:wessvr]] * [[doc:jroboplc:modules:tagscript]] Данный модуль требует включения в задачу. **Внимание!** Модуль ''database'' должен работать в одной задаче с использующими его модулями. plugin.database: enable: on module.db: enable: on type: firebird dbname: /home/denis/asutp/promauto/db/fb25/SHPMSC/SHPMSC.FDB recon_s: 5 timeout_s: 10 host: localhost port: 3050 user: sysdba password: masterkey properties: encoding: WIN1251 startups: - dbscr/extra.dbscr.yml: schema: mscz4 table: tbl - dbscr/extra.dbscr.yml tabletags: - table: modules field.id: idm field.name: name field.value: idprod access: rw - table: main field.id: idm field.value: wes access: ro |**type** | - |Тип сервера СУБД. Возможные значения: 'firebird' | |**dbname** | - |Имя базы данный | |**recon_s** | ''10'' |Интервал переподключения при потере связи | |**timeout_s** | ''10'' |Тайм-аут подключения и ответа сервера| |**host** | ''localhost'' |адрес сервера | |**port** | |порт сервера, значение по умолчанию зависит от типа сервера: | |:::| ''3050'' |firebird| |**user** | - |Имя пользователя на сервере | |**password** | - |Пароль пользователя | |**properties** | - |Дополнительные параметры подключения, специфичные для СУБД | |**startups** | - |Список файлов с dbscr-скриптами, которые будут выполняться при подключении. Дополнительно можно произвольно указать любые параметры, которые будут переданы скрипту. | ====== tabletags ====== **tabletags** - это список отображений значений в базе данных в теги модуля. Одно отображение создается для одного поля одной таблицы. При этом при подключении к базе данных будет создано n тегов для одного отображения, где n - количество записей таблицы с учетом указанного фильтра where. Количество отображений в списке может быть любым. |**table** | - |Имя таблицы | |**field.id** | id |Имя поля первичного ключа. Возможно использовать только простые ключи, состоящие из одного поля. | |**field.name** | //field.id// |Имя поля, значения которого будут использоваться для формирования имени тегов. Формат имени тега следующий: ..<значение поля field.name> | |**field.value** | - |Имя поля чтения/записи значения. Тип поля может быть integer, smallint, bigint, float, double precision, char, varchar | |**access** | - |Ограничение доступа к тегу. Возможные значения rw/ro/wo. | |**where** | - | Условие, добавляемое в select-запрос. | ====== dbscr ====== Dbscr - сокращение от "database script", далее по тексту в разделе "скрипт". Скрипт предназначен для работы с содержимым баз данных без написания программного кода. Скрипты содержаться в yaml-файлах, которые могут располагаться: - непосредственно на диске - в jar-файле плагинов, модули которых используют модуль database В одном файле допустимо иметь более одного скрипта. Для идентификации начала скрипта имя скрипта содержит префикс ''dbscr.''. Пример файла, содержащего два скрипта: dbscr.first: - if not has_table({schema}, person) - do create sequence {schema}SQ_PERSON_ID - do create table {schema}PERSON ( ID integer not null primary key, ISGROUP smallint default 0, NAME varchar(128), DELETED smallint default 0 ) - do create trigger {schema}PERSON_BI active before insert position 0 on {schema}PERSON as begin if( NEW.ID is NULL) then NEW.ID = next value for {schema}SQ_PERSON_ID; end dbscr.second: # - if not has_schema(msc) - if not has_domain({schema}, dm_myint1) - do create domain {schema}dm_myint1 as integer not null - if not has_table({schema}, myreader) - | do create table {schema}myreader ( id integer, name varchar(30) ) - | do create table {schema}myreader_types ( id integer, typename varchar(30) ) - if not has_column({schema}, myreader, info) - do alter table {schema}myreader add info varchar(30) default 'n/a' Скрипт - это список действий, которые выполняются в описанной последовательности. Действия подразделяются на условия ''if'' и команды ''do''. Если при выполнении ''if'' результат положительный, то все последющие ''do'' будут выполнятся, пока не будет достигнут следующий ''if''. ===== if ===== Формат записи: - if [not] function([args]) ''not'' - инверсия результата ''function'' - функция проверки. Список доступных функций с параметрами: * has_schema() * has_domain(, ) * has_table(,
) * has_column(,
, ) * has_constraint(,
, ) * has_index(, ) * has_trigger(, ) * has_procedure(, ) * has_record() ===== do ===== Формат записи: - do sql ''sql'' - один sql-запрос, не возвращающий результат ===== параметры скрипта ===== Скрипту можно передавать параметры, которые в скрипте заключаются в фигурные скобки. Значения параметров задаются в секции ''startups'' конфигурации модуля, либо в программном коде другого модуля, использующего модуль database. При загрузке скрипта выполняется поиск и замена всех параметров, включая фигурные скобки, на их значения. Если значение не указано, то используется значение ''пустая строка''. Исключением является параметр ''{schema}'', который подставляется вместе с разделителем. Например, ''{schema}{table}'' со значениями ''myschema'' и ''mytable'' для firebird будет преобразовано в ''myschema_mytable'', или для postgresql в ''myschema.mytable''. ====== Команды ====== Далее ''m'' обозначает название модуля. ===== sql ===== m:sql expression Выполняет произвольный sql-запрос, например: db:sql select * from modules ===== exec ===== m:exec scrfile [prm=val ...] Выполняет все dbscr-скрипты, содержащиеся в файле ''scrfile'', с заданными параметрами. Например: db:exec wessvr.debug.yml schema=s1 table=tbl1 ====== Использование firebird ====== Для работы с firebird необходимо использовать версию 3.0 и выше. С более ранними версиями тестирование не проводилось. После установки firebird сервера нужно добавить параметр в файл ''firebird.conf'': WireCrypt = Enabled Если при запуске будут ошибки типа: PM org.firebirdsql.logging.JulLogger warn WARNING: Wire encryption established, but some plugins failed; see other loglines for details то отключить шифрование совсем: WireCrypt = Disabled