:- use_module(cgi).

run_query(QueryString, Output) :-
	open(QueryString, string, S),
	readvar(S, Query, Vars),
	close(S),
	( call(Query) ->
	    Output = Vars
	;
	    Output = "no"
	).

compile_string(CodeString) :-
	open(CodeString, string, S),
	compile_stream(S),
	close(S).

writevars([]).
writevars([[Name|Value]|Vars]) :-
	printf("%w = %Mw\n", [Name,Value]),
	writevars(Vars).

process(Code, Query, Result) :-
	block((
	    compile_string(Code),
	    run_query(Query, Result)
	    ),
	    _,
	    Result = "abort"
	).

go :-
	posted_params(NameValuePairs),
	get_param_value(NameValuePairs, query, Query),
	get_param_value(NameValuePairs, code, Code),

	writeln("Content-type: text/html\n\n "),
	writeln("<HTML><HEAD><TITLE>ECLiPSe Output</TITLE></HEAD>"),
	writeln("<BODY BGCOLOR=\"#F8E0B0\">"),
	writeln("<H1>ECLiPSe Output</H1>"),
%	writeln("<P>Parameters received:<PRE>"),
%	writeln(NameValuePairs),
%	writeln("</PRE>"),
	writeln("<P>Query:<PRE>"),
	writeln(Query),
	writeln("</PRE>"),
	writeln("<P>Output:<PRE>"),
	process(Code, Query, Result),
	writeln("</PRE>"),
	writeln("<P>Results:<PRE>"),
	( string(Result) -> writeln(Result) ; writevars(Result) ),
	writeln("</PRE>"),
	writeln("Error messages:<PRE>"),
	current_stream(Errors,_,error),
	writeln(Errors),
	writeln("</PRE>"),
	writeln("</BODY></HTML>").

