All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.xBaseJ.indexes.Node Maven / Gradle / Ivy

/**
 * eobjects.org MetaModel
 * Copyright (C) 2010 eobjects.org
 *
 * This copyrighted material is made available to anyone wishing to use, modify,
 * copy, or redistribute it subject to the terms and conditions of the GNU
 * Lesser General Public License, as published by the Free Software Foundation.
 *
 * This program 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.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this distribution; if not, write to:
 * Free Software Foundation, Inc.
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301  USA
 */

package org.xBaseJ.indexes;



import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;

import org.xBaseJ.DBF;
import org.xBaseJ.DbaseUtils;
import org.xBaseJ.xBaseJException;

/**
 * This class is courtesy of the xBaseJ project: http://xbasej.sourceforge.net/
 * 
 * Copyright 1997-2007 - American Coders, LTD - Raleigh NC USA
 * 
 * 
 * American Coders, Ltd
 * P. O. Box 97462
 * Raleigh, NC  27615  USA
 * 1-919-846-2014
 * http://www.americancoders.com
 * 
* * @author Joe McVerry, American Coders Ltd. */ public class Node extends Object implements Cloneable { public RandomAccessFile nfile; public int pos = 0; public int keys_in_a_Node = 0; public int keys_in_this_Node = 0; public int key_expression_size = 0; public int record_number = 0; public char keyType = 'C'; public byte key_buffer[]; public int lower_level[]; public int key_record_number[]; public NodeKey key_expression[]; public Node prev = null; public Node next = null; public boolean branch = false; public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { return null; } } public Node(RandomAccessFile file, int keys_in, int key_size, char keyType, int rn, boolean iBranch) { nfile = file; keys_in_a_Node = keys_in; key_expression_size = key_size; keys_in_this_Node = 0; this.keyType = keyType; record_number = rn; branch = iBranch; key_buffer = new byte[key_size]; key_expression = new NodeKey[keys_in + 2]; key_record_number = new int[keys_in + 2]; lower_level = new int[keys_in + 2]; for (int i = 0; i < keys_in; i++) { key_record_number[i] = 0; lower_level[i] = 0; } prev = null; next = null; } public void set_pos(int ipos) { pos = ipos; } public void set_key_expression_size(int l) { key_expression_size = l; } public int pos_up() { return ++pos; } public void set_record_number(int r) throws xBaseJException { if (r == 0) throw new xBaseJException("Invalid record number in set"); record_number = r; } public int get_record_number() { return record_number; } public int pos_down() { return --pos; } public int get_pos() { return pos; } public void set_key_record_number(int r) { key_record_number[pos] = r; } public int get_key_record_number() { return key_record_number[pos]; } public void set_lower_level(int level) { lower_level[pos] = level; } public int get_lower_level() { return lower_level[pos]; } public void set_keys_in_this_Node(int c) { keys_in_this_Node = c; } public int get_keys_in_this_Node() { return keys_in_this_Node; } public void set_key_value(NodeKey key) { key_expression[pos] = key; } public void set_key_value(String key) { key_expression[pos] = new NodeKey(key); } public void set_key_value(double key) { key_expression[pos] = new NodeKey(new Double(key)); } public NodeKey get_key_value() { return key_expression[pos]; } public void read() throws IOException { int i, j, k; long longrecn = record_number; nfile.seek(longrecn * 512); keys_in_this_Node = DbaseUtils.x86(nfile.readInt()); for (i = 0; i < keys_in_a_Node; i++) { lower_level[i] = DbaseUtils.x86(nfile.readInt()); key_record_number[i] = DbaseUtils.x86(nfile.readInt()); if (keyType == 'N') { key_expression[i] = new NodeKey(new Double(Double .longBitsToDouble(nfile.readLong()))); } else { nfile.readFully(key_buffer, 0, key_expression_size); for (k = 0; k < key_expression_size && key_buffer[k] != 0; k++) ; try { key_expression[i] = new NodeKey(new String(key_buffer, 0, k, DBF.encodedType)); } catch (UnsupportedEncodingException UEE) { key_expression[i] = new NodeKey( new String(key_buffer, 0, k)); } } j = key_expression_size % 4; if (j > 0) j = 4 - j; for (k = 0; k < j; k++) nfile.readByte(); } // for i if (lower_level[0] > 0) branch = true; else branch = false; lower_level[i] = DbaseUtils.x86(nfile.readInt()); } public void write() throws IOException, xBaseJException { int i, j, k, ll = 512; if (record_number == 0) throw new xBaseJException("Invalid record number in write"); long longrecn = record_number; nfile.seek(longrecn * 512); nfile.writeInt(DbaseUtils.x86(keys_in_this_Node)); ll -= 4; // sizeof(int) for (i = 0; i < keys_in_this_Node && i < keys_in_a_Node && key_expression[i] != null; i++) { if (key_expression[i] == null) throw new xBaseJException("Missing node key expression at " + i); if ((lower_level[0] == 0) && (key_record_number[i] == 0)) throw new xBaseJException( "Logic mismatch, both pointers are zero"); nfile.writeInt(DbaseUtils.x86(lower_level[i])); ll -= 4; nfile.writeInt(DbaseUtils.x86(key_record_number[i])); ll -= 4; if (key_expression[i].getType() == 'N') { double d = key_expression[i].toDouble(); nfile.writeLong(Double.doubleToLongBits(d)); } if (key_expression[i].getType() == 'C') { int x; byte bytebuffer[]; try { bytebuffer = key_expression[i].toString().getBytes( DBF.encodedType); } catch (UnsupportedEncodingException UEE) { bytebuffer = key_expression[i].toString().getBytes(); } for (x = 0; x < bytebuffer.length; x++) key_buffer[x] = bytebuffer[x]; for (; x < key_expression_size; x++) key_buffer[x] = 0; nfile.write(key_buffer, 0, key_expression_size); } ll -= key_expression_size; // sizeof(2 ints) and full key length to // its 4 byte alignment j = key_expression_size % 4; if (j > 0) j = 4 - j; // 4 byte alignment key_buffer[0] = 0; for (k = 0; k < j; k++) { nfile.write(key_buffer[0]); ll--; } } // for i if ((branch == true) && (lower_level[i] == 0)) throw new xBaseJException( "Logic mismatch, lower level pointer is zero"); nfile.writeInt(DbaseUtils.x86(lower_level[i])); ll -= 4; // sizeof(int) if (ll > 0) { // a Node is 512 bytes long; byte temp[] = new byte[ll]; nfile.write(temp, 0, ll); } } public void set_next(Node nxt) { next = nxt; } public void set_prev(Node prv) { prev = prv; } public Node get_next() { return next; } public Node get_prev() { return prev; } public void set_prev_page(int t) throws xBaseJException { throw new xBaseJException("method not available"); } public boolean isBranch() { return branch; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy