Предлагаемый набор модулей предназначен для разработки прогамм,
осуществляющих обработку информации системы по результатам обработки
запроса. Разработка и отладка модулей осуществлялась на компиляторе
Borland C++ ver. 3.1.
Ваша разрабатываемая программа должна вызываться из МЕНЮ обработ-
ки системы. Для этого в подменю обработки "Разовый запрос","Запрос по
образцу","Строчная запись" или "Результат поиска" необходимо создать
подменю, например: "Спецобработка". Для этого подменю нужно задать
программу предобработки (путем нажатия клавиш Alt+U и затем F10) под
названием STRU_OUT. Эта программа записывает в рабочий директорий сис-
темы всю необходимую информацию для работы разрабатываемой Вами прог-
раммы. В самом меню "Спецобработка" может быть несколько пунктов. Каж-
дый из них должен описывать Вашу программу как внешнюю (тип Е).
Результаты обработки запроса.
В результате обработки запроса в системе в рабочий директорий для
каждой базы записывается файл, содержащий список отобранных системных
номеров для этой базы. Имя этого файла образуется как:
<Рабочий директорий>spsn.<Номер базы в запросе>.
Для корневой базы в запросе файл системных номеров с количества
отобранных системных номеров(4 байта в двоичном виде). Далее записаны
собственно системные номера. Каждый системный номер представлен в тект-
стовом виде с лидирующими нулями длиной 8 байт. Если для корневой базы
заданы условия на отсылки, то для каждой из связанных
баз формируется файл системных номеров. И этом случае системный номер
сопровождается списком позиций в соответствующих файлах системных номе-
ров. Количество элементов в этом списке равно количеству связанных баз.
Каждый элемент занимает 4 байта в двойчном виде и означает смещение от
начала файла системных номеров, где записана информация об отобранных
системных номерах связанной базы для текущего системного номера корне-
вой базы. Каждый такой список отобранных системных номеров имеет такую
же структуру как и список для корневой базы (4 байта - количество, сис-
темные номера по 8 байт, которые могут сопровождаться списком смещений
в файлах списков системных номеров для связанных баз). Если база не
имеет свзанных баз в запросе, то после системного номера (8 байт) идет
следующий системный номер и т.д. Таким образом в наборе файлов списков
системных номеров записаны результаты поиска по древовидному запросу.
Структура информации для разрабатываемой программы.
При вызове меню "Спецобработка" (оно может иметь и любое другое
имя) производится запись в рабочий директорий информации о структуре
банка и об обработанном запросе (файл stru). Для получения этой инфор-
мации в разрабатываемой программе необходимо использовать модуль
get_stru(). Этот модуль заполняет структуру bank_stru, описанную в фай-
ле rc.h. По окончании работы с банком необходимо вызвать модуль
free_stru. Для корректного вызова всех модулей включите в программу
строку #include "rc.h". Для доступа к структуре банка и запроса включи-
те строку extern struct BANK_STRU * bank_stru.
Основные используемые модули:
datopen(i_base) - предназначен для открытия файлов данных базы с номе-
ром i_base. Может вызываться повторно для одной и той же базы,
при этом файлы базы данных открываются только один раз.
datclose(i_base) - предназначен для закрытия файлов данных базы с номе-
ром i_base.
inrec(i_base,&rec,sn) - предназначен для чтения записи с системным но-
мером sn из базы i_base в запись rec. По окончании работы с rec
необходимо освободить занимаемую ей память: farfree(rec.addr);
sub_fields(&rec,i_field) - предназначен для определения количества зна-
чений в поле i_field записи rec. Поля записи и значения полей
нумеруются начиная с 1.
field(rec,i_field,i_sub_field) - извлекает из записи значение i_sub_fi-
eld поля i_field. Значение получается в виде символьной строки,
заканчивающейся нулем(\x0). По окончании работы со значением
его необходимо освободить с помощью farfree.
decode(sl_num,cod,&decod) - раскодирует код cod в словаре sl_num и по-
мещает соответствующее ему понятие в decod. Понятие получается
в виде символьной строки, заканчивающейся нулем(\x0). После ис-
пользования decod нужно освободить с помощью farfree.
invert - вспомогательный модуль, необходимый для инвертирования значе-
ния, считанного из файла системных номеров ( 4 байта в двоичном
виде), который записан в порядке обратном тому, в котором запи-
сывается long.
В составе модулей присутствует модуль-пример read_base, считываю-
щий результаты обработки запроса и выводящий на экран все отобранные
записи. На экран выводятся только непустые поля. Значения множественных
полей выводятся каждое с новой строки. Для кодируемых полей выводятся
раскодированные понятия из соответствующих словарей.