Skip to content

Commit ee134ca

Browse files
authored
Merge pull request #2207 from joto/lua-properties
Make properties available in Lua in osm2pgsql.properties
2 parents 211c7f5 + 728a92d commit ee134ca

File tree

8 files changed

+59
-14
lines changed

8 files changed

+59
-14
lines changed

src/osm2pgsql.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ void show_memory_usage()
4444
}
4545
}
4646

47-
file_info run(options_t const &options)
47+
file_info run(options_t const &options, properties_t const &properties)
4848
{
4949
auto const files = prepare_input_files(
5050
options.input_files, options.input_format, options.append);
@@ -57,7 +57,7 @@ file_info run(options_t const &options)
5757
middle->start();
5858

5959
auto output = output_t::create_output(middle->get_query_instance(),
60-
thread_pool, options);
60+
thread_pool, options, properties);
6161

6262
middle->set_requirements(output->get_requirements());
6363

@@ -357,7 +357,7 @@ int main(int argc, char *argv[])
357357

358358
check_and_update_properties(&properties, &options);
359359

360-
auto const finfo = run(options);
360+
auto const finfo = run(options, properties);
361361

362362
if (finfo.last_timestamp.valid()) {
363363
auto const current_timestamp =
@@ -373,7 +373,7 @@ int main(int argc, char *argv[])
373373
} else {
374374
set_option_defaults(&options);
375375
store_properties(&properties, options);
376-
auto const finfo = run(options);
376+
auto const finfo = run(options, properties);
377377
store_data_properties(&properties, finfo);
378378
}
379379

src/output-flex.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "output-flex.hpp"
3131
#include "pgsql.hpp"
3232
#include "pgsql-capabilities.hpp"
33+
#include "properties.hpp"
3334
#include "reprojection.hpp"
3435
#include "thread-pool.hpp"
3536
#include "util.hpp"
@@ -1159,12 +1160,13 @@ output_flex_t::clone(std::shared_ptr<middle_query_t> const &mid,
11591160

11601161
output_flex_t::output_flex_t(std::shared_ptr<middle_query_t> const &mid,
11611162
std::shared_ptr<thread_pool_t> thread_pool,
1162-
options_t const &options)
1163+
options_t const &options,
1164+
properties_t const &properties)
11631165
: output_t(mid, std::move(thread_pool), options),
11641166
m_db_connection(get_options()->connection_params, "out.flex.main"),
11651167
m_copy_thread(std::make_shared<db_copy_thread_t>(options.connection_params))
11661168
{
1167-
init_lua(options.style);
1169+
init_lua(options.style, properties);
11681170

11691171
// If the osm2pgsql.select_relation_members() Lua function is defined
11701172
// it means we need two-stage processing which in turn means we need
@@ -1276,7 +1278,8 @@ void init_expire_output_class(lua_State *lua_state)
12761278

12771279
} // anonymous namespace
12781280

1279-
void output_flex_t::init_lua(std::string const &filename)
1281+
void output_flex_t::init_lua(std::string const &filename,
1282+
properties_t const &properties)
12801283
{
12811284
m_lua_state.reset(luaL_newstate(),
12821285
[](lua_State *state) { lua_close(state); });
@@ -1285,6 +1288,14 @@ void output_flex_t::init_lua(std::string const &filename)
12851288

12861289
luaX_add_table_int(lua_state(), "stage", 1);
12871290

1291+
lua_pushstring(lua_state(), "properties");
1292+
lua_createtable(lua_state(), 0, (int)properties.size());
1293+
for (auto const &property : properties) {
1294+
luaX_add_table_str(lua_state(), property.first.c_str(),
1295+
property.second.c_str());
1296+
}
1297+
lua_rawset(lua_state(), -3);
1298+
12881299
luaX_add_table_func(lua_state(), "define_table",
12891300
lua_trampoline_app_define_table);
12901301

src/output-flex.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class output_flex_t : public output_t
9898
/// Constructor for new objects
9999
output_flex_t(std::shared_ptr<middle_query_t> const &mid,
100100
std::shared_ptr<thread_pool_t> thread_pool,
101-
options_t const &options);
101+
options_t const &options, properties_t const &properties);
102102

103103
/// Constructor for cloned objects
104104
output_flex_t(output_flex_t const *other,
@@ -192,7 +192,7 @@ class output_flex_t : public output_t
192192
void get_mutex_and_call_lua_function(prepared_lua_function_t func,
193193
osmium::OSMObject const &object);
194194

195-
void init_lua(std::string const &filename);
195+
void init_lua(std::string const &filename, properties_t const &properties);
196196

197197
// Get the flex table that is as first parameter on the Lua stack.
198198
flex_table_t const &get_table_from_param();

src/output.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
std::shared_ptr<output_t>
2424
output_t::create_output(std::shared_ptr<middle_query_t> const &mid,
2525
std::shared_ptr<thread_pool_t> thread_pool,
26-
options_t const &options)
26+
options_t const &options,
27+
properties_t const &properties)
2728
{
2829
if (options.output_backend == "pgsql") {
2930
return std::make_shared<output_pgsql_t>(mid, std::move(thread_pool),
@@ -32,7 +33,7 @@ output_t::create_output(std::shared_ptr<middle_query_t> const &mid,
3233

3334
if (options.output_backend == "flex") {
3435
return std::make_shared<output_flex_t>(mid, std::move(thread_pool),
35-
options);
36+
options, properties);
3637
}
3738

3839
if (options.output_backend == "null") {

src/output.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "output-requirements.hpp"
2323

2424
class db_copy_thread_t;
25+
class properties_t;
2526
class thread_pool_t;
2627

2728
struct middle_query_t;
@@ -34,7 +35,7 @@ class output_t
3435
static std::shared_ptr<output_t>
3536
create_output(std::shared_ptr<middle_query_t> const &mid,
3637
std::shared_ptr<thread_pool_t> thread_pool,
37-
options_t const &options);
38+
options_t const &options, properties_t const &properties);
3839

3940
output_t(output_t const &) = default;
4041
output_t &operator=(output_t const &) = default;

src/properties.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class properties_t
3939
*/
4040
properties_t(connection_params_t connection_params, std::string schema);
4141

42+
std::size_t size() const noexcept { return m_properties.size(); }
43+
4244
std::string get_string(std::string const &property,
4345
std::string const &default_value) const;
4446

@@ -93,6 +95,10 @@ class properties_t
9395
*/
9496
bool load();
9597

98+
auto begin() const { return m_properties.begin(); }
99+
100+
auto end() const { return m_properties.end(); }
101+
96102
private:
97103
std::string table_name() const;
98104

tests/bdd/flex/lua-basics.feature

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,22 @@ Feature: Flex output uses a Lua config file
2626
"""
2727
Table=table
2828
"""
29+
30+
Scenario: Check access to osm2pgsql properties from Lua
31+
Given the input file 'liechtenstein-2013-08-03.osm.pbf'
32+
And the lua style
33+
"""
34+
local p = osm2pgsql.properties
35+
print("attributes=" .. p.attributes)
36+
print("prefix=" .. p.prefix)
37+
"""
38+
Then running osm2pgsql flex fails
39+
And the standard output contains
40+
"""
41+
attributes=false
42+
"""
43+
And the standard output contains
44+
"""
45+
prefix=planet_osm
46+
"""
47+

tests/common-import.hpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "middle-ram.hpp"
2323
#include "osmdata.hpp"
2424
#include "output.hpp"
25+
#include "properties.hpp"
2526
#include "taginfo-impl.hpp"
2627

2728
#include "common-pg.hpp"
@@ -132,12 +133,15 @@ class import_t
132133
{
133134
options.connection_params = m_db.connection_params();
134135

136+
properties_t const properties{options.connection_params,
137+
options.middle_dbschema};
138+
135139
auto thread_pool = std::make_shared<thread_pool_t>(1U);
136140
auto middle = create_middle(thread_pool, options);
137141
middle->start();
138142

139143
auto output = output_t::create_output(middle->get_query_instance(),
140-
thread_pool, options);
144+
thread_pool, options, properties);
141145

142146
middle->set_requirements(output->get_requirements());
143147

@@ -163,12 +167,15 @@ class import_t
163167
{
164168
options.connection_params = m_db.connection_params();
165169

170+
properties_t const properties{options.connection_params,
171+
options.middle_dbschema};
172+
166173
auto thread_pool = std::make_shared<thread_pool_t>(1U);
167174
auto middle = std::make_shared<middle_ram_t>(thread_pool, &options);
168175
middle->start();
169176

170177
auto output = output_t::create_output(middle->get_query_instance(),
171-
thread_pool, options);
178+
thread_pool, options, properties);
172179

173180
middle->set_requirements(output->get_requirements());
174181

0 commit comments

Comments
 (0)