Skip to content

Commit

Permalink
Merge pull request #477 from mapbox/empty-attribute-keys
Browse files Browse the repository at this point in the history
Fix error when parsing attributes with empty-string keys
  • Loading branch information
e-n-f authored Oct 13, 2017
2 parents 42a56b1 + ee6da93 commit cd47a39
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 93 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.26.0

Fix error when parsing attributes with empty-string keys

## 1.25.0

* Add --coalesce-smallest-as-needed strategy for reducing tile sizes
Expand Down
39 changes: 15 additions & 24 deletions serial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ void serialize_feature(FILE *geomfile, serial_feature *sf, long long *geompos, c
}

if (sf->metapos < 0 && sf->m != sf->keys.size()) {
fprintf(stderr, "Internal error: %lld doesn't match %lld\n", (long long) sf->m, (long long) sf->keys.size());
fprintf(stderr, "Internal error: feature said to have %lld attributes but only %lld found\n", (long long) sf->m, (long long) sf->keys.size());
exit(EXIT_FAILURE);
}

Expand Down Expand Up @@ -515,15 +515,17 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
exit(EXIT_FAILURE);
}

for (size_t i = 0; i < sf.full_keys.size(); i++) {
for (ssize_t i = sf.full_keys.size() - 1; i >= 0; i--) {
if (sst->exclude_all) {
if (sst->include->count(sf.full_keys[i]) == 0 && sf.full_keys[i] != "") {
sf.full_keys[i] = "";
if (sst->include->count(sf.full_keys[i]) == 0) {
sf.full_keys.erase(sf.full_keys.begin() + i);
sf.full_values.erase(sf.full_values.begin() + i);
sf.m--;
continue;
}
} else if (sst->exclude->count(sf.full_keys[i]) != 0 && sf.full_keys[i] != "") {
sf.full_keys[i] = "";
} else if (sst->exclude->count(sf.full_keys[i]) != 0) {
sf.full_keys.erase(sf.full_keys.begin() + i);
sf.full_values.erase(sf.full_values.begin() + i);
sf.m--;
continue;
}
Expand All @@ -535,12 +537,10 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
std::map<std::string, mvt_value> attributes;

for (size_t i = 0; i < sf.full_keys.size(); i++) {
if (sf.full_keys[i] != "") {
std::string key = sf.full_keys[i];
mvt_value val = stringified_to_mvt_value(sf.full_values[i].type, sf.full_values[i].s.c_str());
std::string key = sf.full_keys[i];
mvt_value val = stringified_to_mvt_value(sf.full_values[i].type, sf.full_values[i].s.c_str());

attributes.insert(std::pair<std::string, mvt_value>(key, val));
}
attributes.insert(std::pair<std::string, mvt_value>(key, val));
}

if (sf.has_id) {
Expand Down Expand Up @@ -569,19 +569,16 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
}
}

for (size_t i = 0; i < sf.full_keys.size(); i++) {
if (sf.full_values[i].type == mvt_null && sf.full_keys[i] != "") {
sf.full_keys[i] = "";
for (ssize_t i = sf.full_keys.size() - 1; i >= 0; i--) {
if (sf.full_values[i].type == mvt_null) {
sf.full_keys.erase(sf.full_keys.begin() + i);
sf.full_values.erase(sf.full_values.begin() + i);
sf.m--;
}
}

if (!sst->filters) {
for (size_t i = 0; i < sf.full_keys.size(); i++) {
if (sf.full_keys[i].size() == 0) {
continue;
}

type_and_string attrib;
attrib.type = sf.full_values[i].type;
attrib.string = sf.full_values[i].s;
Expand All @@ -594,18 +591,12 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) {
if (inline_meta) {
sf.metapos = -1;
for (size_t i = 0; i < sf.full_keys.size(); i++) {
if (sf.full_keys[i].size() == 0) {
continue;
}
sf.keys.push_back(addpool(r->poolfile, r->treefile, sf.full_keys[i].c_str(), mvt_string));
sf.values.push_back(addpool(r->poolfile, r->treefile, sf.full_values[i].s.c_str(), sf.full_values[i].type));
}
} else {
sf.metapos = r->metapos;
for (size_t i = 0; i < sf.full_keys.size(); i++) {
if (sf.full_keys[i].size() == 0) {
continue;
}
serialize_long_long(r->metafile, addpool(r->poolfile, r->treefile, sf.full_keys[i].c_str(), mvt_string), &r->metapos, sst->fname);
serialize_long_long(r->metafile, addpool(r->poolfile, r->treefile, sf.full_values[i].s.c_str(), sf.full_values[i].type), &r->metapos, sst->fname);
}
Expand Down
1 change: 1 addition & 0 deletions tests/dateline/in.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"otherboolean": false,
"stringify": [ "yes", 27.000000, 27, 1.4e27, { "foo": "bar" } ],
"nothing": null,
"": "something for nothing",
"escape": "foo\u0001bar,ü\"\\\/\b\f\n\r\t\u2192",
"prêt": "ready"
},"geometry":{"type":"Polygon","coordinates":[[[-189.492187,64.774125],[-182.460937,67.339860],[-169.101562,68.269386],[-156.09375,68.138851],[-144.492187,66.089364],[-134.648437,62.431074],[-131.835937,55.379110],[-133.59375,48.690960],[-146.25,38.548165],[-169.453124,34.885930],[-184.218749,37.160316],[-198.28125,45.336701],[-203.203125,54.977613],[-196.523437,62.431074],[-189.492187,64.774125]],[[-177.890625,62.593340],[-185.976562,58.813741],[-188.4375,54.367758],[-185.976562,47.279229],[-177.539062,44.339565],[-164.882812,43.325177],[-153.28125,46.558860],[-144.492187,51.179342],[-143.789062,57.136239],[-148.007812,61.100788],[-158.554687,63.860035],[-169.453124,64.472793],[-177.890625,62.593340]]]}},
Expand Down
Loading

0 comments on commit cd47a39

Please sign in to comment.