001: /*
002: * Copyright (c) 1998 - 2005 Versant Corporation
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * Versant Corporation - initial API and implementation
010: */
011: package com.versant.core.jdbc.sql.conv;
012:
013: import com.versant.core.jdbc.JdbcConverter;
014: import com.versant.core.jdbc.JdbcConverterFactory;
015: import com.versant.core.jdbc.metadata.JdbcColumn;
016:
017: import java.sql.PreparedStatement;
018: import java.sql.SQLException;
019: import java.sql.ResultSet;
020:
021: import javax.jdo.JDOFatalDataStoreException; //todo: appears only in throws-clause
022:
023: import com.versant.core.common.BindingSupportImpl;
024:
025: /**
026: * <p>Base class for converters. This implements most methods in JdbcConverter
027: * assuming that this is not a Oracle style LOB converter. Subclasses
028: * only have to provide the following methods:</p>
029: *
030: * <ul>
031: * <li>{@link #get(ResultSet, int, JdbcColumn) }
032: * <li>{@link #set(PreparedStatement, int, JdbcColumn, Object) }
033: * <li>{@link #getValueType() }
034: * </ul>
035: *
036: * <p>A {@link JdbcConverterFactory} must also be written.</p>
037: *
038: * @keep-all
039: */
040: public abstract class JdbcConverterBase implements JdbcConverter {
041:
042: /**
043: * Is this converter for an Oracle style LOB column? Oracle LOBs require
044: * a hard coded a value into the insert/update statement instead of using
045: * a replaceable parameter and then select the value (if not null) and
046: * modify it.
047: */
048: public boolean isOracleStyleLOB() {
049: return false;
050: }
051:
052: /**
053: * This is only called if isOracleStyleLOB returns true. Get the String
054: * to be embedded in an SQL insert/update statement when the value for
055: * this column is not null (e.g. "empty_clob()");
056: */
057: public String getOracleStyleLOBNotNullString() {
058: return null;
059: }
060:
061: /**
062: * Get the value of col from rs at position index.
063: * @exception SQLException on SQL errors
064: * @exception JDOFatalDataStoreException if the ResultSet value is invalid
065: */
066: public abstract Object get(ResultSet rs, int index, JdbcColumn col)
067: throws SQLException, JDOFatalDataStoreException;
068:
069: /**
070: * Set parameter index on ps to value (for col).
071: * @exception SQLException on SQL errors
072: * @exception JDOFatalDataStoreException if value is invalid
073: */
074: public abstract void set(PreparedStatement ps, int index,
075: JdbcColumn col, Object value) throws SQLException,
076: JDOFatalDataStoreException;
077:
078: /**
079: * Set parameter index on ps to value (for col). This special form is used
080: * when the value to be set is available as an int to avoid creating
081: * an wrapper instance.
082: * @exception SQLException on SQL errors
083: * @exception JDOFatalDataStoreException if value is invalid
084: */
085: public void set(PreparedStatement ps, int index, JdbcColumn col,
086: int value) throws SQLException, JDOFatalDataStoreException {
087: throw BindingSupportImpl.getInstance().fatalDatastore(
088: "set(..int) called");
089: }
090:
091: /**
092: * This method is called for converters that return true for
093: * isOracleStyleLOB. The value at index in rs will contain the LOB to
094: * be updated.
095: * @exception SQLException on SQL errors
096: * @exception JDOFatalDataStoreException if value is invalid
097: */
098: public void set(ResultSet rs, int index, JdbcColumn col,
099: Object value) throws SQLException,
100: JDOFatalDataStoreException {
101: throw BindingSupportImpl.getInstance().fatalDatastore(
102: "set(rs..) called");
103: }
104:
105: /**
106: * Get the type of our expected value objects (e.g. java.util.Locale
107: * for a converter for Locale's).
108: */
109: public abstract Class getValueType();
110:
111: }
|