package com.meidusa.amoeba.mysql.util;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.sql.SQLException;
import com.meidusa.amoeba.mysql.jdbc.Messages;
import com.meidusa.amoeba.mysql.jdbc.MysqlDefs;
import com.meidusa.amoeba.util.StringUtil;
public class MysqlStringUtil extends StringUtil {
/**
* Returns the byte[] representation of the given string (re)using the given
* charset converter, and the given encoding.
*
* @param s
* the string to convert
* @param converter
* the converter to reuse
* @param encoding
* the character encoding to use
* @param serverEncoding
* DOCUMENT ME!
* @param parserKnowsUnicode
* DOCUMENT ME!
*
* @return byte[] representation of the string
*
* @throws SQLException
* if an encoding unsupported by the JVM is supplied.
* @throws UnsupportedEncodingException
*/
public static final byte[] getBytes(String s,
SingleByteCharsetConverter converter, String encoding,
String serverEncoding, boolean parserKnowsUnicode)
throws UnsupportedEncodingException {
byte[] b = null;
if (converter != null) {
b = converter.toBytes(s);
} else if (encoding == null) {
b = s.getBytes();
} else {
b = s.getBytes(encoding);
if (!parserKnowsUnicode && (encoding.equalsIgnoreCase("SJIS") //$NON-NLS-1$
|| encoding.equalsIgnoreCase("BIG5") //$NON-NLS-1$
|| encoding.equalsIgnoreCase("GBK"))) { //$NON-NLS-1$
if (!encoding.equalsIgnoreCase(serverEncoding)) {
b = escapeEasternUnicodeByteStream(b, s, 0, s.length());
}
}
}
return b;
}
/**
* Adds '+' to decimal numbers that are positive (MySQL doesn't understand
* them otherwise
*
* @param dString
* The value as a string
*
* @return String the string with a '+' added (if needed)
*/
public static final String fixDecimalExponent(String dString) {
int ePos = dString.indexOf("E"); //$NON-NLS-1$
if (ePos == -1) {
ePos = dString.indexOf("e"); //$NON-NLS-1$
}
if (ePos != -1) {
if (dString.length() > (ePos + 1)) {
char maybeMinusChar = dString.charAt(ePos + 1);
if (maybeMinusChar != '-' && maybeMinusChar != '+') {
StringBuffer buf = new StringBuffer(dString.length() + 1);
buf.append(dString.substring(0, ePos + 1));
buf.append('+');
buf.append(dString.substring(ePos + 1, dString.length()));
dString = buf.toString();
}
}
}
return dString;
}
public static final BigDecimal getBigDecimalFromString(String stringVal, int scale) throws SQLException {
BigDecimal bdVal;
if (stringVal != null) {
if (stringVal.length() == 0) {
bdVal = new BigDecimal('0');
try {
return bdVal.setScale(scale);
} catch (ArithmeticException ex) {
try {
return bdVal.setScale(scale, BigDecimal.ROUND_HALF_UP);
} catch (ArithmeticException arEx) {
throw new SQLException(Messages.getString(
"ResultSet.Bad_format_for_BigDecimal",
new Object[] { stringVal}),
MysqlDefs.SQL_STATE_ILLEGAL_ARGUMENT); //$NON-NLS-1$
}
}
}
try {
return new BigDecimal(stringVal).setScale(scale);
} catch (ArithmeticException ex) {
try {
return new BigDecimal(stringVal).setScale(scale,
BigDecimal.ROUND_HALF_UP);
} catch (ArithmeticException arEx) {
throw new SQLException(Messages
.getString("ResultSet.Bad_format_for_BigDecimal",
new Object[] { stringVal }),
MysqlDefs.SQL_STATE_ILLEGAL_ARGUMENT); //$NON-NLS-1$
}
}
}
return null;
}
}