size_t middle_ram_t::ways_get_list(const idlist_t &ids, idlist_t &way_ids, multitaglist_t &tags, multinodelist_t &nodes) const { if (ids.empty()) { return 0; } assert(way_ids.empty()); tags.assign(ids.size(), taglist_t()); nodes.assign(ids.size(), nodelist_t()); size_t count = 0; for (idlist_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { if (ways_get(*it, tags[count], nodes[count])) { way_ids.push_back(*it); count++; } else { tags[count].clear(); nodes[count].clear(); } } if (count < ids.size()) { tags.resize(count); nodes.resize(count); } return int(count); }
size_t middle_pgsql_t::ways_get_list(const idlist_t &ids, idlist_t &way_ids, multitaglist_t &tags, multinodelist_t &nodes) const { if (ids.empty()) return 0; char tmp[16]; std::unique_ptr<char[]> tmp2(new (std::nothrow) char[ids.size() * 16]); char const *paramValues[1]; if (tmp2 == nullptr) return 0; //failed to allocate memory, return */ // create a list of ids in tmp2 to query the database */ sprintf(tmp2.get(), "{"); for(idlist_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { snprintf(tmp, sizeof(tmp), "%" PRIdOSMID ",", *it); strncat(tmp2.get(), tmp, sizeof(char)*(ids.size()*16 - 2)); } tmp2[strlen(tmp2.get()) - 1] = '}'; // replace last , with } to complete list of ids*/ pgsql_endCopy(way_table); PGconn *sql_conn = way_table->sql_conn; paramValues[0] = tmp2.get(); PGresult *res = pgsql_execPrepared(sql_conn, "get_way_list", 1, paramValues, PGRES_TUPLES_OK); int countPG = PQntuples(res); idlist_t wayidspg; for (int i = 0; i < countPG; i++) { wayidspg.push_back(strtoosmid(PQgetvalue(res, i, 0), nullptr, 10)); } // Match the list of ways coming from postgres in a different order // back to the list of ways given by the caller */ for(idlist_t::const_iterator it = ids.begin(); it != ids.end(); ++it) { for (int j = 0; j < countPG; j++) { if (*it == wayidspg[j]) { way_ids.push_back(*it); tags.push_back(taglist_t()); pgsql_parse_tags(PQgetvalue(res, j, 2), tags.back()); size_t num_nodes = strtoul(PQgetvalue(res, j, 3), nullptr, 10); idlist_t list; pgsql_parse_nodes( PQgetvalue(res, j, 1), list); if (num_nodes != list.size()) { fprintf(stderr, "parse_nodes problem for way %s: expected nodes %zu got %zu\n", tmp, num_nodes, list.size()); util::exit_nicely(); } nodes.push_back(nodelist_t()); nodes_get_list(nodes.back(), list); break; } } } assert(way_ids.size() <= ids.size()); PQclear(res); return way_ids.size(); }
unsigned tagtransform::lua_filter_rel_member_tags(const taglist_t &rel_tags, const multitaglist_t &member_tags, const rolelist_t &member_roles, int *member_superseeded, int *make_boundary, int *make_polygon, int *roads, taglist_t &out_tags) { lua_getglobal(L, m_rel_mem_func.c_str()); lua_newtable(L); /* relations key value table */ for (taglist_t::const_iterator it = rel_tags.begin(); it != rel_tags.end(); ++it) { lua_pushstring(L, it->key.c_str()); lua_pushstring(L, it->value.c_str()); lua_rawset(L, -3); } lua_newtable(L); /* member tags table */ int idx = 1; for (multitaglist_t::const_iterator list = member_tags.begin(); list != member_tags.end(); ++list) { lua_pushnumber(L, idx++); lua_newtable(L); /* member key value table */ for (taglist_t::const_iterator it = list->begin(); it != list->end(); ++it) { lua_pushstring(L, it->key.c_str()); lua_pushstring(L, it->value.c_str()); lua_rawset(L, -3); } lua_rawset(L, -3); } lua_newtable(L); /* member roles table */ for (size_t i = 0; i < member_roles.size(); i++) { lua_pushnumber(L, i + 1); lua_pushstring(L, member_roles[i]->c_str()); lua_rawset(L, -3); } lua_pushnumber(L, member_roles.size()); if (lua_pcall(L,4,6,0)) { fprintf(stderr, "Failed to execute lua function for relation tag processing: %s\n", lua_tostring(L, -1)); /* lua function failed */ return 1; } *roads = lua_tointeger(L, -1); lua_pop(L,1); *make_polygon = lua_tointeger(L, -1); lua_pop(L,1); *make_boundary = lua_tointeger(L,-1); lua_pop(L,1); lua_pushnil(L); for (size_t i = 0; i < member_tags.size(); i++) { if (lua_next(L,-2)) { member_superseeded[i] = lua_tointeger(L,-1); lua_pop(L,1); } else { fprintf(stderr, "Failed to read member_superseeded from lua function\n"); } } lua_pop(L,2); lua_pushnil(L); while (lua_next(L,-2) != 0) { const char *key = lua_tostring(L,-2); const char *value = lua_tostring(L,-1); out_tags.push_back(tag(key, value)); lua_pop(L,1); } lua_pop(L,1); int filter = lua_tointeger(L, -1); lua_pop(L,1); return filter; }
unsigned lua_tagtransform_t::filter_rel_member_tags( taglist_t const &rel_tags, multitaglist_t const &members_tags, rolelist_t const &member_roles, int *member_superseded, int *make_boundary, int *make_polygon, int *roads, export_list const &, taglist_t &out_tags, bool) { lua_getglobal(L, m_rel_mem_func.c_str()); lua_newtable(L); /* relations key value table */ for (const auto &rel_tag : rel_tags) { lua_pushstring(L, rel_tag.key.c_str()); lua_pushstring(L, rel_tag.value.c_str()); lua_rawset(L, -3); } lua_newtable(L); /* member tags table */ int idx = 1; for (const auto &member_tags : members_tags) { lua_pushnumber(L, idx++); lua_newtable(L); /* member key value table */ for (const auto &member_tag : member_tags) { lua_pushstring(L, member_tag.key.c_str()); lua_pushstring(L, member_tag.value.c_str()); lua_rawset(L, -3); } lua_rawset(L, -3); } lua_newtable(L); /* member roles table */ for (size_t i = 0; i < member_roles.size(); i++) { lua_pushnumber(L, i + 1); lua_pushstring(L, member_roles[i]); lua_rawset(L, -3); } lua_pushnumber(L, member_roles.size()); if (lua_pcall(L, 4, 6, 0)) { fprintf( stderr, "Failed to execute lua function for relation tag processing: %s\n", lua_tostring(L, -1)); /* lua function failed */ return 1; } *roads = (int)lua_tointeger(L, -1); lua_pop(L, 1); *make_polygon = (int)lua_tointeger(L, -1); lua_pop(L, 1); *make_boundary = (int)lua_tointeger(L, -1); lua_pop(L, 1); lua_pushnil(L); for (size_t i = 0; i < members_tags.size(); i++) { if (lua_next(L, -2)) { member_superseded[i] = (int)lua_tointeger(L, -1); lua_pop(L, 1); } else { fprintf(stderr, "Failed to read member_superseded from lua function\n"); } } lua_pop(L, 2); lua_pushnil(L); while (lua_next(L, -2) != 0) { const char *key = lua_tostring(L, -2); const char *value = lua_tostring(L, -1); out_tags.push_back(tag_t(key, value)); lua_pop(L, 1); } lua_pop(L, 1); unsigned filter = (unsigned)lua_tointeger(L, -1); lua_pop(L, 1); return filter; }