На этом шаге мы рассмотрим обработку баз данных.
Когда вы создаете новую внешнюю базу данных или открываете существующую, можно поместить ее в файл или в оперативную память, в зависимости от значения аргумента place при обращении к db_create или db_open. По окончании работы с внешней базой данных она закрывается с помощью вызова db_close.
Если база данных размещена в памяти, то закрытие базы с помощью db_close не будет приводить к удалению ее из памяти. Вы должны сделать это явно обращением к предикату db_delete для высвобождения памяти, занятой базой данных. Если вы закрываете базу (но не уничтожаете), то можете позднее открыть ее снова предикатом db_open.
Предикат db_create создает новую базу данных.
db_create(Dbase,Name,Place) % (i,i,i)
Если базa данных создается на диске, то Name указывает имя файла; если она создается в оперативной памяти, то Name используется в качестве параметра db_close и db_open. Dbase и Name обозначают соответственно внутреннее и внешнее наименовании данных.
Место расположения базы данных указывается переменной Place, которая может принимать одно из трех значений, описанных в таблице 1.
Описание | Значение переменной Place |
---|---|
in_file | Для экономии оперативной памяти база данных помещается на диске |
in_memory | Для достижения высокой скорости доступа база данных помещается в оперативной памяти |
in_ems | Если установлена карта расширения памяти, то база данных помещается в EMS расширенной памяти. in_ems годится только для DOS. На других платформах она обладает эффектом in_memory |
Значения in_file, in_memory, in_ems являются элементами предопределенного домена Place, который соответствует следующему объявлению:
domains place=in_file;in_memory;in_ems
db_create(db_sel1,"MYFILE.DBA",in_file) % Создает файл MYFILE.DBA на диске db_create (db_sel2, "SymName2", in_memory) % Создает в памяти базу данных SymName2
Предикат db_open открывает предварительно созданную базу данных, идентифицированную параметрами Name и Place.
db_open(Dbase,Name,Place) % (i,i,i)
Если Place принимает значение in_memory, то Name соответствует символическому имени файла, а если Place принимает значение in_file, то Name соответствует имени файла, принятому в DOS.
Независимо от того, где помещена база данных, ее можно будет переместить в дру гое место, используя предикат db_copy.
db_copy(Dbase,Name,Place) % (i,i,i)
Например, при вызове предиката db_copy:
db_copy(my_base,"new_MemBase",in_memorу)
Visual Prolog копирует базу данных, связанную с селектором mybase, в новый файл базы данных new_MemBase который размещается в памяти.
При копировании сохраняется исходная база данных, и вы будете иметь две идентичные базы данных до тех пор, пока явным способом не удалите одну из них.
После перемещения базы данных ее обработка может проводиться, как если бы чего не произошло, т. к. все указатели во внешней базе данных остаются правильными. Таким образом, если вы работаете с базой данных в оперативной памяти, и освобождение памяти не занимает большого времени, вы можете скопировать базу данных в файл и продолжать обработку там. Указатель, установленный для базы данных в оперативной памяти, остается верным после копирования базы данных в файл.
Предикат db_copy используется в нескольких случаях, например:
Предикат db_openinvalid позволяет открыть базу данных, которая ранее была объявлена "неисправной".
db_openinvalid(Dbase,Name,Place) % (i,i,i)
Если в процессе обновления базы данных было отключено электропитание комьпьютера , содержимое базы данных может быть утеряно, т. к. часть буфера могла быть не переписана на диск. После этого система объявляет базу данных "неисправной".
База данных объявляется "неисправной" после обработки любого предиката, изменяющего содержимое базы данных. Эти предикаты: chain_inserta, chain_insertz, chain_insertafter, term_replace, term_delete, chain_delete, bt_create, key_insert и key_delete. База данных объявляется "неисправной" и после того, как она закрывается предикатом db_close, или после того, как происходит обращение к db_flush для освобождения буферов.
Предикат db_openinvalid позволяет продолжить обработку базы данных, если она была объявлена неисправной. При этом возможно восстановление части данных, если все дублирующие файлы были удалены. Однако необходимо проявлять проявить осторожность, попытка использования неисправной базы данных после отрытия ее с помощью db_openinvalid может привести к нежелательным результатам.
Предикат db_flush высвобождает буферы и записывает их содержимое в места их назначения в базе данных:
db_flush(DBasa) % (i)
После обновления базы данных она объявляется неисправной и остается такой до записи с помощью db_f lush или до закрытия.
Уровень надежности, с которым вы будете работать, зависит, безусловно, от значимости содержимого базы данных. Наиболее надежный путь - сохранять копии файлов на диске. Промежуточный уровень - обращение к db_flush после обновлении базы данных. Однако освобождение буферов весьма медленная операция, и если они используется часто, ваша система баз данных будет слишком неповоротлива. Наконец, если содержимое вашей базы данных особенно ценно, вы можете записывал" все изменения в особом файле - "журнале" или поддерживать две идентичные базы данных, может быть, на различных дисках.
Предикат db_close закрывает открытую базу данных.
db_close(Dbase) % (i)
Если база данных Dbase помещается на диске, то соответствующий файл будет за крыт. При этом база данных не будет удалена, даже если она помещена в оперативной памяти, т. е. вы можете открыть ее вновь путем обращения к db_open. Для удаления закрытой базы данных используется предикат db_delete.
Если база данных расположена в оперативной памяти, db_delete высвобождает занятую базой память.
db_delete(Name,Place) % (i,i)
Если база данных расположена в файле, то db_delete удаляет файл. Если при oбработке db_delete база данных Name не находится в месте, указанном Place, возникаем ошибка.
В процессе поиска с возвратом предикат db_btrees последовательно связывает BtreeName с именем каждого В+ дерева в базе данных Dbase.
nondeterm db_btrees(Dbase,BtreeName) % (i,o)
Имена В+ деревьев присваиваются в порядке сортировки.
В процессе поиска с возвратом предикат db_chains поочередно связывает переменную ChainsName с именем каждой цепочки базы данных Dbase.
nondeterm db_chains(Dbase,ChainName) % (i,o)
Имена цепочек присваиваются в порядке сортировки.
Выходные данные предиката db_statistics - статистические сведения о базе данных Dbase.
db_statistics(Dbase,NoOfTerms,MemSize,DbaSize,FreeSize) % (i, о, о, о, о)
Аргументы предиката db_statistics описаны в таблице 2.
Аргумент | Описание |
---|---|
NoOfTerms | Связывается с общим числом термов в базе данных |
MemSize | Связывается с размером (в байтах) внутренней таблицы для базы данных, хранящейся в памяти |
DbaSize | Связывается с общим числом байт, которые заняты термами и определе- ниями базы данных Dbase. Если Dbase записана на диске и DbaSize принимает значение намного меньшее, чем размер файла, то файл может быть сжат использованием db_copy |
FreeSize | Связывается с величиной свободной памяти, зависящей от того, где Dbase находится в настоящее время. Если в оперативной памяти, то FreeSize связывается с количеством байт неиспользуемой памяти; если Dbase помещена в файле, FreeSize связывается с количеством свободных байт на диске, содержащем файл |
На следующем шаге мы рассмотрим обработку термов.