Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make properties available in Lua in osm2pgsql.properties #2207

Merged
merged 1 commit into from
Jul 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/osm2pgsql.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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());

Expand Down Expand Up @@ -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 =
Expand All @@ -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);
}

Expand Down
17 changes: 14 additions & 3 deletions src/output-flex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -1159,12 +1160,13 @@ output_flex_t::clone(std::shared_ptr<middle_query_t> const &mid,

output_flex_t::output_flex_t(std::shared_ptr<middle_query_t> const &mid,
std::shared_ptr<thread_pool_t> 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<db_copy_thread_t>(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
Expand Down Expand Up @@ -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); });
Expand All @@ -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);

Expand Down
4 changes: 2 additions & 2 deletions src/output-flex.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ class output_flex_t : public output_t
/// Constructor for new objects
output_flex_t(std::shared_ptr<middle_query_t> const &mid,
std::shared_ptr<thread_pool_t> 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,
Expand Down Expand Up @@ -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();
Expand Down
5 changes: 3 additions & 2 deletions src/output.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
std::shared_ptr<output_t>
output_t::create_output(std::shared_ptr<middle_query_t> const &mid,
std::shared_ptr<thread_pool_t> thread_pool,
options_t const &options)
options_t const &options,
properties_t const &properties)
{
if (options.output_backend == "pgsql") {
return std::make_shared<output_pgsql_t>(mid, std::move(thread_pool),
Expand All @@ -32,7 +33,7 @@ output_t::create_output(std::shared_ptr<middle_query_t> const &mid,

if (options.output_backend == "flex") {
return std::make_shared<output_flex_t>(mid, std::move(thread_pool),
options);
options, properties);
}

if (options.output_backend == "null") {
Expand Down
3 changes: 2 additions & 1 deletion src/output.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "output-requirements.hpp"

class db_copy_thread_t;
class properties_t;
class thread_pool_t;

struct middle_query_t;
Expand All @@ -34,7 +35,7 @@ class output_t
static std::shared_ptr<output_t>
create_output(std::shared_ptr<middle_query_t> const &mid,
std::shared_ptr<thread_pool_t> 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;
Expand Down
6 changes: 6 additions & 0 deletions src/properties.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down
19 changes: 19 additions & 0 deletions tests/bdd/flex/lua-basics.feature
Original file line number Diff line number Diff line change
Expand Up @@ -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
"""

11 changes: 9 additions & 2 deletions tests/common-import.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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<thread_pool_t>(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());

Expand All @@ -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<thread_pool_t>(1U);
auto middle = std::make_shared<middle_ram_t>(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());

Expand Down
Loading