Skip to content

Commit

Permalink
Merge pull request #2207 from joto/lua-properties
Browse files Browse the repository at this point in the history
Make properties available in Lua in osm2pgsql.properties
  • Loading branch information
lonvia authored Jul 9, 2024
2 parents 211c7f5 + 728a92d commit ee134ca
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 14 deletions.
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

0 comments on commit ee134ca

Please sign in to comment.