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

Fix for handling LOBs during recovery

上级 aa55aed2
...@@ -456,6 +456,8 @@ public class LobStorageBackend implements LobStorageInterface { ...@@ -456,6 +456,8 @@ public class LobStorageBackend implements LobStorageInterface {
synchronized (conn.getSession()) { synchronized (conn.getSession()) {
try { try {
init(); init();
ValueLobDb v = null;
if(!old.isRecoveryReference()){
long lobId = getNextLobId(); long lobId = getNextLobId();
String sql = "INSERT INTO " + LOB_MAP + "(LOB, SEQ, POS, HASH, BLOCK) " + String sql = "INSERT INTO " + LOB_MAP + "(LOB, SEQ, POS, HASH, BLOCK) " +
"SELECT ?, SEQ, POS, HASH, BLOCK FROM " + LOB_MAP + " WHERE LOB = ?"; "SELECT ?, SEQ, POS, HASH, BLOCK FROM " + LOB_MAP + " WHERE LOB = ?";
...@@ -474,7 +476,11 @@ public class LobStorageBackend implements LobStorageInterface { ...@@ -474,7 +476,11 @@ public class LobStorageBackend implements LobStorageInterface {
prep.executeUpdate(); prep.executeUpdate();
reuse(sql, prep); reuse(sql, prep);
ValueLobDb v = ValueLobDb.create(type, database, tableId, lobId, null, length); 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;
} }
/** /**
......
...@@ -55,6 +55,11 @@ public class ValueLobDb extends Value implements Value.ValueClob, ...@@ -55,6 +55,11 @@ public class ValueLobDb extends Value implements Value.ValueClob,
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) {
this.type = type; this.type = type;
...@@ -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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论