Browse Source

merge git://github.com/mabrek/epgsql.git

Ery Lee 12 years ago
parent
commit
7ab6ef1d0a
2 changed files with 12 additions and 0 deletions
  1. 6 0
      src/pgsql_fdatetime.erl
  2. 6 0
      src/pgsql_idatetime.erl

+ 6 - 0
src/pgsql_fdatetime.erl

@@ -7,6 +7,7 @@
 -define(int32, 1/big-signed-unit:32).
 
 -define(postgres_epoc_jdate, 2451545).
+-define(postgres_epoc_secs, 946684800).
 
 -define(mins_per_hour, 60).
 -define(secs_per_day, 86400.0).
@@ -23,7 +24,9 @@ decode(interval, <<N:1/big-float-unit:64, D:?int32, M:?int32>>) -> {f2time(N), D
 encode(date, D)         -> <<4:?int32, (date2j(D) - ?postgres_epoc_jdate):1/big-signed-unit:32>>;
 encode(time, T)         -> <<8:?int32, (time2f(T)):1/big-float-unit:64>>;
 encode(timetz, {T, TZ}) -> <<12:?int32, (time2f(T)):1/big-float-unit:64, TZ:?int32>>;
+encode(timestamp, TS = {_, _, _})   -> <<8:?int32, (now2f(TS)):1/big-float-unit:64>>;
 encode(timestamp, TS)   -> <<8:?int32, (timestamp2f(TS)):1/big-float-unit:64>>;
+encode(timestamptz, TS = {_, _, _})   -> <<8:?int32, (now2f(TS)):1/big-float-unit:64>>;
 encode(timestamptz, TS) -> <<8:?int32, (timestamp2f(TS)):1/big-float-unit:64>>;
 encode(interval, {T, D, M}) -> <<16:?int32, (time2f(T)):1/big-float-unit:64, D:?int32, M:?int32>>.
 
@@ -94,6 +97,9 @@ timestamp2f({Date, Time}) ->
     D = date2j(Date) - ?postgres_epoc_jdate,
     D * ?secs_per_day + time2f(Time).
 
+now2f({MegaSecs, Secs, MicroSecs}) ->
+    MegaSecs * 1000000 + Secs + MicroSecs / 1000000.0 - ?postgres_epoc_secs.
+
 tmodulo(T, U) ->
     case T < 0 of
         true  -> Q = ceiling(T / U);

+ 6 - 0
src/pgsql_idatetime.erl

@@ -8,6 +8,7 @@
 -define(int64, 1/big-signed-unit:64).
 
 -define(postgres_epoc_jdate, 2451545).
+-define(postgres_epoc_usecs, 946684800000000).
 
 -define(mins_per_hour, 60).
 -define(secs_per_minute, 60).
@@ -27,7 +28,9 @@ decode(interval, <<N:?int64, D:?int32, M:?int32>>) -> {i2time(N), D, M}.
 encode(date, D)         -> <<4:?int32, (date2j(D) - ?postgres_epoc_jdate):?int32>>;
 encode(time, T)         -> <<8:?int32, (time2i(T)):?int64>>;
 encode(timetz, {T, TZ}) -> <<12:?int32, (time2i(T)):?int64, TZ:?int32>>;
+encode(timestamp, TS = {_, _, _})   -> <<8:?int32, (now2i(TS)):?int64>>;
 encode(timestamp, TS)   -> <<8:?int32, (timestamp2i(TS)):?int64>>;
+encode(timestamptz, TS = {_, _, _})   -> <<8:?int32, (now2i(TS)):?int64>>;
 encode(timestamptz, TS) -> <<8:?int32, (timestamp2i(TS)):?int64>>;
 encode(interval, {T, D, M}) -> <<16:?int32, (time2i(T)):?int64, D:?int32, M:?int32>>.
 
@@ -89,6 +92,9 @@ timestamp2i({Date, Time}) ->
     D = date2j(Date) - ?postgres_epoc_jdate,
     D * ?usecs_per_day + time2i(Time).
 
+now2i({MegaSecs, Secs, MicroSecs}) ->
+    (MegaSecs * 1000000 + Secs) * 1000000 + MicroSecs - ?postgres_epoc_usecs.
+
 tmodulo(T, U) ->
     case T div U of
         0 -> {T, 0};