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: import com.versant.core.metadata.MDStatics;
018:
019: import javax.jdo.JDOFatalDataStoreException; //todo: appears only in throws clause
020: import java.sql.PreparedStatement;
021: import java.sql.SQLException;
022: import java.sql.ResultSet;
023:
024: /**
025: * This converter converts char and Character's to and from SQL. It assumes
026: * that the value is stored in a column compatible with ResultSet.getString and
027: * PreparedStatement.setString. The value is stored as a String containing
028: * the character.
029: * @keep-all
030: */
031: public class CharConverter extends JdbcConverterBase {
032: private char defaultChar;
033:
034: public static class Factory extends NoArgJdbcConverterFactory {
035:
036: private CharConverter converter;
037:
038: /**
039: * Create a converter for col using props as parameters. Return null if
040: * no converter is required.
041: */
042: public JdbcConverter createJdbcConverter(JdbcColumn col,
043: Object args, JdbcTypeRegistry jdbcTypeRegistry) {
044: if (converter == null)
045: converter = new CharConverter();
046: return converter;
047: }
048:
049: }
050:
051: /**
052: * Get the value of col from rs at position index.
053: * @exception SQLException on SQL errors
054: * @exception JDOFatalDataStoreException if the ResultSet value is invalid
055: */
056: public Object get(ResultSet rs, int index, JdbcColumn col)
057: throws SQLException, JDOFatalDataStoreException {
058: String s = rs.getString(index);
059: if (s == null || s.length() == 0) {
060: if (rs.wasNull()) {
061: if (col.javaTypeCode == MDStatics.CHAR) {
062: return new Character(defaultChar);
063: } else {
064: return null;
065: }
066: } else {
067: return new Character(defaultChar);
068: }
069: }
070: return new Character(s.charAt(0));
071: }
072:
073: /**
074: * Set parameter index on ps to value (for col).
075: * @exception SQLException on SQL errors
076: * @exception JDOFatalDataStoreException if value is invalid
077: */
078: public void set(PreparedStatement ps, int index, JdbcColumn col,
079: Object value) throws SQLException,
080: JDOFatalDataStoreException {
081: if (value == null) {
082: ps.setNull(index, col.jdbcType);
083: } else {
084:
085: {
086: Character c = (Character) value;
087: String s = new String(new char[] { c.charValue() });
088: ps.setString(index, s);
089: }
090:
091: }
092: }
093:
094: /**
095: * Get the type of our expected value objects (e.g. java.util.Locale
096: * for a converter for Locale's).
097: */
098: public Class getValueType() {
099: return Character.class;
100: }
101:
102: }
|