?? recover.java
字號(hào):
}
sb.append(Integer.toHexString(x));
}
writer.println("-- dump: " + sb.toString());
}
private void dumpLob(String fileName, boolean lobCompression) {
OutputStream out = null;
FileStore store = null;
int size = 0;
String n = fileName + (lobCompression ? ".comp" : "") + ".txt";
InputStream in = null;
try {
out = FileUtils.openFileOutputStream(n, false);
textStorage = Database.isTextStorage(fileName, false);
byte[] magic = Database.getMagic(textStorage);
store = FileStore.open(null, fileName, "r", magic);
store.init();
in = new BufferedInputStream(new FileStoreInputStream(store, this, lobCompression, false));
byte[] buffer = new byte[Constants.IO_BUFFER_SIZE];
while (true) {
int l = in.read(buffer);
if (l < 0) {
break;
}
out.write(buffer, 0, l);
size += l;
}
out.close();
} catch (Throwable e) {
// this is usually not a problem, because we try both compressed and
// uncompressed
if (log) {
logError(fileName, e);
}
} finally {
IOUtils.closeSilently(out);
IOUtils.closeSilently(in);
closeSilently(store);
}
if (size == 0) {
try {
FileUtils.delete(n);
} catch (SQLException e) {
logError(n, e);
}
}
}
private void writeLogRecord(PrintWriter writer, DataPage s) {
try {
recordLength = s.readInt();
if (recordLength <= 0) {
writeDataError(writer, "recordLength<0", s.getBytes(), blockCount);
return;
}
Value[] data;
try {
data = new Value[recordLength];
} catch (OutOfMemoryError e) {
writeDataError(writer, "out of memory", s.getBytes(), blockCount);
return;
}
StringBuffer sb = new StringBuffer();
sb.append("// data: ");
for (valueId = 0; valueId < recordLength; valueId++) {
try {
Value v = s.readValue();
data[valueId] = v;
if (valueId > 0) {
sb.append(", ");
}
sb.append(getSQL(v));
} catch (Exception e) {
if (log) {
logError("log data", e);
}
writeDataError(writer, "exception " + e, s.getBytes(), blockCount);
continue;
} catch (OutOfMemoryError e) {
writeDataError(writer, "out of memory", s.getBytes(), blockCount);
continue;
}
}
writer.println(sb.toString());
writer.flush();
} catch (IOException e) {
try {
writeDataError(writer, "error: " + e.toString(), s.getBytes(), blockCount);
} catch (IOException e2) {
writeError(writer, e);
}
}
}
private String getSQL(Value v) {
if (v instanceof ValueLob) {
ValueLob lob = (ValueLob) v;
byte[] small = lob.getSmall();
if (small == null) {
String file = lob.getFileName();
if (lob.getType() == Value.BLOB) {
return "READ_BLOB('" + file + ".txt')";
} else {
return "READ_CLOB('" + file + ".txt')";
}
}
}
return v.getSQL();
}
private void setDatabaseName(String name) {
databaseName = name;
lobFilesInDirectories = FileUtils.exists(databaseName + Constants.SUFFIX_LOBS_DIRECTORY);
}
private void dumpLog(String fileName) throws SQLException {
PrintWriter writer = null;
FileStore store = null;
try {
setDatabaseName(fileName.substring(fileName.length() - Constants.SUFFIX_LOG_FILE.length()));
writer = getWriter(fileName, ".txt");
textStorage = Database.isTextStorage(fileName, false);
byte[] magic = Database.getMagic(textStorage);
store = FileStore.open(null, fileName, "r", magic);
long length = store.length();
writer.println("// length: " + length);
int offset = FileStore.HEADER_LENGTH;
int blockSize = LogFile.BLOCK_SIZE;
int blocks = (int) (length / blockSize);
byte[] buff = new byte[blockSize];
DataPage s = DataPage.create(this, buff);
s.fill(3 * blockSize);
int len = s.length();
s.reset();
if (length < FileStore.HEADER_LENGTH + len) {
// this is an empty file
writer.println("// empty file");
return;
}
store.seek(offset);
store.readFully(s.getBytes(), 0, len);
int id = s.readInt();
int firstUncommittedPos = s.readInt();
int firstUnwrittenPos = s.readInt();
writer.println("// id:" + id);
writer.println("// firstUncommittedPos:" + firstUncommittedPos);
writer.println("// firstUnwrittenPos:" + firstUnwrittenPos);
int max = (int) (length / blockSize);
writer.println("// max:" + max);
while (true) {
int pos = (int) (store.getFilePointer() / blockSize);
if ((long) pos * blockSize >= length) {
break;
}
buff = new byte[blockSize];
store.readFully(buff, 0, blockSize);
s = DataPage.create(this, buff);
blocks = Math.abs(s.readInt());
if (blocks > 1) {
byte[] b2 = new byte[blocks * blockSize];
System.arraycopy(buff, 0, b2, 0, blockSize);
buff = b2;
try {
store.readFully(buff, blockSize, blocks * blockSize - blockSize);
} catch (SQLException e) {
break;
}
s = DataPage.create(this, buff);
s.check(blocks * blockSize);
}
s.reset();
blocks = Math.abs(s.readInt());
if (blocks == 0) {
writer.println("// [" + pos + "] blocks: " + blocks + " (end)");
break;
} else {
char type = (char) s.readByte();
int sessionId = s.readInt();
if (type == 'P') {
String transaction = s.readString();
writer.println("// prepared session:" + sessionId + " tx:" + transaction);
} else if (type == 'C') {
writer.println("// commit session:" + sessionId);
} else {
int storageId = s.readInt();
int recId = s.readInt();
int blockCount = s.readInt();
if (type != 'T') {
s.readDataPageNoSize();
}
switch (type) {
case 'S': {
char fileType = (char) s.readByte();
int sumLength = s.readInt();
byte[] summary = new byte[sumLength];
if (sumLength > 0) {
s.read(summary, 0, sumLength);
}
writer.println("// summary session:"+sessionId+" fileType:" + fileType + " sumLength:" + sumLength);
dumpSummary(writer, summary);
break;
}
case 'T':
writer.println("// truncate session:"+sessionId+" storage:" + storageId + " pos:" + recId + " blockCount:"+blockCount);
break;
case 'I':
writer.println("// insert session:"+sessionId+" storage:" + storageId + " pos:" + recId + " blockCount:"+blockCount);
writeLogRecord(writer, s);
break;
case 'D':
writer.println("// delete session:"+sessionId+" storage:" + storageId + " pos:" + recId + " blockCount:"+blockCount);
writeLogRecord(writer, s);
break;
default:
writer.println("// type?:"+type+" session:"+sessionId+" storage:" + storageId + " pos:" + recId + " blockCount:"+blockCount);
break;
}
}
}
}
writer.close();
} catch (Throwable e) {
writeError(writer, e);
} finally {
IOUtils.closeSilently(writer);
closeSilently(store);
}
}
private void dumpSummary(PrintWriter writer, byte[] summary) throws SQLException {
if (summary == null || summary.length == 0) {
writer.println("// summary is empty");
return;
}
try {
DataInputStream in = new DataInputStream(new ByteArrayInputStream(summary));
int b2 = in.readInt();
for (int i = 0; i < b2 / 8; i++) {
int x = in.read();
if ((i % 8) == 0) {
writer.print("// ");
}
writer.print(" " + Long.toString(i * 8) + ":");
for (int j = 0; j < 8; j++) {
writer.print(((x & 1) == 1) ? "1" : "0");
x >>>= 1;
}
if ((i % 8) == 7) {
writer.println("");
}
}
writer.println("//");
int len = in.readInt();
for (int i = 0; i < len; i++) {
int storageId = in.readInt();
if (storageId != -1) {
writer.println("// pos:" + (i * DiskFile.BLOCKS_PER_PAGE) + " storage:" + storageId);
}
}
while (true) {
int s = in.readInt();
if (s < 0) {
break;
}
int recordCount = in.readInt();
writer.println("// storage:" + s + " recordCount:" + recordCount);
}
} catch (Throwable e) {
writeError(writer, e);
}
}
private void dumpIndex(String fileName) throws SQLException {
PrintWriter writer = null;
FileStore store = null;
try {
setDatabaseName(fileName.substring(fileName.length() - Constants.SUFFIX_INDEX_FILE.length()));
writer = getWriter(fileName, ".txt");
textStorage = Database.isTextStorage(fileName, false);
byte[] magic = Database.getMagic(textStorage);
store = FileStore.open(null, fileName, "r", magic);
long length = store.length();
int offset = FileStore.HEADER_LENGTH;
int blockSize = DiskFile.BLOCK_SIZE;
int blocks = (int) (length / blockSize);
blockCount = 1;
int[] pageOwners = new int[blocks / DiskFile.BLOCKS_PER_PAGE];
for (int block = 0; block < blocks; block += blockCount) {
store.seek(offset + (long) block * blockSize);
byte[] buff = new byte[blockSize];
DataPage s = DataPage.create(this, buff);
store.readFully(buff, 0, blockSize);
blockCount = s.readInt();
storageId = -1;
recordLength = -1;
valueId = -1;
if (blockCount == 0) {
// free block
blockCount = 1;
continue;
} else if (blockCount < 0) {
writeDataError(writer, "blockCount<0", s.getBytes(), 1);
blockCount = 1;
continue;
} else if ((blockCount * blockSize) >= Integer.MAX_VALUE / 4) {
writeDataError(writer, "blockCount=" + blockCount, s.getBytes(), 1);
blockCount = 1;
continue;
}
try {
s.checkCapacity(blockCount * blockSize);
} catch (OutOfMemoryError e) {
writeDataError(writer, "out of memory", s.getBytes(), 1);
blockCount = 1;
continue;
}
if (blockCount > 1) {
store.readFully(s.getBytes(), blockSize, blockCount * blockSize - blockSize);
}
try {
s.check(blockCount * blockSize);
} catch (SQLException e) {
writeDataError(writer, "wrong checksum", s.getBytes(), 1);
blockCount = 1;
continue;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -