/* *********************************************************
	upload module
********************************************************** */

:- export loadbase/1, loadtrans/1.
:- import set_n_create/1 from keys_appl1.
:- import declare/1 from keys_basics1.
:- import insertbase/1, trmode/1 from basic_funs1.
:- import load_dyn/1, append/3 from basics.
:- import write_new_rules/0, parse_body/3 from parser1.

% upload a program into transaction base.
%
loadtrans(File) :-  
		see(File), 
	      	out_filename(File,FileOut),	
	        tell(FileOut), 
		do_read_and_compile(FileOut),
		write_new_rules,
		seen, told, 
		(
		trmode(compile) -> reconsult(FileOut) 
		;
		load_dyn(FileOut) ).

/* parsing rules repeatedly */
do_read_and_compile(FileOut) :-
	read(Term),
	(
	(Term == end_of_file) -> true
	;
	do_writerule(Term,FileOut), 
	do_read_and_compile(FileOut)  ).

/* parse rule if it has body */
do_writerule(declare(Term),FileOut) :-
	told, declare(Term), tell(FileOut).

do_writerule('<-'(Lhs,Rhs),_) :-
	write_canonical(Lhs),
	write(' :- '),
	parse_body(Rhs,PRhs,transaction),
	write_canonical(PRhs),
	write('.'), nl.

do_writerule(Term,_) :-
	not(Term = declare(_)),
	not(Term = '<-'(_,_)),
	write_canonical(Term), write(' :- tr.'), nl.


% upload a program into database.
%
loadbase(File) :- 
		see(File),
		read(Term),
		load_a_line(Term),
		seen.

% declare the idb predicates
load_a_line(declare(Term)) :-
		declare(Term), 
		read(Next), !,
		load_a_line(Next).

load_a_line((Lhs :- Rhs)) :-
		insertbase((Lhs :- Rhs)),
		read(Next), !,
		load_a_line(Next).

load_a_line(Term) :-
		not(Term = declare(_)),
		read_and_assert(Term).

% insert the predicates
read_and_assert(Term) :-
		(Term == end_of_file), !, true
		;
		set_n_create(Term), 
		read(Next), !,
		load_a_line(Next).


% change the name into name_tran for output file
out_filename(FileIn,FileOut) :-
	name(FileIn,NameIn),
	append(NameIn,"_tran",NameOut),
	name(FileOut,NameOut).

