[QGIS Commit] r11479 - trunk/qgis/src/app

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sat Aug 22 06:20:19 EDT 2009


Author: jef
Date: 2009-08-22 06:20:18 -0400 (Sat, 22 Aug 2009)
New Revision: 11479

Modified:
   trunk/qgis/src/app/qgsdbsourceselect.cpp
   trunk/qgis/src/app/qgsdbsourceselect.h
   trunk/qgis/src/app/qgsdbtablemodel.cpp
   trunk/qgis/src/app/qgsdbtablemodel.h
Log:
[FEATURE] add selection of postgres primary key column (for views; apply #1855)

Modified: trunk/qgis/src/app/qgsdbsourceselect.cpp
===================================================================
--- trunk/qgis/src/app/qgsdbsourceselect.cpp	2009-08-22 10:19:52 UTC (rev 11478)
+++ trunk/qgis/src/app/qgsdbsourceselect.cpp	2009-08-22 10:20:18 UTC (rev 11479)
@@ -31,13 +31,9 @@
 #include <QMessageBox>
 #include <QSettings>
 #include <QTextStream>
-#include <QTableWidgetItem>
 #include <QHeaderView>
 #include <QStringList>
 
-#include <cassert>
-#include <iostream>
-
 #ifdef HAVE_PGCONFIG
 #include <pg_config.h>
 #endif
@@ -57,6 +53,7 @@
   mSearchColumnComboBox->addItem( tr( "Table" ) );
   mSearchColumnComboBox->addItem( tr( "Type" ) );
   mSearchColumnComboBox->addItem( tr( "Geometry column" ) );
+  mSearchColumnComboBox->addItem( tr( "Primary key column" ) );
   mSearchColumnComboBox->addItem( tr( "Sql" ) );
 
   mProxyModel.setParent( this );
@@ -67,6 +64,10 @@
   mTablesTreeView->setModel( &mProxyModel );
   mTablesTreeView->setSortingEnabled( true );
 
+  mTablesTreeView->setEditTriggers( QAbstractItemView::CurrentChanged );
+
+  mTablesTreeView->setItemDelegateForColumn( QgsDbTableModel::dbtmPkCol, new QgsDbSourceSelectDelegate( this ) );
+
   QSettings settings;
   mTablesTreeView->setSelectionMode( settings.value( "/qgis/addPostgisDC", false ).toBool() ?
                                      QAbstractItemView::ExtendedSelection :
@@ -169,23 +170,27 @@
   }
   else if ( text == tr( "Schema" ) )
   {
-    mProxyModel.setFilterKeyColumn( 0 );
+    mProxyModel.setFilterKeyColumn( QgsDbTableModel::dbtmSchema );
   }
   else if ( text == tr( "Table" ) )
   {
-    mProxyModel.setFilterKeyColumn( 1 );
+    mProxyModel.setFilterKeyColumn( QgsDbTableModel::dbtmTable );
   }
   else if ( text == tr( "Type" ) )
   {
-    mProxyModel.setFilterKeyColumn( 2 );
+    mProxyModel.setFilterKeyColumn( QgsDbTableModel::dbtmType );
   }
   else if ( text == tr( "Geometry column" ) )
   {
-    mProxyModel.setFilterKeyColumn( 3 );
+    mProxyModel.setFilterKeyColumn( QgsDbTableModel::dbtmGeomCol );
   }
+  else if ( text == tr( "Primay key column" ) )
+  {
+    mProxyModel.setFilterKeyColumn( QgsDbTableModel::dbtmPkCol );
+  }
   else if ( text == tr( "Sql" ) )
   {
-    mProxyModel.setFilterKeyColumn( 4 );
+    mProxyModel.setFilterKeyColumn( QgsDbTableModel::dbtmSql );
   }
 }
 
@@ -199,26 +204,15 @@
                                       QString type )
 {
   mTableModel.setGeometryTypesForTable( schema, table, column, type );
-  mTablesTreeView->sortByColumn( 1, Qt::AscendingOrder );
-  mTablesTreeView->sortByColumn( 0, Qt::AscendingOrder );
+  mTablesTreeView->sortByColumn( QgsDbTableModel::dbtmTable, Qt::AscendingOrder );
+  mTablesTreeView->sortByColumn( QgsDbTableModel::dbtmSchema, Qt::AscendingOrder );
 }
 
-QString QgsDbSourceSelect::makeGeomQuery( QString schema,
-    QString table, QString column )
-{
-  return QString( "select distinct "
-                  "case"
-                  " when geometrytype(%1) IN ('POINT','MULTIPOINT') THEN 'POINT'"
-                  " when geometrytype(%1) IN ('LINESTRING','MULTILINESTRING') THEN 'LINESTRING'"
-                  " when geometrytype(%1) IN ('POLYGON','MULTIPOLYGON') THEN 'POLYGON'"
-                  " end "
-                  "from \"%2\".\"%3\"" ).arg( "\"" + column + "\"" ).arg( schema ).arg( table );
-}
-
 QgsDbSourceSelect::~QgsDbSourceSelect()
 {
   PQfinish( pd );
 }
+
 void QgsDbSourceSelect::populateConnectionList()
 {
   QSettings settings;
@@ -234,6 +228,7 @@
   settings.endGroup();
   setConnectionListPosition();
 }
+
 void QgsDbSourceSelect::addNewConnection()
 {
   QgsNewConnection *nc = new QgsNewConnection( this );
@@ -243,6 +238,7 @@
     populateConnectionList();
   }
 }
+
 void QgsDbSourceSelect::editConnection()
 {
   QgsNewConnection *nc = new QgsNewConnection( this, cmbConnections->currentText() );
@@ -278,6 +274,7 @@
     setConnectionListPosition();
   }
 }
+
 void QgsDbSourceSelect::addTables()
 {
   m_selectedTables.clear();
@@ -310,16 +307,13 @@
 
     if ( dbInfo[currentSchemaName][currentRow].size() == 0 )
     {
-      dbInfo[currentSchemaName][currentRow].resize( 5 );
+      dbInfo[currentSchemaName][currentRow].resize( QgsDbTableModel::dbtmColumns );
     }
 
     dbInfo[currentSchemaName][currentRow][currentColumn] = currentItem->text();
   }
 
   //now traverse all the schemas and table infos
-  QString schemaName, tableName, geomColumnName, sql;
-  QString query;
-
   QMap<QString, schemaInfo>::const_iterator schema_it = dbInfo.constBegin();
   for ( ; schema_it != dbInfo.constEnd(); ++schema_it )
   {
@@ -327,16 +321,17 @@
     schemaInfo::const_iterator entry_it = scheme.constBegin();
     for ( ; entry_it != scheme.constEnd(); ++entry_it )
     {
-      schemaName = entry_it->at( 0 );
-      tableName = entry_it->at( 1 );
-      geomColumnName = entry_it->at( 3 );
-      sql = entry_it->at( 4 );
+      QString schemaName = entry_it->at( QgsDbTableModel::dbtmSchema );
+      QString tableName = entry_it->at( QgsDbTableModel::dbtmTable );
+      QString geomColumnName = entry_it->at( QgsDbTableModel::dbtmGeomCol );
+      QString pkColumnName = entry_it->at( QgsDbTableModel::dbtmPkCol );
+      QString sql = entry_it->at( QgsDbTableModel::dbtmSql );
 
       if ( geomColumnName.contains( " AS " ) )
       {
         int a = geomColumnName.indexOf( " AS " );
         QString typeName = geomColumnName.mid( a + 4 ); //only the type name
-        geomColumnName = geomColumnName.mid( 0, a ); //only the geom column name
+        geomColumnName = geomColumnName.left( a ); //only the geom column name
 
         if ( !sql.isEmpty() )
         {
@@ -360,8 +355,17 @@
         }
       }
 
-      query = "\"" + schemaName + "\".\"" + tableName + "\" " + "(" + geomColumnName + ") sql=" + sql;
+      QString query;
+      if ( !pkColumnName.isEmpty() )
+      {
+        query += QString( "key=\"%1\" " ).arg( pkColumnName );
+      }
 
+      query += QString( "table=\"%1\".\"%2\" (%3) sql=%4" )
+               .arg( schemaName ).arg( tableName )
+               .arg( geomColumnName )
+               .arg( sql );
+
       m_selectedTables.push_back( query );
     }
   }
@@ -493,8 +497,8 @@
                           .arg( QString::fromUtf8( PQerrorMessage( pd ) ) ) );
   }
 
-  mTablesTreeView->sortByColumn( 1, Qt::AscendingOrder );
-  mTablesTreeView->sortByColumn( 0, Qt::AscendingOrder );
+  mTablesTreeView->sortByColumn( QgsDbTableModel::dbtmTable, Qt::AscendingOrder );
+  mTablesTreeView->sortByColumn( QgsDbTableModel::dbtmSchema, Qt::AscendingOrder );
 
   //if we have only one schema item, expand it by default
   int numTopLevelItems = mTableModel.invisibleRootItem()->rowCount();
@@ -532,8 +536,8 @@
   }
 
   //create "Schema"."Table" and find out existing sql string
-  QModelIndex schemaSibling = index.sibling( index.row(), 0 );
-  QModelIndex tableSibling = index.sibling( index.row(), 1 );
+  QModelIndex schemaSibling = index.sibling( index.row(), QgsDbTableModel::dbtmSchema );
+  QModelIndex tableSibling = index.sibling( index.row(), QgsDbTableModel::dbtmTable );
   if ( !schemaSibling.isValid() || !tableSibling.isValid() )
   {
     return;
@@ -545,7 +549,7 @@
   QgsDebugMsg( tableString );
 
   QString currentSql;
-  QModelIndex sqlSibling = index.sibling( index.row(), 4 );
+  QModelIndex sqlSibling = index.sibling( index.row(), QgsDbTableModel::dbtmSql );
   if ( sqlSibling.isValid() )
   {
     currentSql = mTableModel.itemFromIndex( mProxyModel.mapToSource( sqlSibling ) )->text();
@@ -576,6 +580,33 @@
   mColumnTypeThread->addGeometryColumn( schema, table, column );
 }
 
+QStringList QgsDbSourceSelect::pkCandidates( PGconn *pg, QString schemaName, QString tableName )
+{
+  QStringList cols;
+  cols << QString::null;
+
+  QString sql = QString( "select attname from pg_attribute join pg_type on atttypid=pg_type.oid WHERE pg_type.typname='int4' AND attrelid=regclass('\"%1\".\"%2\"')" ).arg( schemaName ).arg( tableName );
+  QgsDebugMsg( sql );
+  PGresult *colRes = PQexec( pg, sql.toUtf8() );
+
+  if ( PQresultStatus( colRes ) == PGRES_TUPLES_OK )
+  {
+    for ( int i = 0; i < PQntuples( colRes ); i++ )
+    {
+      QgsDebugMsg( PQgetvalue( colRes, i, 0 ) );
+      cols << QString::fromUtf8( PQgetvalue( colRes, i, 0 ) );
+    }
+  }
+  else
+  {
+    QgsDebugMsg( QString( "SQL:%1\nresult:%2\nerror:%3\n" ).arg( sql ).arg( PQresultStatus( colRes ) ).arg( PQerrorMessage( pg ) ) );
+  }
+
+  PQclear( colRes );
+
+  return cols;
+}
+
 bool QgsDbSourceSelect::getTableInfo( PGconn *pg, bool searchGeometryColumnsOnly, bool searchPublicOnly )
 {
   int n = 0;
@@ -583,12 +614,23 @@
 
   // The following query returns only tables that exist and the user has SELECT privilege on.
   // Can't use regclass here because table must exist, else error occurs.
-  QString sql = "select * from geometry_columns,pg_class,pg_namespace "
-                "where relname=f_table_name and f_table_schema=nspname "
-                "and pg_namespace.oid = pg_class.relnamespace "
-                "and has_schema_privilege(pg_namespace.nspname,'usage') "
-                "and has_table_privilege('\"'||pg_namespace.nspname||'\".\"'||pg_class.relname||'\"','select') " // user has select privilege
-                "order by f_table_schema,f_table_name,f_geometry_column";
+  QString sql = "select "
+                "f_table_name,"
+                "f_table_schema,"
+                "f_geometry_column,"
+                "type"
+                " from "
+                "geometry_columns,"
+                "pg_class,"
+                "pg_namespace"
+                " where "
+                "relname=f_table_name"
+                " and f_table_schema=nspname"
+                " and pg_namespace.oid=pg_class.relnamespace"
+                " and has_schema_privilege(pg_namespace.nspname,'usage')"
+                " and has_table_privilege('\"'||pg_namespace.nspname||'\".\"'||pg_class.relname||'\"','select')" // user has select privilege
+                " order by "
+                "f_table_schema,f_table_name,f_geometry_column";
 
   PGresult *result = PQexec( pg, sql.toUtf8() );
   if ( result )
@@ -606,12 +648,11 @@
     {
       for ( int idx = 0; idx < PQntuples( result ); idx++ )
       {
-        QString tableName = QString::fromUtf8( PQgetvalue( result, idx, PQfnumber( result, QString( "f_table_name" ).toUtf8() ) ) );
-        QString schemaName = QString::fromUtf8( PQgetvalue( result, idx, PQfnumber( result, QString( "f_table_schema" ).toUtf8() ) ) );
+        QString tableName = QString::fromUtf8( PQgetvalue( result, idx, 0 ) );
+        QString schemaName = QString::fromUtf8( PQgetvalue( result, idx, 1 ) );
+        QString column = QString::fromUtf8( PQgetvalue( result, idx, 2 ) );
+        QString type = QString::fromUtf8( PQgetvalue( result, idx, 3 ) );
 
-        QString column = QString::fromUtf8( PQgetvalue( result, idx, PQfnumber( result, QString( "f_geometry_column" ).toUtf8() ) ) );
-        QString type = QString::fromUtf8( PQgetvalue( result, idx, PQfnumber( result, QString( "type" ).toUtf8() ) ) );
-
         QString as = "";
         if ( type == "GEOMETRY" && !searchGeometryColumnsOnly )
         {
@@ -619,7 +660,7 @@
           as = type = "WAITING";
         }
 
-        mTableModel.addTableEntry( type, schemaName, tableName, column, "" );
+        mTableModel.addTableEntry( type, schemaName, tableName, column, pkCandidates( pg, schemaName, tableName ), "" );
         n++;
       }
     }
@@ -636,31 +677,38 @@
     // geometry_columns table. This code is specific to postgresql,
     // but an equivalent query should be possible in other
     // databases.
-    sql = "select pg_class.relname,pg_namespace.nspname,pg_attribute.attname,pg_class.relkind "
-          "from pg_attribute, pg_class, pg_namespace "
-          "where pg_namespace.oid = pg_class.relnamespace "
-          "and pg_attribute.attrelid = pg_class.oid "
-          "and ("
+    sql = "select "
+          "pg_class.relname,"
+          "pg_namespace.nspname,"
+          "pg_attribute.attname,"
+          "pg_class.relkind"
+          " from "
+          "pg_attribute,"
+          "pg_class,"
+          "pg_namespace"
+          " where "
+          "pg_namespace.oid = pg_class.relnamespace"
+          " and pg_attribute.attrelid = pg_class.oid "
+          " and ("
           "pg_attribute.atttypid = regtype('geometry')"
-          " or "
-          "pg_attribute.atttypid IN (select oid FROM pg_type WHERE typbasetype=regtype('geometry'))"
-          ") "
-          "and has_schema_privilege(pg_namespace.nspname,'usage') "
-          "and has_table_privilege('\"'||pg_namespace.nspname||'\".\"'||pg_class.relname||'\"','select') ";
+          " or pg_attribute.atttypid IN (select oid FROM pg_type WHERE typbasetype=regtype('geometry'))"
+          ")"
+          " and has_schema_privilege(pg_namespace.nspname,'usage')"
+          " and has_table_privilege('\"'||pg_namespace.nspname||'\".\"'||pg_class.relname||'\"','select')";
     // user has select privilege
     if ( searchPublicOnly )
-      sql += "and pg_namespace.nspname = 'public' ";
+      sql += " and pg_namespace.nspname = 'public'";
 
     if ( n > 0 )
     {
-      sql += "and not exists (select * from geometry_columns WHERE pg_namespace.nspname=f_table_schema AND pg_class.relname=f_table_name) ";
+      sql += " and not exists (select * from geometry_columns WHERE pg_namespace.nspname=f_table_schema AND pg_class.relname=f_table_name)";
     }
     else
     {
       n = 0;
     }
 
-    sql += "and pg_class.relkind in ('v', 'r')"; // only from views and relations (tables)
+    sql += " and pg_class.relkind in ('v', 'r')"; // only from views and relations (tables)
 
     result = PQexec( pg, sql.toUtf8() );
 
@@ -692,7 +740,7 @@
 
         addSearchGeometryColumn( schema, table, column );
         //details.push_back(geomPair(fullDescription(schema, table, column, "WAITING"), "WAITING"));
-        mTableModel.addTableEntry( "Waiting", schema, table, column, "" );
+        mTableModel.addTableEntry( "Waiting", schema, table, column, pkCandidates( pg, schema, table ), "" );
         n++;
       }
     }
@@ -798,9 +846,14 @@
 
     for ( uint i = 0; i < schemas.size(); i++ )
     {
-      QString query = QgsDbSourceSelect::makeGeomQuery( schemas[i],
-                      tables[i],
-                      columns[i] );
+      QString query = QString( "select distinct "
+                               "case"
+                               " when geometrytype(%1) IN ('POINT','MULTIPOINT') THEN 'POINT'"
+                               " when geometrytype(%1) IN ('LINESTRING','MULTILINESTRING') THEN 'LINESTRING'"
+                               " when geometrytype(%1) IN ('POLYGON','MULTIPOLYGON') THEN 'POLYGON'"
+                               " end "
+                               "from "
+                               "\"%2\".\"%3\"" ).arg( "\"" + columns[i] + "\"" ).arg( schemas[i] ).arg( tables[i] );
       PGresult* gresult = PQexec( pd, query.toUtf8() );
       QString type;
       if ( PQresultStatus( gresult ) == PGRES_TUPLES_OK )

Modified: trunk/qgis/src/app/qgsdbsourceselect.h
===================================================================
--- trunk/qgis/src/app/qgsdbsourceselect.h	2009-08-22 10:19:52 UTC (rev 11478)
+++ trunk/qgis/src/app/qgsdbsourceselect.h	2009-08-22 10:20:18 UTC (rev 11479)
@@ -36,11 +36,43 @@
 #include <QMap>
 #include <QPair>
 #include <QIcon>
+#include <QItemDelegate>
 
 class QStringList;
-class QTableWidgetItem;
 class QgsGeomColumnTypeThread;
 class QgisApp;
+
+class QgsDbSourceSelectDelegate : public QItemDelegate
+{
+    Q_OBJECT;
+
+  public:
+    QgsDbSourceSelectDelegate( QObject *parent = NULL ) : QItemDelegate( parent )
+    {
+    }
+
+    /** Used to create an editor for when the user tries to
+     * change the contents of a cell */
+    QWidget *createEditor(
+      QWidget *parent,
+      const QStyleOptionViewItem &option,
+      const QModelIndex &index ) const
+    {
+      QComboBox *cb = new QComboBox( parent );
+      cb->addItems( index.data( Qt::UserRole + 1 ).toStringList() );
+      return cb;
+    }
+
+    void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
+    {
+      QComboBox *cb = dynamic_cast<QComboBox *>( editor );
+      if ( !cb )
+        return;
+      model->setData( index, cb->currentText() );
+    }
+};
+
+
 /*! \class QgsDbSourceSelect
  * \brief Dialog to create connections and add tables from PostgresQL.
  *
@@ -73,9 +105,6 @@
     QString connectionInfo();
     // Store the selected database
     void dbChanged();
-    // Utility function to construct the query for finding out the
-    // geometry type of a column
-    static QString makeGeomQuery( QString schema, QString table, QString column );
 
   public slots:
     /*! Connects to the database using the stored connection parameters.
@@ -102,14 +131,6 @@
     void setSearchExpression( const QString& regexp );
 
   private:
-    enum columns
-    {
-      dbssType = 0,
-      dbssDetail,
-      dbssSql,
-      dbssColumns
-    };
-
     typedef std::pair<QString, QString> geomPair;
     typedef std::list<geomPair > geomCol;
 
@@ -121,6 +142,9 @@
     /**Inserts information about the spatial tables into mTableModel*/
     bool getTableInfo( PGconn *pg, bool searchGeometryColumnsOnly, bool searchPublicOnly );
 
+    /** get primary key candidates (all int4 columns) */
+    QStringList pkCandidates( PGconn *pg, QString schemaName, QString tableName );
+
     // queue another query for the thread
     void addSearchGeometryColumn( const QString &schema, const QString &table, const QString &column );
 

Modified: trunk/qgis/src/app/qgsdbtablemodel.cpp
===================================================================
--- trunk/qgis/src/app/qgsdbtablemodel.cpp	2009-08-22 10:19:52 UTC (rev 11478)
+++ trunk/qgis/src/app/qgsdbtablemodel.cpp	2009-08-22 10:20:18 UTC (rev 11479)
@@ -26,6 +26,7 @@
   headerLabels << tr( "Table" );
   headerLabels << tr( "Type" );
   headerLabels << tr( "Geometry column" );
+  headerLabels << tr( "Primary key column" );
   headerLabels << tr( "Sql" );
   setHorizontalHeaderLabels( headerLabels );
 }
@@ -35,7 +36,7 @@
 
 }
 
-void QgsDbTableModel::addTableEntry( QString type, QString schemaName, QString tableName, QString geometryColName, QString sql )
+void QgsDbTableModel::addTableEntry( QString type, QString schemaName, QString tableName, QString geometryColName, const QStringList &pkCols, QString sql )
 {
   //is there already a root item with the given scheme Name?
   QStandardItem* schemaItem;
@@ -68,6 +69,9 @@
   tableItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
   QStandardItem* geomItem = new QStandardItem( geometryColName );
   geomItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
+  QStandardItem* pkItem = new QStandardItem( "" );
+  pkItem->setData( pkCols );
+  pkItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
   QStandardItem* sqlItem = new QStandardItem( sql );
   sqlItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
 
@@ -76,13 +80,14 @@
   childItemList.push_back( tableItem );
   childItemList.push_back( typeItem );
   childItemList.push_back( geomItem );
+  childItemList.push_back( pkItem );
   childItemList.push_back( sqlItem );
 
   schemaItem->appendRow( childItemList );
   ++mTableCount;
 }
 
-void QgsDbTableModel::setSql( const QModelIndex& index, const QString& sql )
+void QgsDbTableModel::setSql( const QModelIndex& index, const QString &sql )
 {
   if ( !index.isValid() || !index.parent().isValid() )
   {
@@ -138,7 +143,7 @@
     if ( itemFromIndex( currentTableIndex )->text() == tableName &&
          itemFromIndex( currentGeomIndex )->text() == geomName )
     {
-      QModelIndex sqlIndex = currentChildIndex.sibling( i, 4 );
+      QModelIndex sqlIndex = currentChildIndex.sibling( i, dbtmSql );
       if ( sqlIndex.isValid() )
       {
         itemFromIndex( sqlIndex )->setText( sql );
@@ -168,6 +173,7 @@
   QModelIndex currentTableIndex;
   QModelIndex currentTypeIndex;
   QModelIndex currentGeomColumnIndex;
+  QModelIndex currentPkColumnIndex;
 
   for ( int i = 0; i < numChildren; ++i )
   {
@@ -176,10 +182,12 @@
     {
       continue;
     }
-    currentTableIndex = currentChildIndex.sibling( i, 1 );
-    currentTypeIndex = currentChildIndex.sibling( i, 2 );
-    currentGeomColumnIndex = currentChildIndex.sibling( i, 3 );
+    currentTableIndex = currentChildIndex.sibling( i, dbtmTable );
+    currentTypeIndex = currentChildIndex.sibling( i, dbtmType );
+    currentGeomColumnIndex = currentChildIndex.sibling( i, dbtmGeomCol );
+    currentPkColumnIndex = currentChildIndex.sibling( i, dbtmPkCol );
     QString geomColText = itemFromIndex( currentGeomColumnIndex )->text();
+    QStringList pkCols = itemFromIndex( currentPkColumnIndex )->data().toStringList();
 
     if ( !currentTypeIndex.isValid() || !currentTableIndex.isValid() || !currentGeomColumnIndex.isValid() )
     {
@@ -207,7 +215,7 @@
       for ( int j = 1; j < typeList.size(); ++j )
       {
         //todo: add correct type
-        addTableEntry( typeList.at( j ), schema, table, geomColText + " AS " + typeList.at( j ), "" );
+        addTableEntry( typeList.at( j ), schema, table, geomColText + " AS " + typeList.at( j ), pkCols, "" );
       }
     }
   }

Modified: trunk/qgis/src/app/qgsdbtablemodel.h
===================================================================
--- trunk/qgis/src/app/qgsdbtablemodel.h	2009-08-22 10:19:52 UTC (rev 11478)
+++ trunk/qgis/src/app/qgsdbtablemodel.h	2009-08-22 10:20:18 UTC (rev 11479)
@@ -29,7 +29,7 @@
     QgsDbTableModel();
     ~QgsDbTableModel();
     /**Adds entry for one database table to the model*/
-    void addTableEntry( QString type, QString schemaName, QString tableName, QString geometryColName, QString Sql );
+    void addTableEntry( QString type, QString schemaName, QString tableName, QString geometryColName, const QStringList &pkCols, QString Sql );
     /**Sets an sql statement that belongs to a cell specified by a model index*/
     void setSql( const QModelIndex& index, const QString& sql );
     /**Sets one or more geometry types to a row. In case of several types, additional rows are inserted.
@@ -38,6 +38,17 @@
     /**Returns the number of tables in the model*/
     int tableCount() const {return mTableCount;}
 
+    enum columns
+    {
+      dbtmSchema = 0,
+      dbtmTable,
+      dbtmType,
+      dbtmGeomCol,
+      dbtmPkCol,
+      dbtmSql,
+      dbtmColumns
+    };
+
   private:
     /**Number of tables in the model*/
     int mTableCount;



More information about the QGIS-commit mailing list