[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