You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by fd...@apache.org on 2011/05/21 14:29:38 UTC

svn commit: r1125682 - in /couchdb/branches/1.1.x: share/www/script/test/replicator_db.js src/couchdb/couch_rep.erl

Author: fdmanana
Date: Sat May 21 12:29:38 2011
New Revision: 1125682

URL: http://svn.apache.org/viewvc?rev=1125682&view=rev
Log:
Merged revision 1125680 from trunk

    Use RFC3339 timestamps in replication documents

    As recently proposed by Max Odgen, RFC3339 timestamps are
    now used instead of Unix timestamps.


Modified:
    couchdb/branches/1.1.x/share/www/script/test/replicator_db.js
    couchdb/branches/1.1.x/src/couchdb/couch_rep.erl

Modified: couchdb/branches/1.1.x/share/www/script/test/replicator_db.js
URL: http://svn.apache.org/viewvc/couchdb/branches/1.1.x/share/www/script/test/replicator_db.js?rev=1125682&r1=1125681&r2=1125682&view=diff
==============================================================================
--- couchdb/branches/1.1.x/share/www/script/test/replicator_db.js (original)
+++ couchdb/branches/1.1.x/share/www/script/test/replicator_db.js Sat May 21 12:29:38 2011
@@ -121,7 +121,7 @@ couchTests.replicator_db = function(debu
     T(repDoc1.source === repDoc.source);
     T(repDoc1.target === repDoc.target);
     T(repDoc1._replication_state === "completed", "simple");
-    T(typeof repDoc1._replication_state_time === "number");
+    T(typeof repDoc1._replication_state_time === "string");
     T(typeof repDoc1._replication_id  === "string");
   }
 
@@ -173,7 +173,7 @@ couchTests.replicator_db = function(debu
     T(repDoc1.source === repDoc.source);
     T(repDoc1.target === repDoc.target);
     T(repDoc1._replication_state === "completed", "filtered");
-    T(typeof repDoc1._replication_state_time === "number");
+    T(typeof repDoc1._replication_state_time === "string");
     T(typeof repDoc1._replication_id  === "string");
   }
 
@@ -217,7 +217,7 @@ couchTests.replicator_db = function(debu
     T(repDoc1.source === repDoc.source);
     T(repDoc1.target === repDoc.target);
     T(repDoc1._replication_state === "triggered");
-    T(typeof repDoc1._replication_state_time === "number");
+    T(typeof repDoc1._replication_state_time === "string");
     T(typeof repDoc1._replication_id  === "string");
 
     // add a design doc to source, it will be replicated to target
@@ -332,7 +332,7 @@ couchTests.replicator_db = function(debu
     T(repDoc1_copy.source === repDoc1.source);
     T(repDoc1_copy.target === repDoc1.target);
     T(repDoc1_copy._replication_state === "completed");
-    T(typeof repDoc1_copy._replication_state_time === "number");
+    T(typeof repDoc1_copy._replication_state_time === "string");
     T(typeof repDoc1_copy._replication_id  === "string");
 
     var newDoc = {
@@ -363,7 +363,7 @@ couchTests.replicator_db = function(debu
     T(repDoc2_copy.source === repDoc1.source);
     T(repDoc2_copy.target === repDoc1.target);
     T(repDoc2_copy._replication_state === "completed");
-    T(typeof repDoc2_copy._replication_state_time === "number");
+    T(typeof repDoc2_copy._replication_state_time === "string");
     T(typeof repDoc2_copy._replication_id === "string");
     T(repDoc2_copy._replication_id === repDoc1_copy._replication_id);
   }
@@ -400,7 +400,7 @@ couchTests.replicator_db = function(debu
     repDoc1 = repDb.open("foo_dup_rep_doc_1");
     T(repDoc1 !== null);
     T(repDoc1._replication_state === "completed", "identical");
-    T(typeof repDoc1._replication_state_time === "number");
+    T(typeof repDoc1._replication_state_time === "string");
     T(typeof repDoc1._replication_id  === "string");
 
     repDoc2 = repDb.open("foo_dup_rep_doc_2");
@@ -444,7 +444,7 @@ couchTests.replicator_db = function(debu
     repDoc1 = repDb.open("foo_dup_cont_rep_doc_1");
     T(repDoc1 !== null);
     T(repDoc1._replication_state === "triggered");
-    T(typeof repDoc1._replication_state_time === "number");
+    T(typeof repDoc1._replication_state_time === "string");
     T(typeof repDoc1._replication_id  === "string");
 
     repDoc2 = repDb.open("foo_dup_cont_rep_doc_2");
@@ -470,7 +470,7 @@ couchTests.replicator_db = function(debu
     repDoc1 = repDb.open("foo_dup_cont_rep_doc_1");
     T(repDoc1 !== null);
     T(repDoc1._replication_state === "triggered");
-    T(typeof repDoc1._replication_state_time === "number");
+    T(typeof repDoc1._replication_state_time === "string");
 
     var newDoc2 = {
         _id: "foo5000",
@@ -739,7 +739,7 @@ couchTests.replicator_db = function(debu
     T(repDoc1.target === repDoc.target);
     T(repDoc1._replication_state === "completed",
       "replication document with bad replication id failed");
-    T(typeof repDoc1._replication_state_time === "number");
+    T(typeof repDoc1._replication_state_time === "string");
     T(typeof repDoc1._replication_id  === "string");
     T(repDoc1._replication_id !== "1234abc");
   }
@@ -930,7 +930,7 @@ couchTests.replicator_db = function(debu
     var repDoc1 = repDb.open(repDoc._id);
     T(repDoc1 !== null);
     T(repDoc1._replication_state === "error");
-    T(typeof repDoc1._replication_state_time === "number");
+    T(typeof repDoc1._replication_state_time === "string");
     T(typeof repDoc1._replication_id  === "string");
   }
 

Modified: couchdb/branches/1.1.x/src/couchdb/couch_rep.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/1.1.x/src/couchdb/couch_rep.erl?rev=1125682&r1=1125681&r2=1125682&view=diff
==============================================================================
--- couchdb/branches/1.1.x/src/couchdb/couch_rep.erl (original)
+++ couchdb/branches/1.1.x/src/couchdb/couch_rep.erl Sat May 21 12:29:38 2011
@@ -889,11 +889,9 @@ update_rep_doc(RepDb, #doc{body = {RepDo
                     Body;
                 _ ->
                     Body1 = lists:keystore(K, 1, Body, KV),
-                    {Mega, Secs, _} = erlang:now(),
-                    UnixTime = Mega * 1000000 + Secs,
                     lists:keystore(
                         <<"_replication_state_time">>, 1,
-                        Body1, {<<"_replication_state_time">>, UnixTime})
+                        Body1, {<<"_replication_state_time">>, timestamp()})
                 end;
             ({K, _V} = KV, Body) ->
                 lists:keystore(K, 1, Body, KV)
@@ -909,6 +907,26 @@ update_rep_doc(RepDb, #doc{body = {RepDo
         []
     ).
 
+% RFC3339 timestamps.
+% Note: doesn't include the time seconds fraction (RFC3339 says it's optional).
+timestamp() ->
+    {{Year, Month, Day}, {Hour, Min, Sec}} = calendar:now_to_local_time(now()),
+    UTime = erlang:universaltime(),
+    LocalTime = calendar:universal_time_to_local_time(UTime),
+    DiffSecs = calendar:datetime_to_gregorian_seconds(LocalTime) -
+        calendar:datetime_to_gregorian_seconds(UTime),
+    zone(DiffSecs div 3600, (DiffSecs rem 3600) div 60),
+    iolist_to_binary(
+        io_lib:format("~4..0w-~2..0w-~2..0wT~2..0w:~2..0w:~2..0w~s",
+            [Year, Month, Day, Hour, Min, Sec,
+                zone(DiffSecs div 3600, (DiffSecs rem 3600) div 60)])).
+
+zone(Hr, Min) when Hr >= 0, Min >= 0 ->
+    io_lib:format("+~2..0w:~2..0w", [Hr, Min]);
+zone(Hr, Min) ->
+    io_lib:format("-~2..0w:~2..0w", [abs(Hr), abs(Min)]).
+
+
 maybe_set_triggered({RepProps} = RepDoc, RepId) ->
     case couch_util:get_value(<<"_replication_state">>, RepProps) of
     <<"triggered">> ->