/* * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software;Designed and Developed mainly by many Chinese * opensource volunteers. you can redistribute it and/or modify it under the * terms of the GNU General Public License version 2 only, as published by the * Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Any questions about this component can be directed to it's project Web address * https://code.google.com/p/opencloudb/. * */ package com.akiban.sql.parser; import com.akiban.sql.StandardException; import com.akiban.sql.types.TypeId; import java.sql.Types; public class BitConstantNode extends ConstantNode { private int bitLength; /** * Initializer for a BitConstantNode. * * @param arg1 A Bit containing the value of the constant OR The TypeId for the type of the node * * @exception StandardException */ public void init(Object arg1) throws StandardException { super.init(arg1, Boolean.TRUE, 0); } public void init(Object arg1, Object arg2) throws StandardException { String a1 = (String)arg1; byte[] nv = fromHexString(a1, 0, a1.length()); Integer bitLengthO = (Integer)arg2; bitLength = bitLengthO.intValue(); init(TypeId.getBuiltInTypeId(Types.BINARY), Boolean.FALSE, bitLengthO); setValue(nv); } /** * Fill this node with a deep copy of the given node. */ public void copyFrom(QueryTreeNode node) throws StandardException { super.copyFrom(node); BitConstantNode other = (BitConstantNode)node; this.bitLength = other.bitLength; } /** Convert a hexidecimal string generated by toHexString() back into a byte array. @param s String to convert @param offset starting character (zero based) to convert. @param length number of characters to convert. @return the converted byte array. Returns null if the length is not a multiple of 2. */ public static byte[] fromHexString(String s, int offset, int length) { if ((length%2) != 0) return null; byte[] byteArray = new byte[length/2]; int j = 0; int end = offset+length; for (int i = offset; i < end; i += 2) { int high_nibble = Character.digit(s.charAt(i), 16); int low_nibble = Character.digit(s.charAt(i+1), 16); if (high_nibble == -1 || low_nibble == -1) { // illegal format return null; } byteArray[j++] = (byte)(((high_nibble << 4) & 0xf0) | (low_nibble & 0x0f)); } return byteArray; } }