Browse Source

Database improvements

Tweaked database queries to avoid going backwards  when navigating result set and set queries to forwardOnly. ~30pc performance improvement on large queries.
Felix Turo 4 years ago
parent
commit
a9efe90b1f
1 changed files with 25 additions and 10 deletions
  1. 25 10
      src/experimental/adatabase.cpp

+ 25 - 10
src/experimental/adatabase.cpp

@@ -110,14 +110,21 @@ bool ADataBase::remove(AEntry entry)
 
 bool ADataBase::exists(AEntry entry)
 {
-    if(entry.getPosition() == DEFAULT_PILOT_POSITION)
+    if(entry.getPosition().second == 0)
         return false;
 
     //Check database for row id
     QString statement = "SELECT COUNT(*) FROM " + entry.getPosition().tableName +
             " WHERE ROWID=" + QString::number(entry.getPosition().rowId);
     //this returns either 1 or 0 since row ids are unique
-    QSqlQuery query(statement);
+    QSqlQuery query;
+    query.prepare(statement);
+    query.setForwardOnly(true);
+    query.exec();
+    if (!query.isActive()) {
+        emit sqlError(query.lastError(), statement);
+        DEB("Query Error: " << query.lastError().text() << statement);
+    }
     query.next();
     int rowId = query.value(0).toInt();
     if (rowId) {
@@ -211,7 +218,10 @@ TableData ADataBase::getEntryData(DataPosition data_position)
     //Check Database for rowId
     QString statement = "SELECT COUNT(*) FROM " + data_position.first
                       + " WHERE ROWID=" + QString::number(data_position.second);
-    QSqlQuery check_query(statement);
+    QSqlQuery check_query;
+    check_query.prepare(statement);
+    check_query.setForwardOnly(true);
+    check_query.exec();
 
     if (check_query.lastError().type() != QSqlError::NoError) {
         DEB("SQL error: " << check_query.lastError().text());
@@ -230,7 +240,11 @@ TableData ADataBase::getEntryData(DataPosition data_position)
     statement = "SELECT * FROM " + data_position.first
               + " WHERE ROWID=" + QString::number(data_position.second);
 
-    QSqlQuery select_query(statement);
+    QSqlQuery select_query;
+    select_query.prepare(statement);
+    select_query.setForwardOnly(true);
+    select_query.exec();
+
     if (select_query.lastError().type() != QSqlError::NoError) {
         DEB("SQL error: " << select_query.lastError().text());
         DEB("Statement: " << statement);
@@ -298,11 +312,14 @@ const QStringList ADataBase::getCompletionList(ADataBase::CompleterTarget target
         break;
     }
 
-    QSqlQuery query(statement);
-    if(!query.first())
+    QSqlQuery query;
+    query.prepare(statement);
+    query.setForwardOnly(true);
+    query.exec();
+
+    if(!query.isActive())
         emit sqlError(query.lastError(), statement);
 
-    query.previous();
     QStringList completer_list;
     while (query.next())
         completer_list.append(query.value(0).toString());
@@ -334,15 +351,13 @@ const QMap<QString, int> ADataBase::getIdMap(ADataBase::CompleterTarget target)
 
     auto id_map = QMap<QString, int>();
     auto query = QSqlQuery(statement);
-    if (!query.first()) {
+    if (!query.isActive()) {
         DEB("No result found. Check Query and Error.");
         DEB("Query: " << statement);
         DEB("Error: " << query.lastError().text());
         emit sqlError(query.lastError(), statement);
         return QMap<QString, int>();
     } else {
-        query.first();
-        query.previous();
         QVector<QString> query_result;
         while (query.next()) {
             id_map.insert(query.value(1).toString(), query.value(0).toInt());