[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    kdesupport/akonadi/server
From:       Volker Krause <vkrause () kde ! org>
Date:       2010-07-09 12:13:24
Message-ID: 20100709121324.98865AC8A8 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1147930 by vkrause:

Add support for LIMIT statements in SELECT queries. Also fix db type
detection in a few places.


 M  +2 -2      src/storage/dbinitializer.cpp  
 M  +15 -1     src/storage/querybuilder.cpp  
 M  +10 -1     src/storage/querybuilder.h  
 M  +14 -0     tests/unittest/querybuildertest.cpp  


--- trunk/kdesupport/akonadi/server/src/storage/dbinitializer.cpp #1147929:1147930
@@ -35,9 +35,9 @@
 
 DbInitializer::Ptr DbInitializer::createInstance(const QSqlDatabase& database, const \
QString& templateFile)  {
-  if ( database.databaseName() == QLatin1String( "QPSQL" ) )
+  if ( database.databaseName().startsWith( QLatin1String( "QPSQL" ) ) )
     return boost::shared_ptr<DbInitializer>( new DbInitializerPostgreSql( database, \
                templateFile ) );
-  if ( database.databaseName() == QLatin1String( "QODBC" ) )
+  if ( database.databaseName().startsWith( QLatin1String( "QODBC" ) ) )
     return boost::shared_ptr<DbInitializer>( new DbInitializerVirtuoso( database, \
templateFile ) );  return boost::shared_ptr<DbInitializer>( new DbInitializer( \
database, templateFile ) );  }
--- trunk/kdesupport/akonadi/server/src/storage/querybuilder.cpp #1147929:1147930
@@ -89,6 +89,7 @@
     mDatabaseType( Unknown ),
 #endif
     mType( type ),
+    mLimit( -1 ),
     mDistinct( false )
 {
 }
@@ -150,6 +151,8 @@
       statement += QLatin1String( "SELECT " );
       if ( mDistinct )
         statement += QLatin1String( "DISTINCT " );
+      if ( mDatabaseType == Virtuoso && mLimit > 0 )
+        statement += QString::fromLatin1( "TOP %1 " ).arg( mLimit );
       Q_ASSERT_X( mColumns.count() > 0, "QueryBuilder::exec()", "No columns \
specified" );  statement += mColumns.join( QLatin1String( ", " ) );
       statement += QLatin1String(" FROM ");
@@ -265,6 +268,10 @@
     statement += orderStmts.join( QLatin1String( ", " ) );
   }
 
+  if ( mLimit > 0 && mDatabaseType != Virtuoso ) {
+    statement += QString::fromLatin1( " LIMIT %1" ).arg( mLimit );
+  }
+
 #ifndef QUERYBUILDER_UNITTEST
   mQuery.prepare( statement );
   //too heavy debug info but worths to have from time to time
@@ -375,6 +382,11 @@
   mDistinct = distinct;
 }
 
+void QueryBuilder::setLimit(int limit)
+{
+  mLimit = limit;
+}
+
 qint64 QueryBuilder::insertId()
 {
   if ( mDatabaseType == PostgreSQL ) {
@@ -397,7 +409,9 @@
     return MySQL;
   if ( driverName == QLatin1String( "QPSQL" ) )
     return PostgreSQL;
-  if ( driverName.startsWith( QLatin1String( "SQLITE" ) ) )
+  if ( driverName.startsWith( QLatin1String( "QSQLITE" ) ) )
     return Sqlite;
+  if ( driverName.startsWith( QLatin1String( "QODBC" ) ) )
+    return Virtuoso;
   return Unknown;
 }
--- trunk/kdesupport/akonadi/server/src/storage/querybuilder.h #1147929:1147930
@@ -53,7 +53,8 @@
       Unknown,
       Sqlite,
       MySQL,
-      PostgreSQL
+      PostgreSQL,
+      Virtuoso
     };
 
     /**
@@ -198,6 +199,13 @@
     void setDistinct( bool distinct );
 
     /**
+     * Limits the amount of retrieved rows.
+     * @param limit the maximum number of rows to retrieve.
+     * @note This has no effect on anything but SELECT queries.
+     */
+    void setLimit( int limit );
+
+    /**
       Returns the query, only valid after exec().
     */
     QSqlQuery& query();
@@ -238,6 +246,7 @@
     // QMap sorts by key which might invalidate the queries
     QStringList mJoinedTables;
     QMap< QString, QPair< JoinType, Query::Condition > > mJoins;
+    int mLimit;
     bool mDistinct;
 #ifdef QUERYBUILDER_UNITTEST
     QString mStatement;
--- trunk/kdesupport/akonadi/server/tests/unittest/querybuildertest.cpp \
#1147929:1147930 @@ -90,6 +90,20 @@
   mBuilders << qb;
   QTest::newRow( "where in" ) << mBuilders.count() << QString( "SELECT col1 FROM \
table WHERE ( col1 IN ( :0, :1, :2 ) )" ) << bindVals;  
+  qb = QueryBuilder( "table", QueryBuilder::Select );
+  qb.setDatabaseType( QueryBuilder::MySQL );
+  qb.addColumn( "col1" );
+  qb.setLimit( 1 );
+  mBuilders << qb;
+  QTest::newRow( "SELECT with LIMIT" ) << mBuilders.count() << QString( "SELECT col1 \
FROM table LIMIT 1" ) << QList<QVariant>(); +
+  qb = QueryBuilder( "table", QueryBuilder::Select );
+  qb.setDatabaseType( QueryBuilder::Virtuoso );
+  qb.addColumn( "col1" );
+  qb.setLimit( 1 );
+  mBuilders << qb;
+  QTest::newRow( "SELECT with TOP" ) << mBuilders.count() << QString( "SELECT TOP 1 \
col1 FROM table" ) << QList<QVariant>(); +
   qb = QueryBuilder( "table", QueryBuilder::Update );
   qb.setColumnValue( "col1", QString( "bla" ) );
   bindVals.clear();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic