1919#include < osmium/memory/buffer.hpp>
2020#include < osmium/osm/types_from_string.hpp>
2121
22- #include < libpq-fe.h>
23-
2422#include " format.hpp"
2523#include " middle-pgsql.hpp"
2624#include " node-persistent-cache.hpp"
@@ -308,25 +306,40 @@ void middle_pgsql_t::node_delete(osmid_t osm_id)
308306 }
309307}
310308
311- void middle_pgsql_t::node_changed ( osmid_t osm_id)
309+ idlist_t middle_pgsql_t::get_ids ( const char * stmt, osmid_t osm_id)
312310{
313- assert (m_append);
314- if (!m_mark_pending) {
315- return ;
316- }
311+ idlist_t ids;
317312
318- // Find all ways referencing this node and mark them as pending.
319- auto const res_ways =
320- m_db_connection.exec_prepared (" mark_ways_by_node" , osm_id);
321- for_each_id (res_ways, [this ](osmid_t id) {
322- way_changed (id);
323- m_ways_pending_tracker->mark (id);
324- });
313+ auto const res = m_db_connection.exec_prepared (stmt, osm_id);
314+ ids.reserve (res.num_tuples ());
315+ for_each_id (res, [&ids](osmid_t id) { ids.push_back (id); });
316+
317+ return ids;
318+ }
319+
320+ idlist_t middle_pgsql_t::get_ways_by_node (osmid_t osm_id)
321+ {
322+ return get_ids (" mark_ways_by_node" , osm_id);
323+ }
324+
325+ idlist_t middle_pgsql_t::get_rels_by_node (osmid_t osm_id)
326+ {
327+ return get_ids (" mark_rels_by_node" , osm_id);
328+ }
329+
330+ idlist_t middle_pgsql_t::get_rels_by_way (osmid_t osm_id)
331+ {
332+ return get_ids (" mark_rels_by_way" , osm_id);
333+ }
334+
335+ idlist_t middle_pgsql_t::get_rels_by_rel (osmid_t osm_id)
336+ {
337+ return get_ids (" mark_rels" , osm_id);
338+ }
325339
326- // Find all relations referencing this node and mark them as pending.
327- auto const res_rels = m_db_connection.exec_prepared (" mark_rels_by_node" , osm_id);
328- for_each_id (res_rels,
329- [this ](osmid_t id) { m_rels_pending_tracker->mark (id); });
340+ idlist_t middle_pgsql_t::get_ways_by_rel (osmid_t osm_id)
341+ {
342+ return get_ids (" mark_ways_by_rel" , osm_id);
330343}
331344
332345void middle_pgsql_t::way_set (osmium::Way const &way)
@@ -431,31 +444,6 @@ void middle_pgsql_t::way_delete(osmid_t osm_id)
431444 m_db_copy.delete_object (osm_id);
432445}
433446
434- void middle_pgsql_t::iterate_ways (pending_processor &pf)
435- {
436- // enqueue the jobs
437- osmid_t id;
438- while (id_tracker::is_valid (id = m_ways_pending_tracker->pop_mark ())) {
439- pf.enqueue_ways (id);
440- }
441-
442- // let the threads work on them
443- pf.process_ways ();
444- }
445-
446- void middle_pgsql_t::way_changed (osmid_t osm_id)
447- {
448- assert (m_append);
449-
450- if (m_ways_pending_tracker->is_marked (osm_id)) {
451- return ;
452- }
453-
454- // Keep track of all relations having this way as member.
455- auto const res = m_db_connection.exec_prepared (" mark_rels_by_way" , osm_id);
456- for_each_id (res, [this ](osmid_t id) { m_rels_pending_tracker->mark (id); });
457- }
458-
459447void middle_pgsql_t::relation_set (osmium::Relation const &rel)
460448{
461449 // Sort relation members by their type.
@@ -526,34 +514,10 @@ void middle_pgsql_t::relation_delete(osmid_t osm_id)
526514{
527515 assert (m_append);
528516
529- // Keep track of all member ways.
530- auto const res = m_db_connection.exec_prepared (" mark_ways_by_rel" , osm_id);
531- for_each_id (res, [this ](osmid_t id) { m_ways_pending_tracker->mark (id); });
532-
533517 m_db_copy.new_line (m_tables[REL_TABLE].m_copy_target );
534518 m_db_copy.delete_object (osm_id);
535519}
536520
537- void middle_pgsql_t::iterate_relations (pending_processor &pf)
538- {
539- // enqueue the jobs
540- osmid_t id;
541- while (id_tracker::is_valid (id = m_rels_pending_tracker->pop_mark ())) {
542- pf.enqueue_relations (id);
543- }
544-
545- // let the threads work on them
546- pf.process_relations ();
547- }
548-
549- void middle_pgsql_t::relation_changed (osmid_t osm_id)
550- {
551- assert (m_append);
552-
553- auto const res = m_db_connection.exec_prepared (" mark_rels" , osm_id);
554- for_each_id (res, [this ](osmid_t id) { m_rels_pending_tracker->mark (id); });
555- }
556-
557521idlist_t middle_query_pgsql_t::relations_using_way (osmid_t way_id) const
558522{
559523 auto const result = m_sql_conn.exec_prepared (" rels_using_way" , way_id);
@@ -579,9 +543,6 @@ middle_query_pgsql_t::middle_query_pgsql_t(
579543
580544void middle_pgsql_t::start ()
581545{
582- m_ways_pending_tracker.reset (new id_tracker{});
583- m_rels_pending_tracker.reset (new id_tracker{});
584-
585546 // Gazetter doesn't use mark-pending processing and consequently
586547 // needs no way-node index.
587548 // TODO Currently, set here to keep the impact on the code small.
@@ -782,8 +743,3 @@ middle_pgsql_t::get_query_instance()
782743
783744 return std::shared_ptr<middle_query_t >(mid.release ());
784745}
785-
786- bool middle_pgsql_t::has_pending () const
787- {
788- return !m_ways_pending_tracker->empty () || !m_rels_pending_tracker->empty ();
789- }
0 commit comments