From 9c19d8b361de9cbaf32faa719650d19bf839fe3f Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Thu, 3 Mar 2022 15:06:56 -0500 Subject: [PATCH] GP-1788 Ensure that composite last modified time is updated when component field name or comment is modified. Removed unnecessary component record update. --- .../database/data/DataTypeComponentDB.java | 60 +++++++++---------- .../program/database/data/StructureDB.java | 20 +++---- 2 files changed, 38 insertions(+), 42 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeComponentDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeComponentDB.java index 62147d9e85..8d7632ad3b 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeComponentDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeComponentDB.java @@ -208,15 +208,9 @@ class DataTypeComponentDB implements InternalDataTypeComponent { @Override public void setComment(String comment) { - try { - if (record != null) { - record.setString(ComponentDBAdapter.COMPONENT_COMMENT_COL, comment); - adapter.updateRecord(record); - dataMgr.dataTypeChanged(getParent(), false); - } - } - catch (IOException e) { - dataMgr.dbError(e); + if (record != null) { + record.setString(ComponentDBAdapter.COMPONENT_COMMENT_COL, comment); + updateRecord(true); } } @@ -233,26 +227,19 @@ class DataTypeComponentDB implements InternalDataTypeComponent { @Override public void setFieldName(String name) throws DuplicateNameException { - try { - if (record != null) { - if (name != null) { - name = name.trim(); - if (name.length() == 0 || name.equals(getDefaultFieldName())) { - name = null; - } - else { - checkDuplicateName(name); - } + if (record != null) { + if (name != null) { + name = name.trim(); + if (name.length() == 0 || name.equals(getDefaultFieldName())) { + name = null; + } + else { + checkDuplicateName(name); } - record.setString(ComponentDBAdapter.COMPONENT_FIELD_NAME_COL, name); - adapter.updateRecord(record); - dataMgr.dataTypeChanged(getParent(), false); } + record.setString(ComponentDBAdapter.COMPONENT_FIELD_NAME_COL, name); + updateRecord(true); } - catch (IOException e) { - dataMgr.dbError(e); - } - } private void checkDuplicateName(String name) throws DuplicateNameException { @@ -351,7 +338,7 @@ class DataTypeComponentDB implements InternalDataTypeComponent { record.setIntValue(ComponentDBAdapter.COMPONENT_ORDINAL_COL, ordinal); record.setIntValue(ComponentDBAdapter.COMPONENT_OFFSET_COL, offset); record.setIntValue(ComponentDBAdapter.COMPONENT_SIZE_COL, length); - updateRecord(); + updateRecord(false); } } @@ -361,7 +348,7 @@ class DataTypeComponentDB implements InternalDataTypeComponent { record.setIntValue(ComponentDBAdapter.COMPONENT_OFFSET_COL, offset); } if (updateRecord) { - updateRecord(); + updateRecord(false); } } @@ -371,7 +358,7 @@ class DataTypeComponentDB implements InternalDataTypeComponent { record.setIntValue(ComponentDBAdapter.COMPONENT_ORDINAL_COL, ordinal); } if (updateRecord) { - updateRecord(); + updateRecord(false); } } @@ -385,14 +372,23 @@ class DataTypeComponentDB implements InternalDataTypeComponent { record.setIntValue(ComponentDBAdapter.COMPONENT_SIZE_COL, length); } if (updateRecord) { - updateRecord(); + updateRecord(false); } } - void updateRecord() { + /** + * Update component record and option update composite last modified time. + * @param setLastChangeTime if true update composite last modified time and + * invoke dataTypeChanged for composite, else update component record only. + */ + void updateRecord(boolean setLastChangeTime) { if (record != null) { try { adapter.updateRecord(record); + if (setLastChangeTime) { + long timeNow = System.currentTimeMillis(); + parent.setLastChangeTime(timeNow); + } } catch (IOException e) { dataMgr.dbError(e); @@ -410,7 +406,7 @@ class DataTypeComponentDB implements InternalDataTypeComponent { if (record != null) { record.setLongValue(ComponentDBAdapter.COMPONENT_DT_ID_COL, dataMgr.getResolvedID(newDt)); - updateRecord(); + updateRecord(false); } } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/StructureDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/StructureDB.java index 9c99fa273a..cef332fb83 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/StructureDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/StructureDB.java @@ -1740,14 +1740,13 @@ class StructureDB extends CompositeDB implements StructureInternal { } if (length < dtcLen) { dtc.setLength(length, true); - shiftOffsets(i + 1, dtcLen - length, 0); + shiftOffsets(i + 1, dtcLen - length, 0); // updates structure record and last modified time changed = true; } else if (length > dtcLen) { - int consumed = consumeBytesAfter(i, length - dtcLen); + int consumed = consumeBytesAfter(i, length - dtcLen); // updates component record if (consumed > 0) { - dtc.updateRecord(); - shiftOffsets(i + 1, -consumed, 0); + shiftOffsets(i + 1, -consumed, 0); // updates structure record and last modified time changed = true; } } @@ -1803,14 +1802,13 @@ class StructureDB extends CompositeDB implements StructureInternal { } else if (length < dtcLen) { dtc.setLength(length, true); - shiftOffsets(i + 1, dtcLen - length, 0); + shiftOffsets(i + 1, dtcLen - length, 0); // updates structure record and last modified time didChange = true; } else if (length > dtcLen) { - int consumed = consumeBytesAfter(i, length - dtcLen); + int consumed = consumeBytesAfter(i, length - dtcLen); // updates component record if (consumed > 0) { - dtc.updateRecord(); - shiftOffsets(i + 1, -consumed, 0); + shiftOffsets(i + 1, -consumed, 0); // updates structure record and last modified time didChange = true; } } @@ -1902,7 +1900,9 @@ class StructureDB extends CompositeDB implements StructureInternal { } /** - * + * Adjust length of specified component (by index) by consuming available undefined + * bytes upto the specified number of bytes (numBytes). The associated component record will + * be updated without adjusting structure last modified or providing notification. * @param definedComponentIndex the index of the defined component that is consuming the bytes. * @param numBytes the number of undefined bytes to consume * @return the number of bytes actually consumed @@ -1963,7 +1963,7 @@ class StructureDB extends CompositeDB implements StructureInternal { protected void shiftOffset(DataTypeComponentDB dtc, int deltaOrdinal, int deltaOffset) { dtc.setOffset(dtc.getOffset() + deltaOffset, false); dtc.setOrdinal(dtc.getOrdinal() + deltaOrdinal, false); - dtc.updateRecord(); + dtc.updateRecord(false); } /**