提交 15e9d057 authored 作者: Vitaly Dyachkov's avatar Vitaly Dyachkov

Fix for handling LOBs during recovery

上级 aa55aed2
...@@ -456,25 +456,31 @@ public class LobStorageBackend implements LobStorageInterface { ...@@ -456,25 +456,31 @@ public class LobStorageBackend implements LobStorageInterface {
synchronized (conn.getSession()) { synchronized (conn.getSession()) {
try { try {
init(); init();
long lobId = getNextLobId(); ValueLobDb v = null;
String sql = "INSERT INTO " + LOB_MAP + "(LOB, SEQ, POS, HASH, BLOCK) " + if(!old.isRecoveryReference()){
"SELECT ?, SEQ, POS, HASH, BLOCK FROM " + LOB_MAP + " WHERE LOB = ?"; long lobId = getNextLobId();
PreparedStatement prep = prepare(sql); String sql = "INSERT INTO " + LOB_MAP + "(LOB, SEQ, POS, HASH, BLOCK) " +
prep.setLong(1, lobId); "SELECT ?, SEQ, POS, HASH, BLOCK FROM " + LOB_MAP + " WHERE LOB = ?";
prep.setLong(2, oldLobId); PreparedStatement prep = prepare(sql);
prep.executeUpdate(); prep.setLong(1, lobId);
reuse(sql, prep); prep.setLong(2, oldLobId);
prep.executeUpdate();
sql = "INSERT INTO " + LOBS + "(ID, BYTE_COUNT, TABLE) " + reuse(sql, prep);
"SELECT ?, BYTE_COUNT, ? FROM " + LOBS + " WHERE ID = ?";
prep = prepare(sql); sql = "INSERT INTO " + LOBS + "(ID, BYTE_COUNT, TABLE) " +
prep.setLong(1, lobId); "SELECT ?, BYTE_COUNT, ? FROM " + LOBS + " WHERE ID = ?";
prep.setLong(2, tableId); prep = prepare(sql);
prep.setLong(3, oldLobId); prep.setLong(1, lobId);
prep.executeUpdate(); prep.setLong(2, tableId);
reuse(sql, prep); prep.setLong(3, oldLobId);
prep.executeUpdate();
ValueLobDb v = ValueLobDb.create(type, database, tableId, lobId, null, length); reuse(sql, prep);
v = ValueLobDb.create(type, database, tableId, lobId, null, length);
}else{
//Recovery process, no need to copy LOB using normal infrastructure
v = ValueLobDb.create(type, database, tableId, oldLobId, null, length);
}
return v; return v;
} catch (SQLException e) { } catch (SQLException e) {
throw DbException.convert(e); throw DbException.convert(e);
......
...@@ -218,8 +218,10 @@ public class Recover extends Tool implements DataHandler { ...@@ -218,8 +218,10 @@ public class Recover extends Tool implements DataHandler {
long precision) { long precision) {
DataHandler h = ((JdbcConnection) conn).getSession().getDataHandler(); DataHandler h = ((JdbcConnection) conn).getSession().getDataHandler();
verifyPageStore(h); verifyPageStore(h);
return ValueLobDb.create(Value.BLOB, h, LobStorageFrontend.TABLE_TEMP, ValueLobDb lob = ValueLobDb.create(Value.BLOB, h, LobStorageFrontend.TABLE_TEMP,
lobId, null, precision); lobId, null, precision);
lob.setRecoveryReference(true);
return lob;
} }
private static void verifyPageStore(DataHandler h) { private static void verifyPageStore(DataHandler h) {
...@@ -237,8 +239,10 @@ public class Recover extends Tool implements DataHandler { ...@@ -237,8 +239,10 @@ public class Recover extends Tool implements DataHandler {
long precision) { long precision) {
DataHandler h = ((JdbcConnection) conn).getSession().getDataHandler(); DataHandler h = ((JdbcConnection) conn).getSession().getDataHandler();
verifyPageStore(h); verifyPageStore(h);
return ValueLobDb.create(Value.CLOB, h, LobStorageFrontend.TABLE_TEMP, ValueLobDb lob = ValueLobDb.create(Value.CLOB, h, LobStorageFrontend.TABLE_TEMP,
lobId, null, precision); lobId, null, precision);
lob.setRecoveryReference(true);
return lob;
} }
/** /**
......
...@@ -54,6 +54,11 @@ public class ValueLobDb extends Value implements Value.ValueClob, ...@@ -54,6 +54,11 @@ public class ValueLobDb extends Value implements Value.ValueClob,
private final FileStore tempFile; private final FileStore tempFile;
private int tableId; private int tableId;
private int hash; private int hash;
//Arbonaut: 13.07.2016
// Fix for recovery tool.
private boolean isRecoveryReference = false;
private ValueLobDb(int type, DataHandler handler, int tableId, long lobId, private ValueLobDb(int type, DataHandler handler, int tableId, long lobId,
byte[] hmac, long precision) { byte[] hmac, long precision) {
...@@ -664,4 +669,12 @@ public class ValueLobDb extends Value implements Value.ValueClob, ...@@ -664,4 +669,12 @@ public class ValueLobDb extends Value implements Value.ValueClob,
return new ValueLobDb(type, small, precision); return new ValueLobDb(type, small, precision);
} }
public void setRecoveryReference(boolean isRecoveryReference) {
this.isRecoveryReference = isRecoveryReference;
}
public boolean isRecoveryReference() {
return isRecoveryReference;
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论