Skip to content

Commit bb63eac

Browse files
author
jef
committed
postgres provider update:
- handle secondary geometry columns as text in EWKT. - improve handling of errornous queries. - kudos to Stefanie Tellex for the initial patch git-svn-id: http://svn.osgeo.org/qgis/trunk@9619 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 9094f3e commit bb63eac

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

src/providers/postgres/qgspostgresprovider.cpp

+28-7
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545

4646
#include "qgspostgisbox3d.h"
4747
#include "qgslogger.h"
48-
#include "qgslogger.h"
4948

5049
const QString POSTGRES_KEY = "postgres";
5150
const QString POSTGRES_DESCRIPTION = "PostgreSQL/PostGIS data provider";
@@ -424,6 +423,10 @@ bool QgsPostgresProvider::declareCursor(
424423
{
425424
query += QString( ",boolout(%1)" ).arg( quotedIdentifier( fieldname ) );
426425
}
426+
else if ( type == "geometry")
427+
{
428+
query += QString(",asewkt(%1)").arg(quotedIdentifier(fieldname));
429+
}
427430
else
428431
{
429432
query += "," + quotedIdentifier( fieldname ) + "::text";
@@ -826,6 +829,7 @@ void QgsPostgresProvider::loadFields()
826829
fieldTypeName == "bpchar" ||
827830
fieldTypeName == "varchar" ||
828831
fieldTypeName == "bool" ||
832+
fieldTypeName == "geometry" ||
829833
fieldTypeName == "money" ||
830834
fieldTypeName.startsWith( "time" ) ||
831835
fieldTypeName.startsWith( "date" ) )
@@ -1802,6 +1806,10 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList & flist )
18021806
values += "," + defVal;
18031807
}
18041808
}
1809+
else if( fit->typeName()=="geometry" )
1810+
{
1811+
values += QString(",geomfromewkt(%1)").arg( quotedValue( it->toString() ) );
1812+
}
18051813
else
18061814
{
18071815
values += "," + quotedValue( it->toString() );
@@ -1810,7 +1818,14 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList & flist )
18101818
else
18111819
{
18121820
// value is not unique => add parameter
1813-
values += QString( ",$%1" ).arg( defaultValues.size() + 3 );
1821+
if( fit->typeName()=="geometry" )
1822+
{
1823+
values += QString( ",geomfromewkt($%1)" ).arg( defaultValues.size() + 3 );
1824+
}
1825+
else
1826+
{
1827+
values += QString( ",$%1" ).arg( defaultValues.size() + 3 );
1828+
}
18141829
defaultValues.append( defVal );
18151830
fieldId.append( it.key() );
18161831
}
@@ -2032,15 +2047,15 @@ bool QgsPostgresProvider::changeAttributeValues( const QgsChangedAttributesMap &
20322047
{
20332048
try
20342049
{
2035-
QString fieldName = field( siter.key() ).name();
2050+
QgsField fld = field( siter.key() );
20362051

20372052
if ( !first )
20382053
sql += ",";
20392054
else
20402055
first = false;
20412056

2042-
sql += QString( "%1=%2" )
2043-
.arg( quotedIdentifier( fieldName ) )
2057+
sql += QString( fld.typeName()!="geometry" ? "%1=%2" : "%1=geomfromewkt(%2)" )
2058+
.arg( quotedIdentifier( fld.name() ) )
20442059
.arg( quotedValue( siter->toString() ) );
20452060
}
20462061
catch ( PGFieldNotFound )
@@ -2635,16 +2650,22 @@ bool QgsPostgresProvider::Conn::PQexecNR( QString query )
26352650
if ( res )
26362651
{
26372652
int errorStatus = PQresultStatus( res );
2638-
#ifdef QGISDEBUG
26392653
if ( errorStatus != PGRES_COMMAND_OK )
26402654
{
2655+
#ifdef QGISDEBUG
26412656
QString err = QString( "Query: %1 returned %2 [%3]" )
26422657
.arg( query )
26432658
.arg( errorStatus )
26442659
.arg( PQresultErrorMessage( res ) );
26452660
QgsDebugMsgLevel( err, 3 );
2646-
}
26472661
#endif
2662+
if( openCursors )
2663+
{
2664+
PQexecNR( "ROLLBACK" );
2665+
QgsDebugMsg( QString("Re-starting read-only transaction after errornous statement - state of %1 cursors lost" ).arg( openCursors ) );
2666+
PQexecNR( "BEGIN READ ONLY" );
2667+
}
2668+
}
26482669
return errorStatus == PGRES_COMMAND_OK;
26492670
}
26502671
else

0 commit comments

Comments
 (0)