mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-04 17:49:45 +02:00
229 lines
6.6 KiB
C
229 lines
6.6 KiB
C
/* -*- Mode: c; c-basic-offset: 2 -*-
|
|
*
|
|
* rdf_storage.c - RDF Storage SQL support functions
|
|
*
|
|
* Copyright (C) 2008, David Beckett http://www.dajobe.org/
|
|
*
|
|
* This package is Free Software and part of Redland http://librdf.org/
|
|
*
|
|
* It is licensed under the following three licenses as alternatives:
|
|
* 1. GNU Lesser General Public License (LGPL) V2.1 or any newer version
|
|
* 2. GNU General Public License (GPL) V2 or any newer version
|
|
* 3. Apache License, V2.0 or any newer version
|
|
*
|
|
* You may not use this file except in compliance with at least one of
|
|
* the above three licenses.
|
|
*
|
|
* See LICENSE.html or LICENSE.txt at the top of this package for the
|
|
* complete terms and further detail along with the license texts for
|
|
* the licenses in COPYING.LIB, COPYING and LICENSE-2.0.txt respectively.
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <rdf_config.h>
|
|
#endif
|
|
|
|
#ifdef WIN32
|
|
#include <win32_rdf_config.h>
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
/* for access() and R_OK */
|
|
#ifdef HAVE_STDLIB_H
|
|
#include <stdlib.h>
|
|
#endif
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
#ifdef HAVE_ERRNO_H
|
|
#include <errno.h>
|
|
#endif
|
|
|
|
|
|
#include <redland.h>
|
|
|
|
|
|
static void librdf_sql_config_store_triple(void *user_data, const raptor_statement *triple);
|
|
|
|
|
|
|
|
static void
|
|
librdf_sql_config_store_triple(void *user_data,
|
|
const raptor_statement *triple)
|
|
{
|
|
librdf_sql_config* config=(librdf_sql_config*)user_data;
|
|
int i;
|
|
|
|
for(i=0; i < config->predicates_count; i++) {
|
|
if(triple->predicate_type != RAPTOR_IDENTIFIER_TYPE_RESOURCE ||
|
|
triple->object_type != RAPTOR_IDENTIFIER_TYPE_LITERAL)
|
|
continue;
|
|
|
|
if(!strcmp((const char*)librdf_uri_as_string((librdf_uri*)triple->predicate),
|
|
config->predicate_uri_strings[i])) {
|
|
config->values[i]=strdup((char*)triple->object);
|
|
#if LIBRDF_DEBUG > 1
|
|
LIBRDF_DEBUG3("Set config value %d to '%s'\n", i, config->values[i]);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/**
|
|
* librdf_new_sql_config:
|
|
* @world: librdf_world
|
|
* @storage_name: SQL storage name
|
|
* @layout: SQL schema variant
|
|
* @config_dir: directory for configuration files
|
|
* @predicate_uri_strings: configuration predicate URIs to look for
|
|
*
|
|
* Constructor - Make a new SQL configuration for a layout from a file
|
|
*
|
|
* Uses SQL storage name @storage_name and with database schema
|
|
* @layout to give a configuration that will contain an array of
|
|
* string values in the #librdf_sql_config field values array.
|
|
*
|
|
* Return value: configuration or NULL on failure
|
|
**/
|
|
librdf_sql_config*
|
|
librdf_new_sql_config(librdf_world* world,
|
|
const char* storage_name,
|
|
const char* layout,
|
|
const char* config_dir,
|
|
const char** predicate_uri_strings)
|
|
{
|
|
raptor_parser* rdf_parser=NULL;
|
|
unsigned char *uri_string=NULL;
|
|
raptor_uri *base_uri;
|
|
raptor_uri *uri;
|
|
librdf_sql_config* config;
|
|
size_t len;
|
|
int i;
|
|
|
|
librdf_world_open(world);
|
|
|
|
config=(librdf_sql_config*)LIBRDF_MALLOC(librdf_sql_config,
|
|
sizeof(librdf_sql_config));
|
|
|
|
len=strlen(config_dir) + 1 + strlen(storage_name) + 4 + 1;
|
|
if(layout)
|
|
len+= strlen(layout) + 1;
|
|
config->filename=(char*)LIBRDF_MALLOC(cstring, len);
|
|
if(layout)
|
|
sprintf(config->filename, "%s/%s-%s.ttl", config_dir, storage_name, layout);
|
|
else
|
|
sprintf(config->filename, "%s/%s.ttl", config_dir, storage_name);
|
|
|
|
config->predicate_uri_strings=predicate_uri_strings;
|
|
for(i=0; config->predicate_uri_strings[i]; i++)
|
|
;
|
|
config->predicates_count=i;
|
|
config->values=(char**)LIBRDF_CALLOC(cstring, sizeof(char*),
|
|
config->predicates_count);
|
|
|
|
LIBRDF_DEBUG4("Attempting to open %s layout %s storage config file %s\n",
|
|
storage_name, (layout ? layout: "(default)"), config->filename);
|
|
|
|
if(access((const char*)config->filename, R_OK)) {
|
|
librdf_log(world, 0, LIBRDF_LOG_ERROR, LIBRDF_FROM_STORAGE, NULL,
|
|
"Failed to open configuration file %s for storage %s layout %s - %s",
|
|
config->filename, storage_name, (layout ? layout: "(default)"),
|
|
strerror(errno));
|
|
librdf_free_sql_config(config);
|
|
return NULL;
|
|
}
|
|
|
|
uri_string=raptor_uri_filename_to_uri_string(config->filename);
|
|
uri=raptor_new_uri(uri_string);
|
|
base_uri=raptor_uri_copy(uri);
|
|
|
|
rdf_parser=raptor_new_parser("turtle");
|
|
raptor_set_statement_handler(rdf_parser, config,
|
|
librdf_sql_config_store_triple);
|
|
raptor_parse_file(rdf_parser, uri, base_uri);
|
|
raptor_free_parser(rdf_parser);
|
|
|
|
raptor_free_uri(base_uri);
|
|
raptor_free_memory(uri_string);
|
|
raptor_free_uri(uri);
|
|
|
|
/* Check all values are given */
|
|
for(i=0; i < config->predicates_count; i++) {
|
|
if(!config->values[i]) {
|
|
librdf_log(world, 0, LIBRDF_LOG_ERROR, LIBRDF_FROM_STORAGE, NULL,
|
|
"Configuration %s missing for storage %s",
|
|
config->predicate_uri_strings[i], storage_name);
|
|
librdf_free_sql_config(config);
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
return config;
|
|
}
|
|
|
|
|
|
const char* librdf_storage_sql_dbconfig_predicates[DBCONFIG_CREATE_TABLE_LAST+2]={
|
|
"http://schemas.librdf.org/2006/dbconfig#createTableStatements",
|
|
"http://schemas.librdf.org/2006/dbconfig#createTableLiterals",
|
|
"http://schemas.librdf.org/2006/dbconfig#createTableResources",
|
|
"http://schemas.librdf.org/2006/dbconfig#createTableBnodes",
|
|
"http://schemas.librdf.org/2006/dbconfig#createTableModels",
|
|
NULL
|
|
};
|
|
|
|
|
|
/**
|
|
* librdf_new_sql_config_for_storage:
|
|
* @storage: SQL #librdf_storage to configure
|
|
* @layout: layout variant
|
|
* @dir: directory to look for configuration or NULL for default dir
|
|
*
|
|
* Constructor - Create a new SQL storage configuration for a given database layout.
|
|
*
|
|
* Return value: new configuration or NULL on failure
|
|
**/
|
|
librdf_sql_config*
|
|
librdf_new_sql_config_for_storage(librdf_storage* storage, const char* layout,
|
|
const char *dir)
|
|
{
|
|
if(!dir)
|
|
dir=PKGDATADIR;
|
|
|
|
return librdf_new_sql_config(storage->world, storage->factory->name,
|
|
layout, dir,
|
|
librdf_storage_sql_dbconfig_predicates);
|
|
}
|
|
|
|
|
|
/**
|
|
* librdf_free_sql_config:
|
|
* @config: SQL storage configuration
|
|
*
|
|
* Destructor - free a SQL configuration.
|
|
**/
|
|
void
|
|
librdf_free_sql_config(librdf_sql_config* config)
|
|
{
|
|
int i;
|
|
|
|
if(config->values) {
|
|
for(i=0; i < config->predicates_count; i++) {
|
|
if(config->values[i])
|
|
LIBRDF_FREE(cstring, config->values[i]);
|
|
}
|
|
LIBRDF_FREE(cstring, config->values);
|
|
}
|
|
|
|
if(config->filename)
|
|
LIBRDF_FREE(cstring, config->filename);
|
|
|
|
LIBRDF_FREE(cstring, config);
|
|
}
|