bool QgsSpatiaLiteConnection::getTableInfo( sqlite3 *handle, bool loadGeometrylessTables ) { int ret; int i; char **results = nullptr; int rows; int columns; char *errMsg = nullptr; QString sql; // the following query return the tables containing a Geometry column sql = "SELECT f_table_name, f_geometry_column, type " "FROM geometry_columns"; ret = sqlite3_get_table( handle, sql.toUtf8(), &results, &rows, &columns, &errMsg ); if ( ret != SQLITE_OK ) goto error; for ( i = 1; i <= rows; i++ ) { if ( isRasterlite1Datasource( handle, results[( i * columns ) + 0] ) ) continue; QString tableName = QString::fromUtf8( results[( i * columns ) + 0] ); QString column = QString::fromUtf8( results[( i * columns ) + 1] ); QString type = results[( i * columns ) + 2]; if ( isDeclaredHidden( handle, tableName, column ) ) continue; mTables.append( TableEntry( tableName, column, type ) ); } sqlite3_free_table( results ); if ( checkViewsGeometryColumns( handle ) ) { // the following query return the views supporting a Geometry column sql = "SELECT view_name, view_geometry, type " "FROM views_geometry_columns " "JOIN geometry_columns USING (f_table_name, f_geometry_column)"; ret = sqlite3_get_table( handle, sql.toUtf8(), &results, &rows, &columns, &errMsg ); if ( ret != SQLITE_OK ) goto error; for ( i = 1; i <= rows; i++ ) { QString tableName = QString::fromUtf8( results[( i * columns ) + 0] ); QString column = QString::fromUtf8( results[( i * columns ) + 1] ); QString type = results[( i * columns ) + 2]; if ( isDeclaredHidden( handle, tableName, column ) ) continue; mTables.append( TableEntry( tableName, column, type ) ); } sqlite3_free_table( results ); } if ( checkVirtsGeometryColumns( handle ) ) { // the following query return the VirtualShapefiles sql = "SELECT virt_name, virt_geometry, type " "FROM virts_geometry_columns"; ret = sqlite3_get_table( handle, sql.toUtf8(), &results, &rows, &columns, &errMsg ); if ( ret != SQLITE_OK ) goto error; for ( i = 1; i <= rows; i++ ) { QString tableName = QString::fromUtf8( results[( i * columns ) + 0] ); QString column = QString::fromUtf8( results[( i * columns ) + 1] ); QString type = results[( i * columns ) + 2]; if ( isDeclaredHidden( handle, tableName, column ) ) continue; mTables.append( TableEntry( tableName, column, type ) ); } sqlite3_free_table( results ); } if ( loadGeometrylessTables ) { // get all tables sql = "SELECT name " "FROM sqlite_master " "WHERE type in ('table', 'view')"; ret = sqlite3_get_table( handle, sql.toUtf8(), &results, &rows, &columns, &errMsg ); if ( ret != SQLITE_OK ) goto error; for ( i = 1; i <= rows; i++ ) { QString tableName = QString::fromUtf8( results[( i * columns ) + 0] ); mTables.append( TableEntry( tableName, QString(), QStringLiteral( "qgis_table" ) ) ); } sqlite3_free_table( results ); } return true; error: // unexpected IO error mErrorMsg = tr( "unknown error cause" ); if ( errMsg ) { mErrorMsg = errMsg; sqlite3_free( errMsg ); } return false; }
bool QgsSpatiaLiteSourceSelect::getTableInfo( sqlite3 * handle ) { int ret; int i; char **results; int rows; int columns; char *errMsg = NULL; bool ok = false; char sql[1024]; QApplication::setOverrideCursor( Qt::WaitCursor ); // setting the SQLite DB name QFileInfo myFI( mSqlitePath ); QString myName = myFI.fileName(); mTableModel.setSqliteDb( myName ); // the following query return the tables containing a Geometry column strcpy( sql, "SELECT f_table_name, f_geometry_column, type " ); strcat( sql, "FROM geometry_columns" ); ret = sqlite3_get_table( handle, sql, &results, &rows, &columns, &errMsg ); if ( ret != SQLITE_OK ) goto error; if ( rows < 1 ) ; else { for ( i = 1; i <= rows; i++ ) { if ( isRasterlite1Datasource( handle, results[( i * columns ) + 0] ) ) continue; QString tableName = QString::fromUtf8( results[( i * columns ) + 0] ); QString column = QString::fromUtf8( results[( i * columns ) + 1] ); QString type = results[( i * columns ) + 2]; if ( isDeclaredHidden( handle, tableName, column ) ) continue; mTableModel.addTableEntry( type, tableName, column, "" ); } ok = true; } sqlite3_free_table( results ); if ( checkViewsGeometryColumns( handle ) ) { // the following query return the views supporting a Geometry column strcpy( sql, "SELECT view_name, view_geometry, type " ); strcat( sql, "FROM views_geometry_columns " ); strcat( sql, "JOIN geometry_columns USING (f_table_name, f_geometry_column)" ); ret = sqlite3_get_table( handle, sql, &results, &rows, &columns, &errMsg ); if ( ret != SQLITE_OK ) goto error; if ( rows < 1 ) ; else { for ( i = 1; i <= rows; i++ ) { QString tableName = QString::fromUtf8( results[( i * columns ) + 0] ); QString column = QString::fromUtf8( results[( i * columns ) + 1] ); QString type = results[( i * columns ) + 2]; if ( isDeclaredHidden( handle, tableName, column ) ) continue; mTableModel.addTableEntry( type, tableName, column, "" ); } ok = true; } sqlite3_free_table( results ); } if ( checkVirtsGeometryColumns( handle ) ) { // the following query return the VirtualShapefiles strcpy( sql, "SELECT virt_name, virt_geometry, type " ); strcat( sql, "FROM virts_geometry_columns" ); ret = sqlite3_get_table( handle, sql, &results, &rows, &columns, &errMsg ); if ( ret != SQLITE_OK ) goto error; if ( rows < 1 ) ; else { for ( i = 1; i <= rows; i++ ) { QString tableName = QString::fromUtf8( results[( i * columns ) + 0] ); QString column = QString::fromUtf8( results[( i * columns ) + 1] ); QString type = results[( i * columns ) + 2]; if ( isDeclaredHidden( handle, tableName, column ) ) continue; mTableModel.addTableEntry( type, tableName, column, "" ); } ok = true; } sqlite3_free_table( results ); } QApplication::restoreOverrideCursor(); return ok; error: // unexpected IO error QString errCause = tr( "unknown error cause" ); if ( errMsg != NULL ) { errCause = errMsg; sqlite3_free( errMsg ); } QMessageBox::critical( this, tr( "SpatiaLite getTableInfo Error" ), tr( "Failure exploring tables from: %1\n\n%2" ).arg( mSqlitePath ).arg( errCause ) ); return false; }