mirror of
https://github.com/osm2pgsql-dev/osm2pgsql.git
synced 2025-07-22 12:00:31 +00:00
add callbacks for deletion to flex
This commit is contained in:
@ -54,7 +54,7 @@ void osmdata_t::node(osmium::Node const &node)
|
||||
m_mid->node(node);
|
||||
|
||||
if (node.deleted()) {
|
||||
m_output->node_delete(node.id());
|
||||
m_output->node_delete(node);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -94,7 +94,7 @@ void osmdata_t::way(osmium::Way &way)
|
||||
m_mid->way(way);
|
||||
|
||||
if (way.deleted()) {
|
||||
m_output->way_delete(way.id());
|
||||
m_output->way_delete(&way);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -161,7 +161,7 @@ void osmdata_t::relation(osmium::Relation const &rel)
|
||||
m_mid->relation(rel);
|
||||
|
||||
if (rel.deleted()) {
|
||||
m_output->relation_delete(rel.id());
|
||||
m_output->relation_delete(rel);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1084,6 +1084,37 @@ void output_flex_t::delete_from_tables(osmium::item_type type, osmid_t osm_id)
|
||||
}
|
||||
}
|
||||
|
||||
void output_flex_t::node_delete(osmium::Node const &node)
|
||||
{
|
||||
if (m_delete_node) {
|
||||
m_context_node = &node;
|
||||
get_mutex_and_call_lua_function(m_delete_node, node);
|
||||
m_context_node = nullptr;
|
||||
}
|
||||
|
||||
node_delete(node.id());
|
||||
}
|
||||
|
||||
void output_flex_t::way_delete(osmium::Way *way)
|
||||
{
|
||||
if (m_delete_way) {
|
||||
m_way_cache.init(way);
|
||||
get_mutex_and_call_lua_function(m_delete_way, m_way_cache.get());
|
||||
}
|
||||
|
||||
way_delete(way->id());
|
||||
}
|
||||
|
||||
void output_flex_t::relation_delete(osmium::Relation const &rel)
|
||||
{
|
||||
if (m_delete_relation) {
|
||||
m_relation_cache.init(rel);
|
||||
get_mutex_and_call_lua_function(m_delete_relation, rel);
|
||||
}
|
||||
|
||||
relation_delete(rel.id());
|
||||
}
|
||||
|
||||
/* Delete is easy, just remove all traces of this object. We don't need to
|
||||
* worry about finding objects that depend on it, since the same diff must
|
||||
* contain the change for that also. */
|
||||
@ -1146,6 +1177,8 @@ output_flex_t::output_flex_t(output_flex_t const *other,
|
||||
m_process_untagged_node(other->m_process_untagged_node),
|
||||
m_process_untagged_way(other->m_process_untagged_way),
|
||||
m_process_untagged_relation(other->m_process_untagged_relation),
|
||||
m_delete_node(other->m_delete_node), m_delete_way(other->m_delete_way),
|
||||
m_delete_relation(other->m_delete_relation),
|
||||
m_select_relation_members(other->m_select_relation_members),
|
||||
m_after_nodes(other->m_after_nodes), m_after_ways(other->m_after_ways),
|
||||
m_after_relations(other->m_after_relations)
|
||||
@ -1330,6 +1363,13 @@ void output_flex_t::init_lua(std::string const &filename,
|
||||
prepared_lua_function_t{lua_state(), calling_context::process_relation,
|
||||
"process_untagged_relation"};
|
||||
|
||||
m_delete_node = prepared_lua_function_t{
|
||||
lua_state(), calling_context::process_node, "delete_node"};
|
||||
m_delete_way = prepared_lua_function_t{
|
||||
lua_state(), calling_context::process_way, "delete_way"};
|
||||
m_delete_relation = prepared_lua_function_t{
|
||||
lua_state(), calling_context::process_relation, "delete_relation"};
|
||||
|
||||
m_select_relation_members = prepared_lua_function_t{
|
||||
lua_state(), calling_context::select_relation_members,
|
||||
"select_relation_members", 1};
|
||||
|
@ -147,9 +147,9 @@ public:
|
||||
void way_modify(osmium::Way *way) override;
|
||||
void relation_modify(osmium::Relation const &rel) override;
|
||||
|
||||
void node_delete(osmid_t id) override;
|
||||
void way_delete(osmid_t id) override;
|
||||
void relation_delete(osmid_t id) override;
|
||||
void node_delete(osmium::Node const &node) override;
|
||||
void way_delete(osmium::Way *way) override;
|
||||
void relation_delete(osmium::Relation const &rel) override;
|
||||
|
||||
void merge_expire_trees(output_t *other) override;
|
||||
|
||||
@ -204,6 +204,10 @@ private:
|
||||
osmium::OSMObject const &
|
||||
check_and_get_context_object(flex_table_t const &table);
|
||||
|
||||
void node_delete(osmid_t id);
|
||||
void way_delete(osmid_t id);
|
||||
void relation_delete(osmid_t id);
|
||||
|
||||
void delete_from_table(table_connection_t *table_connection,
|
||||
pg_conn_t const &db_connection,
|
||||
osmium::item_type type, osmid_t osm_id);
|
||||
@ -304,6 +308,10 @@ private:
|
||||
prepared_lua_function_t m_process_untagged_way;
|
||||
prepared_lua_function_t m_process_untagged_relation;
|
||||
|
||||
prepared_lua_function_t m_delete_node;
|
||||
prepared_lua_function_t m_delete_way;
|
||||
prepared_lua_function_t m_delete_relation;
|
||||
|
||||
prepared_lua_function_t m_select_relation_members;
|
||||
|
||||
prepared_lua_function_t m_after_nodes;
|
||||
|
@ -50,9 +50,9 @@ public:
|
||||
void way_modify(osmium::Way * /*way*/) override {}
|
||||
void relation_modify(osmium::Relation const & /*rel*/) override {}
|
||||
|
||||
void node_delete(osmid_t /*id*/) override {}
|
||||
void way_delete(osmid_t /*id*/) override {}
|
||||
void relation_delete(osmid_t /*id*/) override {}
|
||||
void node_delete(osmium::Node const & /*node*/) override {}
|
||||
void way_delete(osmium::Way * /*way*/) override {}
|
||||
void relation_delete(osmium::Relation const & /*rel*/) override {}
|
||||
};
|
||||
|
||||
#endif // OSM2PGSQL_OUTPUT_NULL_HPP
|
||||
|
@ -349,15 +349,15 @@ void output_pgsql_t::relation_add(osmium::Relation const &rel)
|
||||
/* Delete is easy, just remove all traces of this object. We don't need to
|
||||
* worry about finding objects that depend on it, since the same diff must
|
||||
* contain the change for that also. */
|
||||
void output_pgsql_t::node_delete(osmid_t osm_id)
|
||||
void output_pgsql_t::node_delete(osmium::Node const &node)
|
||||
{
|
||||
if (m_expire.enabled()) {
|
||||
auto const results = m_tables[t_point]->get_wkb(osm_id);
|
||||
auto const results = m_tables[t_point]->get_wkb(node.id());
|
||||
if (expire_from_result(&m_expire, results, m_expire_config) != 0) {
|
||||
m_tables[t_point]->delete_row(osm_id);
|
||||
m_tables[t_point]->delete_row(node.id());
|
||||
}
|
||||
} else {
|
||||
m_tables[t_point]->delete_row(osm_id);
|
||||
m_tables[t_point]->delete_row(node.id());
|
||||
}
|
||||
}
|
||||
|
||||
@ -392,9 +392,9 @@ void output_pgsql_t::pgsql_delete_way_from_output(osmid_t osm_id)
|
||||
delete_from_output_and_expire(osm_id);
|
||||
}
|
||||
|
||||
void output_pgsql_t::way_delete(osmid_t osm_id)
|
||||
void output_pgsql_t::way_delete(osmium::Way *way)
|
||||
{
|
||||
pgsql_delete_way_from_output(osm_id);
|
||||
pgsql_delete_way_from_output(way->id());
|
||||
}
|
||||
|
||||
/* Relations are identified by using negative IDs */
|
||||
@ -403,9 +403,9 @@ void output_pgsql_t::pgsql_delete_relation_from_output(osmid_t osm_id)
|
||||
delete_from_output_and_expire(-osm_id);
|
||||
}
|
||||
|
||||
void output_pgsql_t::relation_delete(osmid_t osm_id)
|
||||
void output_pgsql_t::relation_delete(osmium::Relation const &rel)
|
||||
{
|
||||
pgsql_delete_relation_from_output(osm_id);
|
||||
pgsql_delete_relation_from_output(rel.id());
|
||||
}
|
||||
|
||||
/* Modify is slightly trickier. The basic idea is we simply delete the
|
||||
@ -413,19 +413,19 @@ void output_pgsql_t::relation_delete(osmid_t osm_id)
|
||||
* objects that depend on this one */
|
||||
void output_pgsql_t::node_modify(osmium::Node const &node)
|
||||
{
|
||||
node_delete(node.id());
|
||||
node_delete(node);
|
||||
node_add(node);
|
||||
}
|
||||
|
||||
void output_pgsql_t::way_modify(osmium::Way *way)
|
||||
{
|
||||
way_delete(way->id());
|
||||
way_delete(way);
|
||||
way_add(way);
|
||||
}
|
||||
|
||||
void output_pgsql_t::relation_modify(osmium::Relation const &rel)
|
||||
{
|
||||
relation_delete(rel.id());
|
||||
relation_delete(rel);
|
||||
relation_add(rel);
|
||||
}
|
||||
|
||||
@ -448,7 +448,9 @@ std::shared_ptr<output_t> output_pgsql_t::clone(
|
||||
output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
|
||||
std::shared_ptr<thread_pool_t> thread_pool,
|
||||
options_t const &options)
|
||||
: output_t(mid, std::move(thread_pool), options), m_proj(options.projection),
|
||||
: output_t(mid, std::move(thread_pool), options),
|
||||
m_ignore_untagged_objects(!options.extra_attributes),
|
||||
m_proj(options.projection),
|
||||
m_expire(options.expire_tiles_zoom, options.projection),
|
||||
m_buffer(32768, osmium::memory::Buffer::auto_grow::yes),
|
||||
m_rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes),
|
||||
@ -470,8 +472,6 @@ output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
|
||||
|
||||
m_enable_way_area = read_style_file(options.style, &exlist);
|
||||
|
||||
m_ignore_untagged_objects = !options.extra_attributes;
|
||||
|
||||
m_tagtransform = tagtransform_t::make_tagtransform(&options, exlist);
|
||||
|
||||
auto copy_thread =
|
||||
|
@ -76,9 +76,9 @@ public:
|
||||
void way_modify(osmium::Way *way) override;
|
||||
void relation_modify(osmium::Relation const &rel) override;
|
||||
|
||||
void node_delete(osmid_t id) override;
|
||||
void way_delete(osmid_t id) override;
|
||||
void relation_delete(osmid_t id) override;
|
||||
void node_delete(osmium::Node const &node) override;
|
||||
void way_delete(osmium::Way *way) override;
|
||||
void relation_delete(osmium::Relation const &rel) override;
|
||||
|
||||
void merge_expire_trees(output_t *other) override;
|
||||
|
||||
|
@ -98,9 +98,9 @@ public:
|
||||
virtual void way_modify(osmium::Way *way) = 0;
|
||||
virtual void relation_modify(osmium::Relation const &rel) = 0;
|
||||
|
||||
virtual void node_delete(osmid_t id) = 0;
|
||||
virtual void way_delete(osmid_t id) = 0;
|
||||
virtual void relation_delete(osmid_t id) = 0;
|
||||
virtual void node_delete(osmium::Node const &node) = 0;
|
||||
virtual void way_delete(osmium::Way *way) = 0;
|
||||
virtual void relation_delete(osmium::Relation const &rel) = 0;
|
||||
|
||||
virtual void merge_expire_trees(output_t * /*other*/) {}
|
||||
|
||||
|
@ -130,11 +130,11 @@ struct counting_output_t : public output_null_t
|
||||
++relation.modified;
|
||||
}
|
||||
|
||||
void node_delete(osmid_t) override { ++node.deleted; }
|
||||
void node_delete(osmium::Node const &) override { ++node.deleted; }
|
||||
|
||||
void way_delete(osmid_t) override { ++way.deleted; }
|
||||
void way_delete(osmium::Way *) override { ++way.deleted; }
|
||||
|
||||
void relation_delete(osmid_t) override { ++relation.deleted; }
|
||||
void relation_delete(osmium::Relation const &) override { ++relation.deleted; }
|
||||
|
||||
type_stats_t node, way, relation;
|
||||
uint64_t sum_ids = 0;
|
||||
|
Reference in New Issue
Block a user