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