45
45
46
46
#include " qgspostgisbox3d.h"
47
47
#include " qgslogger.h"
48
- #include " qgslogger.h"
49
48
50
49
const QString POSTGRES_KEY = " postgres" ;
51
50
const QString POSTGRES_DESCRIPTION = " PostgreSQL/PostGIS data provider" ;
@@ -424,6 +423,10 @@ bool QgsPostgresProvider::declareCursor(
424
423
{
425
424
query += QString ( " ,boolout(%1)" ).arg ( quotedIdentifier ( fieldname ) );
426
425
}
426
+ else if ( type == " geometry" )
427
+ {
428
+ query += QString (" ,asewkt(%1)" ).arg (quotedIdentifier (fieldname));
429
+ }
427
430
else
428
431
{
429
432
query += " ," + quotedIdentifier ( fieldname ) + " ::text" ;
@@ -826,6 +829,7 @@ void QgsPostgresProvider::loadFields()
826
829
fieldTypeName == " bpchar" ||
827
830
fieldTypeName == " varchar" ||
828
831
fieldTypeName == " bool" ||
832
+ fieldTypeName == " geometry" ||
829
833
fieldTypeName == " money" ||
830
834
fieldTypeName.startsWith ( " time" ) ||
831
835
fieldTypeName.startsWith ( " date" ) )
@@ -1802,6 +1806,10 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList & flist )
1802
1806
values += " ," + defVal;
1803
1807
}
1804
1808
}
1809
+ else if ( fit->typeName ()==" geometry" )
1810
+ {
1811
+ values += QString (" ,geomfromewkt(%1)" ).arg ( quotedValue ( it->toString () ) );
1812
+ }
1805
1813
else
1806
1814
{
1807
1815
values += " ," + quotedValue ( it->toString () );
@@ -1810,7 +1818,14 @@ bool QgsPostgresProvider::addFeatures( QgsFeatureList & flist )
1810
1818
else
1811
1819
{
1812
1820
// 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
+ }
1814
1829
defaultValues.append ( defVal );
1815
1830
fieldId.append ( it.key () );
1816
1831
}
@@ -2032,15 +2047,15 @@ bool QgsPostgresProvider::changeAttributeValues( const QgsChangedAttributesMap &
2032
2047
{
2033
2048
try
2034
2049
{
2035
- QString fieldName = field ( siter.key () ). name ( );
2050
+ QgsField fld = field ( siter.key () );
2036
2051
2037
2052
if ( !first )
2038
2053
sql += " ," ;
2039
2054
else
2040
2055
first = false ;
2041
2056
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 () ) )
2044
2059
.arg ( quotedValue ( siter->toString () ) );
2045
2060
}
2046
2061
catch ( PGFieldNotFound )
@@ -2635,16 +2650,22 @@ bool QgsPostgresProvider::Conn::PQexecNR( QString query )
2635
2650
if ( res )
2636
2651
{
2637
2652
int errorStatus = PQresultStatus ( res );
2638
- #ifdef QGISDEBUG
2639
2653
if ( errorStatus != PGRES_COMMAND_OK )
2640
2654
{
2655
+ #ifdef QGISDEBUG
2641
2656
QString err = QString ( " Query: %1 returned %2 [%3]" )
2642
2657
.arg ( query )
2643
2658
.arg ( errorStatus )
2644
2659
.arg ( PQresultErrorMessage ( res ) );
2645
2660
QgsDebugMsgLevel ( err, 3 );
2646
- }
2647
2661
#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
+ }
2648
2669
return errorStatus == PGRES_COMMAND_OK;
2649
2670
}
2650
2671
else
0 commit comments