diff options
author | Constantin Michael <constantin@codesynthesis.com> | 2011-07-21 23:12:34 +0200 |
---|---|---|
committer | Constantin Michael <constantin@codesynthesis.com> | 2011-07-22 10:04:34 +0200 |
commit | f64ea73680a7f21e841f16d3af886f943ac2f99d (patch) | |
tree | 97226ba0262b5e9f5eba907f0be0cd6b66ef2083 /mapping/traits-pgsql.hxx | |
parent | 0ccc8133c0233ba4a1bad0d675beba297c0beac2 (diff) |
Simplify implementation of PostgreSQL DATE mapping example
Diffstat (limited to 'mapping/traits-pgsql.hxx')
-rw-r--r-- | mapping/traits-pgsql.hxx | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/mapping/traits-pgsql.hxx b/mapping/traits-pgsql.hxx index 92ce4c4..e196321 100644 --- a/mapping/traits-pgsql.hxx +++ b/mapping/traits-pgsql.hxx @@ -54,6 +54,9 @@ namespace odb } }; + // Mapping of date to PostgreSQL DATE. DATE is stored as the number + // of days since the PostgreSQL epoch 2000-01-01. + // template <> class value_traits<date, id_date> { @@ -62,7 +65,11 @@ namespace odb typedef date query_type; typedef int image_type; - static const time_t pg_epoch_tt; + // The difference between the PostgreSQL epoch and the Unix epoch + // in seconds. + // + static const time_t epoch_diff = 946684800; + static const time_t seconds_per_day = 86400; static void @@ -74,13 +81,14 @@ namespace odb return; } - tm pg_epoch_tm = {0, 0, 0, 1, 1, 100, 0, 0, 0, 0, 0}; - time_t pg_epoch_tt (mktime (&pg_epoch_tm)); - - time_t v_tt (pg_epoch_tt + + time_t v_tt (epoch_diff + static_cast<time_t> (details::endian_traits::ntoh (i)) * seconds_per_day); + // Assume that the date is specified as UTC. Use localtime so as + // to avoid any timeshift that could be introduced by the system + // time locale not being UTC. + // tm v_tm (*localtime (&v_tt)); v = date (v_tm.tm_year + 1900, v_tm.tm_mon, v_tm.tm_mday); @@ -100,11 +108,8 @@ namespace odb time_t v_tt (mktime (&v_tm)); - tm pg_epoch_tm = {0, 0, 0, 1, 1, 100, 0, 0, 0, 0, 0}; - time_t pg_epoch_tt (mktime (&pg_epoch_tm)); - i = details::endian_traits::hton ( - static_cast<int> ((v_tt - pg_epoch_tt) / seconds_per_day)); + static_cast<int> ((v_tt - epoch_diff) / seconds_per_day)); } }; } |