Home | History | Annotate | Download | only in JDBC2z
      1 package SQLite.JDBC2z;
      2 
      3 import java.sql.*;
      4 import java.math.BigDecimal;
      5 
      6 public class JDBCResultSet implements java.sql.ResultSet {
      7 
      8     /**
      9      * Current row to be retrieved.
     10      */
     11     private int row;
     12 
     13     /**
     14      * Table returned by Database.get_table()
     15      */
     16     protected SQLite.TableResult tr;
     17 
     18     /**
     19      * Statement from which result set was produced.
     20      */
     21     private JDBCStatement s;
     22 
     23     /**
     24      * Meta data for result set or null.
     25      */
     26     private JDBCResultSetMetaData md;
     27 
     28     /**
     29      * Last result cell retrieved or null.
     30      */
     31     private String lastg;
     32 
     33     /**
     34      * Updatability of this result set.
     35      */
     36     private int updatable;
     37 
     38     /**
     39      * When updatable this is the table name.
     40      */
     41     private String uptable;
     42 
     43     /**
     44      * When updatable these are the PK column names of uptable.
     45      */
     46     private String pkcols[];
     47 
     48     /**
     49      * When updatable these are the PK column indices (0-based) of uptable.
     50      */
     51     private int pkcoli[];
     52 
     53     /*
     54      * Constants to reflect updateability.
     55      */
     56     private final static int UPD_UNKNOWN = -1;
     57     private final static int UPD_NO = 0;
     58     private final static int UPD_INS = 1;
     59     private final static int UPD_INSUPDDEL = 2;
     60 
     61     /**
     62      * Flag for cursor being (not) on insert row.
     63      */
     64     private boolean oninsrow;
     65 
     66     /**
     67      * Row buffer for insert/update row.
     68      */
     69     private String rowbuf[];
     70 
     71     private static final boolean nullrepl =
     72         SQLite.Database.version().compareTo("2.5.0") < 0;
     73 
     74     public JDBCResultSet(SQLite.TableResult tr, JDBCStatement s) {
     75 	this.tr = tr;
     76 	this.s = s;
     77 	this.md = null;
     78 	this.lastg = null;
     79 	this.row = -1;
     80 	this.updatable = UPD_UNKNOWN;
     81 	this.oninsrow = false;
     82 	this.rowbuf = null;
     83     }
     84 
     85     public boolean isUpdatable() throws SQLException {
     86 	if (updatable == UPD_UNKNOWN) {
     87 	    try {
     88 		JDBCResultSetMetaData m =
     89 		    (JDBCResultSetMetaData) getMetaData();
     90 		java.util.HashSet<String> h = new java.util.HashSet<String>();
     91 		String lastt = null;
     92 		for (int i = 1; i <= tr.ncolumns; i++) {
     93 		    lastt = m.getTableName(i);
     94 		    h.add(lastt);
     95 		}
     96 		if (h.size() > 1 || lastt == null) {
     97 		    updatable = UPD_NO;
     98 		    throw new SQLException("view or join");
     99 		}
    100 		updatable = UPD_INS;
    101 		uptable = lastt;
    102 		JDBCResultSet pk = (JDBCResultSet)
    103 		    s.conn.getMetaData().getPrimaryKeys(null, null, uptable);
    104 		if (pk.tr.nrows > 0) {
    105 		    boolean colnotfound = false;
    106 		    pkcols = new String[pk.tr.nrows];
    107 		    pkcoli = new int[pk.tr.nrows];
    108 		    for (int i = 0; i < pk.tr.nrows; i++) {
    109 			String rd[] = (String []) pk.tr.rows.elementAt(i);
    110 			pkcols[i] = rd[3];
    111 			try {
    112 			    pkcoli[i] = findColumn(pkcols[i]) - 1;
    113 			} catch (SQLException ee) {
    114 			    colnotfound = true;
    115 			}
    116 		    }
    117 		    if (!colnotfound) {
    118 			updatable = UPD_INSUPDDEL;
    119 		    }
    120 		}
    121 		pk.close();
    122 	    } catch (SQLException e) {
    123 		updatable = UPD_NO;
    124 	    }
    125 	}
    126 	if (updatable < UPD_INS) {
    127 	    throw new SQLException("result set not updatable");
    128 	}
    129 	return true;
    130     }
    131 
    132     public void fillRowbuf() throws SQLException {
    133 	if (rowbuf == null) {
    134 	    if (row < 0) {
    135 		throw new SQLException("cursor outside of result set");
    136 	    }
    137 	    rowbuf = new String[tr.ncolumns];
    138 	    System.arraycopy((String []) tr.rows.elementAt(row), 0,
    139 			     rowbuf, 0, tr.ncolumns);
    140 	}
    141     }
    142 
    143     public boolean next() throws SQLException {
    144 	if (tr == null) {
    145 	    return false;
    146 	}
    147 	row++;
    148 	return row < tr.nrows;
    149     }
    150 
    151     public int findColumn(String columnName) throws SQLException {
    152 	JDBCResultSetMetaData m = (JDBCResultSetMetaData) getMetaData();
    153 	return m.findColByName(columnName);
    154     }
    155 
    156     public int getRow() throws SQLException {
    157 	if (tr == null) {
    158 	    throw new SQLException("no rows");
    159 	}
    160 	return row + 1;
    161     }
    162 
    163     public boolean previous() throws SQLException {
    164 	if (tr == null) {
    165 	    throw new SQLException("result set already closed.");
    166 	}
    167 	if (row >= 0) {
    168 	    row--;
    169 	}
    170 	return row >= 0;
    171     }
    172 
    173     public boolean absolute(int row) throws SQLException {
    174 	if (tr == null) {
    175 	    return false;
    176 	}
    177 	if (row < 0) {
    178 	    row = tr.nrows + 1 + row;
    179 	}
    180 	row--;
    181 	if (row < 0 || row > tr.nrows) {
    182 	    return false;
    183 	}
    184 	this.row = row;
    185 	return true;
    186     }
    187 
    188     public boolean relative(int row) throws SQLException {
    189 	if (tr == null) {
    190 	    return false;
    191 	}
    192 	if (this.row + row < 0 || this.row + row >= tr.nrows) {
    193 	    return false;
    194 	}
    195 	this.row += row;
    196 	return true;
    197     }
    198 
    199     public void setFetchDirection(int dir) throws SQLException {
    200 	if (dir != ResultSet.FETCH_FORWARD) {
    201 	    throw new SQLException("only forward fetch direction supported");
    202 	}
    203     }
    204 
    205     public int getFetchDirection() throws SQLException {
    206 	return ResultSet.FETCH_FORWARD;
    207     }
    208 
    209     public void setFetchSize(int fsize) throws SQLException {
    210 	if (fsize != 1) {
    211 	    throw new SQLException("fetch size must be 1");
    212 	}
    213     }
    214 
    215     public int getFetchSize() throws SQLException {
    216 	return 1;
    217     }
    218 
    219     public String getString(int columnIndex) throws SQLException {
    220 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    221 	    throw new SQLException("column " + columnIndex + " not found");
    222 	}
    223 	String rd[] = (String []) tr.rows.elementAt(row);
    224 	lastg = rd[columnIndex - 1];
    225 	return lastg;
    226     }
    227 
    228     public String getString(String columnName) throws SQLException {
    229 	int col = findColumn(columnName);
    230 	return getString(col);
    231     }
    232 
    233     public int getInt(int columnIndex) throws SQLException {
    234 	Integer i = internalGetInt(columnIndex);
    235 	if (i != null) {
    236 	    return i.intValue();
    237 	}
    238 	return 0;
    239     }
    240 
    241     private Integer internalGetInt(int columnIndex) throws SQLException {
    242 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    243 	    throw new SQLException("column " + columnIndex + " not found");
    244 	}
    245 	String rd[] = (String []) tr.rows.elementAt(row);
    246 	lastg = rd[columnIndex - 1];
    247 	try {
    248 	    return Integer.valueOf(lastg);
    249 	} catch (java.lang.Exception e) {
    250 	    lastg = null;
    251 	}
    252 	return null;
    253     }
    254 
    255     public int getInt(String columnName) throws SQLException {
    256 	int col = findColumn(columnName);
    257 	return getInt(col);
    258     }
    259 
    260     public boolean getBoolean(int columnIndex) throws SQLException {
    261 	return getInt(columnIndex) == 1 ||
    262 	    Boolean.parseBoolean(getString(columnIndex));
    263     }
    264 
    265     public boolean getBoolean(String columnName) throws SQLException {
    266 	int col = findColumn(columnName);
    267 	return getBoolean(col);
    268     }
    269 
    270     public ResultSetMetaData getMetaData() throws SQLException {
    271 	if (md == null) {
    272 	    md = new JDBCResultSetMetaData(this);
    273 	}
    274 	return md;
    275     }
    276 
    277     public short getShort(int columnIndex) throws SQLException {
    278 	Short sh = internalGetShort(columnIndex);
    279 	if (sh != null) {
    280 	    return sh.shortValue();
    281 	}
    282 	return 0;
    283     }
    284 
    285     private Short internalGetShort(int columnIndex) throws SQLException {
    286 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    287 	    throw new SQLException("column " + columnIndex + " not found");
    288 	}
    289 	String rd[] = (String []) tr.rows.elementAt(row);
    290 	lastg = rd[columnIndex - 1];
    291 	try {
    292 	    return Short.valueOf(lastg);
    293 	} catch (java.lang.Exception e) {
    294 	    lastg = null;
    295 	}
    296 	return null;
    297     }
    298 
    299     public short getShort(String columnName) throws SQLException {
    300 	int col = findColumn(columnName);
    301 	return getShort(col);
    302     }
    303 
    304     public java.sql.Time getTime(int columnIndex) throws SQLException {
    305 	return internalGetTime(columnIndex, null);
    306     }
    307 
    308     private java.sql.Time internalGetTime(int columnIndex,
    309 					  java.util.Calendar cal)
    310 	throws SQLException {
    311 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    312 	    throw new SQLException("column " + columnIndex + " not found");
    313 	}
    314 	String rd[] = (String []) tr.rows.elementAt(row);
    315 	lastg = rd[columnIndex - 1];
    316 	try {
    317 	    if (s.conn.useJulian) {
    318 		try {
    319 		    return new java.sql.Time(SQLite.Database.long_from_julian(lastg));
    320 		} catch (java.lang.Exception ee) {
    321 		    return java.sql.Time.valueOf(lastg);
    322 		}
    323 	    } else {
    324 		try {
    325 		    return java.sql.Time.valueOf(lastg);
    326 		} catch (java.lang.Exception ee) {
    327 		    return new java.sql.Time(SQLite.Database.long_from_julian(lastg));
    328 		}
    329 	    }
    330 	} catch (java.lang.Exception e) {
    331 	    lastg = null;
    332 	}
    333 	return null;
    334     }
    335 
    336     public java.sql.Time getTime(String columnName) throws SQLException {
    337 	int col = findColumn(columnName);
    338 	return getTime(col);
    339     }
    340 
    341     public java.sql.Time getTime(int columnIndex, java.util.Calendar cal)
    342 	throws SQLException {
    343 	return internalGetTime(columnIndex, cal);
    344     }
    345 
    346     public java.sql.Time getTime(String columnName, java.util.Calendar cal)
    347 	throws SQLException{
    348 	int col = findColumn(columnName);
    349 	return getTime(col, cal);
    350     }
    351 
    352     public java.sql.Timestamp getTimestamp(int columnIndex)
    353 	throws SQLException{
    354 	return internalGetTimestamp(columnIndex, null);
    355     }
    356 
    357     private java.sql.Timestamp internalGetTimestamp(int columnIndex,
    358 						    java.util.Calendar cal)
    359 	throws SQLException {
    360 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    361 	    throw new SQLException("column " + columnIndex + " not found");
    362 	}
    363 	String rd[] = (String []) tr.rows.elementAt(row);
    364 	lastg = rd[columnIndex - 1];
    365 	try {
    366 	    if (s.conn.useJulian) {
    367 		try {
    368 		    return new java.sql.Timestamp(SQLite.Database.long_from_julian(lastg));
    369 		} catch (java.lang.Exception ee) {
    370 		    return java.sql.Timestamp.valueOf(lastg);
    371 		}
    372 	    } else {
    373 		try {
    374 		    return java.sql.Timestamp.valueOf(lastg);
    375 		} catch (java.lang.Exception ee) {
    376 		    return new java.sql.Timestamp(SQLite.Database.long_from_julian(lastg));
    377 		}
    378 	    }
    379 	} catch (java.lang.Exception e) {
    380 	    lastg = null;
    381 	}
    382 	return null;
    383     }
    384 
    385     public java.sql.Timestamp getTimestamp(String columnName)
    386 	throws SQLException{
    387 	int col = findColumn(columnName);
    388 	return getTimestamp(col);
    389     }
    390 
    391     public java.sql.Timestamp getTimestamp(int columnIndex,
    392 					   java.util.Calendar cal)
    393 	throws SQLException {
    394 	return internalGetTimestamp(columnIndex, cal);
    395     }
    396 
    397     public java.sql.Timestamp getTimestamp(String columnName,
    398 					   java.util.Calendar cal)
    399 	throws SQLException {
    400 	int col = findColumn(columnName);
    401 	return getTimestamp(col, cal);
    402     }
    403 
    404     public java.sql.Date getDate(int columnIndex) throws SQLException {
    405 	return internalGetDate(columnIndex, null);
    406     }
    407 
    408     private java.sql.Date internalGetDate(int columnIndex,
    409 					  java.util.Calendar cal)
    410 	throws SQLException {
    411 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    412 	    throw new SQLException("column " + columnIndex + " not found");
    413 	}
    414 	String rd[] = (String []) tr.rows.elementAt(row);
    415 	lastg = rd[columnIndex - 1];
    416 	try {
    417 	    if (s.conn.useJulian) {
    418 		try {
    419 		    return new java.sql.Date(SQLite.Database.long_from_julian(lastg));
    420 		} catch (java.lang.Exception ee) {
    421 		    return java.sql.Date.valueOf(lastg);
    422 		}
    423 	    } else {
    424 		try {
    425 		    return java.sql.Date.valueOf(lastg);
    426 		} catch (java.lang.Exception ee) {
    427 		    return new java.sql.Date(SQLite.Database.long_from_julian(lastg));
    428 		}
    429 	    }
    430 	} catch (java.lang.Exception e) {
    431 	    lastg = null;
    432 	}
    433 	return null;
    434     }
    435 
    436     public java.sql.Date getDate(String columnName) throws SQLException {
    437 	int col = findColumn(columnName);
    438 	return getDate(col);
    439     }
    440 
    441     public java.sql.Date getDate(int columnIndex, java.util.Calendar cal)
    442 	throws SQLException{
    443 	return internalGetDate(columnIndex, cal);
    444     }
    445 
    446     public java.sql.Date getDate(String columnName, java.util.Calendar cal)
    447 	throws SQLException{
    448 	int col = findColumn(columnName);
    449 	return getDate(col, cal);
    450     }
    451 
    452     public double getDouble(int columnIndex) throws SQLException {
    453 	Double d = internalGetDouble(columnIndex);
    454 	if (d != null) {
    455 	    return d.doubleValue();
    456 	}
    457 	return 0;
    458     }
    459 
    460     private Double internalGetDouble(int columnIndex) throws SQLException {
    461 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    462 	    throw new SQLException("column " + columnIndex + " not found");
    463 	}
    464 	String rd[] = (String []) tr.rows.elementAt(row);
    465 	lastg = rd[columnIndex - 1];
    466 	try {
    467 	    return Double.valueOf(lastg);
    468 	} catch (java.lang.Exception e) {
    469 	    lastg = null;
    470 	}
    471 	return null;
    472     }
    473 
    474     public double getDouble(String columnName) throws SQLException {
    475 	int col = findColumn(columnName);
    476 	return getDouble(col);
    477     }
    478 
    479     public float getFloat(int columnIndex) throws SQLException {
    480 	Float f = internalGetFloat(columnIndex);
    481 	if (f != null) {
    482 	    return f.floatValue();
    483 	}
    484 	return 0;
    485     }
    486 
    487     private Float internalGetFloat(int columnIndex) throws SQLException {
    488 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    489 	    throw new SQLException("column " + columnIndex + " not found");
    490 	}
    491 	String rd[] = (String []) tr.rows.elementAt(row);
    492 	lastg = rd[columnIndex - 1];
    493 	try {
    494 	    return Float.valueOf(lastg);
    495 	} catch (java.lang.Exception e) {
    496 	    lastg = null;
    497 	}
    498 	return null;
    499     }
    500 
    501     public float getFloat(String columnName) throws SQLException {
    502 	int col = findColumn(columnName);
    503 	return getFloat(col);
    504     }
    505 
    506     public long getLong(int columnIndex) throws SQLException {
    507 	Long l = internalGetLong(columnIndex);
    508 	if (l != null) {
    509 	    return l.longValue();
    510 	}
    511 	return 0;
    512     }
    513 
    514     private Long internalGetLong(int columnIndex) throws SQLException {
    515 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    516 	    throw new SQLException("column " + columnIndex + " not found");
    517 	}
    518 	String rd[] = (String []) tr.rows.elementAt(row);
    519 	lastg = rd[columnIndex - 1];
    520 	try {
    521 	    return Long.valueOf(lastg);
    522 	} catch (java.lang.Exception e) {
    523 	    lastg = null;
    524 	}
    525 	return null;
    526     }
    527 
    528     public long getLong(String columnName) throws SQLException {
    529 	int col = findColumn(columnName);
    530 	return getLong(col);
    531     }
    532 
    533     @Deprecated
    534     public java.io.InputStream getUnicodeStream(int columnIndex)
    535 	throws SQLException {
    536 	throw new SQLFeatureNotSupportedException();
    537     }
    538 
    539     @Deprecated
    540     public java.io.InputStream getUnicodeStream(String columnName)
    541 	throws SQLException {
    542 	int col = findColumn(columnName);
    543 	return getUnicodeStream(col);
    544     }
    545 
    546     public java.io.InputStream getAsciiStream(String columnName)
    547 	throws SQLException {
    548 	int col = findColumn(columnName);
    549 	return getAsciiStream(col);
    550     }
    551 
    552     public java.io.InputStream getAsciiStream(int columnIndex)
    553 	throws SQLException {
    554 	throw new SQLException("not supported");
    555     }
    556 
    557     public BigDecimal getBigDecimal(String columnName)
    558 	throws SQLException {
    559 	int col = findColumn(columnName);
    560 	return getBigDecimal(col);
    561     }
    562 
    563     @Deprecated
    564     public BigDecimal getBigDecimal(String columnName, int scale)
    565 	throws SQLException {
    566 	int col = findColumn(columnName);
    567 	return getBigDecimal(col, scale);
    568     }
    569 
    570     public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
    571 	throw new SQLFeatureNotSupportedException();
    572     }
    573 
    574     @Deprecated
    575     public BigDecimal getBigDecimal(int columnIndex, int scale)
    576 	throws SQLException {
    577 	throw new SQLFeatureNotSupportedException();
    578     }
    579 
    580     public java.io.InputStream getBinaryStream(int columnIndex)
    581 	throws SQLException {
    582 	byte data[] = getBytes(columnIndex);
    583 	if (data != null) {
    584 	    return new java.io.ByteArrayInputStream(data);
    585 	}
    586 	return null;
    587     }
    588 
    589     public java.io.InputStream getBinaryStream(String columnName)
    590 	throws SQLException {
    591 	byte data[] = getBytes(columnName);
    592 	if (data != null) {
    593 	    return new java.io.ByteArrayInputStream(data);
    594 	}
    595 	return null;
    596     }
    597 
    598     public byte getByte(int columnIndex) throws SQLException {
    599 	throw new SQLException("not supported");
    600     }
    601 
    602     public byte getByte(String columnName) throws SQLException {
    603 	int col = findColumn(columnName);
    604 	return getByte(col);
    605     }
    606 
    607     public byte[] getBytes(int columnIndex) throws SQLException {
    608 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    609 	    throw new SQLException("column " + columnIndex + " not found");
    610 	}
    611 	byte ret[] = null;
    612 	String rd[] = (String []) tr.rows.elementAt(row);
    613 	lastg = rd[columnIndex - 1];
    614 	if (lastg != null) {
    615 	    ret = SQLite.StringEncoder.decode(lastg);
    616 	}
    617 	return ret;
    618     }
    619 
    620     public byte[] getBytes(String columnName) throws SQLException {
    621 	int col = findColumn(columnName);
    622 	return getBytes(col);
    623     }
    624 
    625     public String getCursorName() throws SQLException {
    626 	return null;
    627     }
    628 
    629     public Object getObject(int columnIndex) throws SQLException {
    630 	if (tr == null || columnIndex < 1 || columnIndex > tr.ncolumns) {
    631 	    throw new SQLException("column " + columnIndex + " not found");
    632 	}
    633 	String rd[] = (String []) tr.rows.elementAt(row);
    634 	lastg = rd[columnIndex - 1];
    635 	Object ret = lastg;
    636 	if (tr instanceof TableResultX) {
    637 	    switch (((TableResultX) tr).sql_type[columnIndex - 1]) {
    638 	    case Types.SMALLINT:
    639 		ret = internalGetShort(columnIndex);
    640 		break;
    641 	    case Types.INTEGER:
    642 		ret = internalGetInt(columnIndex);
    643 		break;
    644 	    case Types.DOUBLE:
    645 		ret = internalGetDouble(columnIndex);
    646 		break;
    647 	    case Types.FLOAT:
    648 		ret = internalGetFloat(columnIndex);
    649 		break;
    650 	    case Types.BIGINT:
    651 		ret = internalGetLong(columnIndex);
    652 		break;
    653 	    case Types.BINARY:
    654 	    case Types.VARBINARY:
    655 	    case Types.LONGVARBINARY:
    656 		ret = getBytes(columnIndex);
    657 		break;
    658 	    case Types.NULL:
    659 		ret = null;
    660 		break;
    661 	    /* defaults to String below */
    662 	    }
    663 	}
    664 	return ret;
    665     }
    666 
    667     public Object getObject(String columnName) throws SQLException {
    668 	int col = findColumn(columnName);
    669 	return getObject(col);
    670     }
    671 
    672     public Object getObject(int columnIndex, java.util.Map map)
    673 	throws SQLException {
    674 	throw new SQLFeatureNotSupportedException();
    675     }
    676 
    677     public Object getObject(String columnName, java.util.Map map)
    678 	throws SQLException {
    679 	int col = findColumn(columnName);
    680 	return getObject(col, map);
    681     }
    682 
    683     public java.sql.Ref getRef(int columnIndex) throws SQLException {
    684 	throw new SQLFeatureNotSupportedException();
    685     }
    686 
    687     public java.sql.Ref getRef(String columnName) throws SQLException {
    688 	int col = findColumn(columnName);
    689 	return getRef(col);
    690     }
    691 
    692     public java.sql.Blob getBlob(int columnIndex) throws SQLException {
    693 	throw new SQLFeatureNotSupportedException();
    694     }
    695 
    696     public java.sql.Blob getBlob(String columnName) throws SQLException {
    697 	int col = findColumn(columnName);
    698 	return getBlob(col);
    699     }
    700 
    701     public java.sql.Clob getClob(int columnIndex) throws SQLException {
    702 	throw new SQLFeatureNotSupportedException();
    703     }
    704 
    705     public java.sql.Clob getClob(String columnName) throws SQLException {
    706 	int col = findColumn(columnName);
    707 	return getClob(col);
    708     }
    709 
    710     public java.sql.Array getArray(int columnIndex) throws SQLException {
    711 	throw new SQLFeatureNotSupportedException();
    712     }
    713 
    714     public java.sql.Array getArray(String columnName) throws SQLException {
    715 	int col = findColumn(columnName);
    716 	return getArray(col);
    717     }
    718 
    719     public java.io.Reader getCharacterStream(int columnIndex)
    720 	throws SQLException {
    721 	String data = getString(columnIndex);
    722 	if (data != null) {
    723 	    char[] cdata = data.toCharArray();
    724 	    return new java.io.CharArrayReader(cdata);
    725 	}
    726 	return null;
    727     }
    728 
    729     public java.io.Reader getCharacterStream(String columnName)
    730 	throws SQLException {
    731 	String data = getString(columnName);
    732 	if (data != null) {
    733 	    char[] cdata = data.toCharArray();
    734 	    return new java.io.CharArrayReader(cdata);
    735 	}
    736 	return null;
    737     }
    738 
    739     public SQLWarning getWarnings() throws SQLException {
    740 	throw new SQLException("not supported");
    741     }
    742 
    743     public boolean wasNull() throws SQLException {
    744 	return lastg == null;
    745     }
    746 
    747     public void clearWarnings() throws SQLException {
    748 	throw new SQLException("not supported");
    749     }
    750 
    751     public boolean isFirst() throws SQLException {
    752 	if (tr == null) {
    753 	    return true;
    754 	}
    755 	return row == 0;
    756     }
    757 
    758     public boolean isBeforeFirst() throws SQLException {
    759 	if (tr == null || tr.nrows <= 0) {
    760 	    return false;
    761 	}
    762 	return row < 0;
    763     }
    764 
    765     public void beforeFirst() throws SQLException {
    766 	if (tr == null) {
    767 	    return;
    768 	}
    769 	row = -1;
    770     }
    771 
    772     public boolean first() throws SQLException {
    773 	if (tr == null || tr.nrows <= 0) {
    774 	    return false;
    775 	}
    776 	row = 0;
    777 	return true;
    778     }
    779 
    780     public boolean isAfterLast() throws SQLException {
    781 	if (tr == null || tr.nrows <= 0) {
    782 	    return false;
    783 	}
    784 	return row >= tr.nrows;
    785     }
    786 
    787     public void afterLast() throws SQLException {
    788 	if (tr == null) {
    789 	    return;
    790 	}
    791 	row = tr.nrows;
    792     }
    793 
    794     public boolean isLast() throws SQLException {
    795 	if (tr == null) {
    796 	    return true;
    797 	}
    798 	return row == tr.nrows - 1;
    799     }
    800 
    801     public boolean last() throws SQLException {
    802 	if (tr == null || tr.nrows <= 0) {
    803 	    return false;
    804 	}
    805 	row = tr.nrows -1;
    806 	return true;
    807     }
    808 
    809     public int getType() throws SQLException {
    810 	return TYPE_SCROLL_SENSITIVE;
    811     }
    812 
    813     public int getConcurrency() throws SQLException {
    814 	return CONCUR_UPDATABLE;
    815     }
    816 
    817     public boolean rowUpdated() throws SQLException {
    818 	return false;
    819     }
    820 
    821     public boolean rowInserted() throws SQLException {
    822 	return false;
    823     }
    824 
    825     public boolean rowDeleted() throws SQLException {
    826 	return false;
    827     }
    828 
    829     public void insertRow() throws SQLException {
    830 	isUpdatable();
    831 	if (!oninsrow || rowbuf == null) {
    832 	    throw new SQLException("no insert data provided");
    833 	}
    834 	JDBCResultSetMetaData m = (JDBCResultSetMetaData) getMetaData();
    835 	StringBuffer sb = new StringBuffer();
    836 	sb.append("INSERT INTO ");
    837 	sb.append(SQLite.Shell.sql_quote_dbl(uptable));
    838 	sb.append("(");
    839 	for (int i = 0; i < tr.ncolumns; i++) {
    840 	    sb.append(SQLite.Shell.sql_quote_dbl(m.getColumnName(i + 1)));
    841 	    if (i < tr.ncolumns - 1) {
    842 		sb.append(",");
    843 	    }
    844 	}
    845 	sb.append(") VALUES(");
    846 	for (int i = 0; i < tr.ncolumns; i++) {
    847 	    sb.append(nullrepl ? "'%q'" : "%Q");
    848 	    if (i < tr.ncolumns - 1) {
    849 		sb.append(",");
    850 	    }
    851 	}
    852 	sb.append(")");
    853 	try {
    854 	    this.s.conn.db.exec(sb.toString(), null, rowbuf);
    855 	} catch (SQLite.Exception e) {
    856 	    throw new SQLException(e.getMessage());
    857 	}
    858 	tr.newrow(rowbuf);
    859 	rowbuf = null;
    860 	oninsrow = false;
    861 	last();
    862     }
    863 
    864     public void updateRow() throws SQLException {
    865 	isUpdatable();
    866 	if (rowbuf == null) {
    867 	    throw new SQLException("no update data provided");
    868 	}
    869 	if (oninsrow) {
    870 	    throw new SQLException("cursor on insert row");
    871 	}
    872 	if (updatable < UPD_INSUPDDEL) {
    873 	    throw new SQLException("no primary key on table defined");
    874 	}
    875 	String rd[] = (String []) tr.rows.elementAt(row);
    876 	JDBCResultSetMetaData m = (JDBCResultSetMetaData) getMetaData();
    877 	String args[] = new String[tr.ncolumns + pkcols.length];
    878 	StringBuffer sb = new StringBuffer();
    879 	sb.append("UPDATE ");
    880 	sb.append(SQLite.Shell.sql_quote_dbl(uptable));
    881 	sb.append(" SET ");
    882 	int i;
    883 	for (i = 0; i < tr.ncolumns; i++) {
    884 	    sb.append(SQLite.Shell.sql_quote_dbl(m.getColumnName(i + 1)));
    885 	    sb.append(" = " + (nullrepl ? "'%q'" : "%Q"));
    886 	    if (i < tr.ncolumns - 1) {
    887 		sb.append(",");
    888 	    }
    889 	    args[i] = rowbuf[i];
    890 	}
    891 	sb. append(" WHERE ");
    892 	for (int k = 0; k < pkcols.length; k++, i++) {
    893 	    sb.append(SQLite.Shell.sql_quote_dbl(pkcols[k]));
    894 	    sb.append(" = " + (nullrepl ? "'%q'" : "%Q"));
    895 	    if (k < pkcols.length - 1) {
    896 		sb.append(" AND ");
    897 	    }
    898 	    args[i] = rd[pkcoli[k]];
    899 	}
    900 	try {
    901 	    this.s.conn.db.exec(sb.toString(), null, args);
    902 	} catch (SQLite.Exception e) {
    903 	    throw new SQLException(e.getMessage());
    904 	}
    905 	System.arraycopy(rowbuf, 0, rd, 0, rowbuf.length);
    906 	rowbuf = null;
    907     }
    908 
    909     public void deleteRow() throws SQLException {
    910 	isUpdatable();
    911 	if (oninsrow) {
    912 	    throw new SQLException("cursor on insert row");
    913 	}
    914 	if (updatable < UPD_INSUPDDEL) {
    915 	    throw new SQLException("no primary key on table defined");
    916 	}
    917 	fillRowbuf();
    918 	StringBuffer sb = new StringBuffer();
    919 	sb.append("DELETE FROM ");
    920 	sb.append(SQLite.Shell.sql_quote_dbl(uptable));
    921 	sb.append(" WHERE ");
    922 	String args[] = new String[pkcols.length];
    923 	for (int i = 0; i < pkcols.length; i++) {
    924 	    sb.append(SQLite.Shell.sql_quote_dbl(pkcols[i]));
    925 	    sb.append(" = " + (nullrepl ? "'%q'" : "%Q"));
    926 	    if (i < pkcols.length - 1) {
    927 		sb.append(" AND ");
    928 	    }
    929 	    args[i] = rowbuf[pkcoli[i]];
    930 	}
    931 	try {
    932 	    this.s.conn.db.exec(sb.toString(), null, args);
    933 	} catch (SQLite.Exception e) {
    934 	    throw new SQLException(e.getMessage());
    935 	}
    936 	rowbuf = null;
    937     }
    938 
    939     public void refreshRow() throws SQLException {
    940 	isUpdatable();
    941 	if (oninsrow) {
    942 	    throw new SQLException("cursor on insert row");
    943 	}
    944 	if (updatable < UPD_INSUPDDEL) {
    945 	    throw new SQLException("no primary key on table defined");
    946 	}
    947 	JDBCResultSetMetaData m = (JDBCResultSetMetaData) getMetaData();
    948 	String rd[] = (String []) tr.rows.elementAt(row);
    949 	StringBuffer sb = new StringBuffer();
    950 	sb.append("SELECT ");
    951 	for (int i = 0; i < tr.ncolumns; i++) {
    952 	    sb.append(SQLite.Shell.sql_quote_dbl(m.getColumnName(i + 1)));
    953 	    if (i < tr.ncolumns - 1) {
    954 		sb.append(",");
    955 	    }
    956 	}
    957 	sb.append(" FROM ");
    958 	sb.append(SQLite.Shell.sql_quote_dbl(uptable));
    959 	sb.append(" WHERE ");
    960 	String args[] = new String[pkcols.length];
    961 	for (int i = 0; i < pkcols.length; i++) {
    962 	    sb.append(SQLite.Shell.sql_quote_dbl(pkcols[i]));
    963 	    sb.append(" = " + (nullrepl ? "'%q'" : "%Q"));
    964 	    if (i < pkcols.length - 1) {
    965 		sb.append(" AND ");
    966 	    }
    967 	    args[i] = rd[pkcoli[i]];
    968 	}
    969 	SQLite.TableResult trnew = null;
    970 	try {
    971 	    trnew = this.s.conn.db.get_table(sb.toString(), args);
    972 	} catch (SQLite.Exception e) {
    973 	    throw new SQLException(e.getMessage());
    974 	}
    975 	if (trnew.nrows != 1) {
    976 	    throw new SQLException("wrong size of result set");
    977 	}
    978 	rowbuf = null;
    979 	tr.rows.setElementAt(trnew.rows.elementAt(0), row);
    980     }
    981 
    982     public void cancelRowUpdates() throws SQLException {
    983 	rowbuf = null;
    984     }
    985 
    986     public void moveToInsertRow() throws SQLException {
    987 	isUpdatable();
    988 	if (!oninsrow) {
    989 	    oninsrow = true;
    990 	    rowbuf = new String[tr.nrows];
    991 	}
    992     }
    993 
    994     public void moveToCurrentRow() throws SQLException {
    995 	if (oninsrow) {
    996 	    oninsrow = false;
    997 	    rowbuf = null;
    998 	}
    999     }
   1000 
   1001     public void updateNull(int colIndex) throws SQLException {
   1002 	isUpdatable();
   1003 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1004 	    throw new SQLException("column " + colIndex + " not found");
   1005 	}
   1006 	fillRowbuf();
   1007 	rowbuf[colIndex - 1] = null;
   1008     }
   1009 
   1010     public void updateBoolean(int colIndex, boolean b) throws SQLException {
   1011 	updateString(colIndex, b ? "1" : "0");
   1012     }
   1013 
   1014     public void updateByte(int colIndex, byte b) throws SQLException {
   1015 	throw new SQLFeatureNotSupportedException();
   1016     }
   1017 
   1018     public void updateShort(int colIndex, short b) throws SQLException {
   1019 	isUpdatable();
   1020 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1021 	    throw new SQLException("column " + colIndex + " not found");
   1022 	}
   1023 	fillRowbuf();
   1024 	rowbuf[colIndex - 1] = Short.toString(b);
   1025     }
   1026 
   1027     public void updateInt(int colIndex, int b) throws SQLException {
   1028 	isUpdatable();
   1029 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1030 	    throw new SQLException("column " + colIndex + " not found");
   1031 	}
   1032 	fillRowbuf();
   1033 	rowbuf[colIndex - 1] = Integer.toString(b);
   1034     }
   1035 
   1036     public void updateLong(int colIndex, long b) throws SQLException {
   1037 	isUpdatable();
   1038 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1039 	    throw new SQLException("column " + colIndex + " not found");
   1040 	}
   1041 	fillRowbuf();
   1042 	rowbuf[colIndex - 1] = Long.toString(b);
   1043     }
   1044 
   1045     public void updateFloat(int colIndex, float f) throws SQLException {
   1046 	isUpdatable();
   1047 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1048 	    throw new SQLException("column " + colIndex + " not found");
   1049 	}
   1050 	fillRowbuf();
   1051 	rowbuf[colIndex - 1] = Float.toString(f);
   1052     }
   1053 
   1054     public void updateDouble(int colIndex, double f) throws SQLException {
   1055 	isUpdatable();
   1056 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1057 	    throw new SQLException("column " + colIndex + " not found");
   1058 	}
   1059 	fillRowbuf();
   1060 	rowbuf[colIndex - 1] = Double.toString(f);
   1061     }
   1062 
   1063     public void updateBigDecimal(int colIndex, BigDecimal f)
   1064 	throws SQLException {
   1065 	throw new SQLFeatureNotSupportedException();
   1066     }
   1067 
   1068     public void updateString(int colIndex, String s) throws SQLException {
   1069 	isUpdatable();
   1070 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1071 	    throw new SQLException("column " + colIndex + " not found");
   1072 	}
   1073 	fillRowbuf();
   1074 	rowbuf[colIndex - 1] = s;
   1075     }
   1076 
   1077     public void updateBytes(int colIndex, byte[] s) throws SQLException {
   1078 	isUpdatable();
   1079 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1080 	    throw new SQLException("column " + colIndex + " not found");
   1081 	}
   1082 	fillRowbuf();
   1083 	if (this.s.conn.db.is3()) {
   1084 	    rowbuf[colIndex - 1] = SQLite.StringEncoder.encodeX(s);
   1085 	} else {
   1086 	    rowbuf[colIndex - 1] = SQLite.StringEncoder.encode(s);
   1087 	}
   1088     }
   1089 
   1090     public void updateDate(int colIndex, java.sql.Date d) throws SQLException {
   1091 	isUpdatable();
   1092 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1093 	    throw new SQLException("column " + colIndex + " not found");
   1094 	}
   1095 	fillRowbuf();
   1096 	rowbuf[colIndex - 1] = d.toString();
   1097     }
   1098 
   1099     public void updateTime(int colIndex, java.sql.Time t) throws SQLException {
   1100 	isUpdatable();
   1101 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1102 	    throw new SQLException("column " + colIndex + " not found");
   1103 	}
   1104 	fillRowbuf();
   1105 	rowbuf[colIndex - 1] = t.toString();
   1106     }
   1107 
   1108     public void updateTimestamp(int colIndex, java.sql.Timestamp t)
   1109 	throws SQLException {
   1110 	isUpdatable();
   1111 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1112 	    throw new SQLException("column " + colIndex + " not found");
   1113 	}
   1114 	fillRowbuf();
   1115 	rowbuf[colIndex - 1] = t.toString();
   1116     }
   1117 
   1118     public void updateAsciiStream(int colIndex, java.io.InputStream in, int s)
   1119 	throws SQLException {
   1120 	throw new SQLFeatureNotSupportedException();
   1121     }
   1122 
   1123     public void updateBinaryStream(int colIndex, java.io.InputStream in, int s)
   1124 	throws SQLException {
   1125 	throw new SQLFeatureNotSupportedException();
   1126     }
   1127 
   1128     public void updateCharacterStream(int colIndex, java.io.Reader in, int s)
   1129 	throws SQLException {
   1130 	throw new SQLFeatureNotSupportedException();
   1131     }
   1132 
   1133     public void updateObject(int colIndex, Object obj) throws SQLException {
   1134 	updateString(colIndex, obj.toString());
   1135     }
   1136 
   1137     public void updateObject(int colIndex, Object obj, int s)
   1138 	throws SQLException {
   1139 	updateString(colIndex, obj.toString());
   1140     }
   1141 
   1142     public void updateNull(String colName) throws SQLException {
   1143 	int col = findColumn(colName);
   1144 	updateNull(col);
   1145     }
   1146 
   1147     public void updateBoolean(String colName, boolean b) throws SQLException {
   1148 	int col = findColumn(colName);
   1149 	updateBoolean(col, b);
   1150     }
   1151 
   1152     public void updateByte(String colName, byte b) throws SQLException {
   1153 	int col = findColumn(colName);
   1154 	updateByte(col, b);
   1155     }
   1156 
   1157     public void updateShort(String colName, short b) throws SQLException {
   1158 	int col = findColumn(colName);
   1159 	updateShort(col, b);
   1160     }
   1161 
   1162     public void updateInt(String colName, int b) throws SQLException {
   1163 	int col = findColumn(colName);
   1164 	updateInt(col, b);
   1165     }
   1166 
   1167     public void updateLong(String colName, long b) throws SQLException {
   1168 	int col = findColumn(colName);
   1169 	updateLong(col, b);
   1170     }
   1171 
   1172     public void updateFloat(String colName, float f) throws SQLException {
   1173 	int col = findColumn(colName);
   1174 	updateFloat(col, f);
   1175     }
   1176 
   1177     public void updateDouble(String colName, double f) throws SQLException {
   1178 	int col = findColumn(colName);
   1179 	updateDouble(col, f);
   1180     }
   1181 
   1182     public void updateBigDecimal(String colName, BigDecimal f)
   1183 	throws SQLException {
   1184 	int col = findColumn(colName);
   1185 	updateBigDecimal(col, f);
   1186     }
   1187 
   1188     public void updateString(String colName, String s) throws SQLException {
   1189 	int col = findColumn(colName);
   1190 	updateString(col, s);
   1191     }
   1192 
   1193     public void updateBytes(String colName, byte[] s) throws SQLException {
   1194 	int col = findColumn(colName);
   1195 	updateBytes(col, s);
   1196     }
   1197 
   1198     public void updateDate(String colName, java.sql.Date d)
   1199 	throws SQLException {
   1200 	int col = findColumn(colName);
   1201 	updateDate(col, d);
   1202     }
   1203 
   1204     public void updateTime(String colName, java.sql.Time t)
   1205 	throws SQLException {
   1206 	int col = findColumn(colName);
   1207 	updateTime(col, t);
   1208     }
   1209 
   1210     public void updateTimestamp(String colName, java.sql.Timestamp t)
   1211 	throws SQLException {
   1212 	int col = findColumn(colName);
   1213 	updateTimestamp(col, t);
   1214     }
   1215 
   1216     public void updateAsciiStream(String colName, java.io.InputStream in,
   1217 				  int s)
   1218 	throws SQLException {
   1219 	int col = findColumn(colName);
   1220 	updateAsciiStream(col, in, s);
   1221     }
   1222 
   1223     public void updateBinaryStream(String colName, java.io.InputStream in,
   1224 				   int s)
   1225 	throws SQLException {
   1226 	int col = findColumn(colName);
   1227 	updateBinaryStream(col, in, s);
   1228     }
   1229 
   1230     public void updateCharacterStream(String colName, java.io.Reader in,
   1231 				      int s)
   1232 	throws SQLException {
   1233 	int col = findColumn(colName);
   1234 	updateCharacterStream(col, in, s);
   1235     }
   1236 
   1237     public void updateObject(String colName, Object obj)
   1238 	throws SQLException {
   1239 	int col = findColumn(colName);
   1240 	updateObject(col, obj);
   1241     }
   1242 
   1243     public void updateObject(String colName, Object obj, int s)
   1244 	throws SQLException {
   1245 	int col = findColumn(colName);
   1246 	updateObject(col, obj, s);
   1247     }
   1248 
   1249     public Statement getStatement() throws SQLException {
   1250 	if (s == null) {
   1251 	    throw new SQLException("stale result set");
   1252 	}
   1253 	return s;
   1254     }
   1255 
   1256     public void close() throws SQLException {
   1257 	s = null;
   1258 	tr = null;
   1259 	lastg = null;
   1260 	oninsrow = false;
   1261 	rowbuf = null;
   1262 	row = -1;
   1263     }
   1264 
   1265     public java.net.URL getURL(int colIndex) throws SQLException {
   1266 	if (tr == null || colIndex < 1 || colIndex > tr.ncolumns) {
   1267 	    throw new SQLException("column " + colIndex + " not found");
   1268 	}
   1269 	String rd[] = (String []) tr.rows.elementAt(row);
   1270 	lastg = rd[colIndex - 1];
   1271 	java.net.URL url = null;
   1272 	if (lastg == null) {
   1273 	    return url;
   1274 	}
   1275 	try {
   1276 	    url = new java.net.URL(lastg);
   1277 	} catch (java.lang.Exception e) {
   1278 	    url = null;
   1279 	}
   1280 	return url;
   1281     }
   1282 
   1283     public java.net.URL getURL(String colName) throws SQLException {
   1284 	int col = findColumn(colName);
   1285 	return getURL(col);
   1286     }
   1287 
   1288     public void updateRef(int colIndex, java.sql.Ref x) throws SQLException {
   1289 	throw new SQLFeatureNotSupportedException();
   1290     }
   1291 
   1292     public void updateRef(String colName, java.sql.Ref x)
   1293 	throws SQLException {
   1294 	int col = findColumn(colName);
   1295 	updateRef(col, x);
   1296     }
   1297 
   1298     public void updateBlob(int colIndex, java.sql.Blob x)
   1299 	throws SQLException {
   1300 	throw new SQLFeatureNotSupportedException();
   1301     }
   1302 
   1303     public void updateBlob(String colName, java.sql.Blob x)
   1304 	throws SQLException {
   1305 	int col = findColumn(colName);
   1306 	updateBlob(col, x);
   1307     }
   1308 
   1309     public void updateClob(int colIndex, java.sql.Clob x)
   1310 	throws SQLException {
   1311 	throw new SQLFeatureNotSupportedException();
   1312     }
   1313 
   1314     public void updateClob(String colName, java.sql.Clob x)
   1315 	throws SQLException {
   1316 	int col = findColumn(colName);
   1317 	updateClob(col, x);
   1318     }
   1319 
   1320     public void updateArray(int colIndex, java.sql.Array x)
   1321 	throws SQLException {
   1322 	throw new SQLFeatureNotSupportedException();
   1323     }
   1324 
   1325     public void updateArray(String colName, java.sql.Array x)
   1326 	throws SQLException {
   1327 	int col = findColumn(colName);
   1328 	updateArray(col, x);
   1329     }
   1330 
   1331     public RowId getRowId(int colIndex) throws SQLException {
   1332 	throw new SQLFeatureNotSupportedException();
   1333     }
   1334 
   1335     public RowId getRowId(String colName) throws SQLException {
   1336 	int col = findColumn(colName);
   1337 	return getRowId(col);
   1338     }
   1339 
   1340     public void updateRowId(int colIndex, RowId x) throws SQLException {
   1341 	throw new SQLFeatureNotSupportedException();
   1342     }
   1343 
   1344     public void updateRowId(String colName, RowId x) throws SQLException {
   1345 	int col = findColumn(colName);
   1346 	updateRowId(col, x);
   1347     }
   1348 
   1349     public int getHoldability() throws SQLException {
   1350 	return ResultSet.CLOSE_CURSORS_AT_COMMIT;
   1351     }
   1352 
   1353     public boolean isClosed() throws SQLException {
   1354 	return tr == null;
   1355     }
   1356 
   1357     public void updateNString(int colIndex, String nString)
   1358 	throws SQLException {
   1359 	throw new SQLFeatureNotSupportedException();
   1360     }
   1361 
   1362     public void updateNString(String colName, String nString)
   1363 	throws SQLException {
   1364 	int col = findColumn(colName);
   1365 	updateNString(col, nString);
   1366     }
   1367 
   1368     public void updateNClob(int colIndex, NClob nclob)
   1369 	throws SQLException {
   1370 	throw new SQLFeatureNotSupportedException();
   1371     }
   1372 
   1373     public void updateNClob(String colName, NClob nclob)
   1374 	throws SQLException {
   1375 	int col = findColumn(colName);
   1376 	updateNClob(col, nclob);
   1377     }
   1378 
   1379     public NClob getNClob(int colIndex) throws SQLException {
   1380 	throw new SQLFeatureNotSupportedException();
   1381     }
   1382 
   1383     public NClob getNClob(String colName) throws SQLException {
   1384 	int col = findColumn(colName);
   1385 	return getNClob(col);
   1386     }
   1387 
   1388     public SQLXML getSQLXML(int colIndex) throws SQLException {
   1389 	throw new SQLFeatureNotSupportedException();
   1390     }
   1391 
   1392     public SQLXML getSQLXML(String colName) throws SQLException {
   1393 	int col = findColumn(colName);
   1394 	return getSQLXML(col);
   1395     }
   1396 
   1397     public void updateSQLXML(int colIndex, SQLXML xml)
   1398 	throws SQLException {
   1399 	throw new SQLFeatureNotSupportedException();
   1400     }
   1401 
   1402     public void updateSQLXML(String colName, SQLXML xml)
   1403 	throws SQLException {
   1404 	int col = findColumn(colName);
   1405 	updateSQLXML(col, xml);
   1406     }
   1407 
   1408     public String getNString(int colIndex) throws SQLException {
   1409 	throw new SQLFeatureNotSupportedException();
   1410     }
   1411 
   1412     public String getNString(String colName) throws SQLException {
   1413 	int col = findColumn(colName);
   1414 	return getNString(col);
   1415     }
   1416 
   1417     public java.io.Reader getNCharacterStream(int colIndex)
   1418 	throws SQLException {
   1419 	throw new SQLFeatureNotSupportedException();
   1420     }
   1421 
   1422     public java.io.Reader getNCharacterStream(String colName)
   1423 	throws SQLException {
   1424 	int col = findColumn(colName);
   1425 	return getNCharacterStream(col);
   1426     }
   1427 
   1428     public void updateNCharacterStream(int colIndex, java.io.Reader x,
   1429 				       long len)
   1430 	throws SQLException {
   1431 	throw new SQLFeatureNotSupportedException();
   1432     }
   1433 
   1434     public void updateNCharacterStream(String colName, java.io.Reader x,
   1435 				       long len)
   1436 	throws SQLException {
   1437 	int col = findColumn(colName);
   1438 	updateNCharacterStream(col, x, len);
   1439     }
   1440 
   1441     public void updateAsciiStream(int colIndex, java.io.InputStream x,
   1442 				  long len)
   1443 	throws SQLException {
   1444 	throw new SQLFeatureNotSupportedException();
   1445     }
   1446 
   1447     public void updateAsciiStream(String colName, java.io.InputStream x,
   1448 				  long len)
   1449 	throws SQLException {
   1450 	int col = findColumn(colName);
   1451 	updateAsciiStream(col, x, len);
   1452     }
   1453 
   1454     public void updateBinaryStream(int colIndex, java.io.InputStream x,
   1455 				   long len)
   1456 	throws SQLException {
   1457 	throw new SQLFeatureNotSupportedException();
   1458     }
   1459 
   1460     public void updateBinaryStream(String colName, java.io.InputStream x,
   1461 				   long len)
   1462 	throws SQLException {
   1463 	int col = findColumn(colName);
   1464 	updateBinaryStream(col, x, len);
   1465     }
   1466 
   1467     public void updateCharacterStream(int colIndex, java.io.Reader x,
   1468 				   long len)
   1469 	throws SQLException {
   1470 	throw new SQLFeatureNotSupportedException();
   1471     }
   1472 
   1473     public void updateCharacterStream(String colName, java.io.Reader x,
   1474 				   long len)
   1475 	throws SQLException {
   1476 	int col = findColumn(colName);
   1477 	updateCharacterStream(col, x, len);
   1478     }
   1479 
   1480     public void updateBlob(int colIndex, java.io.InputStream x,
   1481 			   long len)
   1482 	throws SQLException {
   1483 	throw new SQLFeatureNotSupportedException();
   1484     }
   1485 
   1486     public void updateBlob(String colName, java.io.InputStream x,
   1487 			   long len)
   1488 	throws SQLException {
   1489 	int col = findColumn(colName);
   1490 	updateBlob(col, x, len);
   1491     }
   1492 
   1493     public void updateClob(int colIndex, java.io.Reader x,
   1494 			   long len)
   1495 	throws SQLException {
   1496 	throw new SQLFeatureNotSupportedException();
   1497     }
   1498 
   1499     public void updateClob(String colName, java.io.Reader x,
   1500 			   long len)
   1501 	throws SQLException {
   1502 	int col = findColumn(colName);
   1503 	updateClob(col, x, len);
   1504     }
   1505 
   1506     public void updateNClob(int colIndex, java.io.Reader x,
   1507 			    long len)
   1508 	throws SQLException {
   1509 	throw new SQLFeatureNotSupportedException();
   1510     }
   1511 
   1512     public void updateNClob(String colName, java.io.Reader x,
   1513 			    long len)
   1514 	throws SQLException {
   1515 	int col = findColumn(colName);
   1516 	updateNClob(col, x, len);
   1517     }
   1518 
   1519     public void updateNCharacterStream(int colIndex, java.io.Reader x)
   1520 	throws SQLException {
   1521 	throw new SQLFeatureNotSupportedException();
   1522     }
   1523 
   1524     public void updateNCharacterStream(String colName, java.io.Reader x)
   1525 	throws SQLException {
   1526 	int col = findColumn(colName);
   1527 	updateNCharacterStream(col, x);
   1528     }
   1529 
   1530     public void updateAsciiStream(int colIndex, java.io.InputStream x)
   1531 	throws SQLException {
   1532 	throw new SQLFeatureNotSupportedException();
   1533     }
   1534 
   1535     public void updateAsciiStream(String colName, java.io.InputStream x)
   1536 	throws SQLException {
   1537 	int col = findColumn(colName);
   1538 	updateAsciiStream(col, x);
   1539     }
   1540 
   1541     public void updateBinaryStream(int colIndex, java.io.InputStream x)
   1542 	throws SQLException {
   1543 	throw new SQLFeatureNotSupportedException();
   1544     }
   1545 
   1546     public void updateBinaryStream(String colName, java.io.InputStream x)
   1547 	throws SQLException {
   1548 	int col = findColumn(colName);
   1549 	updateBinaryStream(col, x);
   1550     }
   1551 
   1552     public void updateCharacterStream(int colIndex, java.io.Reader x)
   1553 	throws SQLException {
   1554 	throw new SQLFeatureNotSupportedException();
   1555     }
   1556 
   1557     public void updateCharacterStream(String colName, java.io.Reader x)
   1558 	throws SQLException {
   1559 	int col = findColumn(colName);
   1560 	updateCharacterStream(col, x);
   1561     }
   1562 
   1563     public void updateBlob(int colIndex, java.io.InputStream x)
   1564 	throws SQLException {
   1565 	throw new SQLFeatureNotSupportedException();
   1566     }
   1567 
   1568     public void updateBlob(String colName, java.io.InputStream x)
   1569 	throws SQLException {
   1570 	int col = findColumn(colName);
   1571 	updateBlob(col, x);
   1572     }
   1573 
   1574     public void updateClob(int colIndex, java.io.Reader x)
   1575 	throws SQLException {
   1576 	throw new SQLFeatureNotSupportedException();
   1577     }
   1578 
   1579     public void updateClob(String colName, java.io.Reader x)
   1580 	throws SQLException {
   1581 	int col = findColumn(colName);
   1582 	updateClob(col, x);
   1583     }
   1584 
   1585     public void updateNClob(int colIndex, java.io.Reader x)
   1586 	throws SQLException {
   1587 	throw new SQLFeatureNotSupportedException();
   1588     }
   1589 
   1590     public void updateNClob(String colName, java.io.Reader x)
   1591 	throws SQLException {
   1592 	int col = findColumn(colName);
   1593 	updateNClob(col, x);
   1594     }
   1595 
   1596     public <T> T unwrap(java.lang.Class<T> iface) throws SQLException {
   1597 	throw new SQLException("unsupported");
   1598     }
   1599 
   1600     public boolean isWrapperFor(java.lang.Class iface) throws SQLException {
   1601 	return false;
   1602     }
   1603 
   1604 }
   1605