001: /*
002:
003: Derby - Class org.apache.derby.impl.sql.compile.LOBConstantNode
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.types.StringDataValue;
025: import org.apache.derby.iapi.types.TypeId;
026:
027: import org.apache.derby.iapi.error.StandardException;
028:
029: import org.apache.derby.iapi.services.compiler.MethodBuilder;
030:
031: import org.apache.derby.impl.sql.compile.ExpressionClassBuilder;
032: import org.apache.derby.iapi.reference.SQLState;
033:
034: import org.apache.derby.iapi.util.ReuseFactory;
035:
036: import java.sql.Types;
037:
038: public final class LOBConstantNode extends ConstantNode {
039: /**
040: * Initializer for a LOBConstantNode. Parameters are:
041: *
042: * <ul>
043: * <li>arg1 The TypeId for the type of the node, or a string?</li>
044: * </ul>
045: *
046: * <p>
047: * - OR -
048: * </p>
049: *
050: * <ul>
051: * <li>arg1 A String containing the value of the constant</li>
052: * <li>arg2 The factory to get the TypeId and DataTypeServices factories from.</li>
053: * </ul>
054: *
055: * @exception StandardException
056: */
057: public void init(Object arg1) throws StandardException {
058: if (arg1 instanceof TypeId) {
059: super .init(arg1, Boolean.TRUE, ReuseFactory.getInteger(0));
060: } else {
061: String val = (String) arg1;
062:
063: super .init(TypeId.CHAR_ID, (val == null) ? Boolean.TRUE
064: : Boolean.FALSE, (val != null) ? ReuseFactory
065: .getInteger(val.length()) : ReuseFactory
066: .getInteger(0));
067:
068: setValue(getDataValueFactory().getCharDataValue(val));
069: }
070: }
071:
072: public void init(Object newValue, Object newLength)
073: throws StandardException {
074: String val = (String) newValue;
075: int newLen = ((Integer) newLength).intValue();
076:
077: super .init(TypeId.CHAR_ID, (val == null) ? Boolean.TRUE
078: : Boolean.FALSE, newLength);
079:
080: if (val.length() > newLen) {
081: throw StandardException.newException(
082: SQLState.LANG_STRING_TRUNCATION, "CHAR", val,
083: String.valueOf(newLen));
084: }
085:
086: // Blank pad the string if necessesary
087: while (val.length() < newLen) {
088: val = val + ' ';
089: }
090:
091: setValue(getDataValueFactory().getCharDataValue(val));
092: }
093:
094: /**
095: * Return the value from this LOBConstantNode
096: *
097: * @return The value of this LOBConstantNode.
098: *
099: * @exception StandardException Thrown on error
100: */
101:
102: public String getString() throws StandardException {
103: return value.getString();
104: }
105:
106: /**
107: * Return the length
108: *
109: * @return The length of the value this node represents
110: *
111: * @exception StandardException Thrown on error
112: */
113:
114: //public int getLength() throws StandardException
115: //{
116: // return value.getLength();
117: //}
118: /**
119: * Return an Object representing the bind time value of this
120: * expression tree. If the expression tree does not evaluate to
121: * a constant at bind time then we return null.
122: * This is useful for bind time resolution of VTIs.
123: * RESOLVE: What do we do for primitives?
124: *
125: * @return An Object representing the bind time value of this expression tree.
126: * (null if not a bind time constant.)
127: *
128: * @exception StandardException Thrown on error
129: */
130: Object getConstantValueAsObject() throws StandardException {
131: return value.getString();
132: }
133:
134: /**
135: * This generates the proper constant. It is implemented
136: * by every specific constant node (e.g. IntConstantNode).
137: *
138: * @param acb The ExpressionClassBuilder for the class being built
139: * @param mb The method the code to place the code
140: *
141: * @exception StandardException Thrown on error
142: */
143: void generateConstant(ExpressionClassBuilder acb, MethodBuilder mb)
144: throws StandardException {
145: // The generated java is the expression:
146: // "#getString()"
147: mb.push(getString());
148: }
149: }
|