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:28:14 UTC

svn commit: r1125680 - in /couchdb/trunk: share/www/script/test/replicator_db.js src/couchdb/couch_replication_manager.erl

Author: fdmanana
Date: Sat May 21 12:28:14 2011
New Revision: 1125680

URL: http://svn.apache.org/viewvc?rev=1125680&view=rev
Log:
Use RFC3339 timestamps in replication documents

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

Modified:
    couchdb/trunk/share/www/script/test/replicator_db.js
    couchdb/trunk/src/couchdb/couch_replication_manager.erl

Modified: couchdb/trunk/share/www/script/test/replicator_db.js
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/test/replicator_db.js?rev=1125680&r1=1125679&r2=1125680&view=diff
==============================================================================
--- couchdb/trunk/share/www/script/test/replicator_db.js (original)
+++ couchdb/trunk/share/www/script/test/replicator_db.js Sat May 21 12:28:14 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/trunk/src/couchdb/couch_replication_manager.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_replication_manager.erl?rev=1125680&r1=1125679&r2=1125680&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_replication_manager.erl (original)
+++ couchdb/trunk/src/couchdb/couch_replication_manager.erl Sat May 21 12:28:14 2011
@@ -474,11 +474,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})
+                        {<<"_replication_state_time">>, timestamp()})
                 end;
             ({K, _V} = KV, Body) ->
                 lists:keystore(K, 1, Body, KV)
@@ -489,6 +487,27 @@ update_rep_doc(RepDb, #doc{body = {RepDo
     couch_db:update_doc(RepDb, RepDoc#doc{body = {NewRepDocBody}}, []).
 
 
+% 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)]).
+
+
+
 ensure_rep_db_exists() ->
     DbName = ?l2b(couch_config:get("replicator", "db", "_replicator")),
     UserCtx = #user_ctx{roles = [<<"_admin">>, <<"_replicator">>]},