diff --git a/src/osm2pgsql.cpp b/src/osm2pgsql.cpp index b8d7ff510..26bdc47f7 100644 --- a/src/osm2pgsql.cpp +++ b/src/osm2pgsql.cpp @@ -44,7 +44,7 @@ void show_memory_usage() } } -file_info run(options_t const &options) +file_info run(options_t const &options, properties_t const &properties) { auto const files = prepare_input_files( options.input_files, options.input_format, options.append); @@ -57,7 +57,7 @@ file_info run(options_t const &options) middle->start(); auto output = output_t::create_output(middle->get_query_instance(), - thread_pool, options); + thread_pool, options, properties); middle->set_requirements(output->get_requirements()); @@ -357,7 +357,7 @@ int main(int argc, char *argv[]) check_and_update_properties(&properties, &options); - auto const finfo = run(options); + auto const finfo = run(options, properties); if (finfo.last_timestamp.valid()) { auto const current_timestamp = @@ -373,7 +373,7 @@ int main(int argc, char *argv[]) } else { set_option_defaults(&options); store_properties(&properties, options); - auto const finfo = run(options); + auto const finfo = run(options, properties); store_data_properties(&properties, finfo); } diff --git a/src/output-flex.cpp b/src/output-flex.cpp index 6c7e6f68c..e43e0312a 100644 --- a/src/output-flex.cpp +++ b/src/output-flex.cpp @@ -30,6 +30,7 @@ #include "output-flex.hpp" #include "pgsql.hpp" #include "pgsql-capabilities.hpp" +#include "properties.hpp" #include "reprojection.hpp" #include "thread-pool.hpp" #include "util.hpp" @@ -1159,12 +1160,13 @@ output_flex_t::clone(std::shared_ptr const &mid, output_flex_t::output_flex_t(std::shared_ptr const &mid, std::shared_ptr thread_pool, - options_t const &options) + options_t const &options, + properties_t const &properties) : output_t(mid, std::move(thread_pool), options), m_db_connection(get_options()->connection_params, "out.flex.main"), m_copy_thread(std::make_shared(options.connection_params)) { - init_lua(options.style); + init_lua(options.style, properties); // If the osm2pgsql.select_relation_members() Lua function is defined // 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) } // anonymous namespace -void output_flex_t::init_lua(std::string const &filename) +void output_flex_t::init_lua(std::string const &filename, + properties_t const &properties) { m_lua_state.reset(luaL_newstate(), [](lua_State *state) { lua_close(state); }); @@ -1285,6 +1288,14 @@ void output_flex_t::init_lua(std::string const &filename) luaX_add_table_int(lua_state(), "stage", 1); + lua_pushstring(lua_state(), "properties"); + lua_createtable(lua_state(), 0, (int)properties.size()); + for (auto const &property : properties) { + luaX_add_table_str(lua_state(), property.first.c_str(), + property.second.c_str()); + } + lua_rawset(lua_state(), -3); + luaX_add_table_func(lua_state(), "define_table", lua_trampoline_app_define_table); diff --git a/src/output-flex.hpp b/src/output-flex.hpp index e88c20b6f..cc05b6ebc 100644 --- a/src/output-flex.hpp +++ b/src/output-flex.hpp @@ -98,7 +98,7 @@ class output_flex_t : public output_t /// Constructor for new objects output_flex_t(std::shared_ptr const &mid, std::shared_ptr thread_pool, - options_t const &options); + options_t const &options, properties_t const &properties); /// Constructor for cloned objects output_flex_t(output_flex_t const *other, @@ -192,7 +192,7 @@ class output_flex_t : public output_t void get_mutex_and_call_lua_function(prepared_lua_function_t func, osmium::OSMObject const &object); - void init_lua(std::string const &filename); + void init_lua(std::string const &filename, properties_t const &properties); // Get the flex table that is as first parameter on the Lua stack. flex_table_t const &get_table_from_param(); diff --git a/src/output.cpp b/src/output.cpp index da3490114..005689b40 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -23,7 +23,8 @@ std::shared_ptr output_t::create_output(std::shared_ptr const &mid, std::shared_ptr thread_pool, - options_t const &options) + options_t const &options, + properties_t const &properties) { if (options.output_backend == "pgsql") { return std::make_shared(mid, std::move(thread_pool), @@ -32,7 +33,7 @@ output_t::create_output(std::shared_ptr const &mid, if (options.output_backend == "flex") { return std::make_shared(mid, std::move(thread_pool), - options); + options, properties); } if (options.output_backend == "null") { diff --git a/src/output.hpp b/src/output.hpp index a20e78f9c..ac807e425 100644 --- a/src/output.hpp +++ b/src/output.hpp @@ -22,6 +22,7 @@ #include "output-requirements.hpp" class db_copy_thread_t; +class properties_t; class thread_pool_t; struct middle_query_t; @@ -34,7 +35,7 @@ class output_t static std::shared_ptr create_output(std::shared_ptr const &mid, std::shared_ptr thread_pool, - options_t const &options); + options_t const &options, properties_t const &properties); output_t(output_t const &) = default; output_t &operator=(output_t const &) = default; diff --git a/src/properties.hpp b/src/properties.hpp index f8339da9f..3828628be 100644 --- a/src/properties.hpp +++ b/src/properties.hpp @@ -39,6 +39,8 @@ class properties_t */ properties_t(connection_params_t connection_params, std::string schema); + std::size_t size() const noexcept { return m_properties.size(); } + std::string get_string(std::string const &property, std::string const &default_value) const; @@ -93,6 +95,10 @@ class properties_t */ bool load(); + auto begin() const { return m_properties.begin(); } + + auto end() const { return m_properties.end(); } + private: std::string table_name() const; diff --git a/tests/bdd/flex/lua-basics.feature b/tests/bdd/flex/lua-basics.feature index b8d68923a..35bf38db4 100644 --- a/tests/bdd/flex/lua-basics.feature +++ b/tests/bdd/flex/lua-basics.feature @@ -26,3 +26,22 @@ Feature: Flex output uses a Lua config file """ Table=table """ + + Scenario: Check access to osm2pgsql properties from Lua + Given the input file 'liechtenstein-2013-08-03.osm.pbf' + And the lua style + """ + local p = osm2pgsql.properties + print("attributes=" .. p.attributes) + print("prefix=" .. p.prefix) + """ + Then running osm2pgsql flex fails + And the standard output contains + """ + attributes=false + """ + And the standard output contains + """ + prefix=planet_osm + """ + diff --git a/tests/common-import.hpp b/tests/common-import.hpp index 82f41b2b9..8cdfe0403 100644 --- a/tests/common-import.hpp +++ b/tests/common-import.hpp @@ -22,6 +22,7 @@ #include "middle-ram.hpp" #include "osmdata.hpp" #include "output.hpp" +#include "properties.hpp" #include "taginfo-impl.hpp" #include "common-pg.hpp" @@ -132,12 +133,15 @@ class import_t { options.connection_params = m_db.connection_params(); + properties_t const properties{options.connection_params, + options.middle_dbschema}; + auto thread_pool = std::make_shared(1U); auto middle = create_middle(thread_pool, options); middle->start(); auto output = output_t::create_output(middle->get_query_instance(), - thread_pool, options); + thread_pool, options, properties); middle->set_requirements(output->get_requirements()); @@ -163,12 +167,15 @@ class import_t { options.connection_params = m_db.connection_params(); + properties_t const properties{options.connection_params, + options.middle_dbschema}; + auto thread_pool = std::make_shared(1U); auto middle = std::make_shared(thread_pool, &options); middle->start(); auto output = output_t::create_output(middle->get_query_instance(), - thread_pool, options); + thread_pool, options, properties); middle->set_requirements(output->get_requirements());