home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l217 / 2.ddi / EXAMPLES / CH15EX05.PRO < prev    next >
Encoding:
Prolog Source  |  1990-03-26  |  4.2 KB  |  137 lines

  1. /*
  2.    Copyright (c) 1986, 90 by Prolog Development Center
  3. */
  4.       /* Logging database opertations */
  5.       
  6. domains 
  7.    logdom = insert(relation,dbdom,ref);
  8.            replace(relation,dbdom,ref,dbdom);
  9.            erase(relation,ref,dbdom)
  10.  
  11. predicates
  12.    logdbchange(logdom)              
  13.  
  14. clauses
  15.    logdbchange(Logterm):-
  16.       chain_insertz(logdba,logchain,logdom,Logterm,_),
  17.       db_flush(logdba).
  18.  
  19.  
  20.                 /* ch15ex05.pro */
  21.  
  22. domains
  23.    dbdom = city(zipcode, cityname);
  24.    person(firstname, lastname, street, zipcode, code)
  25.    zipcode, cityname, firstname, lastname = string
  26.    street, code = string
  27.    indexName = person_name; person_adr; city_no
  28.    relation  = city; person
  29.    db_selector = dba; logdba
  30.  
  31. database
  32.    indices(IndexName, bt_selector)     /* This takes and index name (a key) that
  33. is a person's name or address or a city number; it also takes a B+ tree selector
  34.                                           */
  35. predicates
  36.    xname(FirstName, LastName, string)    /* This predicate creates an index name
  37.             from a last name (20 characters) and a first name (10 characters) */
  38. clauses
  39.    xname(F, L, S) :-
  40.       str_len(L, LEN), LEN>20, !,
  41.       frontstr(20, L, L1, _),
  42.       format(S, "%-20%", L1, F).
  43.  
  44.    xname(F, L, S) :-
  45.       format(S, "%-20%", L, F).
  46.  
  47. predicates
  48.    dba_insert(relation, dbdom)
  49.    dba_replace(relation, dbdom, Ref)
  50.    dba_erase(relation, Ref)
  51.  
  52. clauses
  53.    dba_insert(person, Term) :- !,
  54.       break(OldBreak),
  55.       break(off),
  56.       indices(person_name, I1),
  57.       indices(person_adr, I2), !,
  58.       Term = person(Fname, Lname, Adr, _, _),
  59.       xname(Fname, Lname, Xname),
  60.       chain_insertz(dba, person, dbdom, Term, Ref),
  61.       key_insert(dba, I1, Xname, Ref),
  62.       key_insert(dba, I2, Adr, Ref),
  63.       db_flush(dba),
  64.       logdbchange(insert(person, Term, Ref)),
  65.       break(OldBreak).
  66.  
  67.    dba_insert(city, Term) :-
  68.       break(OldBreak),
  69.       break(off),
  70.       indices(city_no, I), !,
  71.       Term = city(ZipCode, _),
  72.       chain_insertz(dba, city, dbdom, Term, Ref),
  73.       key_insert(dba, I, ZipCode, Ref),
  74.       db_flush(dba),
  75.       logdbchange(insert(city, Term, Ref)),
  76.       break(OldBreak).
  77.  
  78.    dba_replace(person, NewTerm, Ref) :- !,
  79.       break(OldBreak),
  80.       break(off),
  81.       indices(person_name, I1),
  82.       indices(person_adr, I2), !,
  83.       ref_term(dba, dbdom, Ref, OldTerm),
  84.       OldTerm = person(OldFname, OldLname, OldAdr, _, _),
  85.       xname(OldFname, OldLname, OldXname),
  86.       key_delete(dba, I1, OldXname, Ref),
  87.       key_delete(dba, I2, Oldadr, Ref),
  88.       NewTerm = person(NewFname, NewLname, NewAdr, _, _),
  89.       xname(NewFname, NewLname, NewXname),
  90.       term_replace(dba, dbdom, Ref, NewTerm),
  91.       key_insert(dba, I1, NewXname, Ref),
  92.       key_insert(dba, I2, NewAdr, Ref),
  93.       db_flush(dba),
  94.       logdbchange(replace(person, NewTerm, Ref, OldTerm)),
  95.       break(OldBreak).
  96.  
  97.    dba_replace(city, NewTerm, Ref) :- !,
  98.       break(OldBreak),
  99.       break(off),
  100.       indices(city_no, I), !,
  101.       ref_term(dba, dbdom, Ref, OldTerm),
  102.       OldTerm = city(OldZipCode, _),
  103.       key_delete(dba, I, OldZipCode, Ref),
  104.       NewTerm = city(ZipCode, _),
  105.       term_replace(dba, dbdom, Ref, NewTerm),
  106.       key_insert(dba, I, ZipCode, Ref),
  107.       db_flush(dba),
  108.       logdbchange(replace(city, NewTerm, Ref, OldTerm)),
  109.       break(OldBreak).
  110.  
  111.    dba_erase(person, Ref) :- !,
  112.       break(OldBreak),
  113.       break(off),
  114.       indices(person_name, I1),
  115.       indices(person_adr, I2), !, 
  116.       ref_term(dba, dbdom, Ref, OldTerm),
  117.       OldTerm = person(OldFname, OldLname, OldAdr, _, _),
  118.       xname(OldFname, OldLname, OldXname),
  119.       key_delete(dba, I1, OldXname, Ref),
  120.       key_delete(dba, I2, OldAdr, Ref),
  121.       term_delete(dba, person, Ref),
  122.       db_flush(dba),
  123.       logdbchange(erase(person, Ref, OldTerm)),
  124.       break(OldBreak).
  125.  
  126.    dba_erase(city, Ref) :-
  127.       break(OldBreak),
  128.       break(off),
  129.       indices(city_no, I), !,
  130.       ref_term(dba, dbdom, Ref, OldTerm),
  131.       OldTerm = city(OldZipCode, _),
  132.       key_delete(dba, I, OldZipCode, Ref),
  133.       term_delete(dba, city, Ref),
  134.       db_flush(dba),
  135.       logdbchange(erase(city, Ref, OldTerm)),
  136.       break(OldBreak).
  137.