4545
4646#include " qgspostgisbox3d.h"
4747#include " qgslogger.h"
48- #include " qgslogger.h"
4948
5049const QString POSTGRES_KEY = " postgres" ;
5150const 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