home *** CD-ROM | disk | FTP | other *** search
Prolog Source | 1990-03-26 | 10.9 KB | 396 lines |
- /***************************************************************************
-
- PDC Prolog
-
- Demo example of filesharing ext. db.
-
- PURPOSE: Demo of filesharing in ext. db.
- SEE: DBSHARE.HLP
-
- ═══════════════╦══════╦════════════════════════════════════════════════════
- Date Modified,║ By, ║ Comments.
- ═══════════════╬══════╬════════════════════════════════════════════════════
- ║ ║
-
-
- WINDOWS:
- 2: Names and statess of the text's
- 3: Command window
- 4: Edit window
- 5: List of current users
-
- ***************************************************************************/
-
-
- /***************************************************************************
- DOMAINS FOR DBSHARE
- ***************************************************************************/
-
- DOMAINS
- locker = string
- modifier = string
- text = text_descr(string,modifier,locker)
- db_selector = dba
-
-
- /***************************************************************************
- Global facts
- ***************************************************************************/
-
- DATABASE
- determ lockindex(bt_selector)
- determ index(bt_selector)
- determ usrindex(bt_selector)
- determ mark(real)
- determ username(string)
-
-
- /***************************************************************************
- Small help predicates
- ***************************************************************************/
-
- PREDICATES
- nondeterm repeat
- wr_err(integer)
-
- CLAUSES
- repeat.
- repeat:-repeat.
-
- wr_err(E):-
- errormsg("PROLOG.ERR",E,Errormsg,_),
- write(Errormsg),readchar(_).
-
-
- /***************************************************************************
- Updating the screen
- ***************************************************************************/
-
- PREDICATES
- list % List texts and their status already inside transaction
- translist % List texts and their status
- list_texts(bt_selector)
- list_users(bt_selector)
- show_textname(string)
-
- CLAUSES
- % Print one name and display who last modified the text/who is updating it
- show_textname(Key):-
- lockindex(LockIndex),
- key_search(dba,LockIndex,Key,Ref),!,
- ref_term(dba,text,Ref,text_descr(_,_,Locker)),
- write("\n*",Key,"\n Locked by: ",Locker).
- show_textname(Key):-
- index(Index),
- key_search(dba,Index,Key,Ref),!,
- ref_term(dba,text,Ref,text_descr(_,Modifier,_)),
- write("\n ",Key,"\n Modified by: ",Modifier).
-
- % List names of all text in database
- list_texts(Index) :-
- key_current(dba, Index, Key, _),
- show_textname(Key),
- key_next(dba, Index, _), !,
- list_texts(Index).
- list_texts(_).
-
-
- % List names of all uusers that has logged into the database
- list_users(UsrIndex) :-
- key_current(dba, UsrIndex, Key, _),
- write(Key),nl,
- key_next(dba,UsrIndex, _), !,
- list_users(UsrIndex).
- list_users(_).
-
- % Update both windows
- list:-
- shiftwindow(5),
- clearwindow,
- usrindex(UsrIndex),
- key_first(dba,UsrIndex,_),
- list_users(UsrIndex),
- shiftwindow(2),
- clearwindow,
- index(Index),
- key_first(dba,Index,_),
- list_texts(Index),!.
- list.
-
- translist:-
- db_begintransaction(dba,read),
- list,
- db_endtransaction(dba).
-
-
- /***************************************************************************
- Implementing user locking of text's by inserting the REF for the
- text in the lock index
- ***************************************************************************/
-
- PREDICATES
- lock(string,bt_selector,bt_selector)
-
- CLAUSES
- lock(Name,Index,LockIndex) :-
- not(key_search(dba, LockIndex, Name, _)), !,
- key_search(dba,Index,Name,Ref),
- key_insert(dba, LockIndex, Name, Ref).
- lock(Name,_,_):-
- write(Name," is being updated by another user.\n Access denied"),
- fail.
-
-
- /***************************************************************************
- Edit texts in the database
- ***************************************************************************/
-
- PREDICATES
- ed(bt_selector, bt_selector, string)
-
- CLAUSES
- % Edit existing text
- ed(Index,LockIndex,Name) :-
- username(User),
- db_begintransaction(dba,readwrite),
- key_search(dba, Index, Name, Ref),
- lock(Name,Index,LockIndex), !,
- ref_term(dba, text, Ref, text_descr(Str,_,_)),
- term_replace(dba,text,Ref,text_descr(Str,"",User)),
- db_endtransaction(dba),
- translist,
- shiftwindow(4),
- edit(Str, Str1, "Edit", NAME, "", 0, "PROLOG.HLP", 1,1,1,1,_,_),
- clearwindow,
- db_begintransaction(dba,readwrite),
- term_replace(dba, text, Ref, text_descr(Str1,User,"")),
- key_delete(dba, LockIndex, Name, Ref), %unlock
- db_endtransaction(dba),
- translist.
- %No such text or locked by another user
- ed(_,_,Name):-
- db_endtransaction(dba),
- write("The text: ",Name," cannot be opened.\nPress any key to continue"),
- readchar(_),nl.
-
-
- /***************************************************************************
- Create a new text
- ***************************************************************************/
-
- PREDICATES
- create(bt_selector,bt_selector,string)
-
- CLAUSES
- create(_,_,""):-!.
- create(Index,LockIndex, Name):-
- username(User),
- db_begintransaction(dba,readwrite),
- not(key_search(dba,Index,Name,_)),!,
- chain_insertz(dba, file_chain, text,text_descr("",User,User), Ref),
- key_insert(dba, Index, Name, Ref),
- db_endtransaction(dba),
- translist,
- ed(Index,LockIndex, Name).
- create(_,_,Name):-
- db_endtransaction(dba),
- write("The text: ",Name," already exist.\nPress any key to continue"),
- readchar(_).
-
- /***************************************************************************
- Interpret commands
- ***************************************************************************/
-
- PREDICATES
- main(db_selector, bt_selector, bt_selector)
- interpret(char, bt_selector, bt_selector)
- check_update_view
- check_timeout
- mk_prompt
- terminator(CHAR)
-
- CLAUSES
- % Loop until 'Q' is pressed
- main(dba, Index, LockIndex) :-
- mk_prompt,
- repeat,
- sleep(5),
- check_timeout,
- shiftwindow(3),
- inkey(C),
- upper_lower(Command,C),
- write(Command),
- trap(interpret(Command,Index, LockIndex),E,wr_err(E)),
- translist,
- mk_prompt,
- terminator(Command),!.
-
- terminator(27).
- terminator('Q').
-
- mk_prompt:-
- shiftwindow(3),
- clearwindow,
- write("Command: "),
- cursor(R,C),
- cursor(R,C).
-
-
- check_timeout:-
- mark(T),timeout(T),!,
- marktime(100,Mark),
- retractall(mark(_)),
- assert(mark(Mark)),
- check_update_view.
- check_timeout.
-
- check_update_view:-
- db_begintransaction(dba,read),
- db_updated(dba),!,
- list,
- db_endtransaction(dba).
- check_update_view:-
- db_endtransaction(dba).
-
-
- %interpret commandlineinput if not recognized show help info
- interpret(' ',_,_):-!.
- interpret(27,_,_):-!.
- interpret('Q',_,_):-!.
- interpret('H',_,_):-!,
- shiftwindow(4),
- file_str("dbshare.hlp",Str),
- edit(Str,_, "VIEW", "DBSHARE - HELP", "", 0, "PROLOG.HLP", 0,1,1,1,_,_),
- clearwindow.
- interpret('E',Index,LockIndex):-!,
- write("\nFile Name: "),readln(Name),
- trace(on),
- ed(Index,LockIndex,Name).
- interpret('C',Index,LockIndex):-!,
- write("\nFile Name: "),readln(Name),
- create(Index,LockIndex,Name).
- interpret('V',Index,_):-
- write("\nFile Name: "),readln(Name),
- db_begintransaction(dba,read),
- key_search(dba,Index,Name,Ref),!,
- ref_term(dba,text,Ref,text_descr(Str,_,_)),
- db_endtransaction(dba),
- shiftwindow(4),
- edit(Str,_, "VIEW", NAME, "", 0, "PROLOG.HLP", 0,1,1,1,_,_),
- clearwindow.
- interpret('V',_,_):-!,
- db_endtransaction(dba),
- write("\nNot found.\nPress any key to continue"),readchar(_).
- interpret('D',Index,LockIndex):-
- write("\nDelete text: "),readln(Name),
- db_begintransaction(dba,readwrite),
- key_search(dba,Index,Name,Ref),
- not(key_search(dba,LockIndex,Name,_)),
- key_delete(dba,Index,Name,Ref),!,
- term_delete(dba,file_chain,Ref),
- db_endtransaction(dba),
- translist.
- interpret('D',_,_):-!,
- db_endtransaction(dba),
- write("\nCan't delete.\nPress any key to continue"),readchar(_).
- interpret(_,_,_):-
- beep,
- makewindow(6,7,7,"HELP",0,0,21,50),
- write("COMMANDS:\n\nHelp: H\nCreate text:C\nEdit text:E\n"),
- write("View text:V\nDelete text:D\nQuit:Q\n\nPress any key to continue:"),
- readchar(_),
- clearwindow,
- removewindow.
-
-
- /***************************************************************************
- Open the database file / Create new if not existing
- ***************************************************************************/
-
- PREDICATES
- open_dbase(bt_selector,bt_selector,bt_selector)
-
- CLAUSES
- open_dbase(INDEX,LOCKINDEX, USRINDEX):-
- existfile("dbshare.dba"),!,
- db_open(dba, "dbshare.dba",readwrite,denynone),
- db_begintransaction(dba,read),
- bt_open(dba, "locks", LOCKINDEX),
- bt_open(dba, "ndx", INDEX),
- bt_open(dba, "usridx", USRINDEX),
- db_endtransaction(dba).
- open_dbase(INDEX,LOCKINDEX,USRINDEX):-
- db_create(dba,"dbshare.dba" , in_file),
- bt_create(dba, "locks",TEMPLOCKINDEX,20, 4),
- bt_create(dba, "ndx",TEMPINDEX , 20, 4),
- bt_create(dba, "usridx", TEMPUSRINDEX, 20, 4),
- bt_close(dba, TEMPINDEX),
- bt_close(dba, TEMPLOCKINDEX),
- bt_close(dba, TEMPUSRINDEX),
- db_close(dba),
- open_dbase(INDEX,LOCKINDEX,USRINDEX).
-
-
- /***************************************************************************
- Register a new user in the database file
- ***************************************************************************/
-
- PREDICATES
- logout(bt_selector)
- login(bt_selector)
-
- CLAUSES
- login(USRINDEX):-
- shiftwindow(3),
- clearwindow,
- write("Please enter your name: "),
- readln(Name),
- Name<>"",!,
- retractall(username(_)),
- assert( username(Name)),
- db_begintransaction(dba,readwrite),
- chain_inserta(dba,user_chain,string,Name,Ref),
- key_insert(dba,USRINDEX,Name,Ref),
- db_endtransaction(dba).
- login(USRINDEX):-login(USRINDEX).
-
- logout(USRINDEX):-
- retract(username(Name)),!,
- db_begintransaction(dba,readwrite),
- key_search(dba,USRINDEX,Name,Ref),
- key_delete(dba,USRINDEX,Name,Ref),
- term_delete(dba,user_chain,Ref),
- db_endtransaction(dba).
-
-
- /***************************************************************************
- Main GOAL
- ***************************************************************************/
-
- GOAL
- break(off),
- makewindow(2,23,23,"TEXTS (*=Locked)",0,50,17,30),
- makewindow(4,7,7,"EDIT",0,0,21,50),
- makewindow(5,7,7,"CURRENT USERS",17,50,8,30),
- makewindow(3,13,13,"H:Help C:Create E:Edit V:View D:Delete",21,0,4,50),
- open_dbase(INDEX,LOCKINDEX,USRINDEX),
- assert(index(INDEX)),
- assert(lockindex(LOCKINDEX)),
- assert(usrindex(USRINDEX)),
- marktime(10,Mark), % Initialize timeout for screen update
- assert(mark(Mark)),
- login(USRINDEX),
- translist,
- main(dba, INDEX,LOCKINDEX),
- logout(USRINDEX),
- db_begintransaction(dba,read),
- bt_close(dba,INDEX),
- bt_close(dba,LOCKINDEX),
- bt_close(dba,USRINDEX),
- db_endtransaction(dba),
- db_close(dba),
- removewindow,
- removewindow,
- removewindow,
- removewindow.