Skip to content

Commit 64c2ca9

Browse files
committed
add callbacks for deletion to flex
1 parent 1ee13a9 commit 64c2ca9

File tree

8 files changed

+80
-32
lines changed

8 files changed

+80
-32
lines changed

src/osmdata.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void osmdata_t::node(osmium::Node const &node)
5454
m_mid->node(node);
5555

5656
if (node.deleted()) {
57-
m_output->node_delete(node.id());
57+
m_output->node_delete(node);
5858
return;
5959
}
6060

@@ -94,7 +94,7 @@ void osmdata_t::way(osmium::Way &way)
9494
m_mid->way(way);
9595

9696
if (way.deleted()) {
97-
m_output->way_delete(way.id());
97+
m_output->way_delete(&way);
9898
return;
9999
}
100100

@@ -161,7 +161,7 @@ void osmdata_t::relation(osmium::Relation const &rel)
161161
m_mid->relation(rel);
162162

163163
if (rel.deleted()) {
164-
m_output->relation_delete(rel.id());
164+
m_output->relation_delete(rel);
165165
return;
166166
}
167167

src/output-flex.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,37 @@ void output_flex_t::delete_from_tables(osmium::item_type type, osmid_t osm_id)
10841084
}
10851085
}
10861086

1087+
void output_flex_t::node_delete(osmium::Node const &node)
1088+
{
1089+
if (m_delete_node) {
1090+
m_context_node = &node;
1091+
get_mutex_and_call_lua_function(m_delete_node, node);
1092+
m_context_node = nullptr;
1093+
}
1094+
1095+
node_delete(node.id());
1096+
}
1097+
1098+
void output_flex_t::way_delete(osmium::Way *way)
1099+
{
1100+
if (m_delete_way) {
1101+
m_way_cache.init(way);
1102+
get_mutex_and_call_lua_function(m_delete_way, m_way_cache.get());
1103+
}
1104+
1105+
way_delete(way->id());
1106+
}
1107+
1108+
void output_flex_t::relation_delete(osmium::Relation const &rel)
1109+
{
1110+
if (m_delete_relation) {
1111+
m_relation_cache.init(rel);
1112+
get_mutex_and_call_lua_function(m_delete_relation, rel);
1113+
}
1114+
1115+
relation_delete(rel.id());
1116+
}
1117+
10871118
/* Delete is easy, just remove all traces of this object. We don't need to
10881119
* worry about finding objects that depend on it, since the same diff must
10891120
* contain the change for that also. */
@@ -1146,6 +1177,8 @@ output_flex_t::output_flex_t(output_flex_t const *other,
11461177
m_process_untagged_node(other->m_process_untagged_node),
11471178
m_process_untagged_way(other->m_process_untagged_way),
11481179
m_process_untagged_relation(other->m_process_untagged_relation),
1180+
m_delete_node(other->m_delete_node), m_delete_way(other->m_delete_way),
1181+
m_delete_relation(other->m_delete_relation),
11491182
m_select_relation_members(other->m_select_relation_members),
11501183
m_after_nodes(other->m_after_nodes), m_after_ways(other->m_after_ways),
11511184
m_after_relations(other->m_after_relations)
@@ -1330,6 +1363,13 @@ void output_flex_t::init_lua(std::string const &filename,
13301363
prepared_lua_function_t{lua_state(), calling_context::process_relation,
13311364
"process_untagged_relation"};
13321365

1366+
m_delete_node = prepared_lua_function_t{
1367+
lua_state(), calling_context::process_node, "delete_node"};
1368+
m_delete_way = prepared_lua_function_t{
1369+
lua_state(), calling_context::process_way, "delete_way"};
1370+
m_delete_relation = prepared_lua_function_t{
1371+
lua_state(), calling_context::process_relation, "delete_relation"};
1372+
13331373
m_select_relation_members = prepared_lua_function_t{
13341374
lua_state(), calling_context::select_relation_members,
13351375
"select_relation_members", 1};

src/output-flex.hpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,9 @@ class output_flex_t : public output_t
147147
void way_modify(osmium::Way *way) override;
148148
void relation_modify(osmium::Relation const &rel) override;
149149

150-
void node_delete(osmid_t id) override;
151-
void way_delete(osmid_t id) override;
152-
void relation_delete(osmid_t id) override;
150+
void node_delete(osmium::Node const &node) override;
151+
void way_delete(osmium::Way *way) override;
152+
void relation_delete(osmium::Relation const &rel) override;
153153

154154
void merge_expire_trees(output_t *other) override;
155155

@@ -204,6 +204,10 @@ class output_flex_t : public output_t
204204
osmium::OSMObject const &
205205
check_and_get_context_object(flex_table_t const &table);
206206

207+
void node_delete(osmid_t id);
208+
void way_delete(osmid_t id);
209+
void relation_delete(osmid_t id);
210+
207211
void delete_from_table(table_connection_t *table_connection,
208212
pg_conn_t const &db_connection,
209213
osmium::item_type type, osmid_t osm_id);
@@ -304,6 +308,10 @@ class output_flex_t : public output_t
304308
prepared_lua_function_t m_process_untagged_way;
305309
prepared_lua_function_t m_process_untagged_relation;
306310

311+
prepared_lua_function_t m_delete_node;
312+
prepared_lua_function_t m_delete_way;
313+
prepared_lua_function_t m_delete_relation;
314+
307315
prepared_lua_function_t m_select_relation_members;
308316

309317
prepared_lua_function_t m_after_nodes;

src/output-null.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ class output_null_t : public output_t
5050
void way_modify(osmium::Way * /*way*/) override {}
5151
void relation_modify(osmium::Relation const & /*rel*/) override {}
5252

53-
void node_delete(osmid_t /*id*/) override {}
54-
void way_delete(osmid_t /*id*/) override {}
55-
void relation_delete(osmid_t /*id*/) override {}
53+
void node_delete(osmium::Node const & /*node*/) override {}
54+
void way_delete(osmium::Way * /*way*/) override {}
55+
void relation_delete(osmium::Relation const & /*rel*/) override {}
5656
};
5757

5858
#endif // OSM2PGSQL_OUTPUT_NULL_HPP

src/output-pgsql.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -349,15 +349,15 @@ void output_pgsql_t::relation_add(osmium::Relation const &rel)
349349
/* Delete is easy, just remove all traces of this object. We don't need to
350350
* worry about finding objects that depend on it, since the same diff must
351351
* contain the change for that also. */
352-
void output_pgsql_t::node_delete(osmid_t osm_id)
352+
void output_pgsql_t::node_delete(osmium::Node const &node)
353353
{
354354
if (m_expire.enabled()) {
355-
auto const results = m_tables[t_point]->get_wkb(osm_id);
355+
auto const results = m_tables[t_point]->get_wkb(node.id());
356356
if (expire_from_result(&m_expire, results, m_expire_config) != 0) {
357-
m_tables[t_point]->delete_row(osm_id);
357+
m_tables[t_point]->delete_row(node.id());
358358
}
359359
} else {
360-
m_tables[t_point]->delete_row(osm_id);
360+
m_tables[t_point]->delete_row(node.id());
361361
}
362362
}
363363

@@ -392,9 +392,9 @@ void output_pgsql_t::pgsql_delete_way_from_output(osmid_t osm_id)
392392
delete_from_output_and_expire(osm_id);
393393
}
394394

395-
void output_pgsql_t::way_delete(osmid_t osm_id)
395+
void output_pgsql_t::way_delete(osmium::Way *way)
396396
{
397-
pgsql_delete_way_from_output(osm_id);
397+
pgsql_delete_way_from_output(way->id());
398398
}
399399

400400
/* Relations are identified by using negative IDs */
@@ -403,29 +403,29 @@ void output_pgsql_t::pgsql_delete_relation_from_output(osmid_t osm_id)
403403
delete_from_output_and_expire(-osm_id);
404404
}
405405

406-
void output_pgsql_t::relation_delete(osmid_t osm_id)
406+
void output_pgsql_t::relation_delete(osmium::Relation const &rel)
407407
{
408-
pgsql_delete_relation_from_output(osm_id);
408+
pgsql_delete_relation_from_output(rel.id());
409409
}
410410

411411
/* Modify is slightly trickier. The basic idea is we simply delete the
412412
* object and create it with the new parameters. Then we need to mark the
413413
* objects that depend on this one */
414414
void output_pgsql_t::node_modify(osmium::Node const &node)
415415
{
416-
node_delete(node.id());
416+
node_delete(node);
417417
node_add(node);
418418
}
419419

420420
void output_pgsql_t::way_modify(osmium::Way *way)
421421
{
422-
way_delete(way->id());
422+
way_delete(way);
423423
way_add(way);
424424
}
425425

426426
void output_pgsql_t::relation_modify(osmium::Relation const &rel)
427427
{
428-
relation_delete(rel.id());
428+
relation_delete(rel);
429429
relation_add(rel);
430430
}
431431

@@ -448,7 +448,9 @@ std::shared_ptr<output_t> output_pgsql_t::clone(
448448
output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
449449
std::shared_ptr<thread_pool_t> thread_pool,
450450
options_t const &options)
451-
: output_t(mid, std::move(thread_pool), options), m_proj(options.projection),
451+
: output_t(mid, std::move(thread_pool), options),
452+
m_ignore_untagged_objects(!options.extra_attributes),
453+
m_proj(options.projection),
452454
m_expire(options.expire_tiles_zoom, options.projection),
453455
m_buffer(32768, osmium::memory::Buffer::auto_grow::yes),
454456
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,
470472

471473
m_enable_way_area = read_style_file(options.style, &exlist);
472474

473-
m_ignore_untagged_objects = !options.extra_attributes;
474-
475475
m_tagtransform = tagtransform_t::make_tagtransform(&options, exlist);
476476

477477
auto copy_thread =

src/output-pgsql.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ class output_pgsql_t : public output_t
7676
void way_modify(osmium::Way *way) override;
7777
void relation_modify(osmium::Relation const &rel) override;
7878

79-
void node_delete(osmid_t id) override;
80-
void way_delete(osmid_t id) override;
81-
void relation_delete(osmid_t id) override;
79+
void node_delete(osmium::Node const &node) override;
80+
void way_delete(osmium::Way *way) override;
81+
void relation_delete(osmium::Relation const &rel) override;
8282

8383
void merge_expire_trees(output_t *other) override;
8484

src/output.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ class output_t
9898
virtual void way_modify(osmium::Way *way) = 0;
9999
virtual void relation_modify(osmium::Relation const &rel) = 0;
100100

101-
virtual void node_delete(osmid_t id) = 0;
102-
virtual void way_delete(osmid_t id) = 0;
103-
virtual void relation_delete(osmid_t id) = 0;
101+
virtual void node_delete(osmium::Node const &node) = 0;
102+
virtual void way_delete(osmium::Way *way) = 0;
103+
virtual void relation_delete(osmium::Relation const &rel) = 0;
104104

105105
virtual void merge_expire_trees(output_t * /*other*/) {}
106106

tests/test-osm-file-parsing.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,11 @@ struct counting_output_t : public output_null_t
130130
++relation.modified;
131131
}
132132

133-
void node_delete(osmid_t) override { ++node.deleted; }
133+
void node_delete(osmium::Node const &) override { ++node.deleted; }
134134

135-
void way_delete(osmid_t) override { ++way.deleted; }
135+
void way_delete(osmium::Way *) override { ++way.deleted; }
136136

137-
void relation_delete(osmid_t) override { ++relation.deleted; }
137+
void relation_delete(osmium::Relation const &) override { ++relation.deleted; }
138138

139139
type_stats_t node, way, relation;
140140
uint64_t sum_ids = 0;

0 commit comments

Comments
 (0)