You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2015/04/26 01:44:55 UTC
[9/9] incubator-calcite git commit: [CALCITE-699] In Avatica,
synchronize access to Calendar
[CALCITE-699] In Avatica, synchronize access to Calendar
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/a357e910
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/a357e910
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/a357e910
Branch: refs/heads/master
Commit: a357e910809da869e2edbad68f35346b1f5498fd
Parents: ec4b290
Author: Julian Hyde <jh...@apache.org>
Authored: Fri Apr 24 12:11:30 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Apr 24 16:06:25 2015 -0700
----------------------------------------------------------------------
.../avatica/AvaticaPreparedStatement.java | 44 ++++++++++----------
.../org/apache/calcite/avatica/AvaticaSite.java | 11 ++++-
.../calcite/avatica/util/AbstractCursor.java | 21 +++-------
3 files changed, 38 insertions(+), 38 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a357e910/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
index 4656af8..0410cfe 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaPreparedStatement.java
@@ -86,7 +86,17 @@ public abstract class AvaticaPreparedStatement
* time this method is called.
*
* <p>Uses the calendar to offset date-time values when calling methods such
- * as {@link #setDate(int, Date)}. */
+ * as {@link #setDate(int, Date)}.
+ *
+ * <p>A note on thread-safety. This method does not strictly need to be
+ * {@code synchronized}, because JDBC does not promise thread safety if
+ * different threads are accessing the same statement, or even different
+ * objects within a particular connection.
+ *
+ * <p>The calendar returned is to be used only within this statement, and
+ * JDBC only allows access to a statement from within one thread, so
+ * therefore does not need to be synchronized when accessed.
+ */
protected synchronized Calendar getCalendar() {
if (calendar == null) {
calendar = Calendar.getInstance(connection.getTimeZone());
@@ -156,20 +166,17 @@ public abstract class AvaticaPreparedStatement
public void setAsciiStream(int parameterIndex, InputStream x, int length)
throws SQLException {
- getSite(parameterIndex)
- .setAsciiStream(x, length);
+ getSite(parameterIndex).setAsciiStream(x, length);
}
public void setUnicodeStream(int parameterIndex, InputStream x, int length)
throws SQLException {
- getSite(parameterIndex)
- .setUnicodeStream(x, length);
+ getSite(parameterIndex).setUnicodeStream(x, length);
}
public void setBinaryStream(int parameterIndex, InputStream x, int length)
throws SQLException {
- getSite(parameterIndex)
- .setBinaryStream(x, length);
+ getSite(parameterIndex).setBinaryStream(x, length);
}
public void clearParameters() throws SQLException {
@@ -180,8 +187,7 @@ public abstract class AvaticaPreparedStatement
public void setObject(int parameterIndex, Object x, int targetSqlType)
throws SQLException {
- getSite(parameterIndex)
- .setObject(x, targetSqlType, getCalendar());
+ getSite(parameterIndex).setObject(x, targetSqlType);
}
public void setObject(int parameterIndex, Object x) throws SQLException {
@@ -201,8 +207,7 @@ public abstract class AvaticaPreparedStatement
public void setCharacterStream(int parameterIndex, Reader reader, int length)
throws SQLException {
- getSite(parameterIndex)
- .setCharacterStream(reader, length);
+ getSite(parameterIndex).setCharacterStream(reader, length);
}
public void setRef(int parameterIndex, Ref x) throws SQLException {
@@ -227,8 +232,7 @@ public abstract class AvaticaPreparedStatement
public void setDate(int parameterIndex, Date x, Calendar calendar)
throws SQLException {
- getSite(parameterIndex)
- .setDate(x, calendar);
+ getSite(parameterIndex).setDate(x, calendar);
}
public void setDate(int parameterIndex, Date x) throws SQLException {
@@ -237,8 +241,7 @@ public abstract class AvaticaPreparedStatement
public void setTime(int parameterIndex, Time x, Calendar calendar)
throws SQLException {
- getSite(parameterIndex)
- .setTime(x, calendar);
+ getSite(parameterIndex).setTime(x, calendar);
}
public void setTime(int parameterIndex, Time x) throws SQLException {
@@ -247,8 +250,7 @@ public abstract class AvaticaPreparedStatement
public void setTimestamp(int parameterIndex, Timestamp x, Calendar calendar)
throws SQLException {
- getSite(parameterIndex)
- .setTimestamp(x, calendar);
+ getSite(parameterIndex).setTimestamp(x, calendar);
}
public void setTimestamp(int parameterIndex, Timestamp x)
@@ -258,8 +260,7 @@ public abstract class AvaticaPreparedStatement
public void setNull(int parameterIndex, int sqlType, String typeName)
throws SQLException {
- getSite(parameterIndex)
- .setNull(sqlType, typeName);
+ getSite(parameterIndex).setNull(sqlType, typeName);
}
public void setURL(int parameterIndex, URL x) throws SQLException {
@@ -268,8 +269,7 @@ public abstract class AvaticaPreparedStatement
public void setObject(int parameterIndex, Object x, int targetSqlType,
int scaleOrLength) throws SQLException {
- getSite(parameterIndex)
- .setObject(x, targetSqlType, scaleOrLength);
+ getSite(parameterIndex).setObject(x, targetSqlType, scaleOrLength);
}
// implement ParameterMetaData
@@ -287,7 +287,7 @@ public abstract class AvaticaPreparedStatement
protected AvaticaSite getSite(int param) throws SQLException {
final AvaticaParameter parameter = getParameter(param);
- return new AvaticaSite(parameter, calendar, param - 1, slots);
+ return new AvaticaSite(parameter, getCalendar(), param - 1, slots);
}
public int getParameterCount() {
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a357e910/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSite.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSite.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSite.java
index 047a8db..7fd6947 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSite.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaSite.java
@@ -43,6 +43,12 @@ import java.util.Calendar;
*/
public class AvaticaSite {
final AvaticaParameter parameter;
+
+ /** Calendar is not thread-safe. But calendar is only used from within one
+ * thread, and we have to trust that clients are not modifying calendars
+ * that they pass to us in a method such as
+ * {@link java.sql.PreparedStatement#setTime(int, Time, Calendar)}, so we do
+ * not need to synchronize access. */
final Calendar calendar;
private final int index;
final TypedValue[] slots;
@@ -53,6 +59,9 @@ public class AvaticaSite {
public AvaticaSite(AvaticaParameter parameter, Calendar calendar, int index,
TypedValue[] slots) {
+ assert calendar != null;
+ assert parameter != null;
+ assert slots != null;
this.parameter = parameter;
this.calendar = calendar;
this.index = index;
@@ -189,7 +198,7 @@ public class AvaticaSite {
slots[index] = wrap(ColumnMetaData.Rep.JAVA_SQL_DATE, x, calendar);
}
- public void setObject(Object x, int targetSqlType, Calendar calendar) {
+ public void setObject(Object x, int targetSqlType) {
if (x == null || Types.NULL == targetSqlType) {
setNull(targetSqlType);
return;
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/a357e910/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java b/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
index 17ccfde..9786c7a 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/util/AbstractCursor.java
@@ -135,7 +135,7 @@ public abstract class AbstractCursor implements Cursor {
case NUMBER:
return new DateFromNumberAccessor(getter, localCalendar);
case JAVA_SQL_DATE:
- return new DateAccessor(getter, localCalendar);
+ return new DateAccessor(getter);
default:
throw new AssertionError("bad " + columnMetaData.type.rep);
}
@@ -146,7 +146,7 @@ public abstract class AbstractCursor implements Cursor {
case NUMBER:
return new TimeFromNumberAccessor(getter, localCalendar);
case JAVA_SQL_TIME:
- return new TimeAccessor(getter, localCalendar);
+ return new TimeAccessor(getter);
default:
throw new AssertionError("bad " + columnMetaData.type.rep);
}
@@ -157,7 +157,7 @@ public abstract class AbstractCursor implements Cursor {
case NUMBER:
return new TimestampFromNumberAccessor(getter, localCalendar);
case JAVA_SQL_TIMESTAMP:
- return new TimestampAccessor(getter, localCalendar);
+ return new TimestampAccessor(getter);
case JAVA_UTIL_DATE:
return new TimestampFromUtilDateAccessor(getter, localCalendar);
default:
@@ -916,11 +916,8 @@ public abstract class AbstractCursor implements Cursor {
* corresponds to {@link java.sql.Types#DATE}.
*/
private static class DateAccessor extends ObjectAccessor {
- private final Calendar localCalendar;
-
- public DateAccessor(Getter getter, Calendar localCalendar) {
+ public DateAccessor(Getter getter) {
super(getter);
- this.localCalendar = localCalendar;
}
@Override public Date getDate(Calendar calendar) {
@@ -958,11 +955,8 @@ public abstract class AbstractCursor implements Cursor {
* corresponds to {@link java.sql.Types#TIME}.
*/
private static class TimeAccessor extends ObjectAccessor {
- private final Calendar localCalendar;
-
- public TimeAccessor(Getter getter, Calendar localCalendar) {
+ public TimeAccessor(Getter getter) {
super(getter);
- this.localCalendar = localCalendar;
}
@Override public Time getTime(Calendar calendar) {
@@ -999,11 +993,8 @@ public abstract class AbstractCursor implements Cursor {
* corresponds to {@link java.sql.Types#TIMESTAMP}.
*/
private static class TimestampAccessor extends ObjectAccessor {
- private final Calendar localCalendar;
-
- public TimestampAccessor(Getter getter, Calendar localCalendar) {
+ public TimestampAccessor(Getter getter) {
super(getter);
- this.localCalendar = localCalendar;
}
@Override public Timestamp getTimestamp(Calendar calendar) {