Merge branch 'master' into image-readers-c++11

Conflicts:
	include/mapnik/factory.hpp
This commit is contained in:
artemp 2013-04-18 09:48:31 +01:00
commit 22a1df8388
8 changed files with 97 additions and 13 deletions

View File

@ -348,6 +348,16 @@ void runtime_error_translator(std::runtime_error const & ex)
PyErr_SetString(PyExc_RuntimeError, ex.what());
}
void out_of_range_error_translator(std::out_of_range const & ex)
{
PyErr_SetString(PyExc_IndexError, ex.what());
}
void standard_error_translator(std::exception const & ex)
{
PyErr_SetString(PyExc_RuntimeError, ex.what());
}
unsigned mapnik_version()
{
return MAPNIK_VERSION;
@ -421,6 +431,8 @@ BOOST_PYTHON_MODULE(_mapnik)
using mapnik::save_map_to_string;
using mapnik::render_grid;
register_exception_translator<std::exception>(&standard_error_translator);
register_exception_translator<std::out_of_range>(&out_of_range_error_translator);
register_exception_translator<mapnik::config_error>(&config_error_translator);
register_exception_translator<mapnik::value_error>(&value_error_translator);
register_exception_translator<std::runtime_error>(&runtime_error_translator);

View File

@ -75,10 +75,17 @@ feature_ptr postgis_featureset::next()
if (key_field_)
{
std::string name = rs_->getFieldName(pos);
// null feature id is not acceptable
if (rs_->isNull(pos))
{
MAPNIK_LOG_WARN(postgis) << "postgis_featureset: null value encountered for key_field: " << name;
continue;
}
// create feature with user driven id from attribute
int oid = rs_->getTypeOID(pos);
const char* buf = rs_->getValue(pos);
std::string name = rs_->getFieldName(pos);
// validation happens of this type at initialization
mapnik::value_integer val;
@ -199,7 +206,7 @@ feature_ptr postgis_featureset::next()
default:
{
MAPNIK_LOG_WARN(postgis) << "postgis_featureset: Uknown type_oid=" << oid;
MAPNIK_LOG_WARN(postgis) << "postgis_featureset: Unknown type_oid=" << oid;
break;
}

View File

@ -71,6 +71,13 @@ feature_ptr sqlite_featureset::next()
return feature_ptr();
}
// null feature id is not acceptable
if (rs_->column_type(1) == SQLITE_NULL)
{
MAPNIK_LOG_ERROR(postgis) << "sqlite_featureset: null value encountered for key_field";
continue;
}
feature_ptr feature = feature_factory::create(ctx_,rs_->column_integer64(1));
if (!geometry_utils::from_wkb(feature->paths(), data, size, format_))
continue;

View File

@ -442,7 +442,7 @@ private:
case wkbMultiLineStringZ: s << "MultiLineStringZ"; break;
case wkbMultiPolygonZ: s << "MultiPolygonZ"; break;
case wkbGeometryCollectionZ: s << "GeometryCollectionZ"; break;
default: s << "wkbUknown(" << type << ")"; break;
default: s << "wkbUnknown(" << type << ")"; break;
}
return s.str();

View File

@ -186,6 +186,14 @@ int main( int, char*[] )
BOOST_TEST_EQ( out, "1.00001" );
out.clear();
to_string(out, double(67.65));
BOOST_TEST_EQ( out, "67.65" );
out.clear();
to_string(out, double(67.35));
BOOST_TEST_EQ( out, "67.35" );
out.clear();
to_string(out, double(1234000000000000));
BOOST_TEST_EQ( out, "1.234e+15" );
out.clear();

View File

@ -556,7 +556,7 @@ if 'postgis' in mapnik.DatasourceCache.plugin_names() \
eq_(mapnik.Expression("[name] != 'name'").evaluate(feat),True)
eq_(mapnik.Expression("[name] != ''").evaluate(feat),False)
eq_(mapnik.Expression("[name] != null").evaluate(feat),True)
eq_[bool_field]
eq_(mapnik.Expression("[name] != true").evaluate(feat),True)
eq_(mapnik.Expression("[name] != false").evaluate(feat),True)
feat = fs.next()
@ -573,7 +573,7 @@ if 'postgis' in mapnik.DatasourceCache.plugin_names() \
eq_(mapnik.Expression("[name] != true").evaluate(feat),True)
eq_(mapnik.Expression("[name] != false").evaluate(feat),True)
def test_null_comparision():
def test_null_comparision2():
ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='test10',
geometry_field='geom')
fs = ds.featureset()
@ -586,8 +586,8 @@ if 'postgis' in mapnik.DatasourceCache.plugin_names() \
eq_(mapnik.Expression("[bool_field] = true").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] = false").evaluate(feat),False)
eq_(mapnik.Expression("[bool_field] != 'name'").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != ''").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != null").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != ''").evaluate(feat),True) # in 2.1.x used to be False
eq_(mapnik.Expression("[bool_field] != null").evaluate(feat),True) # in 2.1.x used to be False
eq_(mapnik.Expression("[bool_field] != true").evaluate(feat),False)
eq_(mapnik.Expression("[bool_field] != false").evaluate(feat),True)
@ -601,7 +601,7 @@ if 'postgis' in mapnik.DatasourceCache.plugin_names() \
eq_(mapnik.Expression("[bool_field] = false").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != 'name'").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != ''").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != null").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != null").evaluate(feat),True) # in 2.1.x used to be False
eq_(mapnik.Expression("[bool_field] != true").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != false").evaluate(feat),False)
@ -613,11 +613,40 @@ if 'postgis' in mapnik.DatasourceCache.plugin_names() \
eq_(mapnik.Expression("[bool_field] = null").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] = true").evaluate(feat),False)
eq_(mapnik.Expression("[bool_field] = false").evaluate(feat),False)
eq_(mapnik.Expression("[bool_field] != 'name'").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != ''").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != 'name'").evaluate(feat),True) # in 2.1.x used to be False
eq_(mapnik.Expression("[bool_field] != ''").evaluate(feat),True) # in 2.1.x used to be False
eq_(mapnik.Expression("[bool_field] != null").evaluate(feat),False)
eq_(mapnik.Expression("[bool_field] != true").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != false").evaluate(feat),True)
eq_(mapnik.Expression("[bool_field] != true").evaluate(feat),True) # in 2.1.x used to be False
eq_(mapnik.Expression("[bool_field] != false").evaluate(feat),True) # in 2.1.x used to be False
# https://github.com/mapnik/mapnik/issues/1816
def test_exception_message_reporting():
try:
ds = mapnik.PostGIS(dbname=MAPNIK_TEST_DBNAME,table='doesnotexist')
except Exception, e:
eq_(e.message != 'unidentifiable C++ exception', True)
def test_null_id_field():
opts = {'type':'postgis',
'dbname':MAPNIK_TEST_DBNAME,
'geometry_field':'geom',
'table':"(select null::bigint as osm_id, GeomFromEWKT('SRID=4326;POINT(0 0)') as geom) as tmp"}
ds = mapnik.Datasource(**opts)
fs = ds.featureset()
feat = fs.next()
eq_(feat.id(),1L)
eq_(feat['osm_id'],None)
@raises(StopIteration)
def test_null_key_field():
opts = {'type':'postgis',
"key_field": 'osm_id',
'dbname':MAPNIK_TEST_DBNAME,
'geometry_field':'geom',
'table':"(select null::bigint as osm_id, GeomFromEWKT('SRID=4326;POINT(0 0)') as geom) as tmp"}
ds = mapnik.Datasource(**opts)
fs = ds.featureset()
feat = fs.next() ## should throw since key_field is null: StopIteration: No more features.
atexit.register(postgis_takedown)

View File

@ -379,6 +379,27 @@ if 'sqlite' in mapnik.DatasourceCache.plugin_names():
eq_(feat['OGC_FID'],2)
eq_(feat['bigint'],922337203685477580)
@raises(StopIteration)
def test_null_id_field():
# form up an in-memory test db
wkb = '010100000000000000000000000000000000000000'
# note: the osm_id should be declared INTEGER PRIMARY KEY
# but in this case we intentionally do not make this a valid pkey
# otherwise sqlite would turn the null into a valid, serial id
ds = mapnik.SQLite(file=':memory:',
table='test1',
initdb='''
create table test1 (osm_id INTEGER,geometry BLOB);
insert into test1 values (null,x'%s');
''' % wkb,
extent='-180,-60,180,60',
use_spatial_index=False,
key_field='osm_id'
)
fs = ds.featureset()
feat = fs.next() ## should throw since key_field is null: StopIteration: No more features.
if __name__ == "__main__":
setup()
[eval(run)() for run in dir() if 'test_' in run]

View File

@ -159,7 +159,7 @@ class Reporting:
print "\nVisual rendering: %s failed / %s passed" % (len(self.errors), self.passed)
for idx, error in enumerate(self.errors):
if error[0] == self.OTHER:
print str(idx+1) + ") \x1b[31mfailure to run test:\x1b[0m %s" % error[3]
print str(idx+1) + ") \x1b[31mfailure to run test:\x1b[0m %s" % error[2]
elif error[0] == self.NOT_FOUND:
if self.generate:
print str(idx+1) + ") Generating reference image: '%s'" % error[2]