Author: reschke
Date: Fri Nov 13 10:54:06 2015
New Revision: 1714183
URL: http://svn.apache.org/viewvc?rev=1714183&view=rev
Log:
OAK-3605: RDBBlob/DocumentStore: reduce class complexity (1/2) (ported to 1.2)
Modified:
jackrabbit/oak/branches/1.2/ (props changed)
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionHandler.java
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java
Propchange: jackrabbit/oak/branches/1.2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Nov 13 10:54:06 2015
@@ -1,3 +1,3 @@
/jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673713,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678124,1678171,1678173,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680172,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1681955,1682042,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376,1684442,1684561,1684570,1684601,1684618,1684820
,1684868,1685023,1685075,1685370,1685552,1685589-1685590,1685840,1685964,1685977,1685989,1685999,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686780,1686854,1686857,1686971,1687053-1687055,1687175,1687196,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688634,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689831,1689833,1689903,1690017,1690043,1690047,1690057,1690247,1690249,1690634-1690637,1690650,1690669,1690674,1690885,1690941,1691139,1691151,1691159,1691167,1691183,1691188,1691210,1691280,1691307,1691331-1691333,1691345,1691384-1691385,1691401,1691509,1692133-1692134,1692156,1692250,1692274,1692363,1692382,1692478,1692955,1693002,1693030,1693209,1693421,1693525-1693526,1694007,1694393-1694394,1694651,1694653-1694654,1695032,1695050,1695122,1695280,1695299,1695420,1695457,1695482,1695492,1695507,1695521,1695540,1695905,1696190,1696194,1696
242,1696285,1696375,1696522,1696578,1696759,1696916,1697363,1697373,1697410,1697582,1697589,1697616,1697672,1700191,1700231,1700397,1700403,1700506,1700571,1700727,1700749,1700769,1700775,1701065,1701619,1701733,1701743,1701750,1701768,1701806,1701810,1701814,1701948,1701955,1701959,1701965,1701986,1702014,1702022,1702045,1702051,1702241,1702272,1702387,1702405,1702423,1702860,1702942,1702960,1703212,1703382,1703395,1703411,1703428,1703430,1703568,1703592,1703758,1703858,1703878,1704256,1704282,1704285,1704457,1704479,1704490,1704614,1704629,1704636,1704655,1704670,1704886,1705005,1705027,1705043,1705055,1705250,1705268,1705273,1705323,1705677,1705701,1705871,1705992,1705998,1706009,1706037,1706059,1706212,1706218,1706270,1706764,1706772,1707049,1707191,1707435,1708105,1708315,1708546,1708592,1708766,1709012,1709852,1709978,1710013,1710031,1710049,1710205,1710242,1710559,1710575,1710590,1710614,1710637,1710789,1710811,1710816,1710972,1711248,1711282,1711296,1711498,1712042,1712319,1
712490,1712531,1712730,1712785,1712963,1713008,1713439,1713461,1713580,1713586,1713600,1713626,1713803
+/jackrabbit/oak/trunk:1672350,1672468,1672537,1672603,1672642,1672644,1672834-1672835,1673351,1673410,1673414-1673415,1673436,1673644,1673662-1673664,1673669,1673695,1673713,1673738,1673787,1673791,1674046,1674065,1674075,1674107,1674228,1674780,1674880,1675054-1675055,1675319,1675332,1675354,1675357,1675382,1675555,1675566,1675593,1676198,1676237,1676407,1676458,1676539,1676670,1676693,1676703,1676725,1677579,1677581,1677609,1677611,1677774,1677788,1677797,1677804,1677806,1677939,1677991,1678023,1678095-1678096,1678124,1678171,1678173,1678211,1678323,1678758,1678938,1678954,1679144,1679165,1679191,1679232,1679235,1679503,1679958,1679961,1680170,1680172,1680182,1680222,1680232,1680236,1680461,1680633,1680643,1680747,1680805-1680806,1680903,1681282,1681767,1681918,1681955,1682042,1682218,1682235,1682437,1682494,1682555,1682855,1682904,1683059,1683089,1683213,1683249,1683259,1683278,1683323,1683687,1683700,1684174-1684175,1684186,1684376,1684442,1684561,1684570,1684601,1684618,1684820
,1684868,1685023,1685075,1685370,1685552,1685589-1685590,1685840,1685964,1685977,1685989,1685999,1686023,1686032,1686097,1686162,1686229,1686234,1686253,1686414,1686780,1686854,1686857,1686971,1687053-1687055,1687175,1687196,1687198,1687220,1687239-1687240,1687301,1687441,1687553,1688089-1688090,1688172,1688179,1688349,1688421,1688436,1688453,1688616,1688622,1688634,1688636,1688817,1689003-1689004,1689008,1689577,1689581,1689623,1689810,1689828,1689831,1689833,1689903,1690017,1690043,1690047,1690057,1690247,1690249,1690634-1690637,1690650,1690669,1690674,1690885,1690941,1691139,1691151,1691159,1691167,1691183,1691188,1691210,1691280,1691307,1691331-1691333,1691345,1691384-1691385,1691401,1691509,1692133-1692134,1692156,1692250,1692274,1692363,1692382,1692478,1692955,1693002,1693030,1693209,1693421,1693525-1693526,1694007,1694393-1694394,1694651,1694653-1694654,1695032,1695050,1695122,1695280,1695299,1695420,1695457,1695482,1695492,1695507,1695521,1695540,1695905,1696190,1696194,1696
242,1696285,1696375,1696522,1696578,1696759,1696916,1697363,1697373,1697410,1697582,1697589,1697616,1697672,1700191,1700231,1700397,1700403,1700506,1700571,1700727,1700749,1700769,1700775,1701065,1701619,1701733,1701743,1701750,1701768,1701806,1701810,1701814,1701948,1701955,1701959,1701965,1701986,1702014,1702022,1702045,1702051,1702241,1702272,1702387,1702405,1702423,1702860,1702942,1702960,1703212,1703382,1703395,1703411,1703428,1703430,1703568,1703592,1703758,1703858,1703878,1704256,1704282,1704285,1704457,1704479,1704490,1704614,1704629,1704636,1704655,1704670,1704886,1705005,1705027,1705043,1705055,1705250,1705268,1705273,1705323,1705677,1705701,1705871,1705992,1705998,1706009,1706037,1706059,1706212,1706218,1706270,1706764,1706772,1707049,1707191,1707435,1708105,1708315,1708546,1708592,1708766,1709012,1709852,1709978,1710013,1710031,1710049,1710205,1710242,1710559,1710575,1710590,1710614,1710637,1710789,1710811,1710816,1710972,1711248,1711282,1711296,1711498,1712042,1712319,1
712490,1712531,1712730,1712785,1712963,1713008,1713439,1713461,1713580,1713586,1713599-1713600,1713626,1713698,1713803,1713809
/jackrabbit/trunk:1345480
Modified:
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java?rev=1714183&r1=1714182&r2=1714183&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
(original)
+++
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStore.java
Fri Nov 13 10:54:06 2015
@@ -16,6 +16,9 @@
*/
package org.apache.jackrabbit.oak.plugins.document.rdb;
+import static
org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.closeResultSet;
+import static
org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.closeStatement;
+
import java.io.Closeable;
import java.io.IOException;
import java.security.MessageDigest;
@@ -84,7 +87,7 @@ public class RDBBlobStore extends Cachin
stmt = null;
con.commit();
} catch (SQLException ex) {
- this.ch.closeStatement(stmt);
+ closeStatement(stmt);
LOG.debug("attempting to drop: " + tname);
}
} catch (SQLException ex) {
@@ -186,7 +189,7 @@ public class RDBBlobStore extends Cachin
con.commit();
tablesPresent.add(tableName);
} catch (SQLException ex) {
- this.ch.closeStatement(checkStatement);
+ closeStatement(checkStatement);
// table does not appear to exist
con.rollback();
@@ -226,7 +229,7 @@ public class RDBBlobStore extends Cachin
this.callStack = LOG.isDebugEnabled() ? new Exception("call stack
of RDBBlobStore creation") : null;
} finally {
- this.ch.closeStatement(createStatement);
+ closeStatement(createStatement);
this.ch.closeConnection(con);
}
}
@@ -420,7 +423,7 @@ public class RDBBlobStore extends Cachin
prep.executeUpdate();
prep.close();
} finally {
- this.ch.closeStatement(prep);
+ closeStatement(prep);
con.commit();
this.ch.closeConnection(con);
}
@@ -470,10 +473,10 @@ public class RDBBlobStore extends Cachin
minLastModified = 0;
return count;
} finally {
- this.ch.closeResultSet(rs);
- this.ch.closeStatement(prepCheck);
- this.ch.closeStatement(prepDelMeta);
- this.ch.closeStatement(prepDelData);
+ closeResultSet(rs);
+ closeStatement(prepCheck);
+ closeStatement(prepDelMeta);
+ closeStatement(prepDelData);
con.commit();
this.ch.closeConnection(con);
}
@@ -522,13 +525,9 @@ public class RDBBlobStore extends Cachin
count = prepMeta.executeUpdate();
prepData.execute();
- prepMeta.close();
- prepMeta = null;
- prepData.close();
- prepData = null;
} finally {
- this.ch.closeStatement(prepMeta);
- this.ch.closeStatement(prepData);
+ closeStatement(prepMeta);
+ closeStatement(prepData);
con.commit();
this.ch.closeConnection(con);
}
@@ -612,8 +611,8 @@ public class RDBBlobStore extends Cachin
rs = null;
return !results.isEmpty();
} finally {
- this.ch.closeResultSet(rs);
- this.ch.closeStatement(prep);
+ closeResultSet(rs);
+ closeStatement(prep);
connection.commit();
this.ch.closeConnection(connection);
}
Modified:
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionHandler.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionHandler.java?rev=1714183&r1=1714182&r2=1714183&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionHandler.java
(original)
+++
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBConnectionHandler.java
Fri Nov 13 10:54:06 2015
@@ -18,7 +18,6 @@ package org.apache.jackrabbit.oak.plugin
import java.io.Closeable;
import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -112,42 +111,6 @@ public class RDBConnectionHandler implem
}
/**
- * Closes a {@link Statement}, logging potential problems.
- * @return null
- */
- public <T extends Statement> T closeStatement(@CheckForNull T stmt) {
- if (stmt != null) {
- try {
- stmt.close();
- } catch (SQLException ex) {
- LOG.debug("Closing statement", ex);
- }
- }
- return null;
- }
-
- /**
- * Closes a {@link ResultSet}, logging potential problems.
- *
- * @return null
- */
- public ResultSet closeResultSet(@CheckForNull ResultSet rs) {
- if (rs != null) {
- try {
- rs.close();
- } catch (SQLException ex) {
- LOG.debug("Closing result set", ex);
- }
- }
-
- return null;
- }
-
- public boolean isClosed() {
- return this.ds == null;
- }
-
- /**
* Return current schema name or {@code null} when unavailable
*/
@CheckForNull
@@ -160,12 +123,17 @@ public class RDBConnectionHandler implem
}
}
+ public boolean isClosed() {
+ return this.ds == null;
+ }
+
@Override
public void close() throws IOException {
this.ds = null;
this.closedTime = System.currentTimeMillis();
}
+ @Nonnull
private DataSource getDataSource() throws IllegalStateException {
DataSource result = this.ds;
if (result == null) {
Modified:
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java?rev=1714183&r1=1714182&r2=1714183&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
(original)
+++
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStore.java
Fri Nov 13 10:54:06 2015
@@ -18,6 +18,9 @@ package org.apache.jackrabbit.oak.plugin
import static com.google.common.base.Preconditions.checkNotNull;
import static
org.apache.jackrabbit.oak.plugins.document.UpdateUtils.checkConditions;
+import static
org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.closeResultSet;
+import static
org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.closeStatement;
+import static
org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.createTableName;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -306,7 +309,7 @@ public class RDBDocumentStore implements
Connection connection = null;
PreparedStatement stmt = null;
ResultSet rs = null;
- String tableName = getTable(Collection.NODES);
+ String tableName = getTable(Collection.NODES).getName();
long result;
try {
connection = this.ch.getROConnection();
@@ -342,8 +345,8 @@ public class RDBDocumentStore implements
LOG.error("", ex);
throw new DocumentStoreException(ex);
} finally {
- this.ch.closeResultSet(rs);
- this.ch.closeStatement(stmt);
+ closeResultSet(rs);
+ closeStatement(stmt);
this.ch.closeConnection(connection);
}
}
@@ -379,10 +382,10 @@ public class RDBDocumentStore implements
}
// table names
- private static Map<Object, String> TABLEMAP;
+ private static Map<Collection<? extends Document>, String> TABLEMAP;
private static List<String> TABLENAMES;
static {
- Map<Object, String> tmp = new HashMap<Object, String>();
+ Map<Collection<? extends Document>, String> tmp = new
HashMap<Collection<? extends Document>, String>();
tmp.put(Collection.CLUSTER_NODES, "CLUSTERNODES");
tmp.put(Collection.JOURNAL, "JOURNAL");
tmp.put(Collection.NODES, "NODES");
@@ -397,6 +400,43 @@ public class RDBDocumentStore implements
return TABLENAMES;
}
+ /**
+ * Holds the data about a table that can vary: name, whether the primary
key
+ * is binary, and the estimated size of the "data" column.
+ */
+ private static class TableMetaData {
+
+ final String name;
+ boolean idIsBinary = false;
+ private int dataLimitInOctets = 16384;
+
+ public TableMetaData(String name) {
+ this.name = name;
+ }
+
+ public int getDataLimitInOctets() {
+ return this.dataLimitInOctets;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public boolean isIdBinary() {
+ return this.idIsBinary;
+ }
+
+ public void setIdIsBinary(boolean idIsBinary) {
+ this.idIsBinary = idIsBinary;
+ }
+
+ public void setDataLimitInOctets(int dataLimitInOctets) {
+ this.dataLimitInOctets = dataLimitInOctets;
+ }
+ }
+
+ private final Map<Collection<? extends Document>, TableMetaData> tableMeta
= new HashMap<Collection<? extends Document>, TableMetaData>();
+
@Override
public void dispose() {
if (!this.tablesToBeDropped.isEmpty()) {
@@ -416,7 +456,7 @@ public class RDBDocumentStore implements
} catch (SQLException ex) {
LOG.debug("attempting to drop: " + tname, ex);
} finally {
- this.ch.closeStatement(stmt);
+ closeStatement(stmt);
}
} catch (SQLException ex) {
LOG.debug("attempting to drop: " + tname, ex);
@@ -476,21 +516,12 @@ public class RDBDocumentStore implements
// from options
private Set<String> tablesToBeDropped = new HashSet<String>();
- // table names
- private String tnNodes, tnClusterNodes, tnSettings, tnJournal;
-
// ratio between Java characters and UTF-8 encoding
// a) single characters will fit into 3 bytes
// b) a surrogate pair (two Java characters) will fit into 4 bytes
// thus...
private static final int CHAR2OCTETRATIO = 3;
- // capacity of DATA column
- private int dataLimitInOctets = 16384;
-
- // whether the ID column is a binary type
- private boolean isIdBinary = false;
-
// number of retries for updates
private static final int RETRIES = 10;
@@ -516,10 +547,14 @@ public class RDBDocumentStore implements
private void initialize(DataSource ds, DocumentMK.Builder builder,
RDBOptions options) throws Exception {
- this.tnNodes = RDBJDBCTools.createTableName(options.getTablePrefix(),
TABLEMAP.get(Collection.NODES));
- this.tnClusterNodes =
RDBJDBCTools.createTableName(options.getTablePrefix(),
TABLEMAP.get(Collection.CLUSTER_NODES));
- this.tnSettings =
RDBJDBCTools.createTableName(options.getTablePrefix(),
TABLEMAP.get(Collection.SETTINGS));
- this.tnJournal =
RDBJDBCTools.createTableName(options.getTablePrefix(),
TABLEMAP.get(Collection.JOURNAL));
+ this.tableMeta.put(Collection.NODES,
+ new TableMetaData(createTableName(options.getTablePrefix(),
TABLEMAP.get(Collection.NODES))));
+ this.tableMeta.put(Collection.CLUSTER_NODES,
+ new TableMetaData(createTableName(options.getTablePrefix(),
TABLEMAP.get(Collection.CLUSTER_NODES))));
+ this.tableMeta.put(Collection.JOURNAL,
+ new TableMetaData(createTableName(options.getTablePrefix(),
TABLEMAP.get(Collection.JOURNAL))));
+ this.tableMeta.put(Collection.SETTINGS,
+ new TableMetaData(createTableName(options.getTablePrefix(),
TABLEMAP.get(Collection.SETTINGS))));
this.ch = new RDBConnectionHandler(ds);
this.callStack = LOG.isDebugEnabled() ? new Exception("call stack of
RDBDocumentStore creation") : null;
@@ -565,7 +600,7 @@ public class RDBDocumentStore implements
con.commit();
}
finally {
- this.ch.closeStatement(stmt);
+ closeStatement(stmt);
}
}
@@ -573,10 +608,14 @@ public class RDBDocumentStore implements
List<String> tablesPresent = new ArrayList<String>();
StringBuilder tableDiags = new StringBuilder();
try {
- createTableFor(con, Collection.CLUSTER_NODES, tablesCreated,
tablesPresent, tableDiags);
- createTableFor(con, Collection.NODES, tablesCreated,
tablesPresent, tableDiags);
- createTableFor(con, Collection.SETTINGS, tablesCreated,
tablesPresent, tableDiags);
- createTableFor(con, Collection.JOURNAL, tablesCreated,
tablesPresent, tableDiags);
+ createTableFor(con, Collection.CLUSTER_NODES,
this.tableMeta.get(Collection.CLUSTER_NODES), tablesCreated,
+ tablesPresent, tableDiags);
+ createTableFor(con, Collection.NODES,
this.tableMeta.get(Collection.NODES), tablesCreated, tablesPresent,
+ tableDiags);
+ createTableFor(con, Collection.SETTINGS,
this.tableMeta.get(Collection.SETTINGS), tablesCreated, tablesPresent,
+ tableDiags);
+ createTableFor(con, Collection.JOURNAL,
this.tableMeta.get(Collection.JOURNAL), tablesCreated, tablesPresent,
+ tableDiags);
} finally {
con.commit();
con.close();
@@ -590,7 +629,7 @@ public class RDBDocumentStore implements
tableDiags.insert(0, ", ");
}
- String diag = db.getAdditionalDiagnostics(this.ch, this.tnNodes);
+ String diag = db.getAdditionalDiagnostics(this.ch,
this.tableMeta.get(Collection.NODES).getName());
LOG.info("RDBDocumentStore (" + OakVersion.getVersion() + ")
instantiated for database " + dbDesc + ", using driver: "
+ driverDesc + ", connecting to: " + dbUrl + (diag.isEmpty() ?
"" : (", properties: " + diag))
@@ -608,14 +647,14 @@ public class RDBDocumentStore implements
return sqlType == Types.VARBINARY || sqlType == Types.BINARY ||
sqlType == Types.LONGVARBINARY;
}
- private void obtainFlagsFromResultSetMeta(ResultSetMetaData met) throws
SQLException {
+ private void obtainFlagsFromResultSetMeta(ResultSetMetaData met,
TableMetaData tmd) throws SQLException {
for (int i = 1; i <= met.getColumnCount(); i++) {
String lcName = met.getColumnName(i).toLowerCase(Locale.ENGLISH);
if ("id".equals(lcName)) {
- this.isIdBinary = isBinaryType(met.getColumnType(i));
+ tmd.setIdIsBinary(isBinaryType(met.getColumnType(i)));
}
if ("data".equals(lcName)) {
- this.dataLimitInOctets = met.getPrecision(i);
+ tmd.setDataLimitInOctets(met.getPrecision(i));
}
}
}
@@ -715,19 +754,20 @@ public class RDBDocumentStore implements
// well it was best-effort
return "";
} finally {
- this.ch.closeResultSet(rs);
+ closeResultSet(rs);
}
}
- private void createTableFor(Connection con, Collection<? extends Document>
col, List<String> tablesCreated,
+ private void createTableFor(Connection con, Collection<? extends Document>
col, TableMetaData tmd, List<String> tablesCreated,
List<String> tablesPresent, StringBuilder diagnostics) throws
SQLException {
String dbname = this.db.toString();
if (con.getMetaData().getURL() != null) {
dbname += " (" + con.getMetaData().getURL() + ")";
}
- String tableName = getTable(col);
+ String tableName = tmd.getName();
+
+ PreparedStatement checkStatement = null, checkStatement2 = null;
- PreparedStatement checkStatement = null;
ResultSet checkResultSet = null;
Statement creatStatement = null;
try {
@@ -735,10 +775,11 @@ public class RDBDocumentStore implements
checkStatement.setString(1, "0:/");
checkResultSet = checkStatement.executeQuery();
- if (col.equals(Collection.NODES)) {
- // try to discover size of DATA column
- ResultSetMetaData met = checkResultSet.getMetaData();
- obtainFlagsFromResultSetMeta(met);
+ // try to discover size of DATA column and binary-ness of ID
+ ResultSetMetaData met = checkResultSet.getMetaData();
+ obtainFlagsFromResultSetMeta(met, tmd);
+
+ if (col == Collection.NODES) {
String tableInfo = RDBJDBCTools.dumpResultSetMeta(met);
diagnostics.append(tableInfo);
String indexInfo = dumpIndexData(con.getMetaData(), met,
tableName);
@@ -766,12 +807,14 @@ public class RDBDocumentStore implements
tablesCreated.add(tableName);
- if (col.equals(Collection.NODES)) {
- PreparedStatement pstmt = con.prepareStatement("select *
from " + tableName + " where ID = ?");
- pstmt.setString(1, "0:/");
- ResultSet rs = pstmt.executeQuery();
- ResultSetMetaData met = rs.getMetaData();
- obtainFlagsFromResultSetMeta(met);
+ checkStatement2 = con.prepareStatement("select * from " +
tableName + " where ID = ?");
+ checkStatement2.setString(1, "0:/");
+ ResultSet rs = checkStatement2.executeQuery();
+ // try to discover size of DATA column and binary-ness of ID
+ ResultSetMetaData met = rs.getMetaData();
+ obtainFlagsFromResultSetMeta(met, tmd);
+
+ if (col == Collection.NODES) {
String tableInfo = RDBJDBCTools.dumpResultSetMeta(met);
diagnostics.append(tableInfo);
String indexInfo = dumpIndexData(con.getMetaData(), met,
tableName);
@@ -786,9 +829,10 @@ public class RDBDocumentStore implements
}
}
finally {
- this.ch.closeResultSet(checkResultSet);
- this.ch.closeStatement(checkStatement);
- this.ch.closeStatement(creatStatement);
+ closeResultSet(checkResultSet);
+ closeStatement(checkStatement);
+ closeStatement(checkStatement2);
+ closeStatement(creatStatement);
}
}
@@ -1049,12 +1093,11 @@ public class RDBDocumentStore implements
}
Connection connection = null;
- String tableName = getTable(collection);
+ TableMetaData tmd = getTable(collection);
boolean success = false;
try {
connection = this.ch.getRWConnection();
- success = dbBatchedAppendingUpdate(connection, tableName,
chunkedIds, modified, modifiedIsConditional,
- appendData);
+ success = dbBatchedAppendingUpdate(connection, tmd,
chunkedIds, modified, modifiedIsConditional, appendData);
connection.commit();
} catch (SQLException ex) {
success = false;
@@ -1170,7 +1213,7 @@ public class RDBDocumentStore implements
private <T extends Document> List<T> internalQuery(Collection<T>
collection, String fromKey, String toKey,
String indexedProperty, long startValue, int limit) {
Connection connection = null;
- String tableName = getTable(collection);
+ TableMetaData tmd = getTable(collection);
if (indexedProperty != null &&
(!INDEXEDPROPERTIES.contains(indexedProperty))) {
String message = "indexed property " + indexedProperty + " not
supported, query was '>= '" + startValue
+ "'; supported properties are " + INDEXEDPROPERTIES;
@@ -1182,7 +1225,9 @@ public class RDBDocumentStore implements
QueryContext qp = new QueryContext(fromKey, toKey);
qmap.put(Thread.currentThread(), qp);
connection = this.ch.getROConnection();
- List<RDBRow> dbresult = dbQuery(connection, tableName, fromKey,
toKey, indexedProperty, startValue, limit);
+ String from = collection == Collection.NODES &&
NodeDocument.MIN_ID_VALUE.equals(fromKey) ? null : fromKey;
+ String to = collection == Collection.NODES &&
NodeDocument.MAX_ID_VALUE.equals(toKey) ? null : toKey;
+ List<RDBRow> dbresult = dbQuery(connection, tmd, from, to,
indexedProperty, startValue, limit);
connection.commit();
int size = dbresult.size();
@@ -1203,15 +1248,11 @@ public class RDBDocumentStore implements
}
}
- private <T extends Document> String getTable(Collection<T> collection) {
- if (collection == Collection.CLUSTER_NODES) {
- return this.tnClusterNodes;
- } else if (collection == Collection.NODES) {
- return this.tnNodes;
- } else if (collection == Collection.SETTINGS) {
- return this.tnSettings;
- } else if (collection == Collection.JOURNAL) {
- return this.tnJournal;
+ @Nonnull
+ private <T extends Document> TableMetaData getTable(Collection<T>
collection) {
+ TableMetaData tmd = this.tableMeta.get(collection);
+ if (tmd != null) {
+ return tmd;
} else {
throw new IllegalArgumentException("Unknown collection: " +
collection.toString());
}
@@ -1220,14 +1261,14 @@ public class RDBDocumentStore implements
@CheckForNull
private <T extends Document> T readDocumentUncached(Collection<T>
collection, String id, NodeDocument cachedDoc) {
Connection connection = null;
- String tableName = getTable(collection);
+ TableMetaData tmd = getTable(collection);
try {
long lastmodcount = -1;
if (cachedDoc != null) {
lastmodcount = modcountOf(cachedDoc);
}
connection = this.ch.getROConnection();
- RDBRow row = dbRead(connection, tableName, id, lastmodcount);
+ RDBRow row = dbRead(connection, tmd, id, lastmodcount);
connection.commit();
if (row == null) {
return null;
@@ -1249,10 +1290,10 @@ public class RDBDocumentStore implements
private <T extends Document> void delete(Collection<T> collection, String
id) {
Connection connection = null;
- String tableName = getTable(collection);
+ TableMetaData tmd = getTable(collection);
try {
connection = this.ch.getRWConnection();
- dbDelete(connection, tableName, Collections.singletonList(id));
+ dbDelete(connection, tmd, Collections.singletonList(id));
connection.commit();
} catch (Exception ex) {
throw new DocumentStoreException(ex);
@@ -1263,12 +1304,12 @@ public class RDBDocumentStore implements
private <T extends Document> int delete(Collection<T> collection,
List<String> ids) {
int numDeleted = 0;
+ TableMetaData tmd = getTable(collection);
for (List<String> sublist : Lists.partition(ids, 64)) {
Connection connection = null;
- String tableName = getTable(collection);
try {
connection = this.ch.getRWConnection();
- numDeleted += dbDelete(connection, tableName, sublist);
+ numDeleted += dbDelete(connection, tmd, sublist);
connection.commit();
} catch (Exception ex) {
throw new DocumentStoreException(ex);
@@ -1282,7 +1323,7 @@ public class RDBDocumentStore implements
private <T extends Document> int delete(Collection<T> collection,
Map<String, Map<Key, Condition>>
toRemove) {
int numDeleted = 0;
- String tableName = getTable(collection);
+ TableMetaData tmd = getTable(collection);
Map<String, Map<Key, Condition>> subMap = Maps.newHashMap();
Iterator<Entry<String, Map<Key, Condition>>> it =
toRemove.entrySet().iterator();
while (it.hasNext()) {
@@ -1292,7 +1333,7 @@ public class RDBDocumentStore implements
Connection connection = null;
try {
connection = this.ch.getRWConnection();
- numDeleted += dbDelete(connection, tableName, subMap);
+ numDeleted += dbDelete(connection, tmd, subMap);
connection.commit();
} catch (Exception ex) {
throw DocumentStoreException.convert(ex);
@@ -1308,7 +1349,7 @@ public class RDBDocumentStore implements
private <T extends Document> boolean updateDocument(@Nonnull Collection<T>
collection, @Nonnull T document,
@Nonnull UpdateOp update, Long oldmodcount) {
Connection connection = null;
- String tableName = getTable(collection);
+ TableMetaData tmd = getTable(collection);
String data = null;
try {
connection = this.ch.getRWConnection();
@@ -1326,9 +1367,9 @@ public class RDBDocumentStore implements
// every 16th update is a full rewrite
if (isAppendableUpdate(update) && modcount % 16 != 0) {
String appendData = SR.asString(update);
- if (appendData.length() < this.dataLimitInOctets /
CHAR2OCTETRATIO) {
+ if (appendData.length() < tmd.getDataLimitInOctets() /
CHAR2OCTETRATIO) {
try {
- success = dbAppendingUpdate(connection, tableName,
document.getId(), modified, modifiedIsConditional, hasBinary, deletedOnce,
+ success = dbAppendingUpdate(connection, tmd,
document.getId(), modified, modifiedIsConditional, hasBinary, deletedOnce,
modcount, cmodcount, oldmodcount, appendData);
connection.commit();
} catch (SQLException ex) {
@@ -1340,7 +1381,7 @@ public class RDBDocumentStore implements
}
if (!success) {
data = SR.asString(document);
- success = dbUpdate(connection, tableName, document.getId(),
modified, hasBinary, deletedOnce, modcount, cmodcount,
+ success = dbUpdate(connection, tmd, document.getId(),
modified, hasBinary, deletedOnce, modcount, cmodcount,
oldmodcount, data);
connection.commit();
}
@@ -1351,7 +1392,7 @@ public class RDBDocumentStore implements
if (RDBJDBCTools.matchesSQLState(ex, "22", "72")) {
byte[] bytes = asBytes(data);
addDiags = String.format(" (DATA size in Java characters: %d,
in octets: %d, computed character limit: %d)",
- data.length(), bytes.length, this.dataLimitInOctets /
CHAR2OCTETRATIO);
+ data.length(), bytes.length,
tmd.getDataLimitInOctets() / CHAR2OCTETRATIO);
}
String message = String.format("Update for %s failed%s",
document.getId(), addDiags);
LOG.debug(message, ex);
@@ -1392,10 +1433,10 @@ public class RDBDocumentStore implements
private <T extends Document> boolean insertDocuments(Collection<T>
collection, List<T> documents) {
Connection connection = null;
- String tableName = getTable(collection);
+ TableMetaData tmd = getTable(collection);
try {
connection = this.ch.getRWConnection();
- boolean result = dbInsert(connection, tableName, documents);
+ boolean result = dbInsert(connection, tmd, documents);
connection.commit();
return result;
} catch (SQLException ex) {
@@ -1434,7 +1475,7 @@ public class RDBDocumentStore implements
String m = String
.format(" (potential cause: long data for ID %s -
longest octet DATA size in Java characters: %d, in octets: %d, computed
character limit: %d)",
- id, longest, longestChars,
this.dataLimitInOctets / CHAR2OCTETRATIO);
+ id, longest, longestChars,
tmd.getDataLimitInOctets() / CHAR2OCTETRATIO);
messages += m;
}
@@ -1493,8 +1534,8 @@ public class RDBDocumentStore implements
}
}
- private void setIdInStatement(PreparedStatement stmt, int idx, String id)
throws SQLException {
- if (this.isIdBinary) {
+ private static void setIdInStatement(TableMetaData tmd, PreparedStatement
stmt, int idx, String id) throws SQLException {
+ if (tmd.isIdBinary()) {
try {
stmt.setBytes(idx, id.getBytes("UTF-8"));
} catch (UnsupportedEncodingException ex) {
@@ -1506,8 +1547,8 @@ public class RDBDocumentStore implements
}
}
- private String getIdFromRS(ResultSet rs, int idx) throws SQLException {
- if (this.isIdBinary) {
+ private static String getIdFromRS(TableMetaData tmd, ResultSet rs, int
idx) throws SQLException {
+ if (tmd.isIdBinary()) {
try {
return new String(rs.getBytes(idx), "UTF-8");
} catch (UnsupportedEncodingException ex) {
@@ -1520,7 +1561,7 @@ public class RDBDocumentStore implements
}
@CheckForNull
- private RDBRow dbRead(Connection connection, String tableName, String id,
long lastmodcount) throws SQLException {
+ private RDBRow dbRead(Connection connection, TableMetaData tmd, String id,
long lastmodcount) throws SQLException {
PreparedStatement stmt;
boolean useCaseStatement = lastmodcount != -1 &&
this.db.allowsCaseInSelect();
@@ -1529,12 +1570,12 @@ public class RDBDocumentStore implements
// sent in case we already have it
stmt = connection
.prepareStatement("select MODIFIED, MODCOUNT, CMODCOUNT,
HASBINARY, DELETEDONCE, case MODCOUNT when ? then null else DATA end as DATA, "
- + "case MODCOUNT when ? then null else BDATA end
as BDATA from " + tableName + " where ID = ?");
+ + "case MODCOUNT when ? then null else BDATA end
as BDATA from " + tmd.getName() + " where ID = ?");
} else {
// either we don't have a previous version of the document
// or the database does not support CASE in SELECT
stmt = connection.prepareStatement("select MODIFIED, MODCOUNT,
CMODCOUNT, HASBINARY, DELETEDONCE, DATA, BDATA from "
- + tableName + " where ID = ?");
+ + tmd.getName() + " where ID = ?");
}
try {
@@ -1543,7 +1584,7 @@ public class RDBDocumentStore implements
stmt.setLong(si++, lastmodcount);
stmt.setLong(si++, lastmodcount);
}
- setIdInStatement(stmt, si, id);
+ setIdInStatement(tmd, stmt, si, id);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
@@ -1573,25 +1614,23 @@ public class RDBDocumentStore implements
}
}
- private List<RDBRow> dbQuery(Connection connection, String tableName,
String minId, String maxId, String indexedProperty,
+ private List<RDBRow> dbQuery(Connection connection, TableMetaData tmd,
String minId, String maxId, String indexedProperty,
long startValue, int limit) throws SQLException {
- boolean noLowerBound = tableName.equals(this.tnNodes) &&
minId.equals(NodeDocument.MIN_ID_VALUE);
- boolean noUpperBound = tableName.equals(this.tnNodes) &&
maxId.equals(NodeDocument.MAX_ID_VALUE);
long start = System.currentTimeMillis();
StringBuilder selectClause = new StringBuilder();
StringBuilder whereClause = new StringBuilder();
if (limit != Integer.MAX_VALUE && this.db.getFetchFirstSyntax() ==
FETCHFIRSTSYNTAX.TOP) {
selectClause.append("TOP " + limit + " ");
}
- selectClause.append("ID, MODIFIED, MODCOUNT, CMODCOUNT, HASBINARY,
DELETEDONCE, DATA, BDATA from ").append(tableName);
+ selectClause.append("ID, MODIFIED, MODCOUNT, CMODCOUNT, HASBINARY,
DELETEDONCE, DATA, BDATA from ").append(tmd.getName());
// dynamically build where clause
String whereSep = "";
- if (!noLowerBound) {
+ if (minId != null) {
whereClause.append("ID > ?");
whereSep = " and ";
}
- if (!noUpperBound) {
+ if (maxId != null) {
whereClause.append(whereSep).append("ID < ?");
whereSep = " and ";
}
@@ -1640,11 +1679,11 @@ public class RDBDocumentStore implements
long dataTotal = 0, bdataTotal = 0;
try {
int si = 1;
- if (!noLowerBound) {
- setIdInStatement(stmt, si++, minId);
+ if (minId != null) {
+ setIdInStatement(tmd, stmt, si++, minId);
}
- if (!noUpperBound) {
- setIdInStatement(stmt, si++, maxId);
+ if (maxId != null) {
+ setIdInStatement(tmd, stmt, si++, maxId);
}
if (MODIFIED.equals(indexedProperty)) {
@@ -1655,11 +1694,11 @@ public class RDBDocumentStore implements
}
ResultSet rs = stmt.executeQuery();
while (rs.next() && result.size() < limit) {
- String id = getIdFromRS(rs, 1);
+ String id = getIdFromRS(tmd, rs, 1);
- if (id.compareTo(minId) < 0 || id.compareTo(maxId) > 0) {
- throw new DocumentStoreException("unexpected query result:
'" + minId + "' < '" + id + "' < '" + maxId
- + "' - broken DB collation?");
+ if ((minId != null && id.compareTo(minId) < 0) || (maxId !=
null && id.compareTo(maxId) > 0)) {
+ throw new DocumentStoreException(
+ "unexpected query result: '" + minId + "' < '" +
id + "' < '" + maxId + "' - broken DB collation?");
}
long modified = rs.getLong(2);
long modcount = rs.getLong(3);
@@ -1691,10 +1730,10 @@ public class RDBDocumentStore implements
return result;
}
- private boolean dbUpdate(Connection connection, String tableName, String
id, Long modified, Boolean hasBinary,
+ private boolean dbUpdate(Connection connection, TableMetaData tmd, String
id, Long modified, Boolean hasBinary,
Boolean deletedOnce, Long modcount, Long cmodcount, Long
oldmodcount, String data) throws SQLException {
String t = "update "
- + tableName
+ + tmd.getName()
+ " set MODIFIED = ?, HASBINARY = ?, DELETEDONCE = ?, MODCOUNT
= ?, CMODCOUNT = ?, DSIZE = ?, DATA = ?, BDATA = ? where ID = ?";
if (oldmodcount != null) {
t += " and MODCOUNT = ?";
@@ -1709,7 +1748,7 @@ public class RDBDocumentStore implements
stmt.setObject(si++, cmodcount == null ? Long.valueOf(0) :
cmodcount, Types.BIGINT);
stmt.setObject(si++, data.length(), Types.BIGINT);
- if (data.length() < this.dataLimitInOctets / CHAR2OCTETRATIO) {
+ if (data.length() < tmd.getDataLimitInOctets() / CHAR2OCTETRATIO) {
stmt.setString(si++, data);
stmt.setBinaryStream(si++, null, 0);
} else {
@@ -1718,14 +1757,14 @@ public class RDBDocumentStore implements
stmt.setBytes(si++, bytes);
}
- setIdInStatement(stmt, si++, id);
+ setIdInStatement(tmd, stmt, si++, id);
if (oldmodcount != null) {
stmt.setObject(si++, oldmodcount, Types.BIGINT);
}
int result = stmt.executeUpdate();
if (result != 1) {
- LOG.debug("DB update failed for " + tableName + "/" + id + "
with oldmodcount=" + oldmodcount);
+ LOG.debug("DB update failed for " + tmd.getName() + "/" + id +
" with oldmodcount=" + oldmodcount);
}
return result == 1;
} finally {
@@ -1733,14 +1772,14 @@ public class RDBDocumentStore implements
}
}
- private boolean dbAppendingUpdate(Connection connection, String tableName,
String id, Long modified,
+ private boolean dbAppendingUpdate(Connection connection, TableMetaData
tmd, String id, Long modified,
boolean setModifiedConditionally, Boolean hasBinary, Boolean
deletedOnce, Long modcount, Long cmodcount,
Long oldmodcount, String appendData) throws SQLException {
StringBuilder t = new StringBuilder();
- t.append("update " + tableName + " set ");
+ t.append("update " + tmd.getName() + " set ");
t.append(setModifiedConditionally ? "MODIFIED = case when ? > MODIFIED
then ? else MODIFIED end, " : "MODIFIED = ?, ");
t.append("HASBINARY = ?, DELETEDONCE = ?, MODCOUNT = ?, CMODCOUNT = ?,
DSIZE = DSIZE + ?, ");
- t.append("DATA = " +
this.db.getConcatQueryString(this.dataLimitInOctets, appendData.length()) + "
");
+ t.append("DATA = " +
this.db.getConcatQueryString(tmd.getDataLimitInOctets(), appendData.length()) +
" ");
t.append("where ID = ?");
if (oldmodcount != null) {
t.append(" and MODCOUNT = ?");
@@ -1758,14 +1797,14 @@ public class RDBDocumentStore implements
stmt.setObject(si++, cmodcount == null ? Long.valueOf(0) :
cmodcount, Types.BIGINT);
stmt.setObject(si++, 1 + appendData.length(), Types.BIGINT);
stmt.setString(si++, "," + appendData);
- setIdInStatement(stmt, si++, id);
+ setIdInStatement(tmd, stmt, si++, id);
if (oldmodcount != null) {
stmt.setObject(si++, oldmodcount, Types.BIGINT);
}
int result = stmt.executeUpdate();
if (result != 1) {
- LOG.debug("DB append update failed for " + tableName + "/" +
id + " with oldmodcount=" + oldmodcount);
+ LOG.debug("DB append update failed for " + tmd.getName() + "/"
+ id + " with oldmodcount=" + oldmodcount);
}
return result == 1;
} finally {
@@ -1773,14 +1812,14 @@ public class RDBDocumentStore implements
}
}
- private boolean dbBatchedAppendingUpdate(Connection connection, String
tableName, List<String> ids, Long modified,
+ private boolean dbBatchedAppendingUpdate(Connection connection,
TableMetaData tmd, List<String> ids, Long modified,
boolean setModifiedConditionally,
String appendData) throws SQLException {
StringBuilder t = new StringBuilder();
- t.append("update " + tableName + " set ");
+ t.append("update " + tmd.getName() + " set ");
t.append(setModifiedConditionally ? "MODIFIED = case when ? > MODIFIED
then ? else MODIFIED end, " : "MODIFIED = ?, ");
t.append("MODCOUNT = MODCOUNT + 1, DSIZE = DSIZE + ?, ");
- t.append("DATA = " +
this.db.getConcatQueryString(this.dataLimitInOctets, appendData.length()) + "
");
+ t.append("DATA = " +
this.db.getConcatQueryString(tmd.getDataLimitInOctets(), appendData.length()) +
" ");
t.append("where ID in (");
for (int i = 0; i < ids.size(); i++) {
if (i != 0) {
@@ -1799,11 +1838,11 @@ public class RDBDocumentStore implements
stmt.setObject(si++, 1 + appendData.length(), Types.BIGINT);
stmt.setString(si++, "," + appendData);
for (String id : ids) {
- setIdInStatement(stmt, si++, id);
+ setIdInStatement(tmd, stmt, si++, id);
}
int result = stmt.executeUpdate();
if (result != ids.size()) {
- LOG.debug("DB update failed: only " + result + " of " +
ids.size() + " updated. Table: " + tableName + ", IDs:"
+ LOG.debug("DB update failed: only " + result + " of " +
ids.size() + " updated. Table: " + tmd.getName() + ", IDs:"
+ ids);
}
return result == ids.size();
@@ -1812,9 +1851,9 @@ public class RDBDocumentStore implements
}
}
- private <T extends Document> boolean dbInsert(Connection connection,
String tableName, List<T> documents) throws SQLException {
+ private <T extends Document> boolean dbInsert(Connection connection,
TableMetaData tmd, List<T> documents) throws SQLException {
- PreparedStatement stmt = connection.prepareStatement("insert into " +
tableName +
+ PreparedStatement stmt = connection.prepareStatement("insert into " +
tmd.getName() +
"(ID, MODIFIED, HASBINARY, DELETEDONCE, MODCOUNT, CMODCOUNT,
DSIZE, DATA, BDATA) " +
"values (?, ?, ?, ?, ?, ?, ?, ?, ?)");
@@ -1827,14 +1866,14 @@ public class RDBDocumentStore implements
Long cmodcount = (Long) document.get(COLLISIONSMODCOUNT);
int si = 1;
- setIdInStatement(stmt, si++, id);
+ setIdInStatement(tmd, stmt, si++, id);
stmt.setObject(si++, document.get(MODIFIED), Types.BIGINT);
stmt.setObject(si++, (hasBinary != null &&
hasBinary.intValue() == NodeDocument.HAS_BINARY_VAL) ? 1 : 0, Types.SMALLINT);
stmt.setObject(si++, (deletedOnce != null && deletedOnce) ? 1
: 0, Types.SMALLINT);
stmt.setObject(si++, document.get(MODCOUNT), Types.BIGINT);
stmt.setObject(si++, cmodcount == null ? Long.valueOf(0) :
cmodcount, Types.BIGINT);
stmt.setObject(si++, data.length(), Types.BIGINT);
- if (data.length() < this.dataLimitInOctets / CHAR2OCTETRATIO) {
+ if (data.length() < tmd.getDataLimitInOctets() /
CHAR2OCTETRATIO) {
stmt.setString(si++, data);
stmt.setBinaryStream(si++, null, 0);
} else {
@@ -1849,7 +1888,7 @@ public class RDBDocumentStore implements
for (int i = 0; i < documents.size(); i++) {
int result = results[i];
if (result != 1 && result != Statement.SUCCESS_NO_INFO) {
- LOG.error("DB insert failed for {}: {}", tableName,
documents.get(i).getId());
+ LOG.error("DB insert failed for {}: {}", tmd.getName(),
documents.get(i).getId());
success = false;
}
}
@@ -1859,13 +1898,13 @@ public class RDBDocumentStore implements
}
}
- private int dbDelete(Connection connection, String tableName, List<String>
ids) throws SQLException {
+ private int dbDelete(Connection connection, TableMetaData tmd,
List<String> ids) throws SQLException {
PreparedStatement stmt;
int cnt = ids.size();
if (cnt == 1) {
- stmt = connection.prepareStatement("delete from " + tableName + "
where ID=?");
+ stmt = connection.prepareStatement("delete from " + tmd.getName()
+ " where ID=?");
} else {
StringBuilder inClause = new StringBuilder();
for (int i = 0; i < cnt; i++) {
@@ -1874,16 +1913,16 @@ public class RDBDocumentStore implements
inClause.append(',');
}
}
- stmt = connection.prepareStatement("delete from " + tableName + "
where ID in (" + inClause.toString() + ")");
+ stmt = connection.prepareStatement("delete from " + tmd.getName()
+ " where ID in (" + inClause.toString() + ")");
}
try {
for (int i = 0; i < cnt; i++) {
- setIdInStatement(stmt, i + 1, ids.get(i));
+ setIdInStatement(tmd, stmt, i + 1, ids.get(i));
}
int result = stmt.executeUpdate();
if (result != cnt) {
- LOG.debug("DB delete failed for " + tableName + "/" + ids);
+ LOG.debug("DB delete failed for " + tmd.getName() + "/" + ids);
}
return result;
} finally {
@@ -1891,7 +1930,7 @@ public class RDBDocumentStore implements
}
}
- private int dbDelete(Connection connection, String tableName,
+ private int dbDelete(Connection connection, TableMetaData tmd,
Map<String, Map<Key, Condition>> toDelete)
throws SQLException, DocumentStoreException {
String or = "";
@@ -1919,11 +1958,11 @@ public class RDBDocumentStore implements
}
PreparedStatement stmt= connection.prepareStatement(
- "delete from " + tableName + " where " + whereClause);
+ "delete from " + tmd.getName() + " where " + whereClause);
try {
int i = 1;
for (Entry<String, Map<Key, Condition>> entry :
toDelete.entrySet()) {
- setIdInStatement(stmt, i++, entry.getKey());
+ setIdInStatement(tmd, stmt, i++, entry.getKey());
for (Entry<Key, Condition> c : entry.getValue().entrySet()) {
if (c.getValue().type == Condition.Type.EQUALS) {
stmt.setLong(i++, (Long) c.getValue().value);
Modified:
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java?rev=1714183&r1=1714182&r2=1714183&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
(original)
+++
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreDB.java
Fri Nov 13 10:54:06 2015
@@ -16,6 +16,9 @@
*/
package org.apache.jackrabbit.oak.plugins.document.rdb;
+import static
org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.closeResultSet;
+import static
org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.closeStatement;
+
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
@@ -96,8 +99,8 @@ public enum RDBDocumentStoreDB {
} catch (SQLException ex) {
LOG.debug("while getting diagnostics", ex);
} finally {
- ch.closeResultSet(rs);
- ch.closeStatement(stmt);
+ closeResultSet(rs);
+ closeStatement(stmt);
ch.closeConnection(con);
}
return result.toString();
@@ -162,8 +165,8 @@ public enum RDBDocumentStoreDB {
} catch (SQLException ex) {
LOG.debug("while getting diagnostics", ex);
} finally {
- ch.closeResultSet(rs);
- ch.closeStatement(stmt);
+ closeResultSet(rs);
+ closeStatement(stmt);
ch.closeConnection(con);
}
return result.toString();
@@ -208,8 +211,8 @@ public enum RDBDocumentStoreDB {
} catch (SQLException ex) {
LOG.debug("while getting diagnostics", ex);
} finally {
- ch.closeResultSet(rs);
- ch.closeStatement(stmt);
+ closeResultSet(rs);
+ closeStatement(stmt);
ch.closeConnection(con);
}
return result.toString();
@@ -264,8 +267,8 @@ public enum RDBDocumentStoreDB {
} catch (SQLException ex) {
LOG.debug("while getting diagnostics", ex);
} finally {
- ch.closeResultSet(rs);
- ch.closeStatement(stmt);
+ closeResultSet(rs);
+ closeStatement(stmt);
ch.closeConnection(con);
}
return result.toString();
@@ -325,8 +328,8 @@ public enum RDBDocumentStoreDB {
} catch (SQLException ex) {
LOG.debug("while getting diagnostics", ex);
} finally {
- ch.closeResultSet(rs);
- ch.closeStatement(stmt);
+ closeResultSet(rs);
+ closeStatement(stmt);
ch.closeConnection(con);
}
return result.toString();
Modified:
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java?rev=1714183&r1=1714182&r2=1714183&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
(original)
+++
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBJDBCTools.java
Fri Nov 13 10:54:06 2015
@@ -18,8 +18,10 @@ package org.apache.jackrabbit.oak.plugin
import java.sql.Connection;
import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
+import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
@@ -27,13 +29,18 @@ import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
+import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
+import org.slf4j.LoggerFactory;
+
/**
* Convenience methods dealing with JDBC specifics.
*/
public class RDBJDBCTools {
+ private static final org.slf4j.Logger LOG =
LoggerFactory.getLogger(RDBJDBCTools.class);
+
protected static String jdbctype(String jdbcurl) {
if (jdbcurl == null) {
return null;
@@ -202,4 +209,35 @@ public class RDBJDBCTools {
return "";
}
}
+
+ /**
+ * Closes a {@link Statement}, logging potential problems.
+ * @return null
+ */
+ protected static <T extends Statement> T closeStatement(@CheckForNull T
stmt) {
+ if (stmt != null) {
+ try {
+ stmt.close();
+ } catch (SQLException ex) {
+ LOG.debug("Closing statement", ex);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Closes a {@link ResultSet}, logging potential problems.
+ * @return null
+ */
+ protected static ResultSet closeResultSet(@CheckForNull ResultSet rs) {
+ if (rs != null) {
+ try {
+ rs.close();
+ } catch (SQLException ex) {
+ LOG.debug("Closing result set", ex);
+ }
+ }
+
+ return null;
+ }
}
Modified:
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java?rev=1714183&r1=1714182&r2=1714183&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java
(original)
+++
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBBlobStoreFriend.java
Fri Nov 13 10:54:06 2015
@@ -16,6 +16,8 @@
*/
package org.apache.jackrabbit.oak.plugins.document.rdb;
+import static
org.apache.jackrabbit.oak.plugins.document.rdb.RDBJDBCTools.closeStatement;
+
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -40,10 +42,8 @@ public class RDBBlobStoreFriend {
prepDelMeta = con.prepareStatement("delete from " + ds.tnMeta + "
where ID = ?");
prepDelMeta.setString(1, id);
prepDelMeta.execute();
- prepDelMeta.close();
- prepDelMeta = null;
} finally {
- ds.ch.closeStatement(prepDelMeta);
+ closeStatement(prepDelMeta);
con.commit();
ds.ch.closeConnection(con);
}