package com.google.code.hs4j.impl;
import java.math.BigDecimal;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.SQLException;
import java.text.DateFormat;
import java.util.Date;
import java.util.concurrent.TimeoutException;
import com.google.code.hs4j.FindOperator;
import com.google.code.hs4j.ModifyStatement;
import com.google.code.hs4j.exception.HandlerSocketException;
import com.google.code.hs4j.utils.HSUtils;
/**
* A handlersocket modify statement implementation
*
* @author dennis
*
*/
public class HandlerSocketModifyStatement implements ModifyStatement {
private byte[][] values;
private HSClientImpl hsClientImpl;
private String encoding;
private int indexId;
public HandlerSocketModifyStatement(int indexId, int fieldLength,
HSClientImpl hsClientImpl) {
this.indexId = indexId;
this.hsClientImpl = hsClientImpl;
this.values = new byte[fieldLength][0];
this.encoding = this.hsClientImpl.getEncoding();
}
byte[][] getValues() {
return this.values;
}
public boolean insert() throws HandlerSocketException,
InterruptedException, TimeoutException {
return this.hsClientImpl.insert0(indexId, values);
}
public int update(String[] keys, FindOperator operator, int limit,
int offset) throws InterruptedException, TimeoutException,
HandlerSocketException {
return this.hsClientImpl.update0(indexId, keys, operator, limit,
offset, values);
}
public int update(String[] keys, FindOperator operator)
throws InterruptedException, TimeoutException,
HandlerSocketException {
return update(keys, operator, 1, 0);
}
public int incr(String[] keys, FindOperator operator)
throws InterruptedException, TimeoutException,
HandlerSocketException {
return this.hsClientImpl.incr(indexId, keys, operator, 1, 0, values);
}
public int decr(String[] keys, FindOperator operator)
throws InterruptedException, TimeoutException,
HandlerSocketException {
return this.hsClientImpl.decr(indexId, keys, operator, 1, 0, values);
}
public void setBigDecimal(int parameterIndex, BigDecimal x) {
setString(parameterIndex, String.valueOf(x));
}
public void setBlob(int parameterIndex, Blob x) {
checkRange(parameterIndex);
try {
values[parameterIndex - 1] = x.getBytes(0, (int) x.length());
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void setBoolean(int parameterIndex, boolean x) {
setString(parameterIndex, x ? String.valueOf("1") : String.valueOf("0"));
}
public void setByte(int parameterIndex, byte x) {
setString(parameterIndex, String.valueOf(x));
}
public void setBytes(int parameterIndex, byte[] x) {
checkRange(parameterIndex);
values[parameterIndex - 1] = x;
}
public void setClob(int parameterIndex, Clob x) {
try {
setString(parameterIndex, x.getSubString(0, (int) x.length()));
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void setDate(int parameterIndex, Date x) {
setString(parameterIndex, DEFAULT_DATE_FORMAT.format(x));
}
public void setDate(int parameterIndex, Date x, DateFormat df) {
setString(parameterIndex, df.format(x));
}
public void setDouble(int parameterIndex, double x) {
setString(parameterIndex, String.valueOf(x));
}
public void setFloat(int parameterIndex, float x) {
setString(parameterIndex, String.valueOf(x));
}
public void setInt(int parameterIndex, int x) {
setString(parameterIndex, String.valueOf(x));
}
public void setLong(int parameterIndex, long x) {
setString(parameterIndex, String.valueOf(x));
}
public void setShort(int parameterIndex, short x) {
setString(parameterIndex, String.valueOf(x));
}
public void setString(int parameterIndex, String x) {
checkRange(parameterIndex);
int index = parameterIndex - 1;
values[index] = HSUtils.decodeString(x, encoding);
}
private void checkRange(int parameterIndex) {
if (parameterIndex > this.values.length) {
byte[][] newValues = new byte[this.values.length + 1][0];
System.arraycopy(values, 0, newValues, 0, this.values.length);
this.values = newValues;
}
}
}