*** empty log message ***
[IRC.git] / Robust / Transactions / mytuplesoup / src / com / solidosystems / tuplesoup / core / PagedIndexTransactional.java
1 /*
2  * To change this template, choose Tools | Templates
3  * and open the template in the editor.
4  */
5
6 package com.solidosystems.tuplesoup.core;
7
8 import TransactionalIO.core.TransactionalFile;
9 import dstm2.AtomicArray;
10 import dstm2.atomic;
11 import java.io.File;
12 import java.io.IOException;
13 import java.util.ArrayList;
14 import java.util.Hashtable;
15 import java.util.List;
16
17 /**
18  *
19  * @author navid
20  */
21 public class PagedIndexTransactional implements TableIndexTransactional{
22
23     PageIndexTSInf atomicfields;
24    
25
26     
27     public @atomic interface PageIndexTSInf{
28        String getFilename();
29        Long getStat_read();
30        Long getStat_write();
31        Long getStat_create_page();
32        Long getStat_page_next();
33        Long getStat_page_branch();
34        AtomicArray<TableIndexPageTransactional> getRoots();
35        
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);
43     }
44     
45     
46     private TransactionalFile out=null;
47     protected static final int INITIALPAGEHASH=1024;
48     protected static final int PAGESIZE=2048;
49     
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));
56     
57         if(out.length()>0){
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());
62             }
63         }else{
64             for(int i=0;i<INITIALPAGEHASH;i++){
65                 atomicfields.getRoots().set(i, TableIndexPageTransactional.createNewPage(this,out,PAGESIZE));
66                 atomicfields.getRoots().get(i).setFirst();
67             }
68         }
69     }
70     
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);
83         return hash;
84     }
85     
86     private int rootHash(String id){
87         return id.hashCode() & (INITIALPAGEHASH-1);
88     }
89     
90     private synchronized TableIndexPageTransactional getFirstFreePage(String id) throws IOException{
91         return atomicfields.getRoots().get(rootHash(id)).getFirstFreePage(id, id.hashCode());
92     }
93     
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());
97     }
98     
99     public synchronized void updateEntry(String id,int rowsize,int location,long position) throws IOException{
100         long offset=getOffset(id);
101         out.seek(offset);
102         TableIndexEntryTransactional entry=new TableIndexEntryTransactional(id,rowsize,location,position);
103         entry.updateData(out);
104         atomicfields.setStat_write(atomicfields.getStat_write()+1);
105     }
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);
110     }
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());
114     }
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);
120             if(entry!=null){
121                 if(entry.getLocation()!=Table.DELETE)lst.add(entry);
122             }
123         }
124         return lst;
125     }
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);
130         }
131         return lst;
132     }
133     public void close(){
134         try{
135             if(out!=null){
136                 out.close();
137             }
138         }catch(Exception e){}
139     }
140 }