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 is a converter for databases that do not handle \u0000
026: * (Character.MIN_VALUE) propertly (e.g. Postgres and Informix). A char with
027: * value \u0000 must set as an empty String.
028: *
029: * @keep-all
030: */
031: public class NoMinCharConverter extends JdbcConverterBase {
032: private char defaultChar;
033:
034: public static class Factory extends NoArgJdbcConverterFactory {
035:
036: private NoMinCharConverter 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 NoMinCharConverter();
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: Character c = (Character) value;
085: char cv = c.charValue();
086: String s = cv == Character.MIN_VALUE ? "" : new String(
087: new char[] { cv });
088: ps.setString(index, s);
089: }
090: }
091:
092: /**
093: * Get the type of our expected value objects (e.g. java.util.Locale
094: * for a converter for Locale's).
095: */
096: public Class getValueType() {
097: return Character.class;
098: }
099:
100: }
|