001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.compile.CLOBTypeCompiler
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.impl.sql.compile;
023:
024: import org.apache.derby.iapi.reference.SQLState;
025:
026: import org.apache.derby.iapi.services.loader.ClassFactory;
027: import org.apache.derby.iapi.services.sanity.SanityManager;
028: import org.apache.derby.iapi.services.io.StoredFormatIds;
029:
030: import org.apache.derby.iapi.error.StandardException;
031: import org.apache.derby.iapi.sql.conn.ConnectionUtil;
032:
033: import org.apache.derby.iapi.types.BitDataValue;
034: import org.apache.derby.iapi.types.DataValueFactory;
035: import org.apache.derby.iapi.types.TypeId;
036:
037: import org.apache.derby.iapi.types.DataTypeDescriptor;
038:
039: import org.apache.derby.iapi.sql.compile.TypeCompiler;
040:
041: import org.apache.derby.iapi.reference.ClassName;
042:
043: import java.sql.Types;
044: import org.apache.derby.iapi.reference.JDBC20Translation;
045:
046: /**
047: * This class implements TypeCompiler for the SQL LOB types.
048: *
049: * @author Jonas S Karlsson
050: */
051:
052: public class CLOBTypeCompiler extends BaseTypeCompiler {
053: /**
054: * Tell whether this type (LOB) can be compared to the given type.
055: * Clobs are not comparable.
056: *
057: * @param otherType The TypeId of the other type.
058: */
059:
060: public boolean comparable(TypeId otherType, boolean forEquals,
061: ClassFactory cf) {
062: return false;
063: }
064:
065: /**
066: * Tell whether this type (LOB) can be converted to the given type.
067: *
068: * @see TypeCompiler#convertible
069: */
070: public boolean convertible(TypeId otherType,
071: boolean forDataTypeFunction) {
072: // allow casting to any string
073: return (otherType.isStringTypeId());
074:
075: }
076:
077: /**
078: * Tell whether this type (CLOB) is compatible with the given type.
079: *
080: * @param otherType The TypeId of the other type.
081: */
082: public boolean compatible(TypeId otherType) {
083: return convertible(otherType, false);
084: }
085:
086: /**
087: * Tell whether this type (LOB) can be stored into from the given type.
088: *
089: * @param otherType The TypeId of the other type.
090: * @param cf A ClassFactory
091: */
092:
093: public boolean storable(TypeId otherType, ClassFactory cf) {
094: // no automatic conversions at store time--but string
095: // literals (or values of type CHAR/VARCHAR) are STORABLE
096: // as clobs, even if the two types can't be COMPARED.
097: return (otherType.isStringTypeId());
098: }
099:
100: /** @see TypeCompiler#interfaceName */
101: public String interfaceName() {
102: return ClassName.StringDataValue;
103: }
104:
105: /**
106: * @see TypeCompiler#getCorrespondingPrimitiveTypeName
107: */
108:
109: public String getCorrespondingPrimitiveTypeName() {
110: int formatId = getStoredFormatIdFromTypeId();
111: switch (formatId) {
112: case StoredFormatIds.CLOB_TYPE_ID:
113: return "java.sql.Clob";
114: case StoredFormatIds.NCLOB_TYPE_ID:
115: return "java.sql.Clob";
116: default:
117: if (SanityManager.DEBUG)
118: SanityManager
119: .THROWASSERT("unexpected formatId in getCorrespondingPrimitiveTypeName() - "
120: + formatId);
121: return null;
122: }
123: }
124:
125: public String getMatchingNationalCharTypeName() {
126: return TypeId.NCLOB_NAME;
127: }
128:
129: /**
130: * @see TypeCompiler#getCastToCharWidth
131: */
132: public int getCastToCharWidth(DataTypeDescriptor dts) {
133: return dts.getMaximumWidth();
134: }
135:
136: protected String nullMethodName() {
137: int formatId = getStoredFormatIdFromTypeId();
138: switch (formatId) {
139: case StoredFormatIds.CLOB_TYPE_ID:
140: return "getNullClob";
141: case StoredFormatIds.NCLOB_TYPE_ID:
142: return "getNullNClob";
143: default:
144: if (SanityManager.DEBUG)
145: SanityManager
146: .THROWASSERT("unexpected formatId in nullMethodName() - "
147: + formatId);
148: return null;
149: }
150: }
151:
152: protected String dataValueMethodName() {
153: int formatId = getStoredFormatIdFromTypeId();
154: switch (formatId) {
155: case StoredFormatIds.CLOB_TYPE_ID:
156: return "getClobDataValue";
157: case StoredFormatIds.NCLOB_TYPE_ID:
158: return "getNClobDataValue";
159: default:
160: if (SanityManager.DEBUG)
161: SanityManager
162: .THROWASSERT("unexpected formatId in dataValueMethodName() - "
163: + formatId);
164: return null;
165: }
166: }
167: }
|