[QGIS Commit] r8309 - trunk/qgis/src/providers/ogr
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Tue Apr 1 20:10:03 EDT 2008
Author: jef
Date: 2008-04-01 20:10:03 -0400 (Tue, 01 Apr 2008)
New Revision: 8309
Modified:
trunk/qgis/src/providers/ogr/qgsogrprovider.cpp
Log:
support unset fields in OGR provider (like NULL in postgres provider; fixes #1023)
Modified: trunk/qgis/src/providers/ogr/qgsogrprovider.cpp
===================================================================
--- trunk/qgis/src/providers/ogr/qgsogrprovider.cpp 2008-04-01 20:27:42 UTC (rev 8308)
+++ trunk/qgis/src/providers/ogr/qgsogrprovider.cpp 2008-04-02 00:10:03 UTC (rev 8309)
@@ -440,19 +440,23 @@
return;
}
- //QString fld = mEncoding->toUnicode(fldDef->GetNameRef());
- QByteArray cstr(OGR_F_GetFieldAsString(ogrFet,attindex));
- QString str = mEncoding->toUnicode(cstr);
QVariant value;
- switch (mAttributeFields[attindex].type())
+ if( OGR_F_IsFieldSet(ogrFet, attindex) )
{
- case QVariant::String: value = QVariant(str); break;
- case QVariant::Int: value = QVariant(str.toInt()); break;
- case QVariant::Double: value = QVariant(str.toDouble()); break;
- //case QVariant::DateTime: value = QVariant(QDateTime::fromString(str)); break;
- default: assert(NULL && "unsupported field type");
+ switch (mAttributeFields[attindex].type())
+ {
+ case QVariant::String: value = QVariant( mEncoding->toUnicode( OGR_F_GetFieldAsString(ogrFet,attindex) ) ); break;
+ case QVariant::Int: value = QVariant( OGR_F_GetFieldAsInteger( ogrFet, attindex ) ); break;
+ case QVariant::Double: value = QVariant( OGR_F_GetFieldAsDouble( ogrFet, attindex ) ); break;
+ //case QVariant::DateTime: value = QVariant(QDateTime::fromString(str)); break;
+ default: assert(NULL && "unsupported field type");
+ }
}
+ else
+ {
+ value = QVariant( QString::null );
+ }
f.addAttribute(attindex, value);
}
@@ -511,30 +515,38 @@
//if(!s.isEmpty())
// continue;
-
+ //
OGRFieldDefnH fldDef = OGR_FD_GetFieldDefn( fdef, targetAttributeId );
+ OGRFieldType type = OGR_Fld_GetType( fldDef );
- switch( OGR_Fld_GetType(fldDef) )
+ if( it->isNull() || (type!=OFTString && it->toString().isEmpty()) )
{
- case OFTInteger:
- OGR_F_SetFieldInteger(feature,targetAttributeId,it->toInt());
- break;
+ OGR_F_UnsetField(feature, targetAttributeId);
+ }
+ else
+ {
+ switch( type )
+ {
+ case OFTInteger:
+ OGR_F_SetFieldInteger(feature,targetAttributeId,it->toInt());
+ break;
- case OFTReal:
- OGR_F_SetFieldDouble(feature,targetAttributeId,it->toDouble());
- break;
+ case OFTReal:
+ OGR_F_SetFieldDouble(feature,targetAttributeId,it->toDouble());
+ break;
- case OFTString:
- QgsDebugMsg( QString("Writing string attribute %1 with %2, encoding %3")
- .arg( targetAttributeId )
- .arg( it->toString() )
- .arg( mEncoding->name().data() ) );
- OGR_F_SetFieldString(feature,targetAttributeId,mEncoding->fromUnicode(it->toString()).constData());
- break;
+ case OFTString:
+ QgsDebugMsg( QString("Writing string attribute %1 with %2, encoding %3")
+ .arg( targetAttributeId )
+ .arg( it->toString() )
+ .arg( mEncoding->name().data() ) );
+ OGR_F_SetFieldString(feature,targetAttributeId,mEncoding->fromUnicode(it->toString()).constData());
+ break;
- default:
- QgsLogger::warning("QgsOgrProvider::addFeature, no type found");
- break;
+ default:
+ QgsLogger::warning("QgsOgrProvider::addFeature, no type found");
+ break;
+ }
}
}
@@ -633,22 +645,30 @@
}
OGRFieldType type = OGR_Fld_GetType( fd );
- switch ( type )
+
+ if( it2->isNull() || (type!=OFTString && it2->toString().isEmpty()) )
{
- case OFTInteger:
- OGR_F_SetFieldInteger ( of, f, it2->toInt() );
- break;
- case OFTReal:
- OGR_F_SetFieldDouble ( of, f, it2->toDouble() );
- break;
- case OFTString:
- OGR_F_SetFieldString ( of, f, mEncoding->fromUnicode(it2->toString()).constData() );
- break;
- default:
- QgsLogger::warning("QgsOgrProvider::changeAttributeValues, Unknown field type, cannot change attribute");
- break;
+ OGR_F_UnsetField( of, f);
}
-
+ else
+ {
+
+ switch ( type )
+ {
+ case OFTInteger:
+ OGR_F_SetFieldInteger ( of, f, it2->toInt() );
+ break;
+ case OFTReal:
+ OGR_F_SetFieldDouble ( of, f, it2->toDouble() );
+ break;
+ case OFTString:
+ OGR_F_SetFieldString ( of, f, mEncoding->fromUnicode(it2->toString()).constData() );
+ break;
+ default:
+ QgsLogger::warning("QgsOgrProvider::changeAttributeValues, Unknown field type, cannot change attribute");
+ break;
+ }
+ }
}
OGR_L_SetFeature( ogrLayer, of );
More information about the QGIS-commit
mailing list