annotate sparql/mod_audiodb/mod_audiodb.c @ 600:337e5962218a

Apache RDF module generalization Updated apache module to produce xml or json depending on the query string.
author mas01mj
date Thu, 13 Aug 2009 11:20:56 +0000
parents c6debbac3216
children 783a1a5e51b2
rev   line source
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 };