diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2014-11-17 09:05:00 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2014-11-25 06:38:00 +0200 |
commit | 6323bca38688f0f5be72481fb146313d2fc5fe78 (patch) | |
tree | 608bd4a9b9a7159353818697964bffa1be4c911a /odb/pgsql/statement.cxx | |
parent | 1ca674f0dda6ea6f1204f0c06e22e165655927c3 (diff) |
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.
Diffstat (limited to 'odb/pgsql/statement.cxx')
-rw-r--r-- | odb/pgsql/statement.cxx | 66 |
1 files 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<short*> (b.buffer) = - *reinterpret_cast<const short*> (v); - break; - } case bind::integer: - { - *static_cast<int*> (b.buffer) = *reinterpret_cast<const int*> (v); - break; - } case bind::bigint: { - *static_cast<long long*> (b.buffer) = - *reinterpret_cast<const long long*> (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<const short*> (v)); + break; + } + case int4_oid: + { + i = endian_traits::ntoh (*reinterpret_cast<const int*> (v)); + break; + } + case int8_oid: + { + i = endian_traits::ntoh ( + *reinterpret_cast<const long long*> (v)); + break; + } + default: + { + assert (false); // Column in the database is not an integer. + break; + } + } + + switch (b.type) + { + case bind::smallint: + { + *static_cast<short*> (b.buffer) = + endian_traits::hton (static_cast<short> (i)); + break; + } + case bind::integer: + { + *static_cast<int*> (b.buffer) = + endian_traits::hton (static_cast<int> (i)); + break; + } + case bind::bigint: + { + *static_cast<long long*> (b.buffer) = endian_traits::hton (i); + break; + } + default: + break; + } + break; } case bind::real: |