jtv / libpqxx

The official C++ client API for PostgreSQL.
http://pqxx.org/pqxx/
BSD 3-Clause "New" or "Revised" License
961 stars 228 forks source link

Rtti usage on demand #831

Closed Balalarga closed 1 month ago

Balalarga commented 1 month ago

Hi! RTTI is required now only for enum names at error handling.

template<typename TYPE>
std::string const type_name{internal::demangle_type_name(typeid(TYPE).name())};

It's not always good, as many big projects disable it mandatory Is it a big deal to make it a optional feature?

jtv commented 1 month ago

That's annoying: Technically nothing here actually requires RTTI, but it requires the compiler's RTTI support. The typeid operator used here is the one that takes a type, which is evaluated at compile time.

I think it would be possible to work around this without losing any functionality: we'll need a second version of PQXX_DECLARE_ENUM where the caller provides a human-readable name for the type. (Well, or an optional second argument but that only works in C++20 and is also just too ugly for this situation.) And then we'll need to make sure that libpqxx defines explicit names for all the types that need them.

jtv commented 1 month ago

Correction. I don't see any problem with PQXX_DECLARE_ENUM, so no need to change that. Unfortunately my compilers don't provide any information at all about which types trigger the error.

jtv commented 1 month ago

@Balalarga what exactly makes you say the problem happens with enum types? It now looks to me more like it happens with non-enum types.

Balalarga commented 1 month ago

@Balalarga what exactly makes you say the problem happens with enum types? It now looks to me more like it happens with non-enum types.

Thank you for the answer I'm trying to use your lib with UnrealEngine, and cannot cross compile Linux build. And i haven't wrote any code, except of connection. After a small research, i found clang do not support RTTI by default and it should be recompiled manually. Maybe it happen only with EpicGames's toolchain, but i haven't figure it out yet. Also MSVC compile it well with disabled rtti

jtv commented 1 month ago

You could try defining a constant pqxx::type_name<A_TYPE> for every type that's likely to need it, very early on in the source, specialising the template that's in strconv.hxx. But I tried that and it didn't work.

Or perhaps it would be possible to enable RTTI by passing -frtti on the compiler command line.

Balalarga commented 1 month ago

kk, thanks. I'll enable rtti and hide all pqxx code inside a higher-level wrapper!!