From 2cadb387199bfa6a395b7496e0430fccb7ccd08b Mon Sep 17 00:00:00 2001 From: Peinthor Rene Date: Mon, 18 Aug 2014 18:53:16 +0200 Subject: [PATCH] tablemodel: if our sql parser failed get column names from sqlite This makes browsing more robust if our sqlite parser fails we will fallback to a sqlite query to retrieve the column names --- src/sqlitetablemodel.cpp | 53 ++++++++++++++++++++++++++++------------ src/sqlitetablemodel.h | 1 + 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/sqlitetablemodel.cpp b/src/sqlitetablemodel.cpp index a5584169..5cd99d6e 100644 --- a/src/sqlitetablemodel.cpp +++ b/src/sqlitetablemodel.cpp @@ -35,11 +35,26 @@ void SqliteTableModel::setTable(const QString& table) m_sTable = table; - QString rowid = "rowid"; + QString sColumnQuery = QString::fromUtf8("SELECT * FROM `%1`;").arg(table); if(m_db->getObjectByName(table).gettype() == "table") - rowid = sqlb::Table::parseSQL(m_db->getObjectByName(table).getsql()).rowidColumn(); - m_headers.push_back(rowid); - m_headers.append(m_db->getTableFields(table)); + { + sqlb::Table t = sqlb::Table::parseSQL(m_db->getObjectByName(table).getsql()); + if(t.name() != "") // parsing was OK + { + m_headers.push_back(t.rowidColumn()); + m_headers.append(m_db->getTableFields(table)); + } + else + { + m_headers.push_back("rowid"); + m_headers.append(getColumns(sColumnQuery)); + } + } + else + { + m_headers.push_back("rowid"); + m_headers.append(getColumns(sColumnQuery)); + } buildQuery(); } @@ -108,17 +123,7 @@ void SqliteTableModel::setQuery(const QString& sQuery, bool dontClearHeaders) // headers if(!dontClearHeaders) { - sqlite3_stmt* stmt; - QByteArray utf8Query = sQuery.toUtf8(); - int status = sqlite3_prepare_v2(m_db->_db, utf8Query, utf8Query.size(), &stmt, NULL); - if(SQLITE_OK == status) - { - status = sqlite3_step(stmt); - int columns = sqlite3_data_count(stmt); - for(int i = 0; i < columns; ++i) - m_headers.append(QString::fromUtf8((const char*)sqlite3_column_name(stmt, i))); - } - sqlite3_finalize(stmt); + m_headers.append(getColumns(sQuery)); } // now fetch the first entries @@ -398,6 +403,24 @@ void SqliteTableModel::buildQuery() setQuery(sql, true); } +QStringList SqliteTableModel::getColumns(const QString sQuery) +{ + sqlite3_stmt* stmt; + QByteArray utf8Query = sQuery.toUtf8(); + int status = sqlite3_prepare_v2(m_db->_db, utf8Query, utf8Query.size(), &stmt, NULL); + QStringList listColumns; + if(SQLITE_OK == status) + { + status = sqlite3_step(stmt); + int columns = sqlite3_data_count(stmt); + for(int i = 0; i < columns; ++i) + listColumns.append(QString::fromUtf8((const char*)sqlite3_column_name(stmt, i))); + } + sqlite3_finalize(stmt); + + return listColumns; +} + void SqliteTableModel::updateFilter(int column, const QString& value) { // Check for any special comparison operators at the beginning of the value string. If there are none default to LIKE. diff --git a/src/sqlitetablemodel.h b/src/sqlitetablemodel.h index 5ada5fce..e836f43a 100644 --- a/src/sqlitetablemodel.h +++ b/src/sqlitetablemodel.h @@ -50,6 +50,7 @@ private: void clearCache(); void buildQuery(); + QStringList getColumns(const QString sQuery); int getQueryRowCount(); DBBrowserDB* m_db;