<<
>>

Ядро системы

Ядро системы отвечает за взаимодействии всех подсистем приложения с СУБД, обеспечивая интерпретацию спецификации ПБД и преобразование команд подсистем ПБД в команды интерфейсов для взаимодействия с СУБД.

Для представления в памяти определённых в спецификации объектов модели ПБД в коде Ядра созданы соответствующие структуры данных.

Контекст приложения БД.

Класс TTblInfoCtx реализует представление общей информации о ПБД, а также обеспечивает создание соответствующих структур и компонентов для взаимодействия с БД. Свойства и флаги указанные в данной структуре распространяются на все объекты модели ПБД, если они не переопределены в структурах конкретных объектов.

Таблица 3. Основные поля класса TTblInfoCtx.

Поле Тип Назначение
AppName, AppTitle String Наименование и заголовок ПБД
Conn TADOConnection Соединение с БД
Schema String Схема используемой БД
SrcFiles TStringList Список файлов спецификаций ПБД.
Tables TStringList Список таблиц и представлений

ПБД

GridEditMode TGridEditMode =

(geAuto,geForm,geTbl)

Режим редактирования записей по умолчанию - на форме, в таблице, или определять по количеству полей
luPKFmt,

IuNameFmt, QuoteFNFmt, QuoteQFNFmt, QuoteTNFmt:;

String Формат формирования полей
QAlways,

AllPKAutoInc, PreserveTblOrders, AutoIndex, PreviewDefaults, DBCaseIns, QFldAs, QJoinBraces, FilterMCB, BlobLookups, MFltAlways LogSQL,

LogLU

boolean Флаги
UpdateMode TUpdateMode =

(upWhereAll, upWhereChanged, upWhereKeyOnly)

Режим обновления
Dialect TTblInfoSQLDialect =

(sdUnknown, sdMSSQL, sdOracle)

Диалект SQL для формирования запросов к различным СУБД

MapLnkInfo TObject
MapLnkTables TStringList Список таблиц-связей с ЦК

Приведём описание основных методов.

function NewQuery(AOwner: TComponent): TQuery; — создать компонент запрос. function GetTblInfoByName(const TN: String): TBaseTblInfo; — получить описание таблицы по имени.

function MapLnkTblIdByName(const MLTN: String): Integer; — получить номер таблицы связей из списка таблиц-связей с ЦК (MapLnkTables) по имени.

function GetTblInfoByMapKindEx(hMapTbl,Kind,hMinBase: integer): integer получить номер таблицы ПБД по номеру таблицы-связей с ЦК.

function AddSrcFileInfo(const FileName,ShortName: String): integer — добавить файл спецификации в список спецификаций SrcFiles.

function GetSourceName(hSrc: Integer): String; — получить имя файла спецификации по номеру из списка.

function GetSrcInfo(hSrc: Integer): TSrcFileInfo — получить файл спецификации по номеру.

function GetSourceSchema(hSrc: Integer): String — получить схему БД из файла спецификации.

function GetSrcTableByName(hSrc: Integer; Name: String): Integer — получить номер таблицы по номеру файла спецификации и имени таблицы.

function OpenDBInfoReader(AhSrc: Integer): TDBInfoReader — получить доступ к классу чтения спецификаций.

Представление информации о таблицах.

Для представление информации о таблицах БД используется иерархия классов, в которой базовым классом является тип TBaseTblInfo. Данный класс содержит общие свойства таблиц и представлений, а также абстрактные методы для получения и предоставления метаданных (списки полей, связей) таблиц БД. Наследниками данного класса являются классы TTblInfo и TViewInfo. TTblInfo

предназначен для взаимодействия с таблицами, а TViewInfo - представлениями (в терминах технологии).

Рассмотрим основные поля класса TBaseTblInfo (Таблица 4).

Таблица 4. Поля класса TBaseTblInfo.

Поле Тип Назначение
Number Integer Номер таблицы
hSrc Integer Номер в списке файлов

(TTblInfoCtx.SrcFiles), из которого прочитано описание таблицы

SemLinks String Массив связей ЦК
MapSemLnkInfo: PMapSemLnkInfo Описание связи полей таблицы с семантиками объектов ЦК
hMapTbl, MapKind, MapField integer Поля для описания связи с объектами ЦК через таблицу связей
Name,

Descr

String Имя таблицы (представления) ПБД.

Русское имя таблицы

Filter String Строка фильтра.
FQuery TQuery Компонент запрос. Используется в режиме работы с БД через запросы.
hOrder TFieldNumsNeg Список полей сортировки.
hMainNames TFieldNums Именованные поля.
MainNamesSkipFlags Integer Флаг. Если именованное поле одно, то использовать для него

автокомплит.

GridEditMode TGridEditMode Режим редактирования записей для конкретной таблицы. Перекрывает режим указанный в TTblInfoCtx

Тип TFieldNums = String используется для представления массивов полей, где код символа ( ord(s[i]) ) соответствует номеру поля в списке полей таблицы (представления). TFieldNumsNeg = String позволяет представить массив полей со знаком, т.е. каждое поле шифруется парой символов: знак и номер поля.

Методы класса TBaseTblInfo условно можно разделить на 3 группы:

• методы, обеспечивающие взаимодействие с таблицами: формирование описания таблиц, установка атрибутов и режимов, создание наборов данных (TDataSet), включение фильтров и сортировок, формирование SQL-запросов;

• методы, обеспечивающие взаимодействие с полями таблиц: создание структур описания полей, получение атрибутов полей, установка режимов взаимодействия с полями, формирование и получение описания связей, формирование вида имён полей и задание значений при создании SQL-запросов;

• методы взаимодействия с объектами ЦК: связывание и получение данных об объектах ЦК.

Для каждой описанной в спецификации таблицы в памяти создаётся экземпляр TTblInfo = class(TBaseTblInfo), который представляет всю информацию о структуре и свойствах таблиц (реализует объект модели ПБД Table).

На основе структурных данных из спецификации TTblInfo создаёт (метод CreateTTable) и связывает компонент TTable для работы с конкретной таблицей БД. Кроме того, TTblInfo позволяет получить информацию о всех связях текущей таблицы.

Экземпляры класса TViewInfo = class(TBaseTblInfo) создаются для описанных в спецификации представлений (в терминах технологии, глава 2) и соответственно хранят данные об их структуре. Так для создания представления в экземпляре TViewInfo хранятся данные о базовой таблице, на которой оно основано (BaseTbl: TTblInfo), а также реализованы методы декодировании связей для получения значений из полей подчиненных таблиц (представлений) и формирования связей в SQL-запросах.

Представление информации о полях.

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

TFldInfo = object

RName, Подпись поля

sParms: String; Параметры

Kind: TQFldKind; Вид поля

DisplW: Byte; Видимая ширена

F: Integer; Флаги поля

end ;

В sParms хранятся указанные в спецификации свойства поля, которые влияют на отображение поля таблицы в графический интерфейс (например, цвет шрифта, размеры компонента).

Вид поля Kind - это значение типа TQFldKind = (qfNone, qfInt, qfFloat, qfName, qfString, qfPhone, qfRef, qfListed, qfBoolean, qfDate, qfImage, qfBLOB), которое определяется по виду поля в спецификации.

Включение конкретного флага (поле F) соответствует определённому биту в представлении целого числа (integer), что позволяет задать до 32 флагов. Определены следующие флаги (Таблица 5):

Таблица 5. Флаги полей таблиц.

Флаг Назначение
tfAutoinc = $1 Значение поля является счётчиком.
tfCast = $2 Тип поля не может быть неявно преобразован к указанному, поэтому во всех запросах необходимо использовать CAST.
tfReadOnly = $4 Поле только для чтения.
tfHasPlugInButton = $8 Рядом с полем должна быть кнопка вызова надстройки.
tfFileName = $10 Строковое поле, содержащее путь к файлу.
tfMultyline = $20 Поддержка многострочного режима для строковых полей (используется компонент TMemo вместо TDBEdit).

VfStarDef = $100 Поле представления было включено по ссылке на все поля (^*).
tfViewOnly = $400 Для блоб-полей, содержащих изображения защита от копирования.

Для полей представлений используется структура TVFldInfo расширяющая

TFldInfo:

TVFldInfo = object(TFldInfo)

QName: String; hFld: SmallInt; Псевдоним поля.

Номер поля представления.

hVLnk: ShortInt;

end ;

Номер ссылки.

Значение hVLnk содержит номер элемента массива связей TLinks = array[byte]of TLink, являющегося узлом в дереве связей для данной таблицы. Если поле является полем базовой таблицы данного представления, то hVLnk = -1.

Представление связей реализовано в следующей структуре:

TLink = record

Name: String; Имя ссылки.

hSrcFld: TFieldNums; Номера полей таблицы-источника.

hTgtFld: TFieldNums; Номера полей целевой таблицы.

sCond: String;

Tbl: TBaseTblInfo;

end;

Условие

Целевая таблица.

Данная структура позволяет представить связь между двумя таблицами как по одному, так и по нескольким полям. В hSrcFld хранятся номера полей таблицы, содержащих ссылки (являющихся FK). hTgtFld содержит номера полей целевой

(справочника), а Tbl - описание самой целевой таблицы. В sCond может

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

Для описания ссылок представлений разработана структура TVLink.

TVLink = packed object

Tbl: TTblInfo; Базовая таблица представления

hLnk: TLinkNum; Номер ссылки

hParent: TLinkNum; Номер

function GetTargetTbl: TBaseTblInfo; Получить описание целевой

таблицы.

function GetHSrcFld: TFieldNums; Получить номер поля, содержащего

ссылку.

function GetHTgtFld: TFieldNums; Получить номер поля целевой таблицы.

function GetName: String; Получить имя связи.

end;

Для представления связей типа «мастер-детали» разработана специальная структура TDetailLink:

TDetailLink = packed record

Name: String; Наименование связи

Tbl: TBaseTblInfo; Подчинённая таблица

hLnk: TLinkNums; Путь ссылок.

F: Integer; Флаги: dfHidden, dfChMaster

end

hLnk содержит путь ссылок из подчинённой таблицы в главную, что позволяет реализовывать взаимодействие с таблицами-деталями через несколько уровней ссылок.

Загрузчик ядра. Интерпретация спецификации.

Для формирования структур Ядра (описаний таблиц и представлений) разработана иерархия классов «загрузчиков» (Рисунок 8).

Рисунок 8. Иерархия классов загрузки

Базовый класс TDBInfoReader содержит описание абстрактных методов для интерпретации спецификаций ПБД, создания и загрузки соответствующих структур Ядра. Основные методы класса TDBInfoReader:

procedure DoLoadDBInfo; virtual; abstract; — создать контекст приложения. procedure ReadUsedList; virtual; abstract; — получить связанные спецификации и добавить их в контекст приложения.

procedure ReadTblList; virtual; abstract; — создать список таблиц и представлений ПБД. (При этом создаются соответствующие пустые структуры TTblInfo, TViewInfo).

procedure LoadTblMenu(MainPar: Pointer; OnCreateItem:

TCreateTblMenuItemEvent; IP: Pointer); virtual; abstract; — загрузить структуру меню сущностей ПБД.

procedure LoadTblInfo(TI: TTblInfo; var State: TTblInfoLoadState); virtual; abstract; — загрузить описание таблицы.

procedure LoadViewInfo(VI: TViewInfo; var State: TViewInfoLoadState); virtual; abstract; — загрузить описание представления.

procedure LoadTblFormInfo(TI: TBaseTblInfo); virtual; abstract; — загрузить описание пользовательской формы.

В наследниках класса TDBInfoReader — TDBInfoIniReader и TDBInfoDBPLReader описаны методы интерпретации для конкретных видов спецификаций. TDBInfoIniReader реализует загрузку из спецификаций ПБД в формате Ini-файлов, а TDBInfoDBPLReader - спецификаций на ЯПБД. Такой подход позволяет создавать новые классы загрузчики и тем самым поддержать

61 разнообразные формы представления модели ПБД. Например, в дальнейшем планируется реализация интерпретатора моделей ПБД представленных на UML.

Для разбора конструкций спецификаций ПБД представленных в ini-файлах в TDBInfoIniReader используются функции класса TCustomIniFile (поставляемый с Delphi, модуль IniFile.pas). Загрузка Ядра из спецификаций на ЯПБД требует предварительного синтаксического анализа и построения дерева разбора. Разработанный класс TDBPLAnalyzer реализует синтаксический анализ файлов спецификаций ПБД на ЯПБД и построение дерева разбора TDBPLTree. Методы загрузчика TDBInfoDBPLReader ориентированы на чтение дерева разбора TDBPLTree.

3.3.

<< | >>
Источник: Фереферов Евгений Сергеевич. ТЕХНОЛОГИЯ АВТОМАТИЗАЦИИ СОЗДАНИЯ ПРИЛОЖЕНИЙ БАЗ ДАННЫХ С ГИС-ФУНКЦИОНАЛЬНОСТЬЮ НА ОСНОВЕ ИХ ДЕКЛАРАТИВНЫХ СПЕЦИФИКАЦИЙ. ДИССЕРТАЦИЯ на соискание ученой степени кандидата технических наук. Иркутск - 2014. 2014

Еще по теме Ядро системы:

  1. 5.1. Понятие и система государственной службы.
  2. 6. Система гражданского права.
  3. 1. Гражданское право в системе отраслей российского права.
  4. 1.3. Понятие и система субъектов административного права
  5. 13.1. Понятие и система органов, уполномоченных рассматривать дела об административных правонарушениях
  6. Ильина О.П.. Архитектура корпораций и информационных систем : учебное пособие / О. П. Ильина. - СПб. : Изд-во СПбГЭУ,2015. - 119 с., 2015
  7. 4.3 Модель формирования электрического потенциала в системе «медь - графит»
  8. § 4. Банковская тайна в системе правовых режимов конфиденциальной информации
  9. Лекция 1. Административное право как отрасль права в правовой системе Российской Федерации.
  10. Моделирование процессов конвективного теплообмена в конструкциях вентилируемых фасадных систем с учетом скорости ветрового воздействия и режимов движения воздуха
  11. Медианоминация. Место медианоминации в системе коммерческой номинации
  12. КРАСНИКОВ НИКОЛАЙ ИВАНОВИЧ. Система национально-регионального управления в Российской империи (вторая половина XVII - начало XX вв.). ДИССЕРТАЦИЯ на соискание ученой степени доктора юридических наук. Новосибирск - 2019, 2019
  13. 1.5. Система административного права. Соотношение административного права с другими отраслями права
  14. Численные исследования внутреннего резонанса два-к-одному
  15. Внутренний резонанс 1:1:2