From 13e58cb820b5a53f8f3d08f01b85364a931a949b Mon Sep 17 00:00:00 2001 From: Jochen Topf Date: Sun, 25 Jun 2023 10:27:38 +0200 Subject: [PATCH 1/5] Simplify condition --- src/pgsql.hpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/pgsql.hpp b/src/pgsql.hpp index 33c745f36..4f38ca5e9 100644 --- a/src/pgsql.hpp +++ b/src/pgsql.hpp @@ -238,11 +238,9 @@ class pg_conn_t template static constexpr std::size_t buffers_needed() noexcept { - if constexpr (std::is_same_v) { - return 0; - } else if constexpr (std::is_same_v) { - return 0; - } else if constexpr (std::is_same_v) { + if constexpr (std::is_same_v || + std::is_same_v || + std::is_same_v) { return 0; } return 1; From f61b36059f5971716bc4ca7d1aa852109e5c091b Mon Sep 17 00:00:00 2001 From: Jochen Topf Date: Sun, 25 Jun 2023 10:27:49 +0200 Subject: [PATCH 2/5] Use std::array::at() instead of operator[]() Gets rid of a warning and at worst it costs us one check, at best the compiler can elide the check because it should be able to prove at compile time that it is unnecessary. --- src/pgsql.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pgsql.hpp b/src/pgsql.hpp index 4f38ca5e9..27cd34812 100644 --- a/src/pgsql.hpp +++ b/src/pgsql.hpp @@ -303,7 +303,8 @@ class pg_conn_t std::size_t n = 0; std::size_t m = 0; std::array param_ptrs = { - to_str>(&exec_params, &lengths[n++], &bins[m++], + to_str>(&exec_params, &lengths.at(n++), + &bins.at(m++), std::forward(params))...}; return exec_prepared_internal(stmt, sizeof...(params), From c2d8f550dc28fecbf7b5eb0cef329cc5c953c6e4 Mon Sep 17 00:00:00 2001 From: Jochen Topf Date: Sun, 25 Jun 2023 10:59:34 +0200 Subject: [PATCH 3/5] Add copy/move constructor/operator= to virtual base classes clang-tidy complains about broken rule-of-five here --- src/middle.hpp | 12 ++++++++++++ src/tagtransform.hpp | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/src/middle.hpp b/src/middle.hpp index 19f320562..85659b964 100644 --- a/src/middle.hpp +++ b/src/middle.hpp @@ -26,8 +26,15 @@ struct output_requirements; */ struct middle_query_t : std::enable_shared_from_this { + middle_query_t() noexcept = default; + virtual ~middle_query_t() = 0; + middle_query_t(middle_query_t const &) = delete; + middle_query_t &operator=(middle_query_t const &) = delete; + middle_query_t(middle_query_t &&) = delete; + middle_query_t &operator=(middle_query_t &&) = delete; + /** * Retrieves node location for the given id. */ @@ -95,6 +102,11 @@ class middle_t virtual ~middle_t() = 0; + middle_t(middle_t const &) = delete; + middle_t &operator=(middle_t const &) = delete; + middle_t(middle_t &&) = delete; + middle_t &operator=(middle_t &&) = delete; + virtual void start() = 0; virtual void stop() = 0; diff --git a/src/tagtransform.hpp b/src/tagtransform.hpp index aefe1cf6b..224db6524 100644 --- a/src/tagtransform.hpp +++ b/src/tagtransform.hpp @@ -25,8 +25,15 @@ class tagtransform_t static std::unique_ptr make_tagtransform(options_t const *options, export_list const &exlist); + tagtransform_t() noexcept = default; + virtual ~tagtransform_t() = 0; + tagtransform_t(tagtransform_t const &) = delete; + tagtransform_t &operator=(tagtransform_t const &) = delete; + tagtransform_t(tagtransform_t &&) = delete; + tagtransform_t &operator=(tagtransform_t &&) = delete; + virtual std::unique_ptr clone() const = 0; virtual bool filter_tags(osmium::OSMObject const &o, bool *polygon, From cc12576bc56cdd21f4149eeb6a35b2aa2d2f4524 Mon Sep 17 00:00:00 2001 From: Jochen Topf Date: Sun, 25 Jun 2023 11:06:55 +0200 Subject: [PATCH 4/5] Consistently use unit32_t for postgresql server version --- src/version.cpp.in | 4 +++- src/version.hpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/version.cpp.in b/src/version.cpp.in index b4d7a493c..7661eb9b4 100644 --- a/src/version.cpp.in +++ b/src/version.cpp.in @@ -7,6 +7,8 @@ * For a full list of authors see the git log. */ +#include "version.hpp" + char const *get_build_type() noexcept { return "@CMAKE_BUILD_TYPE@"; @@ -27,7 +29,7 @@ char const *get_minimum_postgresql_server_version() noexcept return "@MINIMUM_POSTGRESQL_SERVER_VERSION@"; } -unsigned long get_minimum_postgresql_server_version_num() noexcept +uint32_t get_minimum_postgresql_server_version_num() noexcept { return @MINIMUM_POSTGRESQL_SERVER_VERSION_NUM@; } diff --git a/src/version.hpp b/src/version.hpp index 2fb0b969b..82f109228 100644 --- a/src/version.hpp +++ b/src/version.hpp @@ -10,10 +10,12 @@ * For a full list of authors see the git log. */ +#include + char const *get_build_type() noexcept; char const *get_osm2pgsql_version() noexcept; char const *get_osm2pgsql_short_version() noexcept; char const *get_minimum_postgresql_server_version() noexcept; -unsigned long get_minimum_postgresql_server_version_num() noexcept; +uint32_t get_minimum_postgresql_server_version_num() noexcept; #endif // OSM2PGSQL_VERSION_HPP From 6478f08703e370a6dd08367422e5212a6e9fe5a3 Mon Sep 17 00:00:00 2001 From: Jochen Topf Date: Sun, 25 Jun 2023 11:56:40 +0200 Subject: [PATCH 5/5] Avoid non-thread-safe code where possible Clang-tidy warning concurrency-mt-unsafe --- src/db-copy.cpp | 2 +- src/expire-output.cpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/db-copy.cpp b/src/db-copy.cpp index 8f996d6ab..dd4d0a4a5 100644 --- a/src/db-copy.cpp +++ b/src/db-copy.cpp @@ -163,7 +163,7 @@ void db_copy_thread_t::thread_t::operator()() m_conn.reset(); } catch (std::runtime_error const &e) { log_error("DB copy thread failed: {}", e.what()); - exit(2); + std::exit(2); // NOLINT(concurrency-mt-unsafe) } } diff --git a/src/expire-output.cpp b/src/expire-output.cpp index 1d5b241f5..322415b01 100644 --- a/src/expire-output.cpp +++ b/src/expire-output.cpp @@ -14,6 +14,8 @@ #include "pgsql.hpp" #include "tile.hpp" +#include + std::size_t expire_output_t::output(quadkey_list_t const &tile_list, std::string const &conninfo) const { @@ -32,9 +34,10 @@ std::size_t expire_output_t::output_tiles_to_file( { FILE *outfile = std::fopen(m_filename.data(), "a"); if (outfile == nullptr) { + std::system_error error{errno, std::generic_category()}; log_warn("Failed to open expired tiles file ({}). Tile expiry " "list will not be written!", - std::strerror(errno)); + error.code().message()); return 0; }