Some more minor performance improvements in often called functions

This commit is contained in:
Martin Kleusberg
2019-10-06 10:34:50 +02:00
parent 5f21c23d43
commit 4e8eff7af0
3 changed files with 32 additions and 56 deletions

View File

@@ -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<const char*>(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<int>(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<size_t>(num_columns));
for(int i=0;i<num_columns;++i)
Cache::value_type rowdata(num_columns);
for(size_t i=0;i<num_columns;++i)
{
// No need to do anything for NULL values because we can just use the already default constructed value
if(sqlite3_column_type(stmt, i) != SQLITE_NULL)
if(sqlite3_column_type(stmt, static_cast<int>(i)) != SQLITE_NULL)
{
int bytes = sqlite3_column_bytes(stmt, i);
int bytes = sqlite3_column_bytes(stmt, static_cast<int>(i));
if(bytes)
rowdata[static_cast<size_t>(i)] = QByteArray(static_cast<const char*>(sqlite3_column_blob(stmt, i)), bytes);
rowdata[i] = QByteArray(static_cast<const char*>(sqlite3_column_blob(stmt, static_cast<int>(i))), bytes);
else
rowdata[static_cast<size_t>(i)] = "";
rowdata[i] = "";
}
}
QMutexLocker lk(&cache_mutex);

View File

@@ -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<const char*>(sqlite3_column_text(stmt, 0)));
ret = static_cast<unsigned long>(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;i<statement.size();i++)
{
QChar ch = statement[i];
if(ch < 32 && ch != '\n' && ch != '\r' && ch != '\t')
{
statement.truncate(i>0?i-1:0);
statement.append(tr("... <string can not be logged, contains binary data> ..."));
// 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<const char*>(sqlite3_column_text(vm, 0));
std::string val_name = reinterpret_cast<const char*>(sqlite3_column_text(vm, 1));
QString val_sql = QString::fromUtf8(reinterpret_cast<const char*>(sqlite3_column_text(vm, 2)));
const char* val_sql = reinterpret_cast<const char*>(sqlite3_column_text(vm, 2));
std::string val_tblname = reinterpret_cast<const char*>(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;

View File

@@ -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);