You are viewing a plain text version of this content. The canonical link for it is here.
Posted to triplesoup-commits@incubator.apache.org by le...@apache.org on 2007/04/13 08:56:16 UTC

svn commit: r528394 [22/35] - in /incubator/triplesoup/donations/TRIPLES-3-RDFStore: ./ dbms/ dbms/client/ dbms/client/t/ dbms/dbmsproxy/ dbms/deamon/ dbms/doc/ dbms/include/ dbms/libdbms/ dbms/utils/ doc/ include/ lib/ lib/DBD/ lib/RDFStore/ lib/RDFSt...

Added: incubator/triplesoup/donations/TRIPLES-3-RDFStore/rdfstore_log.c
URL: http://svn.apache.org/viewvc/incubator/triplesoup/donations/TRIPLES-3-RDFStore/rdfstore_log.c?view=auto&rev=528394
==============================================================================
--- incubator/triplesoup/donations/TRIPLES-3-RDFStore/rdfstore_log.c (added)
+++ incubator/triplesoup/donations/TRIPLES-3-RDFStore/rdfstore_log.c Fri Apr 13 01:56:01 2007
@@ -0,0 +1,156 @@
+/*
+##############################################################################
+# 	Copyright (c) 2000-2006 All rights reserved
+# 	Alberto Reggiori <ar...@webweaving.org>
+#	Dirk-Willem van Gulik <di...@webweaving.org>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer. 
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+#
+# 3. The end-user documentation included with the redistribution,
+#    if any, must include the following acknowledgment:
+#       "This product includes software developed by 
+#        Alberto Reggiori <ar...@webweaving.org> and
+#        Dirk-Willem van Gulik <di...@webweaving.org>."
+#    Alternately, this acknowledgment may appear in the software itself,
+#    if and wherever such third-party acknowledgments normally appear.
+#
+# 4. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#    This product includes software developed by the University of
+#    California, Berkeley and its contributors. 
+#
+# 5. Neither the name of the University nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# 6. Products derived from this software may not be called "RDFStore"
+#    nor may "RDFStore" appear in their names without prior written
+#    permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# ====================================================================
+#
+# This software consists of work developed by Alberto Reggiori and 
+# Dirk-Willem van Gulik. The RDF specific part is based based on public 
+# domain software written at the Stanford University Database Group by 
+# Sergey Melnik. For more information on the RDF API Draft work, 
+# please see <http://www-db.stanford.edu/~melnik/rdf/api.html>
+# The DBMS TCP/IP server part is based on software originally written
+# by Dirk-Willem van Gulik for Web Weaving Internet Engineering m/v Enschede,
+# The Netherlands.
+#
+##############################################################################
+#
+# $Id: rdfstore_log.c,v 1.7 2006/06/19 10:10:22 areggiori Exp $
+#
+*/
+
+#if !defined(WIN32)
+#include <sys/param.h>
+#endif
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <strings.h>
+#include <fcntl.h>
+
+#include <time.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+
+#include "rdfstore_log.h"
+
+/* the following code must be integrated with dbms/deamon/mymalloc.[ch] */
+#ifdef RDFSTORE_DEBUG_MALLOC
+struct mp {
+	void * data;
+	int line;
+	int len;
+	char * file;
+	TIMESPEC tal;
+	struct mp * nxt;
+	} mp;
+
+struct mp * mfirst=NULL;
+int mpfree=0,mpalloc=0;
+
+void * rdfstore_log_debug_malloc( size_t len, char * file, int line ) {
+	struct mp * p = malloc( sizeof( mp ) );
+	if (p==NULL)
+		return NULL;
+	p->data = malloc( len );
+	if (p->data==NULL)
+		return NULL;
+#ifdef RDFSTORE_DEBUG
+	bzero(p->data,len);
+#endif
+	p->tal = time(NULL);
+	p->file = strdup( file );
+	p->line = line;
+	p->len = len;
+	p->nxt = mfirst;
+	mfirst = p;
+	mpalloc++;
+	return p->data;
+	}
+
+void rdfstore_log_debug_free( void * addr, char * file, int line ) {
+        struct mp *q, * * p;
+
+	for( p=&mfirst; *p; p=&((*p)->nxt)) 
+		if ((*p)->data == addr) 
+			break;
+
+	if (!*p) {
+		fprintf(stderr,"Unanticipated Free from %s:%d\n",file,line);
+#ifdef RDFSTORE_DEBUG
+		abort();
+#endif
+		};
+	q = *p; 
+	*p=(*p)->nxt;
+
+#ifdef RDFSTORE_DEBUG
+	bzero(q->data,q->len);
+#endif
+
+	free(q->data);
+	free(q->file);
+	free(q);
+	mpfree++;
+	}
+
+void rdfstore_log_debug_malloc_dump() {
+        struct mp * p; 
+	TIMESPEC now=time(NULL);
+
+	fprintf(stderr,"Memory==malloc %d == %d free\n",mpalloc,mpfree);
+        for( p = mfirst; p; p=p->nxt)
+                fprintf(stderr,"%s %d size %d age %f\n", p->file,p->line,p->len, difftime(now,p->tal) );
+        }
+
+#endif

Added: incubator/triplesoup/donations/TRIPLES-3-RDFStore/rdfstore_serializer.c
URL: http://svn.apache.org/viewvc/incubator/triplesoup/donations/TRIPLES-3-RDFStore/rdfstore_serializer.c?view=auto&rev=528394
==============================================================================
--- incubator/triplesoup/donations/TRIPLES-3-RDFStore/rdfstore_serializer.c (added)
+++ incubator/triplesoup/donations/TRIPLES-3-RDFStore/rdfstore_serializer.c Fri Apr 13 01:56:01 2007
@@ -0,0 +1,728 @@
+/*
+##############################################################################
+# 	Copyright (c) 2000-2006 All rights reserved
+# 	Alberto Reggiori <ar...@webweaving.org>
+#	Dirk-Willem van Gulik <di...@webweaving.org>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer. 
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+#
+# 3. The end-user documentation included with the redistribution,
+#    if any, must include the following acknowledgment:
+#       "This product includes software developed by 
+#        Alberto Reggiori <ar...@webweaving.org> and
+#        Dirk-Willem van Gulik <di...@webweaving.org>."
+#    Alternately, this acknowledgment may appear in the software itself,
+#    if and wherever such third-party acknowledgments normally appear.
+#
+# 4. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#    This product includes software developed by the University of
+#    California, Berkeley and its contributors. 
+#
+# 5. Neither the name of the University nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# 6. Products derived from this software may not be called "RDFStore"
+#    nor may "RDFStore" appear in their names without prior written
+#    permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# ====================================================================
+#
+# This software consists of work developed by Alberto Reggiori and 
+# Dirk-Willem van Gulik. The RDF specific part is based based on public 
+# domain software written at the Stanford University Database Group by 
+# Sergey Melnik. For more information on the RDF API Draft work, 
+# please see <http://www-db.stanford.edu/~melnik/rdf/api.html>
+# The DBMS TCP/IP server part is based on software originally written
+# by Dirk-Willem van Gulik for Web Weaving Internet Engineering m/v Enschede,
+# The Netherlands.
+#
+##############################################################################
+#
+# $Id: rdfstore_serializer.c,v 1.9 2006/06/19 10:10:22 areggiori Exp $
+#
+*/
+
+#if !defined(WIN32)
+#include <sys/param.h>
+#endif
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <strings.h>
+#include <fcntl.h>
+#include <ctype.h>
+
+#include <time.h>
+#include <sys/stat.h>
+
+#include "rdfstore_log.h"
+#include "rdfstore.h"
+#include "rdfstore_serializer.h"
+#include "rdfstore_digest.h"
+#include "rdfstore_utf8.h"
+
+/*
+#define RDFSTORE_DEBUG
+*/
+
+/*
+	See also:
+
+	o-> N-Triples http://www.w3.org/TR/rdf-testcases/#ntrip_grammar
+        o-> Quads http://robustai.net/sailor/grammar/Quads.html
+
+*/
+
+int rdfstore_ntriples_hex2c(const char *x);
+void rdfstore_ntriples_c2hex(int ch, char *x);
+
+char *
+rdfstore_get_localname ( char * uri ) {
+        char * nc=NULL;
+        char * localname=NULL;
+
+	if ( uri == NULL )
+		return NULL;
+
+        /* try to get out XML QName LocalName from resource identifier */
+        nc = uri + strlen(uri)-1;
+        while( nc >= uri ) {
+                if( rdfstore_is_xml_name( nc ) )
+                        localname = nc;
+                nc--;
+                };
+
+        if( !localname ) {
+		localname = uri; /* we can not split it up; so we default to the whole uri - correct? */
+                };
+
+        return localname;
+        };
+
+int
+rdfstore_get_namespace ( char * uri ) {
+        char * nc=NULL;
+
+	if ( uri == NULL )
+		return 0;
+
+	nc = rdfstore_get_localname( uri );
+        if ( nc == NULL ) {
+		return ( uri != NULL ) ? strlen(uri) : 0;
+	} else {
+        	return (int)( nc - uri );
+		};
+	};
+
+/* see http://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName */
+int
+rdfstore_is_xml_name( char *name_char ) {
+
+	if (	( ! isalpha((int)*name_char) ) &&
+		( *name_char != '_' ) )
+		return 0;
+
+	name_char++;
+	while( *name_char ) {
+		if (	( ! isalnum((int)*name_char) ) &&
+			( *name_char != '_' ) && 
+			( *name_char != '-' ) &&
+			( *name_char != '.' ) )
+			return 0;
+		name_char++;
+		};
+
+	return 1;
+	};
+
+int
+rdfstore_statement_getLabel( RDF_Statement   * statement, char * label ) {
+	if ( statement->node != NULL ) { /* use the statement as resource identifier if possible */
+		/* XXX is the following copy to char * (string) correct????? */
+        	memcpy( label, statement->node->value.resource.identifier, statement->node->value.resource.identifier_len );
+		memcpy( label+statement->node->value.resource.identifier_len, "\0", 1);
+		return statement->node->value.resource.identifier_len;
+        } else {
+        	int i=0,status=0;
+                unsigned char dd[RDFSTORE_SHA_DIGESTSIZE];
+
+                /* e.g. urn:rdf:SHA-1-d2619b606c7ecac3dcf9151dae104c4ae7554786 */
+                sprintf( label, "urn:rdf:%s-", rdfstore_digest_get_digest_algorithm() );
+                status = rdfstore_digest_get_statement_digest( statement, NULL, dd );
+                if ( status != 0 )
+			return 0;
+
+                for ( i=0; i< RDFSTORE_SHA_DIGESTSIZE ; i++ ) {
+			char cc[2];
+                	sprintf( cc, "%02X", dd[i] );
+			strncat(label, cc, 2);
+                        };
+		return 9 + strlen( rdfstore_digest_get_digest_algorithm() ) + (RDFSTORE_SHA_DIGESTSIZE*2);
+		};
+	};
+
+char * rdfstore_ntriples_statement (
+	RDF_Statement   * statement,
+        RDF_Node	* given_context
+	) {
+	RDF_Node * context = NULL;
+	int i=0;
+	char * buff=NULL;
+	char * buff1=NULL;
+	int s_len=0,p_len=0,o_len=0,c_len=0, reification_len=0;
+
+        buff=NULL;
+
+        if (    ( statement             == NULL ) ||
+                ( statement->subject    == NULL ) ||
+                ( statement->predicate  == NULL ) ||
+                ( statement->subject->value.resource.identifier   == NULL ) ||
+                ( statement->predicate->value.resource.identifier   == NULL ) ||
+                ( statement->object     == NULL ) ||
+		(	( statement->object->type != 1 ) &&
+			( statement->object->value.resource.identifier   == NULL ) ) ||
+		(	( context != NULL ) &&
+			( context->value.resource.identifier   == NULL ) ) ||
+		(	( statement->node != NULL ) &&
+			( statement->node->value.resource.identifier   == NULL ) ) )
+                return NULL;
+
+	if (given_context == NULL) {
+		if (statement->context != NULL)
+                	context = statement->context;
+	} else {
+		/* use given context instead */
+		context = given_context;
+		};
+
+	/* try to allocate just the necessary - see http://www.w3.org/TR/rdf-testcases/#ntriples */
+	if ( statement->subject->type == 0 ) {
+		s_len = statement->subject->value.resource.identifier_len*(RDFSTORE_UTF8_MAXLEN+1+2) + 4;
+	} else {
+		s_len = statement->subject->value.resource.identifier_len + 4;
+		};
+	if ( statement->predicate->type == 0 ) {
+		p_len = statement->predicate->value.resource.identifier_len*(RDFSTORE_UTF8_MAXLEN+1+2) + 4;
+	} else {
+		p_len = statement->predicate->value.resource.identifier_len + 4;
+		};
+	if ( statement->object->type == 0 ) {
+		o_len = statement->object->value.resource.identifier_len*(RDFSTORE_UTF8_MAXLEN+1+2) + 4;
+	} else if ( statement->object->type == 2 ) {
+		o_len = statement->object->value.resource.identifier_len + 4;
+	} else {
+		o_len = ( statement->object->value.literal.string != NULL ) ? 
+				statement->object->value.literal.string_len*(RDFSTORE_UTF8_MAXLEN+1+2) + 3 : 0;
+		if (	(statement->object->value.literal.lang != NULL) && 
+			(strlen(statement->object->value.literal.lang) > 0) )
+			o_len += strlen(statement->object->value.literal.lang) + 1;
+		/* we propably should croak or warn the user if something is fishy with the rdf:dataType property */
+		if ( statement->object->value.literal.parseType == 1 )
+			o_len += strlen(RDFSTORE_RDF_PARSETYPE_LITERAL) + 4;
+		else if ( statement->object->value.literal.dataType != NULL )
+			o_len += strlen(statement->object->value.literal.dataType) + 4;
+		o_len++;
+		};
+	if ( context != NULL )
+		c_len = context->value.resource.identifier_len + 4;
+
+	if (    (statement->isreified) &&
+                (statement->node != NULL) ) {
+		reification_len = ( statement->node->value.resource.identifier_len + 4 ) * 4;
+		reification_len += strlen(RDFMS_type) + 4;
+		reification_len += strlen(RDFMS_Statement) + 4;
+		reification_len += strlen(RDFMS_subject) + 4;
+		reification_len += s_len;
+		reification_len += strlen(RDFMS_predicate) + 4;
+		reification_len += p_len;
+		reification_len += strlen(RDFMS_object) + 4;
+		reification_len += o_len;
+		};
+
+        buff = (char *) RDFSTORE_MALLOC( sizeof(char) * ( s_len + p_len + o_len + c_len + 3 + reification_len ) );
+
+	if ( buff == NULL )
+                return NULL;
+
+        /* try to generate an N-Triples/Quads like string here */
+
+	i=0;
+
+	buff1=NULL;
+	if( (buff1=rdfstore_ntriples_node( statement->subject )) == NULL ) {
+		RDFSTORE_FREE( buff );
+		return NULL;
+		};
+        memcpy(buff+i, buff1, strlen(buff1));
+	i+=strlen(buff1);
+	RDFSTORE_FREE( buff1 );
+	memcpy(buff+i," ",1);
+	i++;
+
+	buff1=NULL;
+	if( (buff1=rdfstore_ntriples_node( statement->predicate )) == NULL ) {
+		RDFSTORE_FREE( buff );
+		return NULL;
+		};
+        memcpy(buff+i, buff1, strlen(buff1));
+	i+=strlen(buff1);
+	RDFSTORE_FREE( buff1 );
+	memcpy(buff+i," ",1);
+	i++;
+
+	buff1=NULL;
+	if( (buff1=rdfstore_ntriples_node( statement->object )) == NULL ) {
+		RDFSTORE_FREE( buff );
+		return NULL;
+		};
+        memcpy(buff+i, buff1, strlen(buff1));
+	i+=strlen(buff1);
+	RDFSTORE_FREE( buff1 );
+	memcpy(buff+i," ",1);
+	i++;
+
+	if ( context != NULL ) {
+		buff1=NULL;
+		if( (buff1=rdfstore_ntriples_node( context )) == NULL ) {
+			RDFSTORE_FREE( buff );
+			return NULL;
+			};
+        	memcpy(buff+i, buff1, strlen(buff1));
+		i+=strlen(buff1);
+		RDFSTORE_FREE( buff1 );
+		memcpy(buff+i," ",1);
+		i++;
+		};
+
+	memcpy(buff+i,". ",2); /* not cr/lf */
+	i+=2;
+
+	/* add the reification triples if necessary */
+	if (	(statement->isreified) &&
+		(statement->node != NULL) ) {
+		memcpy(buff+i,"\n",1);
+		i++;
+
+		buff1=NULL;
+		if( (buff1=rdfstore_ntriples_node( statement->node )) == NULL ) {
+			RDFSTORE_FREE( buff );
+			return NULL;
+			};
+        	memcpy(buff+i, buff1, strlen(buff1));
+		i+=strlen(buff1);
+		RDFSTORE_FREE( buff1 );
+		memcpy(buff+i," ",1);
+		i++;
+
+		memcpy(buff+i,"<",1);
+		i++;
+        	memcpy(buff+i, RDFMS_type, strlen(RDFMS_type));
+		i+=strlen(RDFMS_type);
+		memcpy(buff+i,">",1);
+		i++;
+		memcpy(buff+i," ",1);
+		i++;
+
+		memcpy(buff+i,"<",1);
+		i++;
+        	memcpy(buff+i, RDFMS_Statement, strlen(RDFMS_Statement));
+		i+=strlen(RDFMS_Statement);
+		memcpy(buff+i,">",1);
+		i++;
+		memcpy(buff+i," ",1);
+		i++;
+
+		memcpy(buff+i,". ",2); /* not cr/lf */
+		i+=2;
+		memcpy(buff+i,"\n",1);
+		i++;
+
+		buff1=NULL;
+		if( (buff1=rdfstore_ntriples_node( statement->node )) == NULL ) {
+			RDFSTORE_FREE( buff );
+			return NULL;
+			};
+        	memcpy(buff+i, buff1, strlen(buff1));
+		i+=strlen(buff1);
+		RDFSTORE_FREE( buff1 );
+		memcpy(buff+i," ",1);
+		i++;
+
+		memcpy(buff+i,"<",1);
+		i++;
+        	memcpy(buff+i, RDFMS_subject, strlen(RDFMS_subject));
+		i+=strlen(RDFMS_subject);
+		memcpy(buff+i,">",1);
+		i++;
+		memcpy(buff+i," ",1);
+		i++;
+
+		buff1=NULL;
+		if( (buff1=rdfstore_ntriples_node( statement->subject )) == NULL ) {
+			RDFSTORE_FREE( buff );
+			return NULL;
+			};
+        	memcpy(buff+i, buff1, strlen(buff1));
+		i+=strlen(buff1);
+		RDFSTORE_FREE( buff1 );
+		memcpy(buff+i," ",1);
+		i++;
+
+		memcpy(buff+i,". ",2); /* not cr/lf */
+		i+=2;
+		memcpy(buff+i,"\n",1);
+		i++;
+
+		buff1=NULL;
+		if( (buff1=rdfstore_ntriples_node( statement->node )) == NULL ) {
+			RDFSTORE_FREE( buff );
+			return NULL;
+			};
+        	memcpy(buff+i, buff1, strlen(buff1));
+		i+=strlen(buff1);
+		RDFSTORE_FREE( buff1 );
+		memcpy(buff+i," ",1);
+		i++;
+
+		memcpy(buff+i,"<",1);
+		i++;
+        	memcpy(buff+i, RDFMS_predicate, strlen(RDFMS_predicate));
+		i+=strlen(RDFMS_predicate);
+		memcpy(buff+i,">",1);
+		i++;
+		memcpy(buff+i," ",1);
+		i++;
+
+		buff1=NULL;
+		if( (buff1=rdfstore_ntriples_node( statement->predicate )) == NULL ) {
+			RDFSTORE_FREE( buff );
+			return NULL;
+			};
+        	memcpy(buff+i, buff1, strlen(buff1));
+		i+=strlen(buff1);
+		RDFSTORE_FREE( buff1 );
+		memcpy(buff+i," ",1);
+		i++;
+
+		memcpy(buff+i,". ",2); /* not cr/lf */
+		i+=2;
+		memcpy(buff+i,"\n",1);
+		i++;
+
+		buff1=NULL;
+		if( (buff1=rdfstore_ntriples_node( statement->node )) == NULL ) {
+			RDFSTORE_FREE( buff );
+			return NULL;
+			};
+        	memcpy(buff+i, buff1, strlen(buff1));
+		i+=strlen(buff1);
+		RDFSTORE_FREE( buff1 );
+		memcpy(buff+i," ",1);
+		i++;
+
+		memcpy(buff+i,"<",1);
+		i++;
+        	memcpy(buff+i, RDFMS_object, strlen(RDFMS_object));
+		i+=strlen(RDFMS_object);
+		memcpy(buff+i,">",1);
+		i++;
+		memcpy(buff+i," ",1);
+		i++;
+
+		buff1=NULL;
+		if( (buff1=rdfstore_ntriples_node( statement->object )) == NULL ) {
+			RDFSTORE_FREE( buff );
+			return NULL;
+			};
+        	memcpy(buff+i, buff1, strlen(buff1));
+		i+=strlen(buff1);
+		RDFSTORE_FREE( buff1 );
+		memcpy(buff+i," ",1);
+		i++;
+
+		memcpy(buff+i,". ",2); /* not cr/lf */
+		i+=2;
+		};
+
+	memcpy(buff+i,"\0",1);
+	i++;
+
+	return buff;
+	};
+
+char * rdfstore_ntriples_node (
+	RDF_Node    * node
+	) {
+        int j=0,len=0;
+        char * buff=NULL;
+        register unsigned int i=0;
+        unsigned int utf8_size=0;
+
+        if (	( node == NULL ) ||
+		(	( node->type != 1 ) &&
+			( node->value.resource.identifier == NULL ) ) )
+                return NULL;
+
+	if ( node->type == 0 ) {
+		len = node->value.resource.identifier_len*(RDFSTORE_UTF8_MAXLEN+1+2) + 3;
+	} else if ( node->type == 2 ) {
+		len = node->value.resource.identifier_len + 3;
+	} else {
+		len = (node->value.literal.string != NULL ) ? 
+				node->value.literal.string_len*(RDFSTORE_UTF8_MAXLEN+1+2) + 3 : 0;
+		if (	(node->value.literal.lang != NULL) && 
+			(strlen(node->value.literal.lang) > 0) )
+			len += strlen(node->value.literal.lang) + 1;
+		/* we propably should croak or warn the user if something is fishy with the rdf:dataType property */
+		if ( node->value.literal.parseType == 1 )
+			len += strlen(RDFSTORE_RDF_PARSETYPE_LITERAL) + 4;
+		else if ( node->value.literal.dataType != NULL )
+			len += strlen(node->value.literal.dataType) + 4;
+		};
+
+        buff = (char *) RDFSTORE_MALLOC( sizeof(char) * len );
+        if ( buff == NULL )
+                return NULL;
+
+        j=0;
+
+	/* NOTE: we should check that all the absoluteURI generated would be properly escaped accordingly to http://www.w3.org/TR/rdf-testcases/#sec-uri-encoding */
+
+        if ( node->type == 2 ) {
+        	memcpy(buff+j,"_:",2);
+        	j+=2;
+        	memcpy(buff+j,node->value.resource.identifier,node->value.resource.identifier_len);
+        	j+=node->value.resource.identifier_len;
+        } else if ( node->type == 0 ) {
+		int uri_len = 0;
+        	memcpy(buff+j,"<",1);
+        	j++;
+		uri_len = node->value.resource.identifier_len;
+        	for(i=0; i < uri_len; ) {
+			if( node->value.resource.identifier[i] == 0x09 ) {
+        			memcpy(buff+j,"\\t",2);
+        			j+=2;
+				i++;
+				continue;
+			} else if( node->value.resource.identifier[i] == 0x0a ) {
+        			memcpy(buff+j,"\\n",2);
+        			j+=2;
+				i++;
+				continue;
+			} else if( node->value.resource.identifier[i] == 0x0d ) {
+        			memcpy(buff+j,"\\r",2);
+        			j+=2;
+				i++;
+				continue;
+			} else if( node->value.resource.identifier[i] == 0x5c ) {
+        			memcpy(buff+j,"\\\\",2);
+        			j+=2;
+				i++;
+				continue;
+			} else if( node->value.resource.identifier[i] == 0x22 ) {
+        			memcpy(buff+j,"\\\"",2);
+        			j+=2;
+				i++;
+				continue;
+				};
+                	if ( ( rdfstore_utf8_is_utf8( node->value.resource.identifier+i, &utf8_size ) ) && ( utf8_size > 1 ) ) {
+				unsigned long cp=0;
+				unsigned char es[8];
+
+				if ( rdfstore_utf8_utf8_to_cp( utf8_size, node->value.resource.identifier+i, &cp ) ) {
+					RDFSTORE_FREE( buff );
+                               		return NULL;
+                               		};
+
+				if(utf8_size<=4) {
+       					sprintf(es, "\\u%04lX", cp);
+				} else {
+       					sprintf(es, "\\U%08lX", cp);
+					};
+       				memcpy(buff+j,es,strlen(es));
+       				j+=strlen(es);
+				i+=utf8_size;
+               		} else {
+       				memcpy(buff+j,node->value.resource.identifier+i,utf8_size);
+				j+=utf8_size;
+				i++;
+                       		};
+               		};
+		memcpy(buff+j,">",1);
+        	j++;
+        } else if ( node->type == 1 ) {
+        	memcpy(buff+j,"\"",1);
+        	j++;
+
+		if ( node->value.literal.string != NULL ) {
+
+			/* here we convert the string to RDFSTORE_UTF8 and then escape it accordingly to http://www.w3.org/TR/rdf-testcases/#ntrip_strings */
+        		for(i=0; i < node->value.literal.string_len; ) {
+				if( node->value.literal.string[i] == 0x09 ) {
+        				memcpy(buff+j,"\\t",2);
+        				j+=2;
+					i++;
+					continue;
+				} else if( node->value.literal.string[i] == 0x0a ) {
+        				memcpy(buff+j,"\\n",2);
+        				j+=2;
+					i++;
+					continue;
+				} else if( node->value.literal.string[i] == 0x0d ) {
+        				memcpy(buff+j,"\\r",2);
+        				j+=2;
+					i++;
+					continue;
+				} else if( node->value.literal.string[i] == 0x5c ) {
+        				memcpy(buff+j,"\\\\",2);
+        				j+=2;
+					i++;
+					continue;
+				} else if( node->value.literal.string[i] == 0x22 ) {
+        				memcpy(buff+j,"\\\"",2);
+        				j+=2;
+					i++;
+					continue;
+					};
+                		if ( ( rdfstore_utf8_is_utf8( node->value.literal.string+i, &utf8_size ) ) && ( utf8_size > 1 ) ) {
+					unsigned long cp=0;
+					unsigned char es[8];
+
+					if ( rdfstore_utf8_utf8_to_cp( utf8_size, node->value.literal.string+i, &cp ) ) {
+						RDFSTORE_FREE( buff );
+                                		return NULL;
+                                		};
+
+					if(utf8_size<=4) {
+        					sprintf(es, "\\u%04lX", cp);
+					} else {
+        					sprintf(es, "\\U%08lX", cp);
+						};
+        				memcpy(buff+j,es,strlen(es));
+        				j+=strlen(es);
+					i+=utf8_size;
+                		} else {
+        				memcpy(buff+j,node->value.literal.string+i,utf8_size);
+					j+=utf8_size;
+					i++;
+                        		};
+                		};
+			};
+
+        	memcpy(buff+j,"\"",1);
+        	j++;
+
+        	if(	(node->value.literal.lang != NULL) &&
+			(strlen(node->value.literal.lang) > 0) ) {
+        		memcpy(buff+j,"@",1);
+        		j++;
+        		/* we should check that the language tag is also well-formed and escaped */
+        		memcpy(buff+j,node->value.literal.lang,strlen(node->value.literal.lang));
+        		j+=strlen(node->value.literal.lang);
+			};
+
+        	if( node->value.literal.parseType == 1 ) {
+        		memcpy(buff+j,"^^",2);
+        		j+=2;
+        		memcpy(buff+j,"<",1);
+        		j++;
+        		memcpy(buff+j,RDFSTORE_RDF_PARSETYPE_LITERAL,strlen(RDFSTORE_RDF_PARSETYPE_LITERAL));
+        		j+=strlen(RDFSTORE_RDF_PARSETYPE_LITERAL);
+        		memcpy(buff+j,">",1);
+        		j++;
+		} else if ( node->value.literal.dataType != NULL ) {
+        		memcpy(buff+j,"^^",2);
+        		j+=2;
+        		memcpy(buff+j,"<",1);
+        		j++;
+        		/* we should check that the data type URI ref is a valid XMLSchema data type perhpas */
+        		memcpy(buff+j,node->value.literal.dataType,strlen(node->value.literal.dataType));
+        		j+=strlen(node->value.literal.dataType);
+        		memcpy(buff+j,">",1);
+        		j++;
+			};
+	} else {
+		RDFSTORE_FREE( buff );
+		perror("rdfstore_ntriples_node");
+                fprintf(stderr,"Could not generate ntriple for node: unknown node type\n");
+		return NULL;
+		};
+
+	memcpy(buff+j,"\0",1);
+	j++;
+
+	return buff;
+	};
+
+/* the following two subroutines do not consider EBCDIC codes still! */
+int rdfstore_ntriples_hex2c(const char *x) {
+	int i;
+	int ch;
+
+	ch = x[0];
+
+	if (isdigit( ((unsigned char)(ch)) ))
+        	i = ch - '0';
+	else if (isupper( ((unsigned char)(ch)) ))
+		i = ch - ('A' - 10);
+	else
+		i = ch - ('a' - 10);
+
+	i <<= 4;
+
+	ch = x[1];
+	if (isdigit( ((unsigned char)(ch)) ))
+        	i += ch - '0';
+	else if (isupper( ((unsigned char)(ch)) ))
+		i += ch - ('A' - 10);
+	else
+		i += ch - ('a' - 10);
+
+	return i;
+	};
+
+void rdfstore_ntriples_c2hex(int ch, char *x) {
+	int i;
+
+	x[0] = '%';
+	i = (ch & 0xF0) >> 4;
+
+	if (i >= 10)
+		x[1] = ('A' - 10) + i;
+	else
+		x[1] = '0' + i;
+
+	i = ch & 0x0F;
+
+	if (i >= 10)
+		x[2] = ('A' - 10) + i;
+	else
+		x[2] = '0' + i;
+	};