(Продолжение. Начало в №7-9, 11, 12, 13, 14)
Сегодня мы расскажем о типах данных, поддерживаемых LeoBase.
Все виды полей, за исключением виртуальных и memo-полей, имеют свой тип данных. LeoBase поддерживает 11 стандартных типов данных языка Pascal, однако их число может быть расширено до 600 за счет добавления пользовательских типов данных. Создав собственный тип данных, с ним можно работать как со стандартным. LeoBase автоматически будет поддерживать пользовательские типы данных при всех операциях.
Функционально каждый из типов относится к одному из четырех классов:
· обычные - все целочисленные, символьный и логический тип, а также пользовательские типы;
· строковые - все типы, совместимые с типом string;
· перечислимые - поля типов этого класса могут принимать одно из значений, указанных в определении конкретного перечислимого типа;
· вещественные - предназначены для представления дробных чисел.
Каждый тип данных, как стандартный, так и пользовательский, помимо принадлежности к какому-либо классу, может иметь уточняющие параметры (например, диапазон возможных значений для целочисленного типа).
В LeoBase имеется возможность создания особых типов данных - перечислимых. Для них не требуется написания обязательных функций Compare, Visual и др., достаточно задания элементов, которые будут присутствовать в этом типе. Фактически - это аналог перечислимых типов в Pascal, только здесь элементы типа могут состоять из любых символов. LeoBase обрабатывает перечислимые типы без участия программиста. Размер поля перечислимого типа в LeoBase составляет 1 байт.
Набор перечислимых типов может составлять библиотеку перечислимых типов. Библиотеки могут загружаться в память и выгружаться, когда перестают быть нужными.
Для обеспечения корректной работы СУБД с типами, с каждым типом должна быть ассоциирована функция-триггер сравнения, чтения строки и пр. Всего таких функций в LeoBase шесть. В записи информация о функциях хранится в специальных полях - полях функции.
· Prepare - этот триггер приводит содержимое поля к формату, с которым будет затем работать Compare. Использование этой функции позволяет снизить нагрузку на Compare при поиске, так как Prepare вызывается всего один раз для аргумента в терме из строки поиска, в то время, как Compare выполняла бы эту операцию при каждом вызове. Например, стандартная реализация строкового типа использует операцию сравнения строк, приведенных к верхнему регистру и с удаленными лидирующими и хвостовыми пробелами. Поэтому для строкового типа Prepare проделывает эти операции для переданного ей аргумента.
· Compare - функция сравнения двух полей одного типа. Функция сравнивает два поля - Field1 и Field2, в зависимости от результата возвращая три значения.
· Create - функция, отвечающая за формирование дополнительных при создании базы. В качестве возвращаемого значения указывается реальный размер пользовательских данных.
· ReadStr. - функция производит чтение значения заданного типа поля Field из строки S. Возвращает True, если чтение прошло успешно и результат находится в Field и False в противном случае. Это нужно при поиске.
· Visual - функция обратная ReadStr, служит для изображения значения поля в виде строки. Эта функция преобразует значение поля Field в виде строки символов S и возвращает в эту строку.
· Input - функция ввода данных заданного типа. Она производит ввод значения данного типа Field в поле на экране. Возвращает True, если ввод прошел результативно.
В описании любого типа есть эти шесть триггеров. Обязательно, однако, должны присутвовать только четыре: Compare, Visual, ReadStr, Input, остальные являются необязательными. Для того, чтобы исключить присутствие какой-либо функции, указатель на нее должен быть nil.
Для создания своего типа данных надо дать его полное описание и указать ряд триггеров работы с ним, после чего зарегистрировать тип в ядре, назначив ему уникальное имя. В описании типа данных может присутствовать ряд триггеров, которые обеспечивают гибкую работу с полями данного типа. Корректировать и добавлять собственные типы данных нужно в самом начале работы, до вызова любой функции LeoBase, а изменения и дополнения типов данных, во избежание непредсказуемых последствий, нужно вести очень аккуратно.
В LeoBase сделан шаг в сторону объектно-ориентированных баз данных. Если в некоторой БД комплекса имеются нестандартные или перечислимые типы, не загруженные заранее, то при открытии комплекса LeoBase начинает искать во вспомогательном каталоге БД библиотеки DLL с определенными именами и пытается их загрузить. В этих DLL может быть выполнена и загрузка перечислимых типов. Эти библиотеки программист может написать самостоятельно, вставив в их инициализационную часть код загрузки нужных типов. Разумеется, все DLL, используемые в LeoBase, должны быть написаны с учетом определенных соглашений. Таким образом, добавление новых типов в БД не требует перекомпиляции прикладной программы.
Владимир КОТЛЯРОВ,
"СофтИнформ", тел. 228-00-48,
e-mail: ui@activ.minsk.by