Шаг 100.
Visual Prolog.
Изменение структуры базы данных

    На этом шаге мы рассмотрим изменение структуры базы данных.

    Одним из способов изменения структуры базы данных является копирование старой базы данных в новую с внесением изменений. Другой путь заключается в том, чтобы выгрузить базу данных в текстовый файл, внести изменения с помощью редакта текста, а затем считать (загрузить) обратно в обновленном виде.

    Предикат 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'ом.




Предыдущий шаг Содержание