From 6323bca38688f0f5be72481fb146313d2fc5fe78 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 17 Nov 2014 09:05:00 +0200 Subject: Handle conversion between different integer widths in result extraction This will help with custom schemas where the integer types in the database may not necessarily match the ODB's default mappings. --- odb/pgsql/statement.cxx | 66 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/odb/pgsql/statement.cxx b/odb/pgsql/statement.cxx index cf3e181..895cff5 100644 --- a/odb/pgsql/statement.cxx +++ b/odb/pgsql/statement.cxx @@ -360,20 +360,64 @@ namespace odb break; } case bind::smallint: - { - *static_cast (b.buffer) = - *reinterpret_cast (v); - break; - } case bind::integer: - { - *static_cast (b.buffer) = *reinterpret_cast (v); - break; - } case bind::bigint: { - *static_cast (b.buffer) = - *reinterpret_cast (v); + // If we are dealing with a custom schema, we may have a + // difference in the integer widths. Note also that we have + // to go to our endianness and back in order for casts to + // work properly. + // + long long i; + + switch (PQftype (result, c)) + { + case int2_oid: + { + i = endian_traits::ntoh (*reinterpret_cast (v)); + break; + } + case int4_oid: + { + i = endian_traits::ntoh (*reinterpret_cast (v)); + break; + } + case int8_oid: + { + i = endian_traits::ntoh ( + *reinterpret_cast (v)); + break; + } + default: + { + assert (false); // Column in the database is not an integer. + break; + } + } + + switch (b.type) + { + case bind::smallint: + { + *static_cast (b.buffer) = + endian_traits::hton (static_cast (i)); + break; + } + case bind::integer: + { + *static_cast (b.buffer) = + endian_traits::hton (static_cast (i)); + break; + } + case bind::bigint: + { + *static_cast (b.buffer) = endian_traits::hton (i); + break; + } + default: + break; + } + break; } case bind::real: -- cgit v1.1