001: /* Copyright (c) 1995-2000, The Hypersonic SQL Group.
002: * All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * Redistributions of source code must retain the above copyright notice, this
008: * list of conditions and the following disclaimer.
009: *
010: * Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * Neither the name of the Hypersonic SQL Group nor the names of its
015: * contributors may be used to endorse or promote products derived from this
016: * software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP,
022: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
026: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: *
030: * This software consists of voluntary contributions made by many individuals
031: * on behalf of the Hypersonic SQL Group.
032: *
033: *
034: * For work added by the HSQL Development Group:
035: *
036: * Copyright (c) 2001-2005, The HSQL Development Group
037: * All rights reserved.
038: *
039: * Redistribution and use in source and binary forms, with or without
040: * modification, are permitted provided that the following conditions are met:
041: *
042: * Redistributions of source code must retain the above copyright notice, this
043: * list of conditions and the following disclaimer.
044: *
045: * Redistributions in binary form must reproduce the above copyright notice,
046: * this list of conditions and the following disclaimer in the documentation
047: * and/or other materials provided with the distribution.
048: *
049: * Neither the name of the HSQL Development Group nor the names of its
050: * contributors may be used to endorse or promote products derived from this
051: * software without specific prior written permission.
052: *
053: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
054: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
055: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
056: * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
057: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
058: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
059: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
060: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
061: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
062: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
063: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
064: */
065:
066: package org.hsqldb;
067:
068: import org.hsqldb.lib.IntLookup;
069: import org.hsqldb.lib.java.JavaSystem;
070: import org.hsqldb.persist.CachedObject;
071: import org.hsqldb.rowio.RowOutputInterface;
072:
073: // fredt@users 20020221 - patch 513005 by sqlbob@users (RMP)
074: // fredt@users 20020920 - patch 1.7.1 - refactoring to cut mamory footprint
075: // fredt@users 20021215 - doc 1.7.2 - javadoc comments
076:
077: /**
078: * Base class for a database row object implementing rows for
079: * memory resident tables.<p>
080: *
081: * Subclass CachedRow implements rows for CACHED and TEXT tables
082: *
083: * @author Thomas Mueller (Hypersonic SQL Group)
084: * @version 1.8.0
085: * @since Hypersonic SQL
086: */
087: public class Row implements CachedObject {
088:
089: int tableId;
090: int iPos;
091: protected Object[] oData;
092: protected Node nPrimaryNode;
093:
094: /**
095: * Default constructor used only in subclasses.
096: */
097: protected Row() {
098: }
099:
100: /**
101: * Constructor for MEMORY table Row. The result is a Row with Nodes that
102: * are not yet linked with other Nodes in the AVL indexes.
103: */
104: Row(Table t, Object[] o) throws HsqlException {
105:
106: int index = t.getIndexCount();
107:
108: nPrimaryNode = Node.newNode(this , 0, t);
109:
110: Node n = nPrimaryNode;
111:
112: for (int i = 1; i < index; i++) {
113: n.nNext = Node.newNode(this , i, t);
114: n = n.nNext;
115: }
116:
117: tableId = t.getId();
118: oData = o;
119: }
120:
121: /**
122: * Returns the Node for a given Index, using the ordinal position of the
123: * Index within the Table Object.
124: */
125: Node getNode(int index) {
126:
127: Node n = nPrimaryNode;
128:
129: while (index-- > 0) {
130: n = n.nNext;
131: }
132:
133: return n;
134: }
135:
136: /**
137: * Returns the Node for the next Index on this database row, given the
138: * Node for any Index.
139: */
140: Node getNextNode(Node n) {
141:
142: if (n == null) {
143: n = nPrimaryNode;
144: } else {
145: n = n.nNext;
146: }
147:
148: return n;
149: }
150:
151: /**
152: * Returns the Row Object that currently represents the same database row.
153: * In current implementations of Row, this is always the same as the this
154: * Object for MEMORY tables, but could be a different Object for CachedRow
155: * or CachedDataRow implementation. For example the Row Object that
156: * represents a given database row can be freed from the Cache when other
157: * rows need to be loaded into the Cache. getUpdatedRow() returns a
158: * currently valid Row object that is in the Cache.
159: */
160: Row getUpdatedRow() throws HsqlException {
161: return this ;
162: }
163:
164: /**
165: * Returns the array of fields in the database row.
166: */
167: public Object[] getData() {
168: return oData;
169: }
170:
171: /**
172: * Is used only when the database row is deleted, not when it is freed
173: * from the Cache.
174: */
175: void delete() throws HsqlException {
176:
177: JavaSystem.memoryRecords++;
178:
179: nPrimaryNode = null;
180: }
181:
182: void clearNodeLinks() {
183:
184: Node last;
185: Node temp;
186:
187: last = nPrimaryNode;
188:
189: while (last.nNext != null) {
190: temp = last.nNext;
191: last.nNext = null;
192: last = temp;
193: }
194:
195: nPrimaryNode = null;
196: }
197:
198: boolean isCascadeDeleted() {
199: return nPrimaryNode == null;
200: }
201:
202: public int getRealSize(RowOutputInterface out) {
203: return 0;
204: }
205:
206: public void setStorageSize(int size) {
207: ;
208: }
209:
210: public int getStorageSize() {
211: return 0;
212: }
213:
214: public long getId() {
215: return ((long) tableId << 32) + ((long) iPos);
216: }
217:
218: public static long getId(Table table, int pos) {
219: return ((long) table.getId() << 32) + ((long) pos);
220: }
221:
222: public int getPos() {
223: return iPos;
224: }
225:
226: public void setPos(int pos) {
227: iPos = pos;
228: }
229:
230: public boolean hasChanged() {
231: return false;
232: }
233:
234: public boolean isKeepInMemory() {
235: return true;
236: }
237:
238: public void keepInMemory(boolean keep) {
239: }
240:
241: public boolean isInMemory() {
242: return true;
243: }
244:
245: public void setInMemory(boolean in) {
246: }
247:
248: public void write(RowOutputInterface out) {
249: }
250:
251: public void write(RowOutputInterface out, IntLookup lookup) {
252: }
253:
254: /**
255: * Lifetime scope of this method depends on the operations performed on
256: * any cached tables since this row or the parameter were constructed.
257: * If only deletes or only inserts have been performed, this method
258: * remains valid. Otherwise it can return invalid results.
259: *
260: * @param obj row to compare
261: * @return boolean
262: */
263: public boolean equals(Object obj) {
264:
265: if (obj == this ) {
266: return true;
267: }
268:
269: if (obj instanceof Row) {
270: return ((Row) obj).iPos == iPos;
271: }
272:
273: return false;
274: }
275:
276: /**
277: * Hash code is valid only until a modification to the cache
278: *
279: * @return file position of row
280: */
281: public int hashCode() {
282: return iPos;
283: }
284: }
|