KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > sessionsystem > DateSpanTable


1 package com.daffodilwoods.daffodildb.server.sessionsystem;
2
3 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._Iterator;
4
5
6
7 import java.sql.Date JavaDoc;
8 import com.daffodilwoods.daffodildb.server.datasystem.interfaces.*;
9
10 import com.daffodilwoods.daffodildb.server.serversystem.*;
11 import com.daffodilwoods.daffodildb.server.sql99.common.*;
12
13 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*;
14 import com.daffodilwoods.database.resource.*;
15 import com.daffodilwoods.database.sqlinitiator.*;
16 import com.daffodilwoods.daffodildb.server.datasystem.utility.RecordVersion;
17 import com.daffodilwoods.daffodildb.server.datasystem.utility.Record;
18 import com.daffodilwoods.database.general.QualifiedIdentifier;
19 import com.daffodilwoods.database.general.SystemFields;
20 import com.daffodilwoods.daffodildb.server.datasystem.utility._Record;
21 import com.daffodilwoods.daffodildb.utils.FieldUtility;
22 import com.daffodilwoods.daffodildb.utils.field.FieldBase;
23 import com.daffodilwoods.daffodildb.server.sessionsystem.sessioncondition.*;
24 import com.daffodilwoods.daffodildb.server.sessionsystem.sessionversioninfo.SessionVersionHandler;
25
26 public class DateSpanTable extends SessionTable {
27     int endDate = 6;
28     int startDate = 5;
29     private static int[] IT = new int[]{ SystemFields.invalidTransactionId};
30
31
32     /**
33      * Manages all the read and write operations. It maintains the system fields for
34      * each row.
35      * It is responsible for making the records valid or invalid accoring to the
36      * date specified during update or delete or insert .
37      */

38     public DateSpanTable(QualifiedIdentifier tableName, _Session session,_Table mergeTable,TableRowIdGetter tableRowIdGetter , ForUpdateTableHandler futh0,SessionVersionHandler sessionVersionHandler0) throws DException {
39         super(tableName,session,mergeTable,tableRowIdGetter,futh0,sessionVersionHandler0);
40     }
41
42     public RecordVersion updateVersion(_Iterator iterator ,int[] columns, Object JavaDoc[] values , Date JavaDoc date) throws DException {
43         tableLock.lock(0);
44         if( session.getIsolationLevel() == Session.ReadUncommitted )
45             throw new SessionException("DSE1164",null);
46         if(!performCommit){
47           session.addTableInChangedTableList(tableName);
48           performCommit = true;
49         }
50         sessionIdAtCommitInParent = session.getSessionId();
51
52         try{
53             Object JavaDoc rowId = ((FieldBase)(iterator.getColumnValues(SessionConditionReferences.rowIdReference_0))).getObject();
54             synchronized(rowId.toString().intern()){
55                 ((_IndexIteratorInfo)iterator).ensureRecordInMemory();
56                  _Record record = iterator.getRecord();
57                 if( isRowLocked( record ) ){
58                     throw new SessionException("DSE879",null);
59                 }
60                 Date JavaDoc maxDate = (Date JavaDoc) ((FieldBase)record.getObject(endDate)).getObject();
61                 Date JavaDoc minDate = (Date JavaDoc) ((FieldBase)record.getObject(startDate)).getObject();
62                 Record cloneRecord = (Record)record.clone();
63                 Record cloneRecord1 = (Record)record.clone();
64                 RecordVersion recordVersion = new RecordVersion(cloneRecord);
65                 RecordVersion recordVersion1 = new RecordVersion(cloneRecord1);
66                 verifyDate(date,minDate,maxDate);
67                 updateMaxDateField( recordVersion1 ,date ); // Making record invlid and inserting End Date for the reocrd
68
updateSystemFieldsAndUserFieldsMin( recordVersion , columns, values ,date , maxDate );
69                 Object JavaDoc key = ((_IndexIteratorInfo)iterator).getActualKey();
70                 ((_TableOperations)iterator).update(SystemFieldsCharacteristics.IS ,new Object JavaDoc[]{ session.getSessionId() });
71
72                 Object JavaDoc[] valuesToInsertForNewRecord = (Object JavaDoc[])recordVersion.getCurrentRecord().getObject();
73                 Object JavaDoc[] valuesToInsertForCurrentVersionRecord = (Object JavaDoc[])recordVersion1.getCurrentRecord().getObject();
74                 ((_TableOperations)iterator).insert(valuesToInsertForNewRecord);
75                 ((_TableOperations)iterator).insert(valuesToInsertForCurrentVersionRecord);
76                 ((_IndexIteratorInfo)iterator).moveOnActualKey(key);
77                 if(insert)
78                     insertDelete =true;
79                 delete = true;
80                 insert = true;
81                 return recordVersion;
82             }
83         }finally{
84             tableLock.unLock();
85         }
86
87     }
88
89
90     /**
91      * updates the columns of a record with the session id , transaction id and invalid session id.
92      * @param record is Object of RecordVersion
93      * @param columns is an array of column's index.
94      * @param values is an array of new values for updation.
95      * @throws DException
96      */

97     private void updateMaxDateField( RecordVersion record, Date JavaDoc date )throws DException{
98         record.update(endDate, FieldUtility.getField( Datatypes.DATE , date,null));
99     }
100
101     private void updateSystemFieldsAndUserFieldsMin( RecordVersion record, int[] columns, Object JavaDoc[] values, Date JavaDoc date, Date JavaDoc maxDate )throws DException{
102         record.update( SystemFields.sessionId, session.getSessionId() );
103         record.update( SystemFields.transactionId, SystemFields.maxIntegerValue );
104         record.update( SystemFields.invalidSessionId, SystemFields.maxIntegerValue );
105         record.update(columns, values );
106         record.update(endDate, FieldUtility.getField( Datatypes.DATE , maxDate,null));
107         record.update(startDate,FieldUtility.getField( Datatypes.DATE , date,null));
108     }
109
110
111
112
113     public RecordVersion deleteVersion( _Iterator iterator, Date JavaDoc date )throws DException{
114         tableLock.lock(0);
115         if( session.getIsolationLevel() == Session.ReadUncommitted )
116             throw new SessionException("DSE330",null);
117         if(!performCommit){
118           session.addTableInChangedTableList(tableName);
119           performCommit = true;
120         }
121         sessionIdAtCommitInParent = session.getSessionId();
122
123         try{
124             Object JavaDoc rowId = ((FieldBase)(iterator.getColumnValues(SessionConditionReferences.rowIdReference_0))).getObject();
125             synchronized(rowId.toString().intern()){
126                 ((_IndexIteratorInfo)iterator).ensureRecordInMemory();
127                 _Record record = iterator.getRecord();
128                 if( isRowLocked( record ) ){
129                     throw new SessionException("DSE879",null);
130                 }
131                 RecordVersion recordVersion = new RecordVersion(record);
132                 Record clone = (Record)record.clone();
133                 ((_TableOperations)iterator).update(IT ,new Object JavaDoc[]{ session.getTransactionIdAtStart() });
134                 ((_TableOperations)iterator).update(SystemFieldsCharacteristics.IS ,new Object JavaDoc[]{ session.getSessionId() });
135                 clone.update(new int[]{endDate},new Object JavaDoc[]{FieldUtility.getField( Datatypes.DATE , date,null)});
136                 Object JavaDoc[] validRecordWithEndDate = clone.getObject();
137                 ((_TableOperations)iterator).insert(validRecordWithEndDate);
138                 if(insert)
139                      insertDelete = true;
140                 delete = true;
141                 return recordVersion;
142             }
143         }
144         finally{
145             tableLock.unLock();
146         }
147     }
148
149     public RecordVersion insertVersion( int[] columnIndexes, Object JavaDoc[] values, Date JavaDoc date ) throws DException{
150         if( session.getIsolationLevel() == Session.ReadUncommitted )
151             throw new SessionException("DSE487",null);
152         if(!performCommit){
153           session.addTableInChangedTableList(tableName);
154           performCommit = true;
155         }
156           sessionIdAtCommitInParent = session.getSessionId();
157           try{
158             tableLock.lock(0);
159             int[] columnIndexes0 = new int[columnIndexes.length + 1];
160             Object JavaDoc[] values0 = new Object JavaDoc[columnIndexes.length + 1];
161             System.arraycopy(columnIndexes,0,columnIndexes0,0,columnIndexes.length);
162             System.arraycopy(values,0,values0,0,values.length);
163             columnIndexes0[columnIndexes0.length-1] = startDate;
164             values0[values0.length-1] = FieldUtility.getField( Datatypes.DATE , date,null);
165             _Record record = mergeTable.getBlankRecord();
166             int[] systemFields = SystemFieldsCharacteristics.getSystemFields();
167             Object JavaDoc[] systemFieldsDefaultValues = SystemFieldsCharacteristics.defaultValues();
168             record.update( columnIndexes0, values0);
169             record.update(endDate, FieldUtility.getField( Datatypes.DATE , new Date JavaDoc( 2099,12,12 ),null) );
170             updateSystemFields(record, systemFields,systemFieldsDefaultValues);
171             _Iterator iterator = ((_IndexTable)mergeTable).getDefaultIterator();
172             ((_TableOperations)iterator).insert(record.getObject());
173             insert = true;
174             RecordVersion recordVersion = new RecordVersion(record);
175             return recordVersion;
176         }
177         finally{
178             tableLock.unLock();
179         }
180     }
181
182     private void verifyDate(Date JavaDoc date, Date JavaDoc minDate, Date JavaDoc maxDate) throws DException{
183         if ( (minDate.compareTo(date) <= 0 ) && (maxDate.compareTo(date) >= 0) )
184             return;
185         throw new DException("DSE5520",new Object JavaDoc[]{date.toString(),minDate.toString(),maxDate.toString() });
186     }
187
188     public _Iterator getIterator( _SingleTableExecuter singleTableExecuter, _ServerSession serverSession) throws DException{
189       return super.getConditionalIterator(singleTableExecuter,serverSession);
190     }
191
192             /**
193          * return true if a row is locked otherwise false
194          * @param <b>record</b>
195          * @return boolean
196          * @throws DException
197          */

198 /*
199         private boolean isRowLocked( Record record ) throws DException {
200             return !(record.getObject(SystemFields.invalidSessionId).equals( SystemFields.maxIntegerValue ) );
201         }
202
203         */

204 }
205
Popular Tags