You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by to...@apache.org on 2008/03/18 07:47:58 UTC
svn commit: r638239 - in /harmony/enhanced/classlib/trunk/modules/sql/src:
main/java/org/apache/harmony/sql/internal/rowset/
test/java/org/apache/harmony/sql/tests/internal/rowset/
Author: tonywu
Date: Mon Mar 17 23:47:55 2008
New Revision: 638239
URL: http://svn.apache.org/viewvc?rev=638239&view=rev
Log:
Apply patch for HARMONY-5614 ([classlib][sql] implements get/update stream related methods in CachedRowSetImpl)
Modified:
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRow.java
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetImpl.java
harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetReader.java
harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java
harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetTestCase.java
harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetUpdateTest.java
Modified: harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRow.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRow.java?rev=638239&r1=638238&r2=638239&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRow.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRow.java Mon Mar 17 23:47:55 2008
@@ -17,6 +17,7 @@
package org.apache.harmony.sql.internal.rowset;
import java.sql.SQLException;
+import java.sql.SQLWarning;
import java.util.BitSet;
public class CachedRow implements Cloneable {
@@ -33,6 +34,16 @@
private boolean isUpdate;
private boolean nonUpdateable = false;
+
+ private SQLWarning sqlWarning = null;
+
+ public SQLWarning getSqlWarning() {
+ return sqlWarning;
+ }
+
+ public void setSqlWarning(SQLWarning sqlWarning) {
+ this.sqlWarning = sqlWarning;
+ }
public CachedRow(Object[] columnData) {
this.columnData = columnData.clone();
Modified: harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetImpl.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetImpl.java?rev=638239&r1=638238&r2=638239&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetImpl.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetImpl.java Mon Mar 17 23:47:55 2008
@@ -16,8 +16,15 @@
*/
package org.apache.harmony.sql.internal.rowset;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
+import java.io.StringBufferInputStream;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.Array;
@@ -120,7 +127,9 @@
private CachedRowSetImpl originalResultSet;
- private SQLWarning sqlwarn;
+ private SQLWarning sqlwarn = new SQLWarning();
+
+ private RowSetWarning rowSetWarning = new RowSetWarning();
private Class[] columnTypes;
@@ -535,7 +544,7 @@
}
public RowSetWarning getRowSetWarnings() throws SQLException {
- throw new NotImplementedException();
+ return rowSetWarning;
}
public SyncProvider getSyncProvider() throws SQLException {
@@ -1263,7 +1272,7 @@
}
public void clearWarnings() throws SQLException {
- throw new NotImplementedException();
+ sqlwarn = null;
}
public void close() throws SQLException {
@@ -1400,11 +1409,38 @@
}
public InputStream getAsciiStream(int columnIndex) throws SQLException {
- throw new NotImplementedException();
+ Object obj = getObject(columnIndex);
+ if (obj == null) {
+ isLastColNull = true;
+ return null;
+ }
+
+ isLastColNull = false;
+ if (obj instanceof String) {
+ obj = ((String) obj).toCharArray();
+ }
+
+ if (obj instanceof char[]) {
+ char[] cs = (char[]) obj;
+ byte[] bs = new byte[cs.length];
+
+ for (int i = 0; i < cs.length; i++) {
+ // if out of range, convert to unknown char ox3F
+ if (cs[i] > Byte.MAX_VALUE || cs[i] < Byte.MIN_VALUE) {
+ bs[i] = 63;
+ } else {
+ bs[i] = (byte) cs[i];
+ }
+ }
+
+ return new ByteArrayInputStream(bs);
+ }
+ // rowset.10=Data Type Mismatch
+ throw new SQLException(Messages.getString("rowset.10")); //$NON-NLS-1$
}
public InputStream getAsciiStream(String columnName) throws SQLException {
- throw new NotImplementedException();
+ return getAsciiStream(getIndexByName(columnName));
}
public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
@@ -1437,11 +1473,23 @@
}
public InputStream getBinaryStream(int columnIndex) throws SQLException {
- throw new NotImplementedException();
+ Object obj = getObject(columnIndex);
+ if (obj == null) {
+ isLastColNull = true;
+ return null;
+ }
+
+ isLastColNull = false;
+ if (obj instanceof byte[]) {
+ return new ByteArrayInputStream((byte[]) obj);
+ }
+
+ // rowset.10=Data Type Mismatch
+ throw new SQLException(Messages.getString("rowset.10")); //$NON-NLS-1$
}
public InputStream getBinaryStream(String columnName) throws SQLException {
- throw new NotImplementedException();
+ return getBinaryStream(getIndexByName(columnName));
}
public Blob getBlob(int columnIndex) throws SQLException {
@@ -1521,11 +1569,29 @@
}
public Reader getCharacterStream(int columnIndex) throws SQLException {
- throw new NotImplementedException();
+ Object obj = getObject(columnIndex);
+ if (obj == null) {
+ isLastColNull = true;
+ return null;
+ }
+ isLastColNull = false;
+ if (obj instanceof String) {
+ return new StringReader((String) obj);
+ }
+
+ if (obj instanceof byte[]) {
+ return new StringReader(new String((byte[]) obj));
+ }
+
+ if (obj instanceof char[]) {
+ return new StringReader(new String((char[]) obj));
+ }
+ // rowset.10=Data Type Mismatch
+ throw new SQLException(Messages.getString("rowset.10"));
}
public Reader getCharacterStream(String columnName) throws SQLException {
- throw new NotImplementedException();
+ return getCharacterStream(getIndexByName(columnName));
}
public Clob getClob(int columnIndex) throws SQLException {
@@ -1885,15 +1951,42 @@
}
public InputStream getUnicodeStream(int columnIndex) throws SQLException {
- throw new NotImplementedException();
+ Object obj = getObject(columnIndex);
+ if (obj == null) {
+ isLastColNull = true;
+ return null;
+ }
+
+ isLastColNull = false;
+
+ if (obj instanceof byte[]) {
+ return new StringBufferInputStream(new String((byte[]) obj));
+ }
+
+ if (obj instanceof String) {
+ return new StringBufferInputStream((String) obj);
+ }
+
+ if (obj instanceof char[]) {
+ return new StringBufferInputStream(new String((char[]) obj));
+ }
+
+ // rowset.10=Data Type Mismatch
+ throw new SQLException(Messages.getString("rowset.10")); //$NON-NLS-1$
}
public InputStream getUnicodeStream(String columnName) throws SQLException {
- throw new NotImplementedException();
+ return getUnicodeStream(getIndexByName(columnName));
}
public SQLWarning getWarnings() throws SQLException {
- throw new NotImplementedException();
+ if (sqlwarn == null) {
+ return null;
+ }
+ if (currentRow != null && currentRow.getSqlWarning() != null) {
+ return currentRow.getSqlWarning();
+ }
+ return sqlwarn;
}
public void insertRow() throws SQLException {
@@ -2126,9 +2219,37 @@
updateArray(getIndexByName(columnName), x);
}
- public void updateAsciiStream(int columnIndex, InputStream x, int length)
+ public void updateAsciiStream(int columnIndex, InputStream in, int length)
throws SQLException {
- throw new NotImplementedException();
+ checkValidRow();
+ checkColumnValid(columnIndex);
+ if (isCursorOnInsert && insertRow == null) {
+ insertRow = new CachedRow(new Object[columnCount]);
+ currentRow = insertRow;
+ }
+
+ Class type = columnTypes[columnIndex - 1];
+ if (type != null && !type.equals(String.class)
+ && !type.equals(byte[].class)) {
+ // rowset.10=Data Type Mismatch
+ throw new SQLException(Messages.getString("rowset.10")); //$NON-NLS-1$
+ }
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ for (int i = 0; i < length; ++i) {
+ int value = in.read();
+ if (value == -1) {
+ throw new IndexOutOfBoundsException();
+ }
+ out.write(value);
+ }
+ } catch (IOException e) {
+ SQLException ex = new SQLException();
+ ex.initCause(e);
+ throw ex;
+ }
+ updateString(columnIndex, new String(out.toByteArray()));
}
public void updateAsciiStream(String columnName, InputStream x, int length)
@@ -2150,9 +2271,40 @@
updateBigDecimal(getIndexByName(columnName), x);
}
- public void updateBinaryStream(int columnIndex, InputStream x, int length)
+ public void updateBinaryStream(int columnIndex, InputStream in, int length)
throws SQLException {
- throw new NotImplementedException();
+ checkValidRow();
+ checkColumnValid(columnIndex);
+ if (isCursorOnInsert && insertRow == null) {
+ insertRow = new CachedRow(new Object[columnCount]);
+ currentRow = insertRow;
+ }
+
+ Class type = columnTypes[columnIndex - 1];
+ if (type != null && !type.equals(byte[].class)) {
+ // rowset.10=Data Type Mismatch
+ throw new SQLException(Messages.getString("rowset.10")); //$NON-NLS-1$
+ }
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ int i = 0;
+ for (; i < length; ++i) {
+ int value = in.read();
+ if (value == -1) {
+ out.write(0);
+ } else {
+ out.write(value);
+ }
+ }
+
+ } catch (IOException e) {
+ SQLException ex = new SQLException();
+ ex.initCause(e);
+ throw ex;
+ }
+
+ updateBytes(columnIndex, out.toByteArray());
}
public void updateBinaryStream(String columnName, InputStream x, int length)
@@ -2192,9 +2344,38 @@
updateBytes(getIndexByName(columnName), x);
}
- public void updateCharacterStream(int columnIndex, Reader x, int length)
+ public void updateCharacterStream(int columnIndex, Reader in, int length)
throws SQLException {
- throw new NotImplementedException();
+ checkValidRow();
+ checkColumnValid(columnIndex);
+ if (isCursorOnInsert && insertRow == null) {
+ insertRow = new CachedRow(new Object[columnCount]);
+ currentRow = insertRow;
+ }
+
+ Class type = columnTypes[columnIndex - 1];
+ if (type != null && !type.equals(String.class)
+ && !type.equals(byte[].class)) {
+ // rowset.10=Data Type Mismatch
+ throw new SQLException(Messages.getString("rowset.10")); //$NON-NLS-1$
+ }
+
+ StringWriter out = new StringWriter();
+ try {
+ for (int i = 0; i < length; ++i) {
+ int value = in.read();
+ if (value == -1) {
+ throw new IndexOutOfBoundsException();
+ }
+ out.write(value);
+ }
+ } catch (IOException e) {
+ SQLException ex = new SQLException();
+ ex.initCause(e);
+ throw ex;
+ }
+
+ updateString(columnIndex, out.toString());
}
public void updateCharacterStream(String columnName, Reader reader,
@@ -2389,6 +2570,16 @@
if (type == null || type.isInstance(value)) {
return value;
+ }
+
+ if (type.equals(byte[].class)) {
+ return value;
+ }
+
+ if (type.equals(String.class)) {
+ if (!(value instanceof Array) && !(value instanceof byte[])) {
+ return value.toString();
+ }
}
if (type.equals(Integer.class)) {
Modified: harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetReader.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetReader.java?rev=638239&r1=638238&r2=638239&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetReader.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetReader.java Mon Mar 17 23:47:55 2008
@@ -52,7 +52,9 @@
columnData[i] = rs.getObject(i + 1);
}
- data.add(new CachedRow(columnData));
+ CachedRow currentRow = new CachedRow(columnData);
+ currentRow.setSqlWarning(rs.getWarnings());
+ data.add(currentRow);
if (maxRows > 0 && maxRows == data.size()) {
break;
Modified: harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java?rev=638239&r1=638238&r2=638239&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java Mon Mar 17 23:47:55 2008
@@ -846,14 +846,14 @@
crset.setInt(1, 3);
crset.execute();
- assertEquals(12, crset.getMetaData().getColumnCount());
+ assertEquals(DEFAULT_COLUMN_COUNT, crset.getMetaData().getColumnCount());
assertTrue(crset.next());
assertEquals("test3", crset.getString(2));
assertFalse(crset.next());
CachedRowSet crsetCopy = crset.createCopy();
crsetCopy.execute();
- assertEquals(12, crsetCopy.getMetaData().getColumnCount());
+ assertEquals(DEFAULT_COLUMN_COUNT, crsetCopy.getMetaData().getColumnCount());
assertTrue(crsetCopy.next());
assertEquals("test3", crsetCopy.getString(2));
assertFalse(crsetCopy.next());
@@ -2415,7 +2415,7 @@
}
try {
- noInitialCrset.toCollection(13);
+ noInitialCrset.toCollection(DEFAULT_COLUMN_COUNT + 1);
fail("should throw SQLException");
} catch (SQLException e) {
// expected
Modified: harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetTestCase.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetTestCase.java?rev=638239&r1=638238&r2=638239&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetTestCase.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetTestCase.java Mon Mar 17 23:47:55 2008
@@ -131,7 +131,7 @@
String insertSQL = "INSERT INTO USER_INFO(ID, NAME, BIGINT_T, NUMERIC_T, DECIMAL_T, SMALLINT_T, "
+ "FLOAT_T, REAL_T, DOUBLE_T, DATE_T, TIME_T, TIMESTAMP_T) VALUES(?, ?, ?, ?, ?, ?,"
- + "?, ?, ?, ?, ?, ? )";
+ + "?, ?, ?, ?, ?, ?)";
PreparedStatement preStmt = conn.prepareStatement(insertSQL);
// third row
preStmt.setInt(1, 3);
@@ -142,7 +142,7 @@
preStmt.setInt(6, 13);
preStmt.setFloat(7, 3.7F);
preStmt.setFloat(8, 3.888F);
- preStmt.setDouble(9, 3.9999);
+ preStmt.setDouble(9, 3.99999999);
preStmt.setDate(10, new Date(52365412356663L));
preStmt.setTime(11, new Time(96655422555551L));
preStmt.setTimestamp(12, new Timestamp(52365412356663L));
@@ -170,7 +170,7 @@
protected void insertMoreData(int rows) throws Exception {
String insertSQL = "INSERT INTO USER_INFO(ID, NAME, BIGINT_T, NUMERIC_T, DECIMAL_T, SMALLINT_T, "
+ "FLOAT_T, REAL_T, DOUBLE_T, DATE_T, TIME_T, TIMESTAMP_T) VALUES(?, ?, ?, ?, ?, ?,"
- + "?, ?, ?, ?, ?, ? )";
+ + "?, ?, ?, ?, ?, ?)";
PreparedStatement preStmt = conn.prepareStatement(insertSQL);
// insert 15 rows
Modified: harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetUpdateTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetUpdateTest.java?rev=638239&r1=638238&r2=638239&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetUpdateTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetUpdateTest.java Mon Mar 17 23:47:55 2008
@@ -814,4 +814,43 @@
crset.moveToCurrentRow();
crset.acceptChanges(conn);
}
+
+ public void testUpdateString() throws Exception {
+ crset.moveToInsertRow();
+
+ crset.updateInt(1, 50);
+ crset.updateString(2, "test100");
+ crset.updateInt(2, 2);
+ assertEquals("2", crset.getObject(2));
+
+ try {
+ crset.updateBytes(2, new byte[] { 1, 2 });
+ fail("Should throw SQLException");
+ } catch (SQLException e) {
+ // expected, Data Type Mismatch
+ }
+
+ crset.updateDate(2, new Date(965324512));
+ assertEquals(new Date(965324512).toString(), crset.getObject(2));
+
+ crset.updateTime(2, new Time(452368512));
+ assertEquals(new Time(452368512).toString(), crset.getObject(2));
+
+ crset.updateTimestamp(2, new Timestamp(874532105));
+ assertEquals(new Timestamp(874532105).toString(), crset.getObject(2));
+
+ crset.updateBigDecimal(2, new BigDecimal(12));
+ assertEquals(new BigDecimal(12).toString(), crset.getObject(2));
+
+ crset.updateLong(3, 444423L);
+ crset.updateBigDecimal(4, new BigDecimal(12));
+ crset.updateBigDecimal(5, new BigDecimal(23));
+ crset.updateLong(6, 33);
+ crset.updateFloat(7, 4.8F);
+ crset.updateFloat(8, 4.888F);
+ crset.updateDouble(9, 4.9999);
+ crset.updateDate(10, new Date(965324512));
+ crset.updateTime(11, new Time(452368512));
+ crset.updateTimestamp(12, new Timestamp(874532105));
+ }
}