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 ; 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 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 [] values , Date 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 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 maxDate = (Date ) ((FieldBase)record.getObject(endDate)).getObject(); 61 Date minDate = (Date ) ((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 ); updateSystemFieldsAndUserFieldsMin( recordVersion , columns, values ,date , maxDate ); 69 Object key = ((_IndexIteratorInfo)iterator).getActualKey(); 70 ((_TableOperations)iterator).update(SystemFieldsCharacteristics.IS ,new Object []{ session.getSessionId() }); 71 72 Object [] valuesToInsertForNewRecord = (Object [])recordVersion.getCurrentRecord().getObject(); 73 Object [] valuesToInsertForCurrentVersionRecord = (Object [])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 97 private void updateMaxDateField( RecordVersion record, Date date )throws DException{ 98 record.update(endDate, FieldUtility.getField( Datatypes.DATE , date,null)); 99 } 100 101 private void updateSystemFieldsAndUserFieldsMin( RecordVersion record, int[] columns, Object [] values, Date date, Date 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 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 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 []{ session.getTransactionIdAtStart() }); 134 ((_TableOperations)iterator).update(SystemFieldsCharacteristics.IS ,new Object []{ session.getSessionId() }); 135 clone.update(new int[]{endDate},new Object []{FieldUtility.getField( Datatypes.DATE , date,null)}); 136 Object [] 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 [] values, Date 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 [] values0 = new Object [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 [] systemFieldsDefaultValues = SystemFieldsCharacteristics.defaultValues(); 168 record.update( columnIndexes0, values0); 169 record.update(endDate, FieldUtility.getField( Datatypes.DATE , new Date ( 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 date, Date minDate, Date maxDate) throws DException{ 183 if ( (minDate.compareTo(date) <= 0 ) && (maxDate.compareTo(date) >= 0) ) 184 return; 185 throw new DException("DSE5520",new Object []{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 198 204 } 205 | Popular Tags |