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.JdbcTypeRegistry;
016: import com.versant.core.jdbc.metadata.JdbcColumn;
017:
018: import java.sql.PreparedStatement;
019: import java.sql.SQLException;
020: import java.sql.ResultSet;
021: import java.sql.Clob;
022:
023: // import oracle.sql.CLOB;
024:
025: import javax.jdo.JDOFatalDataStoreException; //todo: appears only in throws-clause
026:
027: import org.polepos.teams.jdo.*;
028:
029: import com.versant.core.common.BindingSupportImpl;
030:
031: /**
032: * This converter converts Strings stored in Oracle CLOB columns to
033: * and from SQL.
034: * @keep-all
035: */
036: public class OracleClobConverter implements JdbcConverter {
037:
038: public OracleClobConverter() {
039: VoaEdited.exception();
040: }
041:
042: public static class Factory extends NoArgJdbcConverterFactory {
043:
044: private OracleClobConverter converter;
045:
046: /**
047: * Create a converter for col using args as parameters. Return null if
048: * no converter is required.
049: */
050: public JdbcConverter createJdbcConverter(JdbcColumn col,
051: Object args, JdbcTypeRegistry jdbcTypeRegistry) {
052: if (converter == null)
053: converter = new OracleClobConverter();
054: return converter;
055: }
056:
057: }
058:
059: /**
060: * Is this converter for an Oracle style LOB column? Oracle LOBs require
061: * a hard coded a value into the insert/update statement instead of using
062: * a replaceable parameter and then select the value (if not null) and
063: * modify it.
064: */
065: public boolean isOracleStyleLOB() {
066: return true;
067: }
068:
069: /**
070: * This is only called if isOracleStyleLOB returns true. Get the String
071: * to be embedded in an SQL insert/update statement when the value for
072: * this column is not null (e.g. "empty_clob()");
073: */
074: public String getOracleStyleLOBNotNullString() {
075: return "empty_clob()";
076: }
077:
078: /**
079: * Get the value of col from rs at position index.
080: * @exception SQLException on SQL errors
081: * @exception JDOFatalDataStoreException if the ResultSet value is invalid
082: */
083: public Object get(ResultSet rs, int index, JdbcColumn col)
084: throws SQLException, JDOFatalDataStoreException {
085:
086: VoaEdited.exception();
087: return null;
088:
089: // CLOB clob = (CLOB)rs.getClob(index);
090: // if (clob == null || clob.isEmptyLob()) return null;
091: // if (clob.length() == 0) return "";
092: // return clob.getSubString(1, (int)clob.length());
093:
094: }
095:
096: /**
097: * Set parameter index on ps to value (for col).
098: * @exception SQLException on SQL errors
099: * @exception JDOFatalDataStoreException if value is invalid
100: */
101: public void set(PreparedStatement ps, int index, JdbcColumn col,
102: Object value) throws SQLException,
103: JDOFatalDataStoreException {
104: throw BindingSupportImpl.getInstance().internal(
105: "set(ps..) called");
106: }
107:
108: /**
109: * Set parameter index on ps to value (for col). This special form is used
110: * when the value to be set is available as an int to avoid creating
111: * an wrapper instance.
112: * @exception SQLException on SQL errors
113: * @exception JDOFatalDataStoreException if value is invalid
114: */
115: public void set(PreparedStatement ps, int index, JdbcColumn col,
116: int value) throws SQLException, JDOFatalDataStoreException {
117: throw BindingSupportImpl.getInstance().internal(
118: "set(..int) called");
119: }
120:
121: /**
122: * This method is called for converters that return true for
123: * isOracleStyleLOB. The value at index in rs will contain the LOB to
124: * be updated.
125: * @exception SQLException on SQL errors
126: * @exception JDOFatalDataStoreException if value is invalid
127: */
128: public void set(ResultSet rs, int index, JdbcColumn col,
129: Object value) throws SQLException,
130: JDOFatalDataStoreException {
131:
132: VoaEdited.exception();
133:
134: // String s = (String)value;
135: // CLOB clob = (CLOB)rs.getClob(index);
136: // clob.putString(1, s);
137:
138: // Calling trim leaks cursors - we make new CLOBs for every update to
139: // avoid this problem
140: // DO NOT DO - clob.trim(s.length());
141: }
142:
143: /**
144: * Get the type of our expected value objects (e.g. java.util.Locale
145: * for a converter for Locale's).
146: */
147: public Class getValueType() {
148: return String.class;
149: }
150:
151: }
|