Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

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.



git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.1.x@1125682 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information...
commit 86c8ffc732052ba5eb942330ad431d1a42297034 1 parent 5b8d452
Filipe Manana fdmanana authored
Showing with 31 additions and 13 deletions.
  1. +10 −10 share/www/script/test/replicator_db.js
  2. +21 −3 src/couchdb/couch_rep.erl
20 share/www/script/test/replicator_db.js
View
@@ -121,7 +121,7 @@ couchTests.replicator_db = function(debug) {
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(debug) {
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(debug) {
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(debug) {
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(debug) {
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(debug) {
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(debug) {
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(debug) {
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(debug) {
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(debug) {
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");
}
24 src/couchdb/couch_rep.erl
View
@@ -889,11 +889,9 @@ update_rep_doc(RepDb, #doc{body = {RepDocBody}} = RepDoc, KVs) ->
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 = {RepDocBody}} = RepDoc, KVs) ->
[]
).
+% 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">> ->
Please sign in to comment.
Something went wrong with that request. Please try again.