1 package com.quadcap.sql.file; 2 3 40 41 import java.io.File ; 42 import java.io.FileDescriptor ; 43 import java.io.IOException ; 44 import java.io.RandomAccessFile ; 45 46 import java.util.BitSet ; 47 48 import com.quadcap.util.collections.LongIterator; 49 import com.quadcap.util.collections.LongMap; 50 51 import com.quadcap.util.Debug; 52 import com.quadcap.util.Util; 53 54 import com.quadcap.sql.Version; 55 56 62 public class MemoryBlockStore extends BlockStore { 63 LongMap blocks; 64 65 public MemoryBlockStore() {} 66 67 76 public void init(File file, String mode, int blockSize, Object lock) 77 throws IOException 78 { 79 this.blockSize = blockSize; 80 this.lock = lock; 81 this.blocks = new LongMap(8888); 82 createHeader(blockSize); 83 } 84 85 92 public void read(long blockNum, byte[] buf, int off) 93 throws IOException 94 { 95 synchronized (lock) { 97 byte[] block = (byte[])blocks.get(blockNum); 98 if (block == null) { 99 block = new byte[blockSize]; 100 blocks.put(blockNum, block); 101 } 102 System.arraycopy(block, 0, buf, off, blockSize); 103 readCount++; 104 } 105 } 106 107 114 public void write(long blockNum, byte[] buf) 115 throws IOException 116 { 117 synchronized (lock) { 119 byte[] block = (byte[])blocks.get(blockNum); 120 boolean exists = (block != null); 121 if (!exists) { 122 block = new byte[blockSize]; 123 blocks.put(blockNum, block); 124 } 125 if (log != null && !modified.get((int)blockNum)) { 126 modified.set((int)blockNum); 127 if (exists) { 128 log.saveBlock(blockNum); 129 } 130 } 131 System.arraycopy(buf, 0, block, 0, blockSize); 132 writeCount++; 133 if (Trace.bit(20)) { 135 Debug.println(toString() + ".write(" + blockNum + ")"); 136 } 137 } 139 } 140 141 144 public void restore(long blockNum, byte[] buf, int off) 145 throws IOException 146 { 147 synchronized (lock) { 148 byte[] block = (byte[]) blocks.get(blockNum); 149 if (block == null) { 150 throw new IOException ("No block to restore: " + blockNum); 151 } 152 System.arraycopy(buf, off, block, 0, blockSize); 153 } 154 155 } 156 157 public void setLength(long length) throws IOException { 158 length /= blockSize; 159 LongIterator iter = blocks.keys(); 160 while (iter.hasNext()) { 161 long blockNum = iter.nextLong(); 162 if (blockNum >= length) { 163 iter.remove(); 164 } 165 } 166 } 167 168 private void createHeader(int blockSize) throws IOException { 169 this.blockSize = blockSize; 170 byte[] buf = newHeader(blockSize, 2); 171 blocks.put(0, buf); 172 } 173 174 public boolean isEncrypted() { 175 return false; 176 } 177 178 public void close() throws IOException { 179 } 180 181 public void flush() throws IOException { 182 readCount = writeCount = 0; 183 } 184 185 public void setKey(com.quadcap.crypto.SymmetricKey key) 187 throws IOException 188 { 189 throw new IOException ("Not encrypted"); 190 } 191 193 public String toString() { 195 return "MemoryBlockStore()"; 196 } 197 198 public static String rw() { 199 return "(r=" + BlockStore.readCount + 200 " w=" + BlockStore.writeCount + ")"; 201 } 202 203 205 } 206 | Popular Tags |