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.AtomicArray;
12 import java.io.IOException;
13 import java.util.ArrayList;
14 import java.util.Hashtable;
15 import java.util.List;
21 public class PagedIndexTransactional implements TableIndexTransactional{
23 PageIndexTSInf atomicfields;
27 public @atomic interface PageIndexTSInf{
31 Long getStat_create_page();
32 Long getStat_page_next();
33 Long getStat_page_branch();
34 AtomicArray<TableIndexPageTransactional> getRoots();
36 void setFilename(String val);
37 void setRoots(AtomicArray<TableIndexPageTransactional> roots);
38 void setStat_read(Long val);
39 void setStat_write(Long val);
40 void setStat_create_page(Long val);
41 void setStat_page_next(Long val);
42 void setStat_page_branch(Long val);
46 private TransactionalFile out=null;
47 protected static final int INITIALPAGEHASH=1024;
48 protected static final int PAGESIZE=2048;
50 public PagedIndexTransactional(String filename) throws IOException{
51 this.atomicfields.setFilename(filename);
52 File ftest=new File(filename);
53 if(!ftest.exists())ftest.createNewFile();
54 out=new TransactionalFile(filename,"rw");
55 atomicfields.setRoots(new AtomicArray<TableIndexPageTransactional>(TableIndexPageTransactional.class, INITIALPAGEHASH));
58 for(int i=0;i<INITIALPAGEHASH;i++){
59 atomicfields.getRoots().set(i, new TableIndexPageTransactional(this,out));
60 atomicfields.getRoots().get(i).setFirst();
61 out.seek(atomicfields.getRoots().get(i).getEndLocation());
64 for(int i=0;i<INITIALPAGEHASH;i++){
65 atomicfields.getRoots().set(i, TableIndexPageTransactional.createNewPage(this,out,PAGESIZE));
66 atomicfields.getRoots().get(i).setFirst();
71 public Hashtable<String,Long> readStatistics(){
72 Hashtable<String,Long> hash=new Hashtable<String,Long>();
73 hash.put("stat_index_read",atomicfields.getStat_read());
74 hash.put("stat_index_write",atomicfields.getStat_write());
75 hash.put("stat_index_create_page",atomicfields.getStat_create_page());
76 hash.put("stat_index_page_next",atomicfields.getStat_page_next());
77 hash.put("stat_index_page_branch",atomicfields.getStat_page_branch());
78 atomicfields.setStat_read((long)0);
79 atomicfields.setStat_write((long)0);
80 atomicfields.setStat_create_page((long)0);
81 atomicfields.setStat_page_next((long)0);
82 atomicfields.setStat_page_branch((long)0);
86 private int rootHash(String id){
87 return id.hashCode() & (INITIALPAGEHASH-1);
90 private synchronized TableIndexPageTransactional getFirstFreePage(String id) throws IOException{
91 return atomicfields.getRoots().get(rootHash(id)).getFirstFreePage(id, id.hashCode());
94 private synchronized long getOffset(String id) throws IOException{
95 if(atomicfields.getRoots()==null)return -1;
96 return atomicfields.getRoots().get(rootHash(id)).getOffset(id,id.hashCode());
99 public synchronized void updateEntry(String id,int rowsize,int location,long position) throws IOException{
100 long offset=getOffset(id);
102 TableIndexEntryTransactional entry=new TableIndexEntryTransactional(id,rowsize,location,position);
103 entry.updateData(out);
104 atomicfields.setStat_write(atomicfields.getStat_write()+1);
106 public synchronized void addEntry(String id,int rowsize,int location,long position) throws IOException{
107 TableIndexPageTransactional page=getFirstFreePage(id);
108 page.addEntry(id,rowsize,location,position);
109 atomicfields.setStat_write(atomicfields.getStat_write()+1);
111 public synchronized TableIndexEntryTransactional scanIndex(String id) throws IOException{
112 if(atomicfields.getRoots()==null)return null;
113 return atomicfields.getRoots().get(rootHash(id)).scanIndex(id,id.hashCode());
115 public synchronized List<TableIndexEntryTransactional> scanIndex(List<String> rows) throws IOException{
116 List<TableIndexEntryTransactional> lst=new ArrayList<TableIndexEntryTransactional>();
117 for(int i=0;i<rows.size();i++){
118 String id=rows.get(i);
119 TableIndexEntryTransactional entry=scanIndex(id);
121 if(entry.getLocation()!=Table.DELETE)lst.add(entry);
126 public synchronized List<TableIndexEntryTransactional> scanIndex() throws IOException{
127 ArrayList<TableIndexEntryTransactional> lst=new ArrayList<TableIndexEntryTransactional>();
128 for(int i=0;i<INITIALPAGEHASH;i++){
129 atomicfields.getRoots().get(i).addEntriesToList(lst);
138 }catch(Exception e){}