[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