| | @@ -476,11 +476,11 @@ |
| 476 | 476 | ** But if we do (because of a bug) now is a good time to delete them. */ |
| 477 | 477 | db_multi_exec( |
| 478 | 478 | "DELETE FROM unclustered WHERE rid IN (SELECT rid FROM private)" |
| 479 | 479 | ); |
| 480 | 480 | |
| 481 | | - nUncl = db_int(0, "SELECT count(*) FROM unclustered" |
| 481 | + nUncl = db_int(0, "SELECT count(*) FROM unclustered /*scan*/" |
| 482 | 482 | " WHERE NOT EXISTS(SELECT 1 FROM phantom" |
| 483 | 483 | " WHERE rid=unclustered.rid)"); |
| 484 | 484 | if( nUncl<100 ){ |
| 485 | 485 | return; |
| 486 | 486 | } |
| | @@ -593,10 +593,11 @@ |
| 593 | 593 | int deltaFlag = 0; |
| 594 | 594 | int isClone = 0; |
| 595 | 595 | int nGimme = 0; |
| 596 | 596 | int size; |
| 597 | 597 | int recvConfig = 0; |
| 598 | + char *zNow; |
| 598 | 599 | |
| 599 | 600 | if( strcmp(PD("REQUEST_METHOD","POST"),"POST") ){ |
| 600 | 601 | fossil_redirect_home(); |
| 601 | 602 | } |
| 602 | 603 | memset(&xfer, 0, sizeof(xfer)); |
| | @@ -610,10 +611,12 @@ |
| 610 | 611 | |
| 611 | 612 | db_begin_transaction(); |
| 612 | 613 | db_multi_exec( |
| 613 | 614 | "CREATE TEMP TABLE onremote(rid INTEGER PRIMARY KEY);" |
| 614 | 615 | ); |
| 616 | + zNow = db_text(0, "SELECT strftime('%%Y-%%m-%%dT%%H:%%M:%%S', 'now')"); |
| 617 | + @ # timestamp %s(zNow) |
| 615 | 618 | manifest_crosslink_begin(); |
| 616 | 619 | while( blob_line(xfer.pIn, &xfer.line) ){ |
| 617 | 620 | if( blob_buffer(&xfer.line)[0]=='#' ) continue; |
| 618 | 621 | xfer.nToken = blob_tokenize(&xfer.line, xfer.aToken, count(xfer.aToken)); |
| 619 | 622 | |
| | @@ -1082,10 +1085,25 @@ |
| 1082 | 1085 | go = 0; |
| 1083 | 1086 | |
| 1084 | 1087 | /* Process the reply that came back from the server */ |
| 1085 | 1088 | while( blob_line(&recv, &xfer.line) ){ |
| 1086 | 1089 | if( blob_buffer(&xfer.line)[0]=='#' ){ |
| 1090 | + const char *zLine = blob_buffer(&xfer.line); |
| 1091 | + if( memcmp(zLine, "# timestamp ", 12)==0 ){ |
| 1092 | + char zTime[20]; |
| 1093 | + double rDiff; |
| 1094 | + sqlite3_snprintf(sizeof(zTime), zTime, "%.19s", &zLine[12]); |
| 1095 | + rDiff = db_double(9e99, "SELECT julianday('%q') - julianday('now')", |
| 1096 | + zTime); |
| 1097 | + if( rDiff<0.0 ) rDiff = -rDiff; |
| 1098 | + if( rDiff>9e98 ) rDiff = 0.0; |
| 1099 | + if( (rDiff*24.0*3600.0)>=60.0 ){ |
| 1100 | + fossil_warning("*** time skew *** server time differs by %s", |
| 1101 | + db_timespan_name(rDiff)); |
| 1102 | + g.clockSkewSeen = 1; |
| 1103 | + } |
| 1104 | + } |
| 1087 | 1105 | continue; |
| 1088 | 1106 | } |
| 1089 | 1107 | xfer.nToken = blob_tokenize(&xfer.line, xfer.aToken, count(xfer.aToken)); |
| 1090 | 1108 | nCardRcvd++; |
| 1091 | 1109 | if( !g.cgiOutput && !g.fQuiet ){ |
| 1092 | 1110 | |