GP-1788 Ensure that composite last modified time is updated when component field name or comment is modified. Removed unnecessary component record update.

This commit is contained in:
ghidra1 2022-03-03 15:06:56 -05:00
parent 66c0b49b87
commit 9c19d8b361
2 changed files with 38 additions and 42 deletions

View file

@ -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);
}
}

View file

@ -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);
}
/**