package litchi.core.jdbc.column;
import com.esotericsoftware.reflectasm.FieldAccess;
import com.google.protobuf.GeneratedMessageV3;
import litchi.core.jdbc.table.Table;
import litchi.core.jdbc.table.TableInfo;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class ProtobufColumn extends AbstractColumnParser {
@Override
public void readColumn(Table<?> instance, TableInfo.TableColumnInfo columnInfo, ResultSet rs) throws SQLException {
FieldAccess fieldAccess = instance.getTableInfo().fieldAccess;
byte[] bytes = rs.getBytes(columnInfo.aliasName);
if (bytes == null) {
try {
Class<?> parseClass = columnInfo.getColumnType(0);
Method newBuilder = parseClass.getMethod("newBuilder");
bytes = ((GeneratedMessageV3.Builder<?>)newBuilder.invoke(null)).build().toByteArray();
} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
Method parseFrom = null;
try {
Class<?> parseClass = columnInfo.getColumnType(0);
parseFrom = parseClass.getMethod("parseFrom", byte[].class);
fieldAccess.set(instance, columnInfo.fieldName, parseFrom.invoke(null, (Object) bytes));
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
@Override
public void writeColumn(ArrayList<Object> writeList, TableInfo.TableColumnInfo columnInfo, Object fieldValue) {
if (fieldValue == null) {
writeList.add(new byte[0]);
} else {
writeList.add(((GeneratedMessageV3) fieldValue).toByteArray());
}
}
}