2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
6 package com.solidosystems.tuplesoup.core;
8 import TransactionalIO.core.TransactionalFile;
9 import dstm2.AtomicSuperClass;
11 import java.io.ByteArrayOutputStream;
12 import java.io.DataInputStream;
13 import java.io.DataOutputStream;
14 import java.io.EOFException;
15 import java.io.IOException;
16 import java.io.RandomAccessFile;
22 public class TableIndexEntryTransactional implements AtomicSuperClass, Comparable<TableIndexEntryTransactional>{
24 TableIndexEntryTSInf atomicfields;
25 public @atomic interface TableIndexEntryTSInf{
32 void setId(String val);
33 void setLocation(int val);
34 void setPosition(long val);
35 void setSize(int val);
36 void setRowsize(int val);
40 public TableIndexEntryTransactional(String id,int rowsize,int location,long position){
41 this.atomicfields.setId(id);
42 this.atomicfields.setLocation(location);
43 this.atomicfields.setPosition(position);
44 this.atomicfields.setRowsize(rowsize);
45 this.atomicfields.setSize(-1);
47 public String getId(){
48 return atomicfields.getId();
50 public void setPosition(long position){
51 this.atomicfields.setPosition(position);
53 public long getPosition(){
54 return atomicfields.getPosition();
56 public void setLocation(int location){
57 this.atomicfields.setLocation(location);
59 public int getLocation(){
60 return atomicfields.getLocation();
63 public int getRowSize(){
64 return atomicfields.getRowsize();
67 public int compareTo(TableIndexEntryTransactional obj) throws ClassCastException{
68 TableIndexEntryTransactional ent=(TableIndexEntryTransactional)obj;
69 if(atomicfields.getPosition()<ent.atomicfields.getPosition()) return -1;
70 if(atomicfields.getPosition()==ent.atomicfields.getPosition()) return 0;
74 public boolean equals(Object obj){
76 TableIndexEntryTransactional ent=(TableIndexEntryTransactional)obj;
77 if(ent.atomicfields.getLocation()==atomicfields.getLocation()){
78 if(ent.atomicfields.getPosition()==atomicfields.getPosition()){
79 if(ent.atomicfields.getId().equals(atomicfields.getId())){
84 }catch(ClassCastException e){}
89 if(atomicfields.getSize()<0) calcSize();
90 return atomicfields.getSize();
92 public void setSize(int size){
93 this.atomicfields.setSize(size);
95 private void calcSize(){
97 ByteArrayOutputStream bout=new ByteArrayOutputStream();
98 DataOutputStream dout=new DataOutputStream(bout);
99 dout.writeInt(atomicfields.getId().hashCode());
100 dout.writeShort(atomicfields.getId().length());
101 dout.writeChars(atomicfields.getId());
102 dout.writeInt(atomicfields.getRowsize());
103 dout.writeByte(atomicfields.getLocation());
104 dout.writeLong(atomicfields.getPosition());
105 setSize(bout.size());
113 protected void writeData(TransactionalFile out) throws IOException{
114 long pre=out.getFilePointer();
115 out.writeInt(atomicfields.getId().hashCode());
116 out.writeShort(atomicfields.getId().length());
117 out.writeChars(atomicfields.getId());
118 out.writeInt(atomicfields.getRowsize());
119 out.writeByte(atomicfields.getLocation());
120 out.writeLong(atomicfields.getPosition());
121 setSize((int)(out.getFilePointer()-pre));
123 protected void updateData(TransactionalFile out) throws IOException{
124 long pre=out.getFilePointer();
125 out.skipBytes(4+2+atomicfields.getId().length()*2);
126 out.writeInt(atomicfields.getRowsize());
127 out.writeByte(atomicfields.getLocation());
128 out.writeLong(atomicfields.getPosition());
129 setSize((int)(out.getFilePointer()-pre));
131 protected void writeData(DataOutputStream out) throws IOException{
132 out.writeInt(atomicfields.getId().hashCode());
133 out.writeShort(atomicfields.getId().length());
134 out.writeChars(atomicfields.getId());
135 out.writeInt(atomicfields.getRowsize());
136 out.writeByte(atomicfields.getLocation());
137 out.writeLong(atomicfields.getPosition());
139 protected static TableIndexEntryTransactional readData(TransactionalFile in) throws IOException{
140 long pre=in.getFilePointer();
142 int num=in.readShort();
143 StringBuilder buf=new StringBuilder(num);
144 for(int i=0;i<num;i++){
145 buf.append(in.readChar());
147 String id=buf.toString();
148 int rowsize=in.readInt();
149 int location=in.readByte();
150 long position=in.readLong();
151 TableIndexEntryTransactional tmp=new TableIndexEntryTransactional(id,rowsize,location,position);
152 tmp.setSize((int)(in.getFilePointer()-pre));
156 protected static TableIndexEntryTransactional readData(DataInputStream in) throws IOException{
158 int num=in.readShort();
159 StringBuilder buf=new StringBuilder(num);
160 for(int i=0;i<num;i++){
161 buf.append(in.readChar());
163 String id=buf.toString();
164 int rowsize=in.readInt();
165 int location=in.readByte();
166 long position=in.readLong();
167 TableIndexEntryTransactional tmp=new TableIndexEntryTransactional(id,rowsize,location,position);
171 protected static long scanForOffset(String id,DataInputStream in) throws IOException{
173 int scanhash=id.hashCode();
175 int datahash=in.readInt();
176 while(scanhash!=datahash){
177 int num=in.readShort();
178 in.skipBytes(1+4+8+num*2);
179 offset+=4+4+1+2+8+num*2;
180 datahash=in.readInt();
183 }catch(EOFException e){}
186 protected static TableIndexEntryTransactional lookForData(String id,DataInputStream in) throws IOException{
187 int scanhash=id.hashCode();
188 int datahash=in.readInt();
189 int num=in.readShort();
190 if(scanhash!=datahash){
191 in.skipBytes(4+1+8+num*2);
194 StringBuilder buf=new StringBuilder(num);
195 for(int i=0;i<num;i++){
196 buf.append(in.readChar());
198 String readid=buf.toString();
199 if(!readid.equals(id)){
203 int rowsize=in.readInt();
204 int location=in.readByte();
205 long position=in.readLong();
206 TableIndexEntryTransactional tmp=new TableIndexEntryTransactional(id,rowsize,location,position);
209 protected static TableIndexEntryTransactional lookForData(String id,TransactionalFile in) throws IOException{
210 int scanhash=id.hashCode();
211 int datahash=in.readInt();
212 int num=in.readShort();
213 if(scanhash!=datahash){
214 in.skipBytes(4+1+8+num*2);
217 StringBuilder buf=new StringBuilder(num);
218 for(int i=0;i<num;i++){
219 buf.append(in.readChar());
221 String readid=buf.toString();
222 if(!readid.equals(id)){
226 int rowsize=in.readInt();
227 int location=in.readByte();
228 long position=in.readLong();
229 TableIndexEntryTransactional tmp=new TableIndexEntryTransactional(id,rowsize,location,position);