in rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/AbstractUndoExecutor.java [162:223]
protected void undoPrepare(PreparedStatement undoPST, ArrayList<Field> undoValues, List<Field> pkValueList)
throws SQLException {
int undoIndex = 0;
for (Field undoValue : undoValues) {
undoIndex++;
int type = undoValue.getType();
Object value = undoValue.getValue();
if (type == JDBCType.BLOB.getVendorTypeNumber()) {
SerialBlob serialBlob = (SerialBlob) value;
if (serialBlob != null) {
undoPST.setObject(undoIndex, serialBlob.getBinaryStream());
} else {
undoPST.setObject(undoIndex, null);
}
} else if (type == JDBCType.LONGVARBINARY.getVendorTypeNumber()) {
if (value != null) {
byte[] bytes = (byte[]) value;
undoPST.setObject(undoIndex, new ByteArrayInputStream(bytes));
} else {
undoPST.setObject(undoIndex, null);
}
} else if (type == JDBCType.CLOB.getVendorTypeNumber() || type == JDBCType.NCLOB.getVendorTypeNumber()) {
SerialClob serialClob = (SerialClob) value;
if (serialClob != null) {
undoPST.setClob(undoIndex, serialClob.getCharacterStream());
} else {
undoPST.setObject(undoIndex, null);
}
} else if (type == JDBCType.DATALINK.getVendorTypeNumber()) {
SerialDatalink dataLink = (SerialDatalink) value;
if (dataLink != null) {
undoPST.setURL(undoIndex, dataLink.getDatalink());
} else {
undoPST.setObject(undoIndex, null);
}
} else if (type == JDBCType.ARRAY.getVendorTypeNumber()) {
SerialArray array = (SerialArray) value;
if (array != null) {
Array arrayOf = undoPST.getConnection().createArrayOf(array.getBaseTypeName(), array.getElements());
undoPST.setArray(undoIndex, arrayOf);
} else {
undoPST.setObject(undoIndex, null);
}
} else if (undoValue.getType() == JDBCType.OTHER.getVendorTypeNumber()) {
undoPST.setObject(undoIndex, value);
} else if (undoValue.getType() == JDBCType.BIT.getVendorTypeNumber()) {
undoPST.setObject(undoIndex, value);
} else {
// JDBCType.REF, JDBCType.JAVA_OBJECT etc...
undoPST.setObject(undoIndex, value, type);
}
}
// PK is always at last.
// INSERT INTO a (x, y, z, pk1,pk2) VALUES (?, ?, ?, ? ,?)
// UPDATE a SET x=?, y=?, z=? WHERE pk1 in (?) and pk2 in (?)
// DELETE FROM a WHERE pk1 in (?) and pk2 in (?)
for (Field pkField : pkValueList) {
undoIndex++;
undoPST.setObject(undoIndex, pkField.getValue(), pkField.getType());
}
}