Chris@0: /* $Id$ Chris@0: Chris@0: Part of SWI-Prolog Chris@0: Chris@0: Author: Jan Wielemaker Chris@0: E-mail: wielemak@science.uva.nl Chris@0: WWW: http://www.swi-prolog.org Chris@0: Copyright (C): 2004-2006, University of Amsterdam Chris@0: Chris@0: This program is free software; you can redistribute it and/or Chris@0: modify it under the terms of the GNU General Public License Chris@0: as published by the Free Software Foundation; either version 2 Chris@0: of the License, or (at your option) any later version. Chris@0: Chris@0: This program is distributed in the hope that it will be useful, Chris@0: but WITHOUT ANY WARRANTY; without even the implied warranty of Chris@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Chris@0: GNU General Public License for more details. Chris@0: Chris@0: You should have received a copy of the GNU Lesser General Public Chris@0: License along with this library; if not, write to the Free Software Chris@0: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Chris@0: Chris@0: As a special exception, if you link this library with other files, Chris@0: compiled with a Free Software compiler, to produce an executable, this Chris@0: library does not by itself cause the resulting executable to be covered Chris@0: by the GNU General Public License. This exception does not however Chris@0: invalidate any other reasons why the executable file might be covered by Chris@0: the GNU General Public License. Chris@0: */ Chris@0: Chris@0: :- module(http_sparql, Chris@0: [ sparql_reply/1 Chris@0: ]). Chris@0: :- use_module(user_db). Chris@0: :- use_module(library(lists)). Chris@0: :- use_module(library(rdf_write)). Chris@0: :- use_module(library('http/http_parameters')). Chris@0: :- use_module(library('http/http_dispatch')). Chris@0: :- use_module(sparql). Chris@0: :- use_module(sparql_xml_result). Chris@0: Chris@0: :- http_handler('/sparql/', sparql_reply, []). Chris@0: Chris@0: %% sparql_reply(+Request) Chris@0: % Chris@0: % HTTP handler for SPARQL requests. Typically mounted on Chris@0: % =|/sparql/|= Chris@0: Chris@0: sparql_reply(Request) :- Chris@0: http_parameters(Request, Chris@0: [ query(Query), Chris@0: 'default-graph-uri'(DefaultGraphs), Chris@0: 'named-graph-uri'(NamedGraphs) Chris@0: ], Chris@0: [ attribute_declarations(sparql_decl) Chris@0: ]), Chris@0: append(DefaultGraphs, NamedGraphs, AllGraphs), Chris@0: authorized(read(AllGraphs, query)), Chris@0: statistics(cputime, CPU0), Chris@0: sparql_compile(Query, Compiled, Chris@0: [ type(Type), Chris@0: ordered(Ordered), Chris@0: distinct(Distinct) Chris@0: %,entailment(lit) Chris@0: ]), Chris@0: findall(R, sparql_run(Compiled, R), Rows), Chris@0: statistics(cputime, CPU1), Chris@0: CPU is CPU1 - CPU0, Chris@0: write_result(Type, Rows, Chris@0: [ cputime(CPU), Chris@0: ordered(Ordered), Chris@0: distinct(Distinct) Chris@0: ]). Chris@0: Chris@0: write_result(ask, [True], Options) :- !, Chris@0: format('Transfer-encoding: chunked~n'), Chris@0: format('Content-type: application/sparql-results+xml; charset=UTF-8~n~n'), Chris@0: sparql_write_xml_result(current_output, ask(True), Options). Chris@0: write_result(select(VarNames), Rows, Options) :- !, Chris@0: format('Transfer-encoding: chunked~n'), Chris@0: format('Content-type: application/sparql-results+xml; charset=UTF-8~n~n'), Chris@0: sparql_write_xml_result(current_output, select(VarNames, Rows), Options). Chris@0: write_result(_, RDF, _Options) :- Chris@0: format('Content-type: application/rdf+xml; charset=UTF-8~n~n'), Chris@0: rdf_write_xml(current_output, RDF). Chris@0: Chris@0: Chris@0: %% sparql_decl(+OptionName, -Options) Chris@0: % Chris@0: % Default options for specified attribute names. See Chris@0: % http_parameters/3. Chris@0: Chris@0: sparql_decl(query, Chris@0: []). Chris@0: sparql_decl('default-graph-uri', Chris@0: [ zero_or_more Chris@0: ]). Chris@0: sparql_decl('named-graph-uri', Chris@0: [ zero_or_more Chris@0: ]).