public boolean diffForUpdate(Update res,ExecutableRecord fromDB) {
		res.name_exec = !executableName.equals(fromDB.executableName);
		res.architecture = !architecture.equals(fromDB.architecture);
		res.name_compiler = !compilerName.equals(fromDB.compilerName);
		if ((repository==null)&&(fromDB.repository==null)) {
			res.repository = false;
		}
		else if ((repository!=null)&&(fromDB.repository!=null)) {
			res.repository = !repository.equals(fromDB.repository);
		}
		else if (repository == null) {
			res.repository = false;
		}
		else {
			res.repository = true;
		}
		if ((path==null)&&(fromDB.path==null)) {
			res.path = false;
		}
		else if ((path!=null)&&(fromDB.path!=null)) {
			res.path = !path.equals(fromDB.path);
		}
		else if (path == null) {
			res.path = false;
		}
		else {
			res.path = true;
		}
		res.date = !date.equals(fromDB.date);
		if (usercat==null && fromDB.usercat == null) {	// Neither has any categories
			res.categories = false;
			res.catinsert = null;
		}
		else { // One of the lists is not null
			res.catinsert = findInsertions(fromDB.usercat, usercat);
			if (res.catinsert == null) {
				res.categories = true;		// Deletions are necessary,
			}
			else if (res.catinsert.size()==0) {	// All categories are the same
				res.categories = false;		// Nothing to change
				res.catinsert = null;
			}
			else {
				res.categories = true;		// There are some insertions to be made
			}
		}

		rowid = fromDB.rowid;
		res.update = this;
		return res.name_exec || res.architecture || res.name_compiler || res.repository || res.path
				|| res.date || res.categories;
	}
Assuming this is a (possibly) updated variant of another executable metadata record
Prepare an Update record describing the difference between the two records
@param res is the Update record to fill in
@param fromDB is the other ExecutableRecord metadata
@return true if overall there has been an update
Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/description/ExecutableRecord.java