Source code: org/hsqldb/ReverseDatabaseFile.java
1 /* Copyright (c) 2001-2002, The HSQL Development Group
2 * All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of the HSQL Development Group nor the names of its
15 * contributors may be used to endorse or promote products derived from this
16 * software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
22 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31
32 package org.hsqldb;
33
34 import java.io.IOException;
35 import java.io.FileNotFoundException;
36
37 /**
38 * Cache class declaration <P>
39 *
40 * The cache class implements the handling of reversed text table caches.
41 *
42 * @author sqlbob@users
43 * @version 1.7.0
44 */
45 class ReverseDatabaseFile extends org.hsqldb.DatabaseFile {
46
47 private int size;
48 private long max;
49
50 ReverseDatabaseFile(String name, String mode,
51 int inSize)
52 throws FileNotFoundException, IOException {
53
54 super(name, mode, inSize);
55
56 max = length();
57 pos = max;
58 size = inSize;
59 }
60
61 public void readSeek(long newPos) throws IOException {
62
63 newPos = max - newPos;
64
65 if ((newPos < 0) || (in == null)) {
66 seek(newPos);
67 } else if (newPos != pos) {
68 index -= (int) (pos - newPos);
69 pos = newPos;
70
71 if ((index < 0) || (index > count)) {
72 count = 0;
73 index = 0;
74 }
75 }
76 }
77
78 public int read() throws IOException {
79
80 if (in == null) {
81 return (super.read());
82 }
83
84 if (index == 0) {
85 long newPos = pos - size;
86
87 if (newPos < 0) {
88 realSeek(0);
89
90 count = (int) pos;
91
92 readFully(in, 0, count);
93 } else {
94 realSeek(newPos);
95 readFully(in);
96
97 count = size;
98 }
99
100 index = count;
101 }
102
103 if (index == 0) {
104 return (-1);
105 }
106
107 pos--;
108
109 return (in[--index] & 0xff);
110 }
111
112 public int readInteger() throws IOException {
113
114 seek(pos);
115
116 return (readInt());
117 }
118
119 public long getFilePointer() throws IOException {
120 return (max - pos);
121 }
122 }