На этом шаге мы рассмотрим изменение структуры базы данных.
Одним из способов изменения структуры базы данных является копирование старой базы данных в новую с внесением изменений. Другой путь заключается в том, чтобы выгрузить базу данных в текстовый файл, внести изменения с помощью редакта текста, а затем считать (загрузить) обратно в обновленном виде.
Предикат dump_Dba, описанный ниже, предназначен для выгрузки базы данных в текстовый файл, если база данных удовлетворяет следующим условиям:
Эта методика не требует выгрузки В+ деревьев в текстовый файл, мы предполагаем имея в виду первое условие, что В+ дерево может быть порождено из отношений. В этом примере все термы принадлежат родовому домену mydom, в момент применения можно заменить mydom на требуемое имя домена и соответствующее его объявление.
Следующая программа записывает содержание базы данных в текстовый файл, открытый предикатом outfile. Каждая строка текстового файла содержит терм и имя содержащей его цепочки. Имена цепочки и терма записываются в сложный объект домена chamterm.
constants filename="\\vip\\vpi\\programs\\register\\exe\\register.bin" domains Db_selector=myDba chainterm=chain(string,mydom) file=outfile mydom=city(zipcode,cityname); person(firstname,lastname,street,zipcode,code) zipcode,cityname,firstname,lastname=string street,code=string predicates wr(chainterm) dumpDba(string,string) clauses wr(X):- write(X),nl. dumpDba(Db_selector,OutFile):- db_open(myDba,Db_selector,in_file), openwrite(outfile,OutFile), writedevice(outfile), db_chains(myDba,Chain), chain_terms(myDba,Chain,mydom,Term,_), wr(chain(Chain,Term)), fail. dumpDba(_,_):- closeflie(outfile), db_close(myDba). goal dumpDba(filename,"register.txt").
Используя приведенную выше программу, можно сгенерировать текстовый файл, вызвав dumpDba. И вы можете перегрузить базу данных, используя предикат readterm для домена chainterm. Предикат dba_insert, определенный на шаге, производит это обновление.
domains chainterm=chain(string,dbdom) predicates nondeterm repfile(flie) copyDba loadDba(string) clauses repfile(_). repfile(File):- not(eof(File)), repfile(File). loadDba(OutFile):- openread(Prn_file,OutFile), readdevice(Prn_file), repfile(Prn_file), readterm(Chainterm,chain(Chain,Term)), write(Term),nl, Dba_insert(Chain,Term), fail. loadDba(_):- closefile(Prn_file). copyDba:- createDba, db_open(Dba,"register.bin",in_file), open_indices, loadDba("register.txt"), db_close(Dba).
На этом мы заканчиваем знакомство с Visual Prolog'ом.