[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: kdesupport/soprano
From: Sebastian Trueg <sebastian () trueg ! de>
Date: 2010-01-25 11:32:07
Message-ID: 1264419127.047198.8756.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 1080006 by trueg:
Removed redland dependancy from raptor parser. This was awful work. I forgot how much \
pain the raptor API is!
CCMAIL: monkeyiq@users.sourceforge.net
M +4 -4 CMakeLists.txt
M +1 -5 serializers/raptor/CMakeLists.txt
M +150 -149 serializers/raptor/raptorserializer.cpp
--- trunk/kdesupport/soprano/CMakeLists.txt #1080005:1080006
@@ -7,7 +7,7 @@
################## Soprano version ################################
set(CMAKE_SOPRANO_VERSION_MAJOR 2)
set(CMAKE_SOPRANO_VERSION_MINOR 3)
-set(CMAKE_SOPRANO_VERSION_RELEASE 71)
+set(CMAKE_SOPRANO_VERSION_RELEASE 72)
set(CMAKE_SOPRANO_VERSION_STRING \
"${CMAKE_SOPRANO_VERSION_MAJOR}.${CMAKE_SOPRANO_VERSION_MINOR}.${CMAKE_SOPRANO_VERSION_RELEASE}")
@@ -107,9 +107,9 @@
if(RAPTOR_FOUND AND NOT SOPRANO_DISABLE_RAPTOR_PARSER)
set(BUILD_RAPTOR_PARSER TRUE)
endif(RAPTOR_FOUND AND NOT SOPRANO_DISABLE_RAPTOR_PARSER)
-if(RAPTOR_FOUND AND REDLAND_FOUND AND REDLAND_VERSION_GOOD AND NOT \
SOPRANO_DISABLE_RAPTOR_SERIALIZER) +if(RAPTOR_FOUND AND NOT \
SOPRANO_DISABLE_RAPTOR_SERIALIZER) set(BUILD_RAPTOR_SERIALIZER TRUE)
-endif(RAPTOR_FOUND AND REDLAND_FOUND AND REDLAND_VERSION_GOOD AND NOT \
SOPRANO_DISABLE_RAPTOR_SERIALIZER) +endif(RAPTOR_FOUND AND NOT \
SOPRANO_DISABLE_RAPTOR_SERIALIZER) if(NOT SOPRANO_DISABLE_DBUS AND QT_QTDBUS_FOUND)
set(BUILD_DBUS_SUPPORT TRUE)
endif(NOT SOPRANO_DISABLE_DBUS AND QT_QTDBUS_FOUND)
@@ -256,7 +256,7 @@
endif(NOT BUILD_RAPTOR_PARSER)
if(NOT BUILD_RAPTOR_SERIALIZER)
- message(" * Raptor RDF serializer (missing libraptor and librdf/redland - \
http://librdf.org)") + message(" * Raptor RDF serializer (missing libraptor - \
http://librdf.org)") if(NOT SOPRANO_DISABLE_RAPTOR_PARSER AND REDLAND_FOUND AND \
REDLAND_VERSION STRLESS "1.0.6")
message(" (The Raptor serializer depends on librdf/redland 1.0.6 or \
greater.") endif(NOT SOPRANO_DISABLE_RAPTOR_PARSER AND REDLAND_FOUND AND \
REDLAND_VERSION STRLESS "1.0.6")
--- trunk/kdesupport/soprano/serializers/raptor/CMakeLists.txt #1080005:1080006
@@ -6,8 +6,6 @@
${QT_INCLUDE_DIR}
${soprano_core_SOURCE_DIR}
${soprano_raptor_serializer_BINARY_DIR}
- ${REDLAND_INCLUDE_DIR}
- ${RASQAL_INCLUDE_DIR}
${RAPTOR_INCLUDE_DIR}
)
@@ -27,10 +25,8 @@
add_library(soprano_raptorserializer MODULE ${raptor_serializer_SRC})
-TARGET_LINK_LIBRARIES(soprano_raptorserializer soprano soprano_redlandcore \
${RAPTOR_LIBRARIES}) +TARGET_LINK_LIBRARIES(soprano_raptorserializer soprano \
${RAPTOR_LIBRARIES})
-ADD_DEFINITIONS(${REDLAND_FLAGS})
-
set_target_properties(soprano_raptorserializer PROPERTIES
DEFINE_SYMBOL MAKE_RAPTORSERIALIZER_LIB
)
--- trunk/kdesupport/soprano/serializers/raptor/raptorserializer.cpp #1080005:1080006
@@ -21,20 +21,135 @@
*/
#include "raptorserializer.h"
-#include "../../backends/redland/redlandworld.h"
-#include "../../backends/redland/redlandstatementiterator.h"
#include "statementiterator.h"
#include "statement.h"
+#include "node.h"
-#include <redland.h>
+#include <raptor.h>
+#include <string.h>
#include <QtCore/QUrl>
#include <QtCore/QtPlugin>
#include <QtCore/QTextStream>
+#include <QtCore/QStringList>
#include <QtCore/QDebug>
+namespace {
+ class RaptorInitHelper
+ {
+ public:
+ RaptorInitHelper() {
+ raptor_init();
+ }
+ ~RaptorInitHelper() {
+ raptor_finish();
+ }
+ };
+ bool convertNode( const Soprano::Node& node, const void** data, \
raptor_identifier_type* type, raptor_uri** dataType = 0, const unsigned char** lang = \
0 ) + {
+ if ( node.isResource() ) {
+ *data = raptor_new_uri( ( const unsigned char* \
)node.uri().toEncoded().data() ); + *type = \
RAPTOR_IDENTIFIER_TYPE_RESOURCE; + return true;
+ }
+ else if ( node.isBlank() ) {
+ *data = strdup( node.identifier().toUtf8().data() );
+ *type = RAPTOR_IDENTIFIER_TYPE_ANONYMOUS;
+ return true;
+ }
+ else if ( node.isLiteral() ) {
+ *data = strdup( node.identifier().toUtf8().data() );
+ if ( node.literal().isPlain() ) {
+ *lang = ( unsigned char* )strdup( ( const char* \
)node.language().toUtf8().data() ); + }
+ else {
+ *dataType = raptor_new_uri( ( const unsigned char* \
)node.dataType().toEncoded().data() ); + }
+ *type = RAPTOR_IDENTIFIER_TYPE_LITERAL;
+ return true;
+ }
+
+ return false;
+ }
+
+
+ raptor_statement* convertStatement( const Soprano::Statement& statement )
+ {
+ raptor_statement* s = new raptor_statement;
+ memset( s, 0, sizeof( raptor_statement ) );
+ convertNode( statement.subject(), &s->subject, &s->subject_type );
+ convertNode( statement.predicate(), &s->predicate, &s->predicate_type );
+ convertNode( statement.object(), &s->object, &s->object_type, \
&s->object_literal_datatype, &s->object_literal_language ); + return s;
+ }
+
+
+ void free_node( const void* data, raptor_identifier_type type )
+ {
+ switch( type ) {
+ case RAPTOR_IDENTIFIER_TYPE_RESOURCE:
+ raptor_free_uri( ( raptor_uri* )data );
+ break;
+ default:
+ free( ( char* )data );
+ break;
+ }
+ }
+
+ void free_statement( raptor_statement* s )
+ {
+ free_node( s->subject, s->subject_type );
+ free_node( s->predicate, s->predicate_type );
+ free_node( s->object, s->object_type );
+ if ( s->object_literal_datatype )
+ raptor_free_uri( ( raptor_uri* )s->object_literal_datatype );
+ if ( s->object_literal_language )
+ free( ( char* )s->object_literal_language );
+ delete s;
+ }
+
+
+ int raptorIOStreamWriteByte( void* data, const int byte )
+ {
+ QTextStream* s = reinterpret_cast<QTextStream*>( data );
+ // an int is not a byte. Strange raptor API!
+ if( s->device() ) {
+ s->device()->putChar( (char)byte );
+ }
+ else {
+ ( *s ) << ( char )byte;
+ }
+ return 0;
+ }
+
+
+ int raptorIOStreamWriteBytes( void* data, const void* ptr, size_t size, size_t \
nmemb ) + {
+ // the raptor API is very weird. But it seems that ATM raptor only uses size \
== 1 + QTextStream* s = reinterpret_cast<QTextStream*>( data );
+ switch( size ) {
+ case 1: {
+ const char* p = reinterpret_cast<const char*>( ptr );
+ if( s->device() ) {
+ s->device()->write( p, nmemb );
+ }
+ else {
+ for ( unsigned int i = 0; i < nmemb; ++i ) {
+ raptorIOStreamWriteByte( data, p[i] );
+ }
+ }
+ break;
+ }
+ default:
+ qDebug() << "Unsupported data size: " << size;
+ return -1;
+ }
+ return 0;
+ }
+}
+
Q_EXPORT_PLUGIN2(soprano_raptorserializer, Soprano::Raptor::Serializer)
@@ -76,98 +191,6 @@
}
-int raptorIOStreamWriteByte( void* data, const int byte )
-{
- QTextStream* s = reinterpret_cast<QTextStream*>( data );
- // an int is not a byte. Strange raptor API!
- if( s->device() ) {
- s->device()->putChar( (char)byte );
- }
- else {
- ( *s ) << ( char )byte;
- }
- return 0;
-}
-
-
-int raptorIOStreamWriteBytes( void* data, const void* ptr, size_t size, size_t nmemb \
)
-{
- // the raptor API is very weird. But it seems that ATM raptor only uses size == \
1
- QTextStream* s = reinterpret_cast<QTextStream*>( data );
- switch( size ) {
- case 1: {
- const char* p = reinterpret_cast<const char*>( ptr );
- if( s->device() ) {
- s->device()->write( p, nmemb );
- }
- else {
- for ( unsigned int i = 0; i < nmemb; ++i ) {
- raptorIOStreamWriteByte( data, p[i] );
- }
- }
- break;
- }
- default:
- qDebug() << "Unsupported data size: " << size;
- return -1;
- }
- return 0;
-}
-
-
-class StreamData {
-public:
- StreamData()
- : world(0),
- initialized(false),
- atEnd(false) {}
-
- Soprano::StatementIterator it;
- Soprano::Redland::World* world;
- bool initialized;
- bool atEnd;
-};
-
-// the raptor API is aweful: it seems that first atEnd is called, then get, and then \
next until next returns false.
-// So we have to call it.next() manually if we don't want to get the first statement \
twice
-int streamIsEnd( void* data )
-{
- StreamData* it = reinterpret_cast<StreamData*>( data );
- if ( !it->initialized ) {
- it->initialized = true;
- it->atEnd = !it->it.next();
- }
- return it->atEnd;
-}
-
-
-int streamNext( void* data )
-{
- StreamData* it = reinterpret_cast<StreamData*>( data );
- it->atEnd = !it->it.next();
- return it->atEnd;
-}
-
-
-void* streamGet( void* data, int what )
-{
- StreamData* it = reinterpret_cast<StreamData*>( data );
-
- if ( what == 0 ) {
- // statement (stupid librdf does not export it)
- return it->world->createStatement( it->it.current() );
- }
- else {
- // context
- return it->world->createNode( it->it.current().context() );
- }
-}
-
-
-void streamFinished( void* )
-{}
-
-
bool Soprano::Raptor::Serializer::serialize( StatementIterator it,
QTextStream& stream,
RdfSerialization serialization,
@@ -175,31 +198,33 @@
{
clearError();
- Redland::World world;
+ RaptorInitHelper raptorHelper;
- librdf_serializer* serializer = 0;
+ raptor_serializer* serializer = 0;
if ( serialization == SerializationRdfXml ) {
- serializer = librdf_new_serializer( world.worldPtr(),
- "rdfxml-abbrev", // we always want the \
abbreviated xmlrdf
- 0,
- 0 );
+ serializer = raptor_new_serializer( "rdfxml-abbrev" ); // we always want the \
abbreviated xmlrdf }
- else if ( serialization == SerializationUser ) {
- serializer = librdf_new_serializer( world.worldPtr(),
- userSerialization.toLatin1().data(),
- 0,
- 0 );
- }
else {
- serializer = librdf_new_serializer( world.worldPtr(),
- 0, // all factories
- serializationMimeType( serialization, \
userSerialization ).toLatin1().data(),
- 0 );
+ for ( int i = 0; 1; ++i ) {
+ const char* syntax_name = 0;
+ const char* syntax_label = 0;
+ const char* mime_type = 0;
+ const unsigned char* uri_string = 0;
+ if ( raptor_serializers_enumerate( i,
+ &syntax_name,
+ &syntax_label,
+ &mime_type,
+ &uri_string ) )
+ break;
+ if ( !qstrcmp( serializationMimeType( serialization, userSerialization \
).toLatin1().data(), mime_type ) ) { + serializer = \
raptor_new_serializer( syntax_name ); + break;
+ }
+ }
}
if ( !serializer ) {
qDebug() << "(Soprano::Raptor::Serializer) no serializer for mimetype " << \
serializationMimeType( serialization, userSerialization );
- setError( world.lastError() );
return false;
}
@@ -207,9 +232,11 @@
QHash<QString, QUrl> namespaces = prefixes();
for ( QHash<QString, QUrl>::const_iterator pfit = namespaces.constBegin();
pfit != namespaces.constEnd(); ++pfit ) {
- librdf_serializer_set_namespace( serializer,
- librdf_new_uri( world.worldPtr(), \
reinterpret_cast<unsigned char*>( pfit.value().toEncoded().data() ) \
),
- pfit.key().toLatin1().data() );
+ raptor_uri* ns = raptor_new_uri( reinterpret_cast<unsigned char*>( \
pfit.value().toEncoded().data() ) ); + raptor_serialize_set_namespace( \
serializer, + ns,
+ ( unsigned char* \
)pfit.key().toLatin1().data() ); + raptor_free_uri( ns );
}
bool success = true;
@@ -239,44 +266,18 @@
\
&raptorStreamHandler ); #endif
- if ( !raptorStream ) {
- qDebug() << "(Soprano::Raptor::Serializer) failed to create Raptor stream.";
- librdf_free_serializer( serializer );
- setError( world.lastError() );
- return false;
- }
+ raptor_serialize_start_to_iostream( serializer, 0, raptorStream );
- StreamData streamData;
- streamData.it = it;
- streamData.atEnd = false;
- streamData.initialized = false;
- streamData.world = &world;
- librdf_stream* rdfStream = librdf_new_stream( world.worldPtr(),
- &streamData,
- streamIsEnd,
- streamNext,
- streamGet,
- streamFinished );
-
- if ( !rdfStream ) {
- qDebug() << "(Soprano::Raptor::Serializer) failed to create librdf stream.";
- raptor_free_iostream( raptorStream );
- setError( world.lastError() );
- return false;
+ while ( it.next() ) {
+ raptor_statement* rs = convertStatement( *it );
+ raptor_serialize_statement( serializer, rs );
+ free_statement( rs );
}
- if ( librdf_serializer_serialize_stream_to_iostream( serializer,
- 0,
- rdfStream,
- raptorStream ) ) {
- qDebug() << "(Soprano::Raptor::Serializer) serialization failed.";
- setError( world.lastError() );
- success = false;
- }
+ raptor_serialize_end( serializer );
+ raptor_free_iostream( raptorStream );
+ raptor_free_serializer( serializer );
- librdf_free_stream( rdfStream );
- librdf_free_serializer( serializer );
-
return success;
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic