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