[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [Soprano] facd446: * Fixed crash when deleting model while an it is o
From: Sebastian Trueg <sebastian () trueg ! de>
Date: 2010-10-26 12:01:38
Message-ID: 20101026120138.99E3EA6215 () git ! kde ! org
[Download RAW message or body]
A backends/virtuoso/virtuosomodel_p.h [License: LGPL(v2)]
commit facd4462aa68c56a54e01b21da5821e3980e142e
Author: Sebastian Trueg <sebastian@trueg.de>
Date: Thu Mar 26 16:54:06 2009 +0000
* Fixed crash when deleting model while an it is open (keep track of open its)
* Fixed ask queries (if context is given Virtuoso needs to have a "from" clause \
instead of a "graph" clause)
* All tests succeed (using a patched preview version of Virtuoso 5.0.11)
svn path=/trunk/kdesupport/soprano/; revision=945001
diff --git a/backends/virtuoso/virtuosomodel.cpp \
b/backends/virtuoso/virtuosomodel.cpp index 56eef85..eaba653 100644
--- a/backends/virtuoso/virtuosomodel.cpp
+++ b/backends/virtuoso/virtuosomodel.cpp
@@ -20,7 +20,9 @@
*/
#include "virtuosomodel.h"
+#include "virtuosomodel_p.h"
#include "virtuosoqueryresultiteratorbackend.h"
+#include "virtuosoqueryresultiteratorbackend_p.h"
#include "virtuosobackend.h"
#include "soprano.h"
#include "odbcenvironment.h"
@@ -110,20 +112,9 @@ namespace {
}
-class Soprano::VirtuosoModel::Private
-{
-public:
- Private()
- : connection( 0 ) {
- }
-
- ODBC::Connection* connection;
-};
-
-
Soprano::VirtuosoModel::VirtuosoModel( ODBC::Connection* connection, const Backend* \
b ) : StorageModel(b),
- d( new Private() )
+ d( new VirtuosoModelPrivate() )
{
d->connection = connection;
}
@@ -131,6 +122,8 @@ Soprano::VirtuosoModel::VirtuosoModel( ODBC::Connection* \
connection, const Backe
Soprano::VirtuosoModel::~VirtuosoModel()
{
+ foreach( Virtuoso::QueryResultIteratorBackend* it, d->m_openIterators )
+ it->close();
delete d->connection;
delete d;
}
@@ -195,23 +188,19 @@ bool Soprano::VirtuosoModel::containsStatement( const \
Statement& statement ) con Statement s( statement );
if ( !statement.context().isValid() )
s.setContext( Virtuoso::defaultGraph() );
- QString query = QString( "ask { %1 }" ).arg( statementToConstructGraphPattern( \
s, true ) );
-// qDebug() << "containsStatement query" << query;
- return executeQuery( query, Query::QueryLanguageSparql ).boolValue();
-// if ( VirtuosoStatementHandler* sh = d->connection.execute( "sparql " + query \
) ) {
-// bool b = sh->fetchScroll();
-// delete sh;
-// return b;
-// }
-// return false;
+ return containsAnyStatement( s );
}
-bool Soprano::VirtuosoModel::containsAnyStatement( const Statement &statement ) \
const +bool Soprano::VirtuosoModel::containsAnyStatement( const Statement& statement \
) const {
// qDebug() << Q_FUNC_INFO << statement;
- QString query = QString( "ask { %1 }" ).arg( statementToConstructGraphPattern( \
statement, true ) ); + QString query;
+ if ( statement.context().isValid() )
+ query = QString( "ask from %1 where { %2 . }" ).arg( \
statement.context().toN3(), statementToConstructGraphPattern( statement, false ) ); + \
else + query = QString( "ask where { %1 . }" ).arg( \
statementToConstructGraphPattern( statement, true ) ); // if ( \
VirtuosoStatementHandler* sh = d->connection.execute( "sparql " + query ) ) { // \
bool b = sh->fetchScroll(); // delete sh;
@@ -227,7 +216,11 @@ Soprano::StatementIterator \
Soprano::VirtuosoModel::listStatements( const Stateme qDebug() << Q_FUNC_INFO << \
partial;
// we cannot use a construct query due to missing graph support
- QString query = QString( "select * where { %1 . }" ).arg( \
statementToConstructGraphPattern( partial, true ) ); + QString query;
+ if ( partial.context().isValid() )
+ query = QString( "select * from %1 where { %2 . }" ).arg( \
partial.context().toN3(), statementToConstructGraphPattern( partial, false ) ); + \
else + query = QString( "select * where { %1 . }" ).arg( \
statementToConstructGraphPattern( partial, true ) ); qDebug() << "List Statements \
Query" << query; return executeQuery( query, Query::QueryLanguageSparql )
.iterateStatementsFromBindings( partial.subject().isValid() ? QString() : \
QString( 's' ), @@ -364,7 +357,10 @@ Soprano::QueryResultIterator \
Soprano::VirtuosoModel::executeQuery( const QString
ODBC::QueryResult* result = d->connection->executeQuery( QLatin1String( \
s_queryPrefix ) + ' ' + query ); if ( result ) {
clearError();
- return new Virtuoso::QueryResultIteratorBackend( result );
+ Virtuoso::QueryResultIteratorBackend* backend = new \
Virtuoso::QueryResultIteratorBackend( result ); + backend->d->m_model = d;
+ d->m_openIterators.append( backend );
+ return backend;
}
else {
setError( d->connection->lastError() );
diff --git a/backends/virtuoso/virtuosomodel.h b/backends/virtuoso/virtuosomodel.h
index 7fc9a5f..e5161b4 100644
--- a/backends/virtuoso/virtuosomodel.h
+++ b/backends/virtuoso/virtuosomodel.h
@@ -29,6 +29,8 @@ namespace Soprano {
class Connection;
}
+ class VirtuosoModelPrivate;
+
class VirtuosoModel : public StorageModel
{
Q_OBJECT
@@ -54,8 +56,7 @@ namespace Soprano {
const QString& userQueryLanguage \
= QString() ) const;
private:
- class Private;
- Private* const d;
+ VirtuosoModelPrivate* const d;
};
}
diff --git a/backends/virtuoso/virtuosomodel_p.h \
b/backends/virtuoso/virtuosomodel_p.h new file mode 100644
index 0000000..41b5917
--- /dev/null
+++ b/backends/virtuoso/virtuosomodel_p.h
@@ -0,0 +1,44 @@
+/*
+ * This file is part of Soprano Project
+ *
+ * Copyright (C) 2009 Sebastian Trueg <trueg@kde.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _SOPRANO_IODBC_MODEL_P_H_
+#define _SOPRANO_IODBC_MODEL_P_H_
+
+#include "virtuosoqueryresultiteratorbackend.h"
+
+namespace Soprano {
+ namespace ODBC {
+ class Connection;
+ }
+
+ class VirtuosoModelPrivate
+ {
+ public:
+ VirtuosoModelPrivate()
+ : connection( 0 ) {
+ }
+
+ ODBC::Connection* connection;
+ QList<Virtuoso::QueryResultIteratorBackend*> m_openIterators;
+ };
+}
+
+#endif
diff --git a/backends/virtuoso/virtuosoqueryresultiteratorbackend.cpp \
b/backends/virtuoso/virtuosoqueryresultiteratorbackend.cpp index 2dc1b30..e4397ce \
100644
--- a/backends/virtuoso/virtuosoqueryresultiteratorbackend.cpp
+++ b/backends/virtuoso/virtuosoqueryresultiteratorbackend.cpp
@@ -21,6 +21,7 @@
#include "virtuosoqueryresultiteratorbackend.h"
#include "virtuosoqueryresultiteratorbackend_p.h"
+#include "virtuosomodel_p.h"
#include "virtuosotools.h"
#include "odbcqueryresult.h"
#include "statement.h"
@@ -83,6 +84,7 @@ Soprano::Virtuoso::QueryResultIteratorBackend::QueryResultIteratorBackend( \
ODBC:
Soprano::Virtuoso::QueryResultIteratorBackend::~QueryResultIteratorBackend()
{
+ d->m_model->m_openIterators.removeAll( this );
delete d->m_queryResult;
delete d;
}
diff --git a/backends/virtuoso/virtuosoqueryresultiteratorbackend.h \
b/backends/virtuoso/virtuosoqueryresultiteratorbackend.h index 062eda4..39f495c \
100644
--- a/backends/virtuoso/virtuosoqueryresultiteratorbackend.h
+++ b/backends/virtuoso/virtuosoqueryresultiteratorbackend.h
@@ -1,7 +1,7 @@
/*
* This file is part of Soprano Project
*
- * Copyright (C) 2008 Sebastian Trueg <trueg@kde.org>
+ * Copyright (C) 2008-2009 Sebastian Trueg <trueg@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -25,6 +25,9 @@
#include "queryresultiteratorbackend.h"
namespace Soprano {
+
+ class VirtuosoModel;
+
namespace ODBC {
class QueryResult;
}
@@ -53,6 +56,8 @@ namespace Soprano {
private:
QueryResultIteratorBackendPrivate* const d;
+
+ friend class ::Soprano::VirtuosoModel;
};
}
}
diff --git a/backends/virtuoso/virtuosoqueryresultiteratorbackend_p.h \
b/backends/virtuoso/virtuosoqueryresultiteratorbackend_p.h index a69cbf1..b0645e6 \
100644
--- a/backends/virtuoso/virtuosoqueryresultiteratorbackend_p.h
+++ b/backends/virtuoso/virtuosoqueryresultiteratorbackend_p.h
@@ -38,6 +38,8 @@
namespace Soprano {
+ class VirtuosoModelPrivate;
+
namespace Virtuoso {
class QueryResultIteratorBackendPrivate
{
@@ -55,6 +57,8 @@ namespace Soprano {
bool askResult;
StatementIterator graphIterator;
+
+ VirtuosoModelPrivate* m_model;
};
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic