| 1 package com.daffodilwoods.daffodildb.client; 2 3 import java.sql.*; 4 5 import com.daffodilwoods.daffodildb.server.sql99.dql.listenerevents.*; 6 import com.daffodilwoods.daffodildb.server.sql99.dql.resultsetmetadata.*; 7 import com.daffodilwoods.database.resource.*; 8 9 17 public class RecordSetUpdateable extends RecordSet { 18 19 _Record insertedRecord; 20 _AllColumnRowReader allColumnRowReader; 21 DataOperationListener dataOperationListener; 22 public RecordSetUpdateable() throws SQLException { 23 super(); 24 isUpdateable = true; 25 } 26 27 public _Record getInsertedRecord() throws DException { 28 Object row = selectIterator.moveToInsertRow(); 29 JDBCRecord record = new JDBCRecord(true); 30 record.setBuffer(this); 31 try { 32 record.setValues(row); 33 } catch (SQLException ex) { 34 throw new DException("DSE5032", new Object [] {ex.getMessage()}); 35 } 36 insertedRecord = record; 37 return record; 38 } 39 40 public Object insertRow() throws DException { 41 if (insertedRecord == null) 42 throw new DException("DSE7053", null); 43 JDBCRecord dpRecord = (JDBCRecord) insertedRecord; 44 dpRecord.setInserted(true); 45 int[] columns = dpRecord.getUpdatedColumns(); 46 Object [] columnValues = dpRecord.getValuesForUpdation(); 47 dpRecord.flushUpdateColumnsAndValues(); 48 Object row = selectIterator.insert(columns, columnValues); 49 insertedRecord = null; 50 updateBottomFetched(); 51 55 return null; 56 } 57 58 private void fireDataOperationForInsert(Object row) throws DException { 59 try { 60 JDBCRecord record = new JDBCRecord(isUpdateable); 61 record.setBuffer(this); 62 record.setValues(row); 63 DataOperation dataOperation = new DataOperation(this, DataOperation.INSERT, record.getIdentity(), null, null, null, null); 64 dataOperation.record = record; 65 dataOperationListener.operationPerformed(dataOperation); 66 } catch (SQLException ex) { 67 throw new DException("DSE5030", new Object [] {ex.getMessage()}); 68 } 69 } 70 71 public void loadRecordForIdentity(_Record record, Object identity) throws SQLException { 72 if (identity == null) 73 throw new SQLException(new DException("DSE550", null).getMessage()); 74 int index = identity.hashCode(); 75 if (index < 0 && index > recordList.size()) 76 throw new SQLException(new DException("DSE552", new Object [] {identity}).getMessage()); 77 Object row = recordList.get(index); 78 JDBCRecord drecord = (JDBCRecord) record; 79 drecord.setBuffer(this); 80 drecord.setValues(row); 81 drecord.setKey(identity); 82 } 83 84 public Object locateNearestKey(Object key) throws SQLException { 85 if (key == null) 86 throw new DException("DSE550", null).getSqlException(null); 87 int index = ( (Integer ) key).hashCode(); 88 int size = recordList.size(); 89 return index < size ? key : (size == 0 ? null : new Integer (size - 1)); 90 } 91 92 public void updateRow(_Record record) throws DException, SQLException { 93 if (insertedRecord != null) 94 throw new DException("DSE7054", null); 95 JDBCRecord dpRecord = (JDBCRecord) record; 96 Object updateKey = dpRecord.getKey(); 97 int index = ( (Integer ) updateKey).hashCode(); 98 int[] columns = dpRecord.getUpdatedColumns(); 99 Object [] columnValues = dpRecord.getValuesForUpdation(); 100 Object values = dpRecord.getValues(); 101 Object row = selectIterator.update(allColumnRowReader.getKey(values), columns, columnValues, values); 102 recordList.set(index, row); 103 dpRecord.flushUpdateColumnsAndValues(); 104 fireDataOperationListenerForUpdate(new Integer (index), columns, columnValues, null, row); 105 } 106 107 private void fireDataOperationListenerForUpdate(Object rsKey, int[] columnIndexes, Object [] newValues, Object [] oldValues, Object newRow) throws DException { 108 try { 109 JDBCRecord record = new JDBCRecord(isUpdateable); 110 record.setBuffer(this); 111 record.setKey(rsKey); 112 record.setValues(newRow); 113 DataOperation dataOperation = new DataOperation(this, DataOperation.UPDATE, 114 record.getIdentity(), rsKey, columnIndexes, oldValues, newValues); 115 dataOperation.record = record; 116 dataOperationListener.operationPerformed(dataOperation); 117 } catch (SQLException sq) { 118 throw new RuntimeException (sq.getMessage()); 119 } 120 } 121 122 public Object deleteRow(_Record deleteRecord) throws DException { 123 JDBCRecord record = (JDBCRecord) deleteRecord; 124 Object values = record.getValues(); 125 Object deleteKey = record.getKey(); 126 int index = ( (Integer ) deleteKey).hashCode(); 127 int size = recordList.size(); 128 129 Object keys = allColumnRowReader.getKey(values); selectIterator.delete(keys); 131 Object oldRow = recordList.get(index); 132 recordList.remove(index); 133 decrementNumberOfRecodsMoved(); 134 try { 135 fireDataOperationForDelete(deleteRecord); 136 } catch (SQLException ex) { 137 throw new DException("DSE5029", new Object [] {ex.getMessage()}); 138 } 139 Object nearestKey = size == 1 ? null : (index == (size - 1) ? new Integer (index - 1) : new Integer (index)); 140 return nearestKey; 141 } 142 143 private void fireDataOperationForDelete(_Record deletedRecord) throws SQLException, DException { 144 DataOperation dataOperation = new DataOperation(this, DataOperation.DELETE, deletedRecord.getIdentity(), 145 null, null, null, null); 146 dataOperation.record = deletedRecord; 147 dataOperationListener.operationPerformed(dataOperation); 148 } 149 150 public void addDataOperationListener(DataOperationListener listener) { 151 dataOperationListener = listener; 152 } 153 154 public void removeDataOperationListener(DataOperationListener listener) { 155 dataOperationListener = null; 156 } 157 158 public void setSelectIterator(_SelectIterator selectIterator0) throws DException { 159 super.setSelectIterator(selectIterator0); 160 allColumnRowReader = (_AllColumnRowReader) selectIterator0.getRowReader(); 161 } 162 } 163 | Popular Tags |