Skip to content

Commit 41a0eab

Browse files
authored
Merge pull request #889 from lonvia/flush-between-type-changes
middle-pgsql: Flush between type changes
2 parents c9030bb + 16ba340 commit 41a0eab

File tree

9 files changed

+121
-75
lines changed

9 files changed

+121
-75
lines changed

middle-pgsql.cpp

Lines changed: 77 additions & 70 deletions
Large diffs are not rendered by default.

middle-pgsql.hpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include "node-persistent-cache.hpp"
1515
#include "id-tracker.hpp"
1616
#include <memory>
17-
#include <vector>
1817

1918
struct middle_pgsql_t : public slim_middle_t {
2019
middle_pgsql_t();
@@ -43,6 +42,8 @@ struct middle_pgsql_t : public slim_middle_t {
4342
void relations_delete(osmid_t id) override;
4443
void relation_changed(osmid_t id) override;
4544

45+
void flush() override;
46+
4647
void iterate_ways(middle_t::pending_processor& pf) override;
4748
void iterate_relations(pending_processor& pf) override;
4849

@@ -82,6 +83,14 @@ struct middle_pgsql_t : public slim_middle_t {
8283
get_query_instance(std::shared_ptr<middle_t> const &mid) const override;
8384

8485
private:
86+
enum middle_tables
87+
{
88+
NODE_TABLE = 0,
89+
WAY_TABLE,
90+
REL_TABLE,
91+
NUM_TABLES
92+
};
93+
8594
void pgsql_stop_one(table_desc *table);
8695

8796
/**
@@ -92,9 +101,7 @@ struct middle_pgsql_t : public slim_middle_t {
92101
size_t local_nodes_get_list(osmium::WayNodeList *nodes) const;
93102
void local_nodes_delete(osmid_t osm_id);
94103

95-
std::vector<table_desc> tables;
96-
int num_tables;
97-
table_desc *node_table, *way_table, *rel_table;
104+
table_desc tables[NUM_TABLES];
98105

99106
bool append;
100107
bool mark_pending;

middle-ram.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ struct middle_ram_t : public middle_t {
107107
int relations_delete(osmid_t id);
108108
int relation_changed(osmid_t id);
109109

110+
void flush() override {}
111+
110112
idlist_t relations_using_way(osmid_t way_id) const override;
111113

112114
void iterate_ways(middle_t::pending_processor& pf) override;

middle.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ struct middle_t : public middle_query_t {
9292
virtual void ways_set(osmium::Way const &way) = 0;
9393
virtual void relations_set(osmium::Relation const &rel) = 0;
9494

95+
/// Write all pending data to permanent storage.
96+
virtual void flush() = 0;
97+
9598
struct pending_processor {
9699
virtual ~pending_processor() {}
97100
virtual void enqueue_ways(osmid_t id) = 0;

osmdata.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,11 @@ void osmdata_t::start() {
180180
mid->start(outs[0]->get_options());
181181
}
182182

183+
void osmdata_t::type_changed()
184+
{
185+
mid->flush();
186+
}
187+
183188
namespace {
184189

185190
//TODO: have the main thread using the main middle to query the middle for batches of ways (configurable number)

osmdata.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ class output_t;
1414
struct middle_t;
1515
class reprojection;
1616

17-
class osmdata_t {
17+
class osmdata_t
18+
{
1819
public:
1920
osmdata_t(std::shared_ptr<middle_t> mid_,
2021
std::shared_ptr<output_t> const &out_,
@@ -25,6 +26,7 @@ class osmdata_t {
2526
~osmdata_t();
2627

2728
void start();
29+
void type_changed();
2830
void stop();
2931

3032
int node_add(osmium::Node const &node);

parse-osmium.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,19 @@ void parse_osmium_t::stream_file(const std::string &filename, const std::string
124124

125125
fprintf(stderr, "Using %s parser.\n", osmium::io::as_string(infile.format()));
126126

127+
m_type = osmium::item_type::node;
127128
osmium::io::Reader reader(infile);
128129
osmium::apply(reader, *this);
129130
reader.close();
130131
}
131132

132133
void parse_osmium_t::node(osmium::Node const &node)
133134
{
135+
if (m_type != osmium::item_type::node) {
136+
m_type = osmium::item_type::node;
137+
m_data->type_changed();
138+
}
139+
134140
if (node.deleted()) {
135141
m_data->node_delete(node.id());
136142
} else {
@@ -159,6 +165,11 @@ void parse_osmium_t::node(osmium::Node const &node)
159165

160166
void parse_osmium_t::way(osmium::Way& way)
161167
{
168+
if (m_type != osmium::item_type::way) {
169+
m_type = osmium::item_type::way;
170+
m_data->type_changed();
171+
}
172+
162173
if (way.deleted()) {
163174
m_data->way_delete(way.id());
164175
} else {
@@ -173,6 +184,11 @@ void parse_osmium_t::way(osmium::Way& way)
173184

174185
void parse_osmium_t::relation(osmium::Relation const &rel)
175186
{
187+
if (m_type != osmium::item_type::relation) {
188+
m_type = osmium::item_type::relation;
189+
m_data->type_changed();
190+
}
191+
176192
if (rel.deleted()) {
177193
m_data->relation_delete(rel.id());
178194
} else {

parse-osmium.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ class parse_osmium_t: public osmium::handler::Handler
129129
bool m_append;
130130
boost::optional<osmium::Box> m_bbox;
131131
parse_stats_t m_stats;
132+
// Current type being parsed.
133+
osmium::item_type m_type;
132134
};
133135

134136
#endif

tests/mockups.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ struct dummy_middle_t : public middle_t {
99

1010
void start(const options_t *) override { }
1111
void stop(osmium::thread::Pool &) override {}
12+
void flush() override {}
1213
void cleanup(void) { }
1314
void analyze(void) override { }
1415
void commit(void) override { }
@@ -46,6 +47,7 @@ struct dummy_slim_middle_t : public slim_middle_t {
4647

4748
void start(const options_t *) override { }
4849
void stop(osmium::thread::Pool &) override {}
50+
void flush() override {}
4951
void cleanup(void) { }
5052
void analyze(void) override { }
5153
void commit(void) override { }

0 commit comments

Comments
 (0)