| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| /* |
| * StorageAccess.java |
| * |
| * Created on 17. August 2004, 13:32 |
| */ |
| |
| package com.sun.star.sdbcx.comp.hsqldb; |
| |
| /** |
| * |
| * @author oj93728 |
| */ |
| |
| public class StorageAccess implements org.hsqldb.lib.Storage { |
| String key; |
| String name; |
| boolean readonly; |
| NativeStorageAccess access; |
| // public SimpleLog appLog; |
| /** Creates a new instance of StorageAccess */ |
| public StorageAccess(String name,Boolean readonly,Object key) throws java.io.IOException{ |
| this.key = (String)key; |
| this.name = name; |
| this.readonly = readonly.booleanValue(); |
| try { |
| access = new NativeStorageAccess(name, |
| this.readonly ? "r" : "rw" |
| ,key); |
| } catch(Exception e){ |
| throw new java.io.IOException(); |
| } |
| // appLog = new SimpleLog(name +".app3.log", true); |
| } |
| public void close() throws java.io.IOException{ |
| //appLog.sendLine("NIOScaledRAFile.close() "); |
| //appLog.close(); |
| access.close(name,key); |
| } |
| |
| public long getFilePointer() throws java.io.IOException{ |
| //appLog.sendLine("NIOScaledRAFile.getFilePointer() "); |
| return access.getFilePointer(name,key); |
| } |
| |
| public long length() throws java.io.IOException{ |
| //appLog.sendLine("NIOScaledRAFile.length() "); |
| return access.length(name,key); |
| } |
| |
| public int read() throws java.io.IOException{ |
| //appLog.sendLine("NIOScaledRAFile.read() "); |
| return access.read(name,key); |
| } |
| |
| public void read(byte[] b, int off, int len) throws java.io.IOException{ |
| //appLog.sendLine("NIOScaledRAFile.read(" + b + ","+ off +","+len + ") "); |
| access.read(name,key,b,off,len); |
| } |
| |
| // fredt - this is based on the same code that reads an int from the .data file in HSQLDB |
| public int readInt() throws java.io.IOException{ |
| //appLog.sendLine("NIOScaledRAFile.readInt() "); |
| byte [] tmp = new byte [4]; |
| |
| int count = access.read(name,key,tmp,0, 4); |
| |
| if (count != 4){ |
| throw new java.io.IOException(); |
| } |
| |
| count = 0; |
| int ch0 = tmp[count++] & 0xff; |
| int ch1 = tmp[count++] & 0xff; |
| int ch2 = tmp[count++] & 0xff; |
| int ch3 = tmp[count] & 0xff; |
| |
| return ((ch0 << 24) + (ch1 << 16) + (ch2 << 8) + (ch3)); |
| |
| /* |
| int ch [] = new int[4]; |
| for(int i = 0;i < 4; ++i){ |
| ch[i] = tmp[i]; |
| if (ch[i] < 0 ){ |
| ch[i] = 256 + ch[i]; |
| } |
| } |
| |
| if ((ch[0] | ch[1] | ch[2] | ch[3]) < 0) |
| throw new java.io.IOException(); |
| return ((ch[0] << 24) + (ch[1] << 16) + (ch[2] << 8) + (ch[3] << 0)); |
| //return access.readInt(name,key); |
| */ |
| } |
| |
| public void seek(long position) throws java.io.IOException{ |
| //appLog.sendLine("NIOScaledRAFile.seek("+position +") "); |
| access.seek(name,key,position); |
| } |
| |
| public void write(byte[] b, int offset, int length) throws java.io.IOException{ |
| //appLog.sendLine("NIOScaledRAFile.write(" + b + "," + offset +","+length+") "); |
| access.write(name,key,b,offset,length); |
| } |
| |
| public void writeInt(int v) throws java.io.IOException{ |
| //appLog.sendLine("NIOScaledRAFile.writeInt(" +v+") "); |
| byte [] oneByte = new byte [4]; |
| oneByte[0] = (byte) ((v >>> 24) & 0xFF); |
| oneByte[1] = (byte) ((v >>> 16) & 0xFF); |
| oneByte[2] = (byte) ((v >>> 8) & 0xFF); |
| oneByte[3] = (byte) ((v >>> 0) & 0xFF); |
| |
| write(oneByte,0,4); |
| } |
| |
| public boolean isReadOnly() { |
| return readonly; |
| } |
| |
| // fredt - minor change of brackets |
| public long readLong() throws java.io.IOException { |
| // return ((long)(readInt()) << 32) + (readInt() & 0xFFFFFFFFL); |
| return (((long) readInt()) << 32) + (((long) readInt()) & 0xFFFFFFFFL); |
| } |
| |
| public boolean wasNio() { |
| return false; |
| } |
| |
| public void writeLong(long v) throws java.io.IOException { |
| //appLog.sendLine("NIOScaledRAFile.writeLong(" +v+") "); |
| byte [] oneByte = new byte [8]; |
| |
| oneByte[0] = (byte) ((v >>> 56) & 0xFF); |
| oneByte[1] = (byte) ((v >>> 48) & 0xFF); |
| oneByte[2] = (byte) ((v >>> 40) & 0xFF); |
| oneByte[3] = (byte) ((v >>> 32) & 0xFF); |
| oneByte[4] = (byte) ((v >>> 24) & 0xFF); |
| oneByte[5] = (byte) ((v >>> 16) & 0xFF); |
| oneByte[6] = (byte) ((v >>> 8) & 0xFF); |
| oneByte[7] = (byte) ((v >>> 0) & 0xFF); |
| |
| write(oneByte,0,8); |
| } |
| } |