Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Вывод содержания базы данных

Вы можете использовать предикат listdba, определенный ниже для выво-

да текущего состояния базы данных. Он имеет один аргумент: селектор прос-

матриваемой уже открытой базы данных. Все термы в базе данных должны быть

одного домена. В примере определен домен mydom; когда вы используете этот

предикат, необходимо заменить mydom на имя домена, используемого в вашей

программе.

/* Программа CH15EX04.PRO */

/* Эта программа нуждается в предыдущем фрагменте */

domains

db_selector = mydba

mydom = city(zipcode, cityname);

person(firstname, lastname, street, zipcode, code)

zipcode, cityname, firstname, lastname, streen, code = string

predicates

listdba(db_selector)

clauses

listdba(db_selector) :-

write("\n**************************************"),

write("\n DATABASE LISTING "),

write("\n**************************************"),

db_statistics(Db_selector, NoOfTerms, MenSize, FreeSize),

write("\n\nTotal number of records in the database:",

NoOfTerms),

write("\nNumber of bites used in main memory:",MemSize),

write("\nNumber of bites used by the database:",DbaSize),

write("\nNumber of bites free on disk:",FreeSize),

fail.

listdba(db_selector) :-

db_chains(Db_selector, Chain),

write("\n\n\n\n********Chain LISTING************"),

write("\n\nName=", Chain),

write("\n\nCONTENT OF: ", Chain),

write("\n---------------------------------\n"),

chain_terms(Db_selector, Chain, mydom, Term, Ref),

write("\n", Ref, ":", Term),

fail.

listdba(db_selector) :-

db_btrees(Db_selector,Btree),/* Returns each B+tree name */

bt_open(Db_selector, Btree, Bt_selector),

bt_statistics(Db_selector, Btree, Bt_selector,NoOfKeys,

NoOfPages, Dept, KeyLen, Order, PageSize),

write("\n\n\n********Index LISTING************"),

write("\n\nName= ", Btree),

write("\nNoOfKeys ", NoOfKeys),

write("\nNoOfPages=", NoOfPages),

write("\nDept= ", Dept),

write("\nOrder= ", Order),

write("\nKeyLen= ", KeyLen),

write("\nPageSize= ", PageSize), n1,

write("\n\nCONTENT OF: ", Btree),

write("\n---------------------------------\n"),

bt_keys(Db_selector, Bt_selector, Key, Ref),

write("\n", Key, "-", Ref),

fail.

listdba(_).

goal

db_open(Mydba, "register.bin", in_file),

listdba(Midba).

Создание защищенной базы данных

Если вы вводите много новой информации в базу данных, то важно удос-

товериться, что она не утеряна при аварии системы. В этом разделе мы по-

кажем как это сделать путем ведения журнала изменений в другом файле.

Внесение изменений включает, сначала, обновление базы данных и, за-

тем, заполнение ее. Если эта операция завершится успешно, система сама

записывает изменения в журнал изменений. Это значит, что в каждый момент

времени лишь один файл является недописанным на диске. Если файл с базой

данных становится не пригодным (например из-за аварии системы перед за-

полнением ), вы можете реконструировать его используя журнал изменений и

дубликат исходной базы данных. Если файл изменений становится непригод-

ным, то вы можете создать новый дубликат базы данных и новый файл измене-

ний.

Если вы записываете число и время в файле изменений вместе со стары-

ми величинами данных, подвергшимися изменению или удалению, то можете ре-

конструировать базу данных к тому состоянию, в котором она была в опреде-

ленный момент времени.

/* Ведение журнала изменений базы данных */

/* Этот фрагмент работает с программой CH15EX05.PRO */

domains

logdon = insert(relation, dbdom, ref);

replace(relation, dbdom, ref, dbdom);

erase(relation, ref, dbdom);

predicates

logdbchange(logdom)

clauses

logdbchange(Logterm) :-

chain_insert(Logdba, Logchain, Logdom, Logterm, _),

db_flush(Logdba).

Соседние файлы в папке Документация