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