/*
* 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;
}
}