From 4e8eff7af0bb9ca7610da4160b41c6573261e10e Mon Sep 17 00:00:00 2001 From: Martin Kleusberg Date: Sun, 6 Oct 2019 10:34:50 +0200 Subject: [PATCH] Some more minor performance improvements in often called functions --- src/RowLoader.cpp | 31 ++++++++++------------------ src/sqlitedb.cpp | 51 +++++++++++++++++------------------------------ src/sqlitedb.h | 6 +++--- 3 files changed, 32 insertions(+), 56 deletions(-) diff --git a/src/RowLoader.cpp b/src/RowLoader.cpp index c8438037..2a861929 100644 --- a/src/RowLoader.cpp +++ b/src/RowLoader.cpp @@ -99,15 +99,10 @@ int RowLoader::countRows() QByteArray utf8Query = countQuery.toUtf8(); sqlite3_stmt* stmt; - int status = sqlite3_prepare_v2(pDb.get(), utf8Query, utf8Query.size(), &stmt, nullptr); - if(status == SQLITE_OK) + if(sqlite3_prepare_v2(pDb.get(), utf8Query, utf8Query.size(), &stmt, nullptr) == SQLITE_OK) { - status = sqlite3_step(stmt); - if(status == SQLITE_ROW) - { - QString sCount = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(stmt, 0))); - retval = sCount.toInt(); - } + if(sqlite3_step(stmt) == SQLITE_ROW) + retval = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); } else { qWarning() << "Count query failed: " << countQuery; @@ -223,29 +218,25 @@ void RowLoader::process (Task & t) QByteArray utf8Query = sLimitQuery.toUtf8(); sqlite3_stmt *stmt; - - int status = sqlite3_prepare_v2(pDb.get(), utf8Query, utf8Query.size(), &stmt, nullptr); - auto row = t.row_begin; - - if(SQLITE_OK == status) + if(sqlite3_prepare_v2(pDb.get(), utf8Query, utf8Query.size(), &stmt, nullptr) == SQLITE_OK) { - const int num_columns = static_cast(headers.size()); + const size_t num_columns = headers.size(); while(!t.cancel && sqlite3_step(stmt) == SQLITE_ROW) { // Construct a new row object with the right number of columns - Cache::value_type rowdata(static_cast(num_columns)); - for(int i=0;i(i)) != SQLITE_NULL) { - int bytes = sqlite3_column_bytes(stmt, i); + int bytes = sqlite3_column_bytes(stmt, static_cast(i)); if(bytes) - rowdata[static_cast(i)] = QByteArray(static_cast(sqlite3_column_blob(stmt, i)), bytes); + rowdata[i] = QByteArray(static_cast(sqlite3_column_blob(stmt, static_cast(i))), bytes); else - rowdata[static_cast(i)] = ""; + rowdata[i] = ""; } } QMutexLocker lk(&cache_mutex); diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp index cb118fdc..c66c2015 100644 --- a/src/sqlitedb.cpp +++ b/src/sqlitedb.cpp @@ -1241,12 +1241,12 @@ bool DBBrowserDB::getRow(const sqlb::ObjectIdentifier& table, const QString& row return ret; } -QString DBBrowserDB::max(const sqlb::ObjectIdentifier& tableName, const sqlb::Field& field) const +unsigned long DBBrowserDB::max(const sqlb::ObjectIdentifier& tableName, const std::string& field) const { - QString sQuery = QString("SELECT MAX(CAST(%2 AS INTEGER)) FROM %1;").arg(QString::fromStdString(tableName.toString())).arg(QString::fromStdString(sqlb::escapeIdentifier(field.name()))); + QString sQuery = QString("SELECT MAX(CAST(%2 AS INTEGER)) FROM %1;").arg(QString::fromStdString(tableName.toString())).arg(QString::fromStdString(sqlb::escapeIdentifier(field))); QByteArray utf8Query = sQuery.toUtf8(); sqlite3_stmt *stmt; - QString ret = "0"; + unsigned long ret = 0; if(sqlite3_prepare_v2(_db, utf8Query, utf8Query.size(), &stmt, nullptr) == SQLITE_OK) { @@ -1254,7 +1254,7 @@ QString DBBrowserDB::max(const sqlb::ObjectIdentifier& tableName, const sqlb::Fi while(sqlite3_step(stmt) == SQLITE_ROW) { if(sqlite3_column_count(stmt) == 1) - ret = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(stmt, 0))); + ret = static_cast(sqlite3_column_int64(stmt, 0)); } } sqlite3_finalize(stmt); @@ -1281,8 +1281,8 @@ QString DBBrowserDB::emptyInsertStmt(const std::string& schemaName, const sqlb:: } else { if(f.notnull()) { - QString maxval = this->max(sqlb::ObjectIdentifier(schemaName, t.name()), f); - QString newval = QString::number(maxval.toLongLong() + 1); + unsigned long maxval = this->max(sqlb::ObjectIdentifier(schemaName, t.name()), f.name()); + QString newval = QString::number(maxval + 1); vals << (f.isText()? "'" + newval + "'" : newval); } else { vals << "NULL"; @@ -1338,7 +1338,7 @@ QString DBBrowserDB::addRecord(const sqlb::ObjectIdentifier& tablename) { // For multiple rowid columns we just use the value of the last one and increase that one by one. If this doesn't yield a valid combination // the insert record dialog should pop up automatically. - pk_value = QString::number(max(tablename, *sqlb::findField(table, table->rowidColumns().back())).toLongLong() + 1); + pk_value = QString::number(max(tablename, table->rowidColumns().back()) + 1); sInsertstmt = emptyInsertStmt(tablename.schema(), *table, pk_value); } else { sInsertstmt = emptyInsertStmt(tablename.schema(), *table); @@ -1900,27 +1900,10 @@ objectMap DBBrowserDB::getBrowsableObjects(const std::string& schema) const return res; } -void DBBrowserDB::logSQL(QString statement, LogMessageType msgtype) +void DBBrowserDB::logSQL(const QString& statement, LogMessageType msgtype) { // Remove any leading and trailing spaces, tabs, or line breaks first - statement = statement.trimmed(); - - // Replace binary log messages by a placeholder text instead of printing gibberish - for(int i=0;i0?i-1:0); - statement.append(tr("... ...")); - - // early exit if we detect a binary character, - // to prevent checking all characters in a potential big string - break; - } - } - - emit sqlExecuted(statement, msgtype); + emit sqlExecuted(statement.trimmed(), msgtype); } void DBBrowserDB::updateSchema() @@ -1967,21 +1950,23 @@ void DBBrowserDB::updateSchema() { std::string val_type = reinterpret_cast(sqlite3_column_text(vm, 0)); std::string val_name = reinterpret_cast(sqlite3_column_text(vm, 1)); - QString val_sql = QString::fromUtf8(reinterpret_cast(sqlite3_column_text(vm, 2))); + const char* val_sql = reinterpret_cast(sqlite3_column_text(vm, 2)); std::string val_tblname = reinterpret_cast(sqlite3_column_text(vm, 3)); - val_sql = val_sql.replace("\r", ""); - if(!val_sql.isEmpty()) + if(val_sql) { + std::string sql = val_sql; + sql.erase(std::remove(sql.begin(), sql.end(), '\r'), sql.end()); + sqlb::ObjectPtr object; if(val_type == "table") - object = sqlb::Table::parseSQL(val_sql.toStdString()); + object = sqlb::Table::parseSQL(sql); else if(val_type == "index") - object = sqlb::Index::parseSQL(val_sql.toStdString()); + object = sqlb::Index::parseSQL(sql); else if(val_type == "trigger") - object = sqlb::Trigger::parseSQL(val_sql.toStdString()); + object = sqlb::Trigger::parseSQL(sql); else if(val_type == "view") - object = sqlb::View::parseSQL(val_sql.toStdString()); + object = sqlb::View::parseSQL(sql); else continue; diff --git a/src/sqlitedb.h b/src/sqlitedb.h index bdaa0db5..970125f4 100644 --- a/src/sqlitedb.h +++ b/src/sqlitedb.h @@ -152,10 +152,10 @@ private: /** * @brief max Queries the table t for the max value of field. * @param tableName Table to query - * @param field Field to get the max value + * @param field Name of the field to get the max value * @return the max value of the field or 0 on error */ - QString max(const sqlb::ObjectIdentifier& tableName, const sqlb::Field& field) const; + unsigned long max(const sqlb::ObjectIdentifier& tableName, const std::string& field) const; static int callbackWrapper (void* callback, int numberColumns, char** values, char** columnNames); @@ -221,7 +221,7 @@ public: QString currentFile() const { return curDBFilename; } /// log an SQL statement [thread-safe] - void logSQL(QString statement, LogMessageType msgtype); + void logSQL(const QString& statement, LogMessageType msgtype); QString getPragma(const QString& pragma); bool setPragma(const QString& pragma, const QString& value);