[QGIS Commit] r15072 - in trunk/qgis/src: app/postgres providers/postgres

svn_qgis at osgeo.org svn_qgis at osgeo.org
Mon Jan 24 16:48:40 EST 2011


Author: jef
Date: 2011-01-24 13:48:40 -0800 (Mon, 24 Jan 2011)
New Revision: 15072

Modified:
   trunk/qgis/src/app/postgres/qgspgsourceselect.cpp
   trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp
Log:
postgres provider update: use st_ functions only with postgis>=2 and the old one with earlier postgis version

Modified: trunk/qgis/src/app/postgres/qgspgsourceselect.cpp
===================================================================
--- trunk/qgis/src/app/postgres/qgspgsourceselect.cpp	2011-01-24 16:33:27 UTC (rev 15071)
+++ trunk/qgis/src/app/postgres/qgspgsourceselect.cpp	2011-01-24 21:48:40 UTC (rev 15072)
@@ -732,8 +732,8 @@
                   "pg_namespace.oid=pg_class.relnamespace"
                   " and pg_attribute.attrelid = pg_class.oid"
                   " and ("
-                  "pg_attribute.atttypid::regtype::text IN ('geometry','geography')"
-                  " or pg_attribute.atttypid IN (select oid FROM pg_type WHERE typbasetype::regtype::text IN ('geometry','geography'))"
+                  " exists (select * from pg_type WHERE pg_type.oid=pg_attribute.atttypid AND pg_type.typname IN ('geometry','geography'))"
+                  " or pg_attribute.atttypid IN (select oid FROM pg_type a WHERE EXISTS (SELECT * FROM pg_type b WHERE a.typbasetype=b.oid AND b.typname IN ('geometry','geography')))"
                   ")"
                   " and has_schema_privilege( pg_namespace.nspname, 'usage' )"
                   " and has_table_privilege( '\"' || pg_namespace.nspname || '\".\"' || pg_class.relname || '\"', 'select' )";

Modified: trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp
===================================================================
--- trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp	2011-01-24 16:33:27 UTC (rev 15071)
+++ trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp	2011-01-24 21:48:40 UTC (rev 15072)
@@ -372,7 +372,9 @@
   }
   else if ( type == "geometry" )
   {
-    return QString( "st_asewkt(%1)" ).arg( quotedIdentifier( fld.name() ) );
+    return QString( "%1(%2)" )
+           .arg( connectionRO->majorVersion() < 2 ? "asewkt" : "st_asewkt" )
+           .arg( quotedIdentifier( fld.name() ) );
   }
   else if ( type == "geography" )
   {
@@ -403,11 +405,13 @@
     {
       if ( isGeography )
       {
-        query += QString( ",st_asbinary(%1)" ).arg( quotedIdentifier( geometryColumn ) );
+        query += QString( ",st_asbinary(%1)" )
+                 .arg( quotedIdentifier( geometryColumn ) );
       }
       else
       {
-        query += QString( ",st_asbinary(%1,'%2')" )
+        query += QString( ",%1(%2,'%3')" )
+                 .arg( connectionRO->majorVersion() < 2 ? "asbinary" : "st_asbinary" )
                  .arg( quotedIdentifier( geometryColumn ) )
                  .arg( endianString() );
       }
@@ -564,20 +568,22 @@
 
     if ( whereClause.isEmpty() )
     {
-
       if ( useIntersect )
       {
         // Contributed by #qgis irc "creeping"
         // This version actually invokes PostGIS's use of spatial indexes
-        whereClause = QString( "%1 && st_setsrid('BOX3D(%2)'::box3d,%3) and st_intersects(%1,st_setsrid('BOX3D(%2)'::box3d,%3))" )
+        whereClause = QString( "%1 && %2('BOX3D(%3)'::box3d,%4) and %5(%1,%2('BOX3D(%3)'::box3d,%4))" )
                       .arg( quotedIdentifier( geometryColumn ) )
+                      .arg( connectionRO->majorVersion() < 2 ? "setsrid" : "st_setsrid" )
                       .arg( rect.asWktCoordinates() )
-                      .arg( srid );
+                      .arg( srid )
+                      .arg( connectionRO->majorVersion() < 2 ? "intersects" : "st_intersects" );
       }
       else
       {
-        whereClause = QString( "%1 && st_setsrid('BOX3D(%2)'::box3d,%3)" )
+        whereClause = QString( "%1 && %2('BOX3D(%3)'::box3d,%4)" )
                       .arg( quotedIdentifier( geometryColumn ) )
+                      .arg( connectionRO->majorVersion() < 2 ? "setsrid" : "st_setsrid" )
                       .arg( rect.asWktCoordinates() )
                       .arg( srid );
       }
@@ -2260,7 +2266,8 @@
     if ( !geometryColumn.isNull() )
     {
       insert += quotedIdentifier( geometryColumn );
-      values += QString( "st_geomfromwkb($%1%2,%3)" )
+      values += QString( "%1($%2%3,%4)" )
+                .arg( connectionRO->majorVersion() < 2 ? "geomfromwkb" : "st_geomfromwkb" )
                 .arg( offset )
                 .arg( connectionRW->useWkbHex() ? "" : "::bytea" )
                 .arg( srid );
@@ -2332,11 +2339,16 @@
         }
         else if ( fit->typeName() == "geometry" )
         {
-          values += QString( "%1st_geomfromewkt(%2)" ).arg( delim ).arg( quotedValue( it->toString() ) );
+          values += QString( "%1%2(%3)" )
+                    .arg( delim )
+                    .arg( connectionRO->majorVersion() < 2 ? "geomfromewkt" : "st_geomfromewkt" )
+                    .arg( quotedValue( it->toString() ) );
         }
         else if ( fit->typeName() == "geography" )
         {
-          values += QString( "%1st_geographyfromewkt(%2)" ).arg( delim ).arg( quotedValue( it->toString() ) );
+          values += QString( "%1st_geographyfromewkt(%2)" )
+                    .arg( delim )
+                    .arg( quotedValue( it->toString() ) );
         }
         else
         {
@@ -2348,15 +2360,22 @@
         // value is not unique => add parameter
         if ( fit->typeName() == "geometry" )
         {
-          values += QString( "%1st_geomfromewkt($%2)" ).arg( delim ).arg( defaultValues.size() + offset );
+          values += QString( "%1%2($%3)" )
+                    .arg( delim )
+                    .arg( connectionRO->majorVersion() < 2 ? "geomfromewkt" : "st_geomfromewkt" )
+                    .arg( defaultValues.size() + offset );
         }
         else if ( fit->typeName() == "geography" )
         {
-          values += QString( "%1st_geographyfromewkt($%2)" ).arg( delim ).arg( defaultValues.size() + offset );
+          values += QString( "%1st_geographyfromewkt($%2)" )
+                    .arg( delim )
+                    .arg( defaultValues.size() + offset );
         }
         else
         {
-          values += QString( "%1$%2" ).arg( delim ).arg( defaultValues.size() + offset );
+          values += QString( "%1$%2" )
+                    .arg( delim )
+                    .arg( defaultValues.size() + offset );
         }
         defaultValues.append( defVal );
         fieldId.append( it.key() );
@@ -2618,11 +2637,23 @@
           else
             first = false;
 
-          sql += QString( fld.typeName() == "geometry" ? "%1=st_geomfromewkt(%2)" :
-                          fld.typeName() == "geography" ? "%1=st_geographyfromewkt(%2)" :
-                          "%1=%2" )
-                 .arg( quotedIdentifier( fld.name() ) )
-                 .arg( quotedValue( siter->toString() ) );
+          sql += QString( "%1=" ).arg( quotedIdentifier( fld.name() ) );
+
+          if ( fld.typeName() == "geometry" )
+          {
+            sql += QString( "%1(%2)" )
+                   .arg( connectionRO->majorVersion() < 2 ? "geomfromewkt" : "st_geomfromewkt" )
+                   .arg( quotedValue( siter->toString() ) );
+          }
+          else if ( fld.typeName() == "geography" )
+          {
+            sql += QString( "st_geographyfromewkt(%1)" )
+                   .arg( quotedValue( siter->toString() ) );
+          }
+          else
+          {
+            sql += quotedValue( siter->toString() );
+          }
         }
         catch ( PGFieldNotFound )
         {
@@ -2681,9 +2712,10 @@
     // Start the PostGIS transaction
     connectionRW->PQexecNR( "BEGIN" );
 
-    QString update = QString( "UPDATE %1 SET %2=st_geomfromwkb($1%3,%4) WHERE %5=$2" )
+    QString update = QString( "UPDATE %1 SET %2=%3($1%4,%5) WHERE %6=$2" )
                      .arg( mQuery )
                      .arg( quotedIdentifier( geometryColumn ) )
+                     .arg( connectionRW->majorVersion() < 2 ? "geomfromwkb" : "st_geomfromwkb" )
                      .arg( connectionRW->useWkbHex() ? "" : "::bytea" )
                      .arg( srid )
                      .arg( quotedIdentifier( primaryKey ) );
@@ -2865,7 +2897,8 @@
       {
         if ( QString::fromUtf8( PQgetvalue( result, 0, 0 ) ).toInt() > 0 )
         {
-          sql = QString( "select st_estimated_extent(%1,%2,%3)" )
+          sql = QString( "select %1(%2,%3,%4)" )
+                .arg( connectionRO->majorVersion() < 2 ? "estimated_extent" : "st_estimated_extent" )
                 .arg( quotedValue( mSchemaName ) )
                 .arg( quotedValue( mTableName ) )
                 .arg( quotedValue( geometryColumn ) );
@@ -2893,7 +2926,8 @@
 
     if ( ext.isEmpty() )
     {
-      sql = QString( "select st_extent(%1) from %2" )
+      sql = QString( "select %1(%2) from %3" )
+            .arg( connectionRO->majorVersion() < 2 ? "extent" : "st_extent" )
             .arg( quotedIdentifier( geometryColumn ) )
             .arg( mQuery );
 
@@ -3111,7 +3145,8 @@
     // Didn't find what we need in the geometry_columns table, so
     // get stuff from the relevant column instead. This may (will?)
     // fail if there is no data in the relevant table.
-    sql = QString( "select st_srid(%1),geometrytype(%1) from %2" )
+    sql = QString( "select %1(%2),geometrytype(%2) from %3" )
+          .arg( connectionRO->majorVersion() < 2 ? "srid" : "st_srid" )
           .arg( quotedIdentifier( geometryColumn ) )
           .arg( mQuery );
 



More information about the QGIS-commit mailing list