diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java index 9327612..7342092 100755 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java @@ -511,7 +511,7 @@ public class RDBDocumentStore implements DocumentStore { Connection connection = null; try { connection = this.ch.getROConnection(); - long result = this.db.determineServerTimeDifferenceMillis(connection, getTable(Collection.NODES)); + long result = this.db.determineServerTimeDifferenceMillis(connection); connection.commit(); return result; } catch (SQLException ex) { diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java index e578918..fc864a1 100755 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java @@ -50,6 +50,16 @@ public enum RDBDocumentStoreDB { public String checkVersion(DatabaseMetaData md) throws SQLException { return RDBJDBCTools.versionCheck(md, 1, 4, description); } + + @Override + public String getInitializationStatement() { + return "create alias if not exists unix_timestamp as $$ long unix_timestamp() { return System.currentTimeMillis()/1000L; } $$;"; + } + + @Override + public String getCurrentTimeStampInSecondsSyntax() { + return "select unix_timestamp();"; + } }, DERBY("Apache Derby") { @@ -59,8 +69,8 @@ public enum RDBDocumentStoreDB { } @Override - public String getCurrentTimeStampInMsSyntax() { - return "CURRENT_TIMESTAMP"; + public String getCurrentTimeStampInSecondsSyntax() { + return "values {fn timestampdiff(SQL_TSI_SECOND,timestamp('1970-1-1-00.00.00.000000'), current_timestamp)};"; } @Override @@ -76,6 +86,11 @@ public enum RDBDocumentStoreDB { } @Override + public String getCurrentTimeStampInSecondsSyntax() { + return "select extract(epoch from now())::integer;"; + } + + @Override public String getTableCreationStatement(String tableName) { return ("create table " + tableName + " (ID varchar(512) not null primary key, MODIFIED bigint, HASBINARY smallint, DELETEDONCE smallint, MODCOUNT bigint, CMODCOUNT bigint, DSIZE bigint, DATA varchar(16384), BDATA bytea)"); } @@ -115,6 +130,11 @@ public enum RDBDocumentStoreDB { return RDBJDBCTools.versionCheck(md, 10, 1, description); } + @Override + public String getCurrentTimeStampInSecondsSyntax() { + return "select cast (days(current_timestamp - current_timezone) - days('1970-01-01') as integer) * 86400 + midnight_seconds(current_timestamp - current_timezone) from sysibm.sysdummy1"; + } + public String getTableCreationStatement(String tableName) { return "create table " + tableName + " (ID varchar(512) not null, MODIFIED bigint, HASBINARY smallint, DELETEDONCE smallint, MODCOUNT bigint, CMODCOUNT bigint, DSIZE bigint, DATA varchar(16384), BDATA blob(" @@ -182,6 +202,11 @@ public enum RDBDocumentStoreDB { } @Override + public String getCurrentTimeStampInSecondsSyntax() { + return "select (trunc(sys_extract_utc(systimestamp)) - to_date('01/01/1970', 'MM/DD/YYYY')) * 24 * 60 * 60 + to_number(to_char(sys_extract_utc(systimestamp), 'SSSSS')) from dual;"; + } + + @Override public String getInitializationStatement() { // see https://issues.apache.org/jira/browse/OAK-1914 // for some reason, the default for NLS_SORT is incorrect @@ -228,6 +253,11 @@ public enum RDBDocumentStoreDB { } @Override + public String getCurrentTimeStampInSecondsSyntax() { + return "select unix_timestamp();"; + } + + @Override public String getTableCreationStatement(String tableName) { // see https://issues.apache.org/jira/browse/OAK-1913 return ("create table " + tableName + " (ID varbinary(512) not null primary key, MODIFIED bigint, HASBINARY smallint, DELETEDONCE smallint, MODCOUNT bigint, CMODCOUNT bigint, DSIZE bigint, DATA varchar(16000), BDATA longblob)"); @@ -328,8 +358,8 @@ public enum RDBDocumentStoreDB { } @Override - public String getCurrentTimeStampInMsSyntax() { - return "CURRENT_TIMESTAMP"; + public String getCurrentTimeStampInSecondsSyntax() { + return "select datediff(second, dateadd(second, datediff(second, getutcdate(), getdate()), '1970-01-01'), getdate());"; } @Override @@ -394,7 +424,7 @@ public enum RDBDocumentStoreDB { /** * Query syntax for current time in ms */ - public String getCurrentTimeStampInMsSyntax() { + public String getCurrentTimeStampInSecondsSyntax() { return "CURRENT_TIMESTAMP(4)"; } diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java index ad9a1bf..1d43af9 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java @@ -222,33 +222,17 @@ public class RDBDocumentStoreJDBC { } } - public long determineServerTimeDifferenceMillis(Connection connection, RDBTableMetaData tmd) { + public long determineServerTimeDifferenceMillis(Connection connection) { PreparedStatement stmt = null; ResultSet rs = null; long result; try { - String t = "select "; - if (this.dbInfo.getFetchFirstSyntax() == FETCHFIRSTSYNTAX.TOP) { - t += "TOP 1 "; - } - t += this.dbInfo.getCurrentTimeStampInMsSyntax() + " from " + tmd.getName(); - switch (this.dbInfo.getFetchFirstSyntax()) { - case LIMIT: - t += " LIMIT 1"; - break; - case FETCHFIRST: - t += " FETCH FIRST 1 ROWS ONLY"; - break; - default: - break; - } - - stmt = connection.prepareStatement(t); + stmt = connection.prepareStatement(this.dbInfo.getCurrentTimeStampInSecondsSyntax()); long start = System.currentTimeMillis(); rs = stmt.executeQuery(); if (rs.next()) { long roundtrip = System.currentTimeMillis() - start; - long serverTime = rs.getTimestamp(1).getTime(); + long serverTime = 1000l * rs.getInt(1); long roundedTime = start + roundtrip / 2; result = roundedTime - serverTime; String msg = String.format("instance timestamp: %d, DB timestamp: %d, difference: %d", roundedTime, serverTime,