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
This commit is contained in:
Peinthor Rene
2014-08-18 18:53:16 +02:00
parent e9fc2229c2
commit 2cadb38719
2 changed files with 39 additions and 15 deletions

View File

@@ -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.

View File

@@ -50,6 +50,7 @@ private:
void clearCache();
void buildQuery();
QStringList getColumns(const QString sQuery);
int getQueryRowCount();
DBBrowserDB* m_db;