1 package com.daffodilwoods.daffodildb.server.serversystem.deeprecordcopy; 2 3 import java.util.*; 4 5 import com.daffodilwoods.daffodildb.server.datadictionarysystem.*; 6 import com.daffodilwoods.daffodildb.server.datasystem.utility._Record; 7 import com.daffodilwoods.daffodildb.server.serversystem.*; 8 import com.daffodilwoods.daffodildb.server.sql99.common.*; 9 import com.daffodilwoods.daffodildb.server.sql99.dql.execution.*; 10 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator.*; 11 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 12 import com.daffodilwoods.daffodildb.server.sql99.utils.*; 13 import com.daffodilwoods.daffodildb.server.sql99.utils.parser.*; 14 import com.daffodilwoods.database.general.*; 15 import com.daffodilwoods.database.resource.*; 16 import com.daffodilwoods.database.utility.*; 17 public class CopyHierarchy { 18 19 Object [] values; 20 _ServerSession serverSession; 21 MappingHandler mappingHandler; 22 ArrayList tables = new ArrayList(3); 23 24 25 26 27 public CopyHierarchy(_ServerSession serverSession) { 28 this.serverSession = serverSession; 29 mappingHandler = new MappingHandler(); 30 } 31 32 33 public Object [] copy( Object [] values , TableCopy rootCopy ) throws DException { 34 this.values = values; 35 TableCopy parentCopy = rootCopy; 36 _Iterator rootNodeIterator = getIteratorForRootNode( parentCopy ); 37 P.showIterator( rootNodeIterator ); 38 serverSession.startSavePoint(); 39 return copyRecord(serverSession, parentCopy , rootNodeIterator); 40 } 41 42 43 public Object [] copyRecord(_ServerSession childSession,TableCopy tableCopy,_Iterator iterator) throws DException{ 44 Object [] valToReturn = new Object [values.length]; 45 try{ 46 Vector recordMappings = new Vector(); 47 RecordMapping recMap; 48 _Record recordToInsert = null; 49 if(iterator.first()){ 50 Object [] oldRecord = iterator.getRecord().getObject(); 51 Object [] newRecordtmp = tableCopy.tableInf.createCopyOfRecord(oldRecord,mappingHandler); 52 recMap = new RecordMapping(); 53 recMap.setOldRecord(oldRecord); 54 Object [] newRec = new Object [newRecordtmp.length-5]; 55 for (int i = 0; i < newRec.length; i++) { 56 newRec[i] = newRecordtmp[5+i]; 57 } 58 recordToInsert = serverSession.getServerTable(tableCopy.tablename).insert(newRec); 59 Object [] newRecord = recordToInsert.getObject(); 60 recMap.setNewRecord( newRecord ); 61 recordMappings.add(recMap); 62 63 mappingHandler.addVector(tableCopy.tablename,recordMappings); 64 ArrayList columnInfo = tableCopy.tableInf.columnInformations; 65 int k = 0; 66 for (int i = 0; i < columnInfo.size(); i++) { 67 if( ((ColumnInfo)columnInfo.get(i)).isPrimary || ((ColumnInfo)columnInfo.get(i)).isPrimary) 68 valToReturn[k++] = newRecord[i]; 69 } 70 } 71 tables.add(tableCopy); 72 for (int i = 0; i < tables.size(); i++) { 73 TableCopy tc = (TableCopy)tables.get(i); 74 createCopyInChildren( childSession,tc); 75 } 76 }catch(DException e){ 77 e.printStackTrace(); 78 childSession.rollback(); 79 throw e; 80 } 81 childSession.commit(); 82 return valToReturn; 83 } 84 85 public static boolean testing = false; 86 87 public _Iterator getIteratorForRootNode(TableCopy parentCopy) throws DException{ 88 booleanvalueexpression condition ; 89 StringBuffer clause = new StringBuffer (); 90 String [] columns = parentCopy.tableInf.getPrimaryColumnNames(); 91 for (int i = 0; i < columns.length; i++) { 92 clause.append(columns[i]); 93 clause.append(" = ? "); 94 if(i != columns.length-1) 95 clause.append(" and "); 96 } 97 condition = (booleanvalueexpression)SessionConditionParser.parseCondition(clause.toString()); 98 TableDetails tableDetails = new TableDetails(); 99 QualifiedIdentifier tableName = parentCopy.tablename; 100 tableDetails.setTableName(new String []{tableName.catalog,tableName.schema,tableName.name}); 101 _SingleTableExecuter singleTableExecuter = new ConditionSingleTableExecuter( null , tableDetails, serverSession , condition, null ); 102 _Iterator iterator = serverSession.getIterator(parentCopy.tablename,singleTableExecuter); 103 104 iterator.setConditionVariableValue(getReferences(condition.getParameters(null)),values,1); 105 return iterator; 106 } 107 108 public void createCopyInChildren(_ServerSession childSession, TableCopy tableCopy)throws DException{ 109 ChildInfo[] children = tableCopy.getchildren(); 110 Vector parentRecords = mappingHandler.getVector(tableCopy.tablename); 111 112 for (int i = 0; i < children.length; i++) { 113 ; Vector recMappings = getRecordsToBeUpdated(children[i],parentRecords); 115 mappingHandler.addVector(children[i].childTableCopy.tablename,recMappings); 116 tables.add(children[i].childTableCopy); 117 } 118 119 for (int i = 0; i < children.length; i++) { 120 TableCopy childcopy = children[i].childTableCopy; 121 if(childcopy.level==tableCopy.level+1){ 122 Vector recordsToBeCopied = mappingHandler.getVector(childcopy.tablename); 123 copyRecordInchild(childcopy,recordsToBeCopied); 124 } 125 126 } 127 128 } 129 130 private _Reference[] getReferences(Object [] obj) throws DException { 131 int len = obj.length; 132 _Reference[] ref = new _Reference[len] ; 133 for( int i=0; i<len; i++ ){ 134 ref[i] = (_Reference)obj[i] ; 135 } 136 return ref; 137 } 138 139 public void copyRecordInchild(TableCopy childCopy,Vector recordsToBeCopied) throws DException{ 140 if( recordsToBeCopied != null ){ 141 for (int i = 0; i < recordsToBeCopied.size(); i++) { 142 try{ 143 RecordMapping recMapping = (RecordMapping)recordsToBeCopied.get(i); 144 if( !recMapping.isCopied() ){ 145 Object [] oldRecord = recMapping.getOldRecord(); 146 Object [] newRecord = childCopy.tableInf.createCopyOfRecord(oldRecord,mappingHandler); 147 Object [] newRec1 = new Object [newRecord.length-5]; 148 for (int j = 0; j < newRec1.length; j++) { 149 newRec1[j] = newRecord[5+j]; 150 } 151 _Record recordInserted = serverSession.getServerTable(childCopy.tablename).insert(newRec1); 152 recMapping.setNewRecord(recordInserted.getObject()); 153 } 154 } catch( Exception ddd ){ 155 ddd.printStackTrace(); 156 } 157 } 158 } 159 else 160 ; } 162 163 public Vector getRecordsToBeUpdated(ChildInfo child,Vector parentIterator) throws DException{ 164 TableCopy childTableCopy = child.childTableCopy; 165 _ReferentialConstraint parentConstraint = child.referencedConstraint; 166 int []referencedColumns = parentConstraint.getReferencedColumns(); 167 int[] referencingColumns = parentConstraint.getReferencingColumns(); 168 booleanvalueexpression condition = parentConstraint.getReferencingCondition(referencingColumns); 169 TableDetails tableDetails = new TableDetails(); 170 QualifiedIdentifier tableName = childTableCopy.tablename; 171 tableDetails.setTableName(new String []{tableName.catalog,tableName.schema,tableName.name}); 172 173 _SingleTableExecuter singleTableExecuter = new ConditionSingleTableExecuter( null , tableDetails, serverSession, condition, null ); 174 175 _Iterator iterator = serverSession.getIterator(childTableCopy.tablename, singleTableExecuter); 176 Vector recMappings = mappingHandler.getVector(childTableCopy.tablename) ; 177 if(recMappings == null) 178 recMappings = new Vector(); 179 for (int i = 0; i < parentIterator.size(); i++) { 180 Object [] oldRecord = ((RecordMapping)parentIterator.get(i)).getOldRecord(); 181 Object [] values = new Object [referencedColumns.length]; 182 for (int j = 0; j < referencedColumns.length; j++) { 183 values[j] = oldRecord[referencedColumns[j]]; 184 } 185 iterator.setConditionVariableValue(getReferences(condition.getParameters(null)),values,1); 186 if(iterator.first()) 187 do{ 188 if( !isRecordAlreadyAdded( recMappings,iterator.getRecord() ) ) { 189 ; RecordMapping recMap = new RecordMapping(); 191 recMap.setOldRecord(iterator.getRecord().getObject()); 192 recMappings.add(recMap); 193 } 194 }while(iterator.next()); 195 } 196 return recMappings; 197 } 198 199 private boolean isRecordAlreadyAdded( Vector vector , _Record record ) throws DException { 200 if( vector.size() > 0 ){ 201 Object [] toLook = record.getObject(); 202 for (int i = 0; i < vector.size(); i++) { 203 Object [] tmpArry = ((RecordMapping)vector.get(i)).getOldRecord(); 204 for (int j = 0; j < tmpArry.length; j++){ 205 if( !tmpArry[j].equals(toLook[j] ) ) 206 break; 207 return true; 208 } 209 } 210 } 211 return false; 212 } 213 214 } 215 | Popular Tags |