На этом шаге мы рассмотрим программирование внешних баз данных.
Рассмотрим некоторые общие принципы и методы работы с системой внешних баз данных 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).
На следующем шаге мы рассмотрим вывод содержания базы данных.