debugstore.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 186 行
JAVA
186 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */package com.caucho.db.debug;import com.caucho.db.store.Store;import com.caucho.util.L10N;import com.caucho.util.Log;import com.caucho.vfs.Path;import com.caucho.vfs.ReadStream;import com.caucho.vfs.Vfs;import com.caucho.vfs.WriteStream;import java.io.IOException;import java.util.logging.Logger;/** * Manager for a basic Java-based database. */public class DebugStore { private static final Logger log = Log.open(DebugStore.class); private static final L10N L = new L10N(DebugStore.class); Path _path; Store _store; public DebugStore(Path path) throws Exception { _path = path; _store = Store.create(path); } public static void main(String []args) throws Exception { if (args.length == 0) { System.out.println("usage: DebugStore store.db"); return; } Path path = Vfs.lookup(args[0]); WriteStream out = Vfs.openWrite(System.out); new DebugStore(path).test(out); out.close(); } public void test(WriteStream out) throws Exception { out.println("file-size : " + _store.getFileSize()); out.println("block-count : " + _store.getBlockCount()); debugAllocation(out, _store.getAllocationTable(), _store.getBlockCount()); debugFragments(out, _store.getAllocationTable(), _store.getBlockCount()); } private void debugAllocation(WriteStream out, byte []allocTable, long count) throws IOException { out.println(); for (int i = 0; i < 2 * count; i += 2) { int v = allocTable[i]; int code = v & 0xf; switch (code) { case Store.ALLOC_FREE: out.print('.'); break; case Store.ALLOC_ROW: out.print('r'); break; case Store.ALLOC_USED: out.print('u'); break; case Store.ALLOC_FRAGMENT: out.print('f'); break; case Store.ALLOC_MINI_FRAG: out.print('m'); break; case Store.ALLOC_INDEX: out.print('i'); break; default: out.print('?'); } if (i % 64 == 63) out.println(); else if (i % 8 == 7) out.print(' '); } out.println(); } private void debugFragments(WriteStream out, byte []allocTable, long count) throws Exception { long totalUsed = 0; byte []block = new byte[Store.BLOCK_SIZE]; for (int i = 0; i < 2 * count; i += 2) { int code = allocTable[i]; if (code == Store.ALLOC_FRAGMENT) { int fragCount = 0; for (int j = 0; j < 8; j++) { if ((allocTable[i + 1] & (1 << j)) != 0) fragCount++; } totalUsed += fragCount; out.println(); out.print("Fragment Block " + (i / 2) + ": "); for (int j = 0; j < 8; j++) { if ((allocTable[i + 1] & (1 << j)) != 0) out.print("1"); else out.print("."); } } } out.println(); out.println("Total-used: " + totalUsed); } private void readBlock(byte []block, long count) throws Exception { ReadStream is = _path.openRead(); try { is.skip(count * Store.BLOCK_SIZE); is.read(block, 0, block.length); } finally { is.close(); } } private int readShort(byte []block, int offset) { return ((block[offset] & 0xff) << 8) + (block[offset + 1] & 0xff); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?