[QGIS Commit] r9382 - trunk/qgis/src/providers/postgres

svn_qgis at osgeo.org svn_qgis at osgeo.org
Tue Sep 23 02:28:36 EDT 2008


Author: jef
Date: 2008-09-23 02:28:35 -0400 (Tue, 23 Sep 2008)
New Revision: 9382

Modified:
   trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp
   trunk/qgis/src/providers/postgres/qgspostgresprovider.h
Log:
postgres provider: use default values for primary key


Modified: trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp
===================================================================
--- trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp	2008-09-23 05:42:44 UTC (rev 9381)
+++ trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp	2008-09-23 06:28:35 UTC (rev 9382)
@@ -1612,34 +1612,38 @@
   return valid;
 }
 
-QVariant QgsPostgresProvider::getDefaultValue( int fieldId )
+QVariant QgsPostgresProvider::getDefaultValue( QString fieldName )
 {
-  try
-  {
-    // Get the default column value from the Postgres information
-    // schema. If there is no default we return an empty string.
+  // Get the default column value from the Postgres information
+  // schema. If there is no default we return an empty string.
 
-    // Maintaining a cache of the results of this query would be quite
-    // simple and if this query is called lots, could save some time.
-    QString fieldName = field( fieldId ).name();
+  // Maintaining a cache of the results of this query would be quite
+  // simple and if this query is called lots, could save some time.
 
-    QString sql( "SELECT column_default FROM"
-                 " information_schema.columns WHERE"
-                 " column_default IS NOT NULL"
-                 " AND table_schema = " + quotedValue( mSchemaName ) +
-                 " AND table_name = " + quotedValue( mTableName ) +
-                 " AND column_name = " + quotedValue( fieldName ) );
+  QString sql( "SELECT column_default FROM"
+               " information_schema.columns WHERE"
+               " column_default IS NOT NULL"
+               " AND table_schema = " + quotedValue( mSchemaName ) +
+               " AND table_name = " + quotedValue( mTableName ) +
+               " AND column_name = " + quotedValue( fieldName ) );
 
-    QVariant defaultValue( QString::null );
+  QVariant defaultValue( QString::null );
 
-    Result result = connectionRO->PQexec( sql );
+  Result result = connectionRO->PQexec( sql );
 
-    if ( PQntuples( result ) == 1 && !PQgetisnull( result, 0, 0 ) )
-      defaultValue = QString::fromUtf8( PQgetvalue( result, 0, 0 ) );
+  if ( PQntuples( result ) == 1 && !PQgetisnull( result, 0, 0 ) )
+    defaultValue = QString::fromUtf8( PQgetvalue( result, 0, 0 ) );
 
-    // QgsDebugMsg( QString("defaultValue for %1 is NULL: %2").arg(fieldId).arg( defaultValue.isNull() ) );
+  // QgsDebugMsg( QString("defaultValue for %1 is NULL: %2").arg(fieldId).arg( defaultValue.isNull() ) );
 
-    return defaultValue;
+  return defaultValue;
+}
+
+QVariant QgsPostgresProvider::getDefaultValue( int fieldId )
+{
+  try
+  {
+    return getDefaultValue( field( fieldId ).name() );
   }
   catch ( PGFieldNotFound )
   {
@@ -1820,7 +1824,10 @@
       throw PGException( stmt );
     PQclear( stmt );
 
-    int primaryKeyHighWater = maxPrimaryKeyValue();
+    QString keyDefault = getDefaultValue( primaryKey ).toString();
+    int primaryKeyHighWater = -1;
+    if ( keyDefault.isNull() )
+      primaryKeyHighWater = maxPrimaryKeyValue();
     QList<int> newIds;
 
     for ( QgsFeatureList::iterator features = flist.begin(); features != flist.end(); features++ )
@@ -1832,9 +1839,19 @@
 
       QStringList params;
       params << geomParam;
-      params << QString( "%1" ).arg( ++primaryKeyHighWater );
 
-      newIds << primaryKeyHighWater;
+      if ( keyDefault.isNull() )
+      {
+        ++primaryKeyHighWater;
+        params << QString::number( primaryKeyHighWater );
+        newIds << primaryKeyHighWater;
+      }
+      else
+      {
+        QByteArray key = paramValue( keyDefault, keyDefault );
+        params << key;
+        newIds << key.toInt();
+      }
 
       for ( int i = 0; i < fieldId.size(); i++ )
         params << paramValue( attributevec[ fieldId[i] ].toString(), defaultValue[i] );

Modified: trunk/qgis/src/providers/postgres/qgspostgresprovider.h
===================================================================
--- trunk/qgis/src/providers/postgres/qgspostgresprovider.h	2008-09-23 05:42:44 UTC (rev 9381)
+++ trunk/qgis/src/providers/postgres/qgspostgresprovider.h	2008-09-23 06:28:35 UTC (rev 9382)
@@ -197,6 +197,9 @@
 
     QgsAttributeList allAttributesList();
 
+    /**Returns the default value for field specified by @c fieldName */
+    QVariant getDefaultValue( QString fieldName );
+
     /**Returns the default value for field specified by @c fieldId */
     QVariant getDefaultValue( int fieldId );
 



More information about the QGIS-commit mailing list