mas01mj@584
|
1
|
mas01mj@584
|
2 #include <httpd.h>
|
mas01mj@584
|
3 #include <ap_config.h>
|
mas01mj@584
|
4 #include <http_config.h>
|
mas01mj@584
|
5 #include <http_protocol.h>
|
mas01mj@584
|
6 #include <apr_strings.h>
|
mas01mj@584
|
7 #include <librdf.h>
|
mas01mj@584
|
8 #include <apreq_module.h>
|
mas01mj@584
|
9 #include <apreq_parser.h>
|
mas01mj@584
|
10 #include <apreq_param.h>
|
mas01mj@584
|
11 #include "apreq2/apreq_module_apache2.h"
|
mas01mj@599
|
12 #include <rasqal.h>
|
mas01mj@584
|
13
|
mas01mj@600
|
14 #define BASE_URI "http://purl.org/ontology/af/"
|
mas01mj@600
|
15 #define JSON_URI "http://www.w3.org/2001/sw/DataAccess/json-sparql/"
|
mas01mj@600
|
16 #define SPARQL_URI "http://www.w3.org/TR/2006/WD-rdf-sparql-XMLres-20070614/"
|
mas01mj@584
|
17
|
mas01mj@584
|
18 static int log_out(void *user_data, librdf_log_message *message)
|
mas01mj@584
|
19 {
|
mas01mj@584
|
20 fprintf(stderr, "%s\n", librdf_log_message_message(message));
|
mas01mj@584
|
21 fflush(stderr);
|
mas01mj@584
|
22 return 1;
|
mas01mj@584
|
23 }
|
mas01mj@584
|
24
|
mas01mj@584
|
25 static int adb_handle_sparql_req(request_rec *r) {
|
mas01mj@584
|
26 if(strcmp(r->handler, "audiodb-sparql-handler") != 0) {
|
mas01mj@584
|
27 return DECLINED;
|
mas01mj@584
|
28 }
|
mas01mj@584
|
29
|
mas01mj@584
|
30 r->content_type = "text/plain";
|
mas01mj@584
|
31 r->status = OK;
|
mas01mj@584
|
32 r->status_line = "200 OK";
|
mas01mj@584
|
33
|
mas01mj@584
|
34 if(!r->args) {
|
mas01mj@584
|
35 r->args = "";
|
mas01mj@584
|
36 }
|
mas01mj@584
|
37
|
mas01mj@584
|
38 const apr_table_t *form_table;
|
mas01mj@584
|
39 apreq_handle_t *h = apreq_handle_apache2(r);
|
mas01mj@584
|
40 if(apreq_args(h, &form_table) != APR_SUCCESS)
|
mas01mj@584
|
41 return DECLINED;
|
mas01mj@584
|
42
|
mas01mj@600
|
43 const char *query_string = apr_table_get(form_table, "query");
|
mas01mj@600
|
44 const char *output = apr_table_get(form_table, "output");
|
mas01mj@600
|
45 if(!output)
|
mas01mj@600
|
46 output = "xml";
|
mas01mj@584
|
47
|
mas01mj@584
|
48 int rc = 0;
|
mas01mj@584
|
49 librdf_world* world = librdf_new_world();
|
mas01mj@584
|
50 librdf_world_open(world);
|
mas01mj@584
|
51 librdf_world_set_logger(world, NULL, log_out);
|
mas01mj@599
|
52 librdf_storage* storage = librdf_new_storage(world, "audiodb", "/tmp/test_database.adb", NULL);
|
mas01mj@584
|
53 if(!storage)
|
mas01mj@584
|
54 {
|
mas01mj@584
|
55 rc = 2;
|
mas01mj@584
|
56 goto error;
|
mas01mj@584
|
57 }
|
mas01mj@584
|
58
|
mas01mj@584
|
59 librdf_model *model;
|
mas01mj@584
|
60 if (!(model = librdf_new_model(world, storage, NULL)))
|
mas01mj@584
|
61 {
|
mas01mj@584
|
62 rc = 5;
|
mas01mj@584
|
63 goto error;
|
mas01mj@584
|
64 }
|
mas01mj@584
|
65
|
mas01mj@584
|
66 librdf_query *query;
|
mas01mj@600
|
67 if (!(query = librdf_new_query(world, "sparql", NULL, (unsigned char*)query_string, NULL)))
|
mas01mj@584
|
68 {
|
mas01mj@584
|
69 rc = 3;
|
mas01mj@584
|
70 goto error;
|
mas01mj@584
|
71 }
|
mas01mj@584
|
72
|
mas01mj@584
|
73 librdf_query_results *results;
|
mas01mj@584
|
74 if (!(results = librdf_query_execute(query, model)))
|
mas01mj@584
|
75 {
|
mas01mj@584
|
76 rc = 4;
|
mas01mj@584
|
77 goto error;
|
mas01mj@584
|
78 }
|
mas01mj@584
|
79
|
mas01mj@599
|
80
|
mas01mj@600
|
81 librdf_uri *output_uri;
|
mas01mj@600
|
82
|
mas01mj@600
|
83 if(strcmp(output, "json") == 0)
|
mas01mj@600
|
84 output_uri = librdf_new_uri( world,(unsigned char *) JSON_URI );
|
mas01mj@600
|
85 else
|
mas01mj@600
|
86 output_uri = librdf_new_uri( world,(unsigned char *) SPARQL_URI );
|
mas01mj@600
|
87
|
mas01mj@600
|
88 const unsigned char* out = librdf_query_results_to_string(results, output_uri, librdf_new_uri(world, (unsigned char*) BASE_URI));
|
mas01mj@600
|
89
|
mas01mj@600
|
90 librdf_free_uri(output_uri);
|
mas01mj@599
|
91 librdf_storage_close(storage);
|
mas01mj@599
|
92 librdf_free_storage(storage);
|
mas01mj@599
|
93 librdf_free_world(world);
|
mas01mj@599
|
94 ap_rprintf(r, out);
|
mas01mj@584
|
95
|
mas01mj@584
|
96 rc = 0;
|
mas01mj@584
|
97 return r->status;
|
mas01mj@584
|
98
|
mas01mj@584
|
99 error:
|
mas01mj@584
|
100 ap_rprintf(r, "Fail %d", rc);
|
mas01mj@584
|
101 return OK;
|
mas01mj@584
|
102 }
|
mas01mj@584
|
103
|
mas01mj@584
|
104 static void mod_audiodb_register_hooks (apr_pool_t *p) {
|
mas01mj@584
|
105 ap_hook_handler(adb_handle_sparql_req, NULL, NULL, APR_HOOK_FIRST);
|
mas01mj@584
|
106 }
|
mas01mj@584
|
107
|
mas01mj@584
|
108 module AP_MODULE_DECLARE_DATA audiodb_module = {
|
mas01mj@584
|
109 STANDARD20_MODULE_STUFF,
|
mas01mj@584
|
110 NULL,
|
mas01mj@584
|
111 NULL,
|
mas01mj@584
|
112 NULL,
|
mas01mj@584
|
113 NULL,
|
mas01mj@584
|
114 NULL,
|
mas01mj@584
|
115 mod_audiodb_register_hooks,
|
mas01mj@584
|
116 };
|