Шаг 95.
Visual Prolog.
Программирование внешних баз данных

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

    Рассмотрим некоторые общие принципы и методы работы с системой внешних баз данных Visual Prolog.

Просмотр базы данных

    При использовании систем баз данных важно представлять механизм работы с памятью Visual Prolog. Каждый раз, извлекая терм из внешней базы данных с помощью предиката ref_term, Visual Prolog помещает его в общий стек. Память, занятая термом, не освобождается до тех пор, пока программа не выдаст неудачу и не вернется к точке, находящейся перед вызовом предиката ref_term. Это значит, и последовательного просмотра базы данных необходимо использовать аналогичный следующему:

% Структура для последовательного просмотра цепочки 
   scan(db_selector,Chain,....):-
      chain_first(db_selector,Chain,Ref).
   scanloop(db_selector,Ref):-
   ref_term(db_selector,mydom,Ref,Term),
   % ... ваши предикаты...
   fail.
   scanloop(db_selector,_):-
      chain_next(db_selector,Ref,NextRef),
      scanloop(db_selector,NextRef).

    Для последовательного просмотра каталога индексов следует использовать структуру типа:

   % Структура для последовательного просмотра каталога 
   scan(db_selector,Bt_selector):-
      key_first(db_selector,Bt_selector,FirstRef),
      scanloop(db_selector,Bt_selector,FirstRef). 
   scanloop(db_selector,Bt_selector,Ref):-
      ref_term(db_selector,mydom,Ref,Term),
      % ... ваши предикаты...
      fail. 
   scanloop(db_selector,Bt_selector,_):-
      key_next(db_selector,Bt_selector,NextRef),  
      scanloop(db_selector, Bt_selector,NextRef).

    Вы также можете осуществить последовательный просмотр цепочки в базе данник с использованием предиката chain_terms:

   % Другой путь последовательного просмотра цепочки 
   scan(db_selector,Chain):-
      chain_terms(db_selector,Chain,mydom,Term,Ref),
      % ... ваши предикаты...
      fail. 
   scan(_,_).

    Для просмотра В+ дерева вы должны определить и использовать предикат bt_keys. В процессе поиска с возвратом предикат возвращает каждый ключ в В+ дереве и связанный с ним указатель базы данных.

   predicates
      bt_keys(db_selector,bt_selector,string,ref)
      bt_keysloop(db_selector,bt_selector,string,ref)
   clauses
      bt_keys(Db_selector, Bt_selector,Key,Ref):-
         key_first(Db_selector,Bt_selector,_), 
         bt_keysloop(Db_selector,Bt_selector,Key,Ref).
      bt_keysloop(Db_selector,Bt_selector,Key, Ref):-
         key_current(Db_selector,Bt_selector,Key,Ref). 
      bt_keysloop(Db_selector,Bt_selector,Key,Ref):-
         key_next(Db_selector,Bt_selector,_),
      bt _keysloop(Db_ selector,Bt_selector,Key,Ref).

    На следующем шаге мы рассмотрим вывод содержания базы данных.




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