Merge remote-tracking branch

'origin/GP-4403_ghidra1_ImmutableDomainObject--SQUASHED'

Conflicts:
	Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/ProgramContentHandler.java
This commit is contained in:
Ryan Kurtz
2024-03-21 09:11:28 -04:00
161 changed files with 1240 additions and 1126 deletions
@@ -21,7 +21,6 @@ import java.net.Socket;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import db.DBConstants;
import db.DBHandle; import db.DBHandle;
import generic.test.AbstractGTest; import generic.test.AbstractGTest;
import ghidra.GhidraApplicationLayout; import ghidra.GhidraApplicationLayout;
@@ -29,6 +28,7 @@ import ghidra.GhidraTestApplicationLayout;
import ghidra.base.project.GhidraProject; import ghidra.base.project.GhidraProject;
import ghidra.framework.Application; import ghidra.framework.Application;
import ghidra.framework.GhidraApplicationConfiguration; import ghidra.framework.GhidraApplicationConfiguration;
import ghidra.framework.data.OpenMode;
import ghidra.framework.model.DomainFile; import ghidra.framework.model.DomainFile;
import ghidra.framework.model.ProjectData; import ghidra.framework.model.ProjectData;
import ghidra.framework.store.db.PackedDatabase; import ghidra.framework.store.db.PackedDatabase;
@@ -139,7 +139,7 @@ public class IsfServer extends Thread {
DBHandle dbh = db.openForUpdate(dummy); DBHandle dbh = db.openForUpdate(dummy);
ProgramDB p = null; ProgramDB p = null;
try { try {
p = new ProgramDB(dbh, DBConstants.UPDATE, dummy, this); p = new ProgramDB(dbh, OpenMode.UPDATE, dummy, this);
} }
catch (VersionException e) { catch (VersionException e) {
if (!e.isUpgradable()) { if (!e.isUpgradable()) {
@@ -151,7 +151,7 @@ public class IsfServer extends Thread {
} }
dbh = db.openForUpdate(dummy); dbh = db.openForUpdate(dummy);
p = new ProgramDB(dbh, DBConstants.UPGRADE, dummy, this); p = new ProgramDB(dbh, OpenMode.UPGRADE, dummy, this);
if (!p.isChanged()) { if (!p.isChanged()) {
throw new RuntimeException(p + " uses an older version and was not upgraded."); throw new RuntimeException(p + " uses an older version and was not upgraded.");
@@ -161,8 +161,8 @@ public class IsfServer extends Thread {
} }
public static void main(String[] args) throws FileNotFoundException, IOException { public static void main(String[] args) throws FileNotFoundException, IOException {
GhidraApplicationLayout layout = new GhidraTestApplicationLayout( GhidraApplicationLayout layout =
new File(AbstractGTest.getTestDirectoryPath())); new GhidraTestApplicationLayout(new File(AbstractGTest.getTestDirectoryPath()));
GhidraApplicationConfiguration config = new GhidraApplicationConfiguration(); GhidraApplicationConfiguration config = new GhidraApplicationConfiguration();
config.setShowSplashScreen(false); config.setShowSplashScreen(false);
Application.initializeApplication(layout, config); Application.initializeApplication(layout, config);
@@ -26,6 +26,7 @@ import db.DBHandle;
import db.Transaction; import db.Transaction;
import generic.depends.DependentService; import generic.depends.DependentService;
import generic.depends.err.ServiceConstructionException; import generic.depends.err.ServiceConstructionException;
import ghidra.framework.data.OpenMode;
import ghidra.framework.model.DomainObjectChangeRecord; import ghidra.framework.model.DomainObjectChangeRecord;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;
import ghidra.lifecycle.Internal; import ghidra.lifecycle.Internal;
@@ -64,7 +65,8 @@ import ghidra.trace.util.*;
import ghidra.trace.util.CopyOnWrite.WeakHashCowSet; import ghidra.trace.util.CopyOnWrite.WeakHashCowSet;
import ghidra.trace.util.CopyOnWrite.WeakValueHashCowMap; import ghidra.trace.util.CopyOnWrite.WeakValueHashCowMap;
import ghidra.util.*; import ghidra.util.*;
import ghidra.util.database.*; import ghidra.util.database.DBCachedDomainObjectAdapter;
import ghidra.util.database.DBCachedObjectStoreFactory;
import ghidra.util.datastruct.ListenerSet; import ghidra.util.datastruct.ListenerSet;
import ghidra.util.exception.*; import ghidra.util.exception.*;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -154,7 +156,7 @@ public class DBTrace extends DBCachedDomainObjectAdapter implements Trace, Trace
public DBTrace(String name, CompilerSpec baseCompilerSpec, Object consumer) public DBTrace(String name, CompilerSpec baseCompilerSpec, Object consumer)
throws IOException, LanguageNotFoundException { throws IOException, LanguageNotFoundException {
super(new DBHandle(), DBOpenMode.CREATE, TaskMonitor.DUMMY, name, DB_TIME_INTERVAL, super(new DBHandle(), OpenMode.CREATE, TaskMonitor.DUMMY, name, DB_TIME_INTERVAL,
DB_BUFFER_SIZE, consumer); DB_BUFFER_SIZE, consumer);
this.storeFactory = new DBCachedObjectStoreFactory(this); this.storeFactory = new DBCachedObjectStoreFactory(this);
@@ -167,7 +169,7 @@ public class DBTrace extends DBCachedDomainObjectAdapter implements Trace, Trace
space -> getAddressSet(space)); space -> getAddressSet(space));
try (Transaction tx = this.openTransaction("Create")) { try (Transaction tx = this.openTransaction("Create")) {
initOptions(DBOpenMode.CREATE); initOptions(OpenMode.CREATE);
init(); init();
} }
catch (VersionException | CancelledException e) { catch (VersionException | CancelledException e) {
@@ -189,7 +191,7 @@ public class DBTrace extends DBCachedDomainObjectAdapter implements Trace, Trace
return new AddressSet(space.getMinAddress(), space.getMaxAddress()); return new AddressSet(space.getMinAddress(), space.getMaxAddress());
} }
public DBTrace(DBHandle dbh, DBOpenMode openMode, TaskMonitor monitor, Object consumer) public DBTrace(DBHandle dbh, OpenMode openMode, TaskMonitor monitor, Object consumer)
throws CancelledException, VersionException, IOException, LanguageNotFoundException { throws CancelledException, VersionException, IOException, LanguageNotFoundException {
super(dbh, openMode, monitor, "Untitled", DB_TIME_INTERVAL, DB_BUFFER_SIZE, consumer); super(dbh, openMode, monitor, "Untitled", DB_TIME_INTERVAL, DB_BUFFER_SIZE, consumer);
this.storeFactory = new DBCachedObjectStoreFactory(this); this.storeFactory = new DBCachedObjectStoreFactory(this);
@@ -209,9 +211,9 @@ public class DBTrace extends DBCachedDomainObjectAdapter implements Trace, Trace
programView = createProgramView(0); programView = createProgramView(0);
} }
protected void initOptions(DBOpenMode openMode) throws IOException, CancelledException { protected void initOptions(OpenMode openMode) throws IOException, CancelledException {
Options traceInfo = getOptions(TRACE_INFO); Options traceInfo = getOptions(TRACE_INFO);
if (openMode == DBOpenMode.CREATE) { if (openMode == OpenMode.CREATE) {
traceInfo.setString(NAME, name); traceInfo.setString(NAME, name);
traceInfo.setDate(DATE_CREATED, new Date()); traceInfo.setDate(DATE_CREATED, new Date());
traceInfo.setString(BASE_LANGUAGE, baseLanguage.getLanguageID().getIdAsString()); traceInfo.setString(BASE_LANGUAGE, baseLanguage.getLanguageID().getIdAsString());
@@ -659,9 +661,8 @@ public class DBTrace extends DBCachedDomainObjectAdapter implements Trace, Trace
if (recordChanges) { if (recordChanges) {
traceChangeSet.sourceArchiveChanged(sourceArchiveID.getValue()); traceChangeSet.sourceArchiveChanged(sourceArchiveID.getValue());
} }
setChanged( setChanged(new TraceChangeRecord<>(TraceEvents.SOURCE_TYPE_ARCHIVE_CHANGED, null,
new TraceChangeRecord<>(TraceEvents.SOURCE_TYPE_ARCHIVE_CHANGED, null, sourceArchiveID));
sourceArchiveID));
} }
public void sourceArchiveAdded(UniversalID sourceArchiveID) { public void sourceArchiveAdded(UniversalID sourceArchiveID) {
@@ -684,8 +685,7 @@ public class DBTrace extends DBCachedDomainObjectAdapter implements Trace, Trace
if (recordChanges) { if (recordChanges) {
traceChangeSet.dataTypeAdded(addedID); traceChangeSet.dataTypeAdded(addedID);
} }
setChanged( setChanged(new TraceChangeRecord<>(TraceEvents.DATA_TYPE_ADDED, null, addedID, addedType));
new TraceChangeRecord<>(TraceEvents.DATA_TYPE_ADDED, null, addedID, addedType));
} }
public void dataTypeReplaced(long replacedID, DataTypePath replacedPath, DataTypePath newPath) { public void dataTypeReplaced(long replacedID, DataTypePath replacedPath, DataTypePath newPath) {
@@ -700,16 +700,16 @@ public class DBTrace extends DBCachedDomainObjectAdapter implements Trace, Trace
if (recordChanges) { if (recordChanges) {
traceChangeSet.dataTypeChanged(movedID); traceChangeSet.dataTypeChanged(movedID);
} }
setChanged(new TraceChangeRecord<>(TraceEvents.DATA_TYPE_MOVED, null, movedID, oldPath, setChanged(
newPath)); new TraceChangeRecord<>(TraceEvents.DATA_TYPE_MOVED, null, movedID, oldPath, newPath));
} }
public void dataTypeNameChanged(long renamedID, String oldName, String newName) { public void dataTypeNameChanged(long renamedID, String oldName, String newName) {
if (recordChanges) { if (recordChanges) {
traceChangeSet.dataTypeChanged(renamedID); traceChangeSet.dataTypeChanged(renamedID);
} }
setChanged(new TraceChangeRecord<>(TraceEvents.DATA_TYPE_RENAMED, null, renamedID, setChanged(new TraceChangeRecord<>(TraceEvents.DATA_TYPE_RENAMED, null, renamedID, oldName,
oldName, newName)); newName));
} }
public void dataTypeDeleted(long deletedID, DataTypePath deletedPath) { public void dataTypeDeleted(long deletedID, DataTypePath deletedPath) {
@@ -22,15 +22,13 @@ import javax.swing.Icon;
import db.DBHandle; import db.DBHandle;
import db.buffers.BufferFile; import db.buffers.BufferFile;
import db.buffers.ManagedBufferFile; import db.buffers.ManagedBufferFile;
import ghidra.framework.data.DBWithUserDataContentHandler; import ghidra.framework.data.*;
import ghidra.framework.data.DomainObjectMergeManager;
import ghidra.framework.model.ChangeSet; import ghidra.framework.model.ChangeSet;
import ghidra.framework.model.DomainObject; import ghidra.framework.model.DomainObject;
import ghidra.framework.store.*; import ghidra.framework.store.*;
import ghidra.trace.model.Trace; import ghidra.trace.model.Trace;
import ghidra.util.InvalidNameException; import ghidra.util.InvalidNameException;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.database.DBOpenMode;
import ghidra.util.exception.CancelledException; import ghidra.util.exception.CancelledException;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -71,7 +69,7 @@ public class DBTraceContentHandler extends DBWithUserDataContentHandler<DBTrace>
try { try {
bf = dbItem.open(version, minChangeVersion); bf = dbItem.open(version, minChangeVersion);
dbh = new DBHandle(bf); dbh = new DBHandle(bf);
DBOpenMode openMode = DBOpenMode.READ_ONLY; OpenMode openMode = OpenMode.IMMUTABLE;
trace = new DBTrace(dbh, openMode, monitor, consumer); trace = new DBTrace(dbh, openMode, monitor, consumer);
getTraceChangeSet(trace, bf); getTraceChangeSet(trace, bf);
success = true; success = true;
@@ -119,7 +117,7 @@ public class DBTraceContentHandler extends DBWithUserDataContentHandler<DBTrace>
try { try {
bf = dbItem.open(version); bf = dbItem.open(version);
dbh = new DBHandle(bf); dbh = new DBHandle(bf);
DBOpenMode openMode = okToUpgrade ? DBOpenMode.UPGRADE : DBOpenMode.UPDATE; OpenMode openMode = okToUpgrade ? OpenMode.UPGRADE : OpenMode.UPDATE;
trace = new DBTrace(dbh, openMode, monitor, consumer); trace = new DBTrace(dbh, openMode, monitor, consumer);
getTraceChangeSet(trace, bf); getTraceChangeSet(trace, bf);
trace.setTraceUserData(new DBTraceUserData(trace)); trace.setTraceUserData(new DBTraceUserData(trace));
@@ -169,7 +167,7 @@ public class DBTraceContentHandler extends DBWithUserDataContentHandler<DBTrace>
try { try {
bf = dbItem.openForUpdate(checkoutId); bf = dbItem.openForUpdate(checkoutId);
dbh = new DBHandle(bf, recover, monitor); dbh = new DBHandle(bf, recover, monitor);
DBOpenMode openMode = okToUpgrade ? DBOpenMode.UPGRADE : DBOpenMode.UPDATE; OpenMode openMode = okToUpgrade ? OpenMode.UPGRADE : OpenMode.UPDATE;
trace = new DBTrace(dbh, openMode, monitor, consumer); trace = new DBTrace(dbh, openMode, monitor, consumer);
if (checkoutId == FolderItem.DEFAULT_CHECKOUT_ID) { if (checkoutId == FolderItem.DEFAULT_CHECKOUT_ID) {
getTraceChangeSet(trace, bf); getTraceChangeSet(trace, bf);
@@ -275,7 +273,7 @@ public class DBTraceContentHandler extends DBWithUserDataContentHandler<DBTrace>
try { try {
bf = dbItem.open(toVer, fromVer); bf = dbItem.open(toVer, fromVer);
dbh = new DBHandle(bf); dbh = new DBHandle(bf);
DBOpenMode openMode = DBOpenMode.READ_ONLY; OpenMode openMode = OpenMode.IMMUTABLE;
trace = new DBTrace(dbh, openMode, null, this); trace = new DBTrace(dbh, openMode, null, this);
return getTraceChangeSet(trace, bf); return getTraceChangeSet(trace, bf);
} }
@@ -23,6 +23,7 @@ import java.util.*;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import db.*; import db.*;
import ghidra.framework.data.OpenMode;
import ghidra.program.database.ProgramAddressFactory; import ghidra.program.database.ProgramAddressFactory;
import ghidra.program.database.ProgramOverlayAddressSpace; import ghidra.program.database.ProgramOverlayAddressSpace;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
@@ -149,7 +150,7 @@ public class DBTraceOverlaySpaceAdapter implements DBTraceManager {
protected final DBCachedObjectStore<DBTraceOverlaySpaceEntry> overlayStore; protected final DBCachedObjectStore<DBTraceOverlaySpaceEntry> overlayStore;
protected final DBCachedObjectIndex<String, DBTraceOverlaySpaceEntry> overlaysByName; protected final DBCachedObjectIndex<String, DBTraceOverlaySpaceEntry> overlaysByName;
public DBTraceOverlaySpaceAdapter(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceOverlaySpaceAdapter(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, DBTrace trace) throws VersionException, IOException { TaskMonitor monitor, DBTrace trace) throws VersionException, IOException {
this.dbh = dbh; this.dbh = dbh;
this.lock = lock; this.lock = lock;
@@ -24,6 +24,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import javax.swing.Icon; import javax.swing.Icon;
import db.DBHandle; import db.DBHandle;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
@@ -39,7 +40,6 @@ import ghidra.trace.util.TraceChangeRecord;
import ghidra.trace.util.TraceEvents; import ghidra.trace.util.TraceEvents;
import ghidra.util.LockHold; import ghidra.util.LockHold;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.database.DBOpenMode;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -167,7 +167,7 @@ public class DBTraceBookmarkManager extends AbstractDBTraceSpaceBasedManager<DBT
protected final Collection<DBTraceBookmarkType> typesView = protected final Collection<DBTraceBookmarkType> typesView =
Collections.unmodifiableCollection(typesByName.values()); Collections.unmodifiableCollection(typesByName.values());
public DBTraceBookmarkManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceBookmarkManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager) throws VersionException, IOException { DBTraceThreadManager threadManager) throws VersionException, IOException {
super(NAME, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager); super(NAME, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager);
@@ -182,8 +182,8 @@ public class DBTraceBookmarkManager extends AbstractDBTraceSpaceBasedManager<DBT
} }
@Override @Override
protected DBTraceBookmarkSpace createRegisterSpace(AddressSpace space, protected DBTraceBookmarkSpace createRegisterSpace(AddressSpace space, TraceThread thread,
TraceThread thread, DBTraceSpaceEntry ent) throws VersionException, IOException { DBTraceSpaceEntry ent) throws VersionException, IOException {
return new DBTraceBookmarkSpace(this, space, thread, ent.getFrameLevel()); return new DBTraceBookmarkSpace(this, space, thread, ent.getFrameLevel());
} }
@@ -292,8 +292,8 @@ public class DBTraceBookmarkManager extends AbstractDBTraceSpaceBasedManager<DBT
} }
@Override @Override
public DBTraceBookmark addBookmark(Lifespan lifespan, Address address, public DBTraceBookmark addBookmark(Lifespan lifespan, Address address, TraceBookmarkType type,
TraceBookmarkType type, String category, String comment) { String category, String comment) {
return delegateWrite(address.getAddressSpace(), return delegateWrite(address.getAddressSpace(),
m -> m.addBookmark(lifespan, address, type, category, comment)); m -> m.addBookmark(lifespan, address, type, category, comment));
} }
@@ -23,6 +23,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import ghidra.dbg.target.TargetBreakpointLocation; import ghidra.dbg.target.TargetBreakpointLocation;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
@@ -33,7 +34,6 @@ import ghidra.trace.model.Lifespan;
import ghidra.trace.model.breakpoint.*; import ghidra.trace.model.breakpoint.*;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.util.LockHold; import ghidra.util.LockHold;
import ghidra.util.database.DBOpenMode;
import ghidra.util.exception.DuplicateNameException; import ghidra.util.exception.DuplicateNameException;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -43,7 +43,7 @@ public class DBTraceBreakpointManager
implements TraceBreakpointManager, DBTraceDelegatingManager<DBTraceBreakpointSpace> { implements TraceBreakpointManager, DBTraceDelegatingManager<DBTraceBreakpointSpace> {
protected static final String NAME = "Breakpoint"; protected static final String NAME = "Breakpoint";
public DBTraceBreakpointManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceBreakpointManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager) throws VersionException, IOException { DBTraceThreadManager threadManager) throws VersionException, IOException {
super(NAME, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager); super(NAME, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager);
@@ -129,8 +129,7 @@ public class DBTraceBreakpointManager
.getObjectByPath(snap, path, TraceObjectBreakpointLocation.class); .getObjectByPath(snap, path, TraceObjectBreakpointLocation.class);
} }
try (LockHold hold = LockHold.lock(lock.readLock())) { try (LockHold hold = LockHold.lock(lock.readLock())) {
return getBreakpointsByPath(path) return getBreakpointsByPath(path).stream()
.stream()
.filter(b -> b.getLifespan().contains(snap)) .filter(b -> b.getLifespan().contains(snap))
.findAny() .findAny()
.orElse(null); .orElse(null);
@@ -24,6 +24,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import db.DBRecord; import db.DBRecord;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.*; import ghidra.program.model.lang.*;
import ghidra.program.model.listing.ProgramContext; import ghidra.program.model.listing.ProgramContext;
@@ -40,15 +41,15 @@ import ghidra.trace.model.TraceAddressSnapRange;
import ghidra.trace.model.context.TraceRegisterContextManager; import ghidra.trace.model.context.TraceRegisterContextManager;
import ghidra.trace.model.guest.TracePlatform; import ghidra.trace.model.guest.TracePlatform;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.util.database.*; import ghidra.util.database.DBCachedObjectStore;
import ghidra.util.database.DBObjectColumn;
import ghidra.util.database.annot.*; import ghidra.util.database.annot.*;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
public class DBTraceRegisterContextManager public class DBTraceRegisterContextManager
extends AbstractDBTraceSpaceBasedManager<DBTraceRegisterContextSpace> extends AbstractDBTraceSpaceBasedManager<DBTraceRegisterContextSpace> implements
implements TraceRegisterContextManager, TraceRegisterContextManager, DBTraceDelegatingManager<DBTraceRegisterContextSpace> {
DBTraceDelegatingManager<DBTraceRegisterContextSpace> {
public static final String NAME = "RegisterContext"; public static final String NAME = "RegisterContext";
@DBAnnotatedObjectInfo(version = 0) @DBAnnotatedObjectInfo(version = 0)
@@ -87,7 +88,7 @@ public class DBTraceRegisterContextManager
protected final Map<Language, ProgramContext> defaultContexts = new HashMap<>(); protected final Map<Language, ProgramContext> defaultContexts = new HashMap<>();
public DBTraceRegisterContextManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceRegisterContextManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager, DBTracePlatformManager languageManager) DBTraceThreadManager threadManager, DBTracePlatformManager languageManager)
throws VersionException, IOException { throws VersionException, IOException {
@@ -20,6 +20,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import db.DBRecord; import db.DBRecord;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.AddressSpace; import ghidra.program.model.address.AddressSpace;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
@@ -176,7 +177,7 @@ public class DBTraceDataSettingsAdapter
} }
} }
public DBTraceDataSettingsAdapter(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceDataSettingsAdapter(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager) throws IOException, VersionException { DBTraceThreadManager threadManager) throws IOException, VersionException {
super(NAME, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager, super(NAME, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager,
@@ -184,17 +185,16 @@ public class DBTraceDataSettingsAdapter
} }
@Override @Override
protected DBTraceDataSettingsSpace createSpace( protected DBTraceDataSettingsSpace createSpace(AddressSpace space, DBTraceSpaceEntry ent)
AddressSpace space, DBTraceSpaceEntry ent) throws VersionException, IOException { throws VersionException, IOException {
return new DBTraceDataSettingsSpace( return new DBTraceDataSettingsSpace(
tableName(space, ent.getThreadKey(), ent.getFrameLevel()), trace.getStoreFactory(), tableName(space, ent.getThreadKey(), ent.getFrameLevel()), trace.getStoreFactory(),
lock, space, null, 0, dataType, dataFactory); lock, space, null, 0, dataType, dataFactory);
} }
@Override @Override
protected DBTraceDataSettingsSpace createRegisterSpace( protected DBTraceDataSettingsSpace createRegisterSpace(AddressSpace space, TraceThread thread,
AddressSpace space, TraceThread thread, DBTraceSpaceEntry ent) DBTraceSpaceEntry ent) throws VersionException, IOException {
throws VersionException, IOException {
return new DBTraceDataSettingsSpace( return new DBTraceDataSettingsSpace(
tableName(space, ent.getThreadKey(), ent.getFrameLevel()), trace.getStoreFactory(), tableName(space, ent.getThreadKey(), ent.getFrameLevel()), trace.getStoreFactory(),
lock, space, thread, ent.getFrameLevel(), dataType, dataFactory); lock, space, thread, ent.getFrameLevel(), dataType, dataFactory);
@@ -206,8 +206,7 @@ public class DBTraceDataSettingsAdapter
} }
@Override @Override
public DBTraceDataSettingsSpace getRegisterSpace(TraceThread thread, public DBTraceDataSettingsSpace getRegisterSpace(TraceThread thread, boolean createIfAbsent) {
boolean createIfAbsent) {
return (DBTraceDataSettingsSpace) super.getRegisterSpace(thread, createIfAbsent); return (DBTraceDataSettingsSpace) super.getRegisterSpace(thread, createIfAbsent);
} }
@@ -22,6 +22,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import db.Transaction; import db.Transaction;
import ghidra.framework.data.OpenMode;
import ghidra.framework.model.DomainFile; import ghidra.framework.model.DomainFile;
import ghidra.program.database.data.ProgramBasedDataTypeManagerDB; import ghidra.program.database.data.ProgramBasedDataTypeManagerDB;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
@@ -33,7 +34,6 @@ import ghidra.trace.database.DBTraceManager;
import ghidra.trace.model.data.TraceBasedDataTypeManager; import ghidra.trace.model.data.TraceBasedDataTypeManager;
import ghidra.util.InvalidNameException; import ghidra.util.InvalidNameException;
import ghidra.util.UniversalID; import ghidra.util.UniversalID;
import ghidra.util.database.DBOpenMode;
import ghidra.util.exception.CancelledException; import ghidra.util.exception.CancelledException;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -46,11 +46,10 @@ public class DBTraceDataTypeManager extends ProgramBasedDataTypeManagerDB
private static final String INSTANCE_TABLE_PREFIX = null; // placeholder only private static final String INSTANCE_TABLE_PREFIX = null; // placeholder only
public DBTraceDataTypeManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceDataTypeManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, DBTrace trace) TaskMonitor monitor, DBTrace trace)
throws CancelledException, VersionException, IOException { throws CancelledException, VersionException, IOException {
super(dbh, null, openMode.toInteger(), INSTANCE_TABLE_PREFIX, trace, trace.getLock(), super(dbh, null, openMode, INSTANCE_TABLE_PREFIX, trace, trace.getLock(), monitor);
monitor);
this.lock = lock; // TODO: nothing uses this local lock - not sure what its purpose is this.lock = lock; // TODO: nothing uses this local lock - not sure what its purpose is
this.trace = trace; this.trace = trace;
@@ -72,7 +71,7 @@ public class DBTraceDataTypeManager extends ProgramBasedDataTypeManagerDB
} }
}, null, false, monitor); }, null, false, monitor);
if (openMode == DBOpenMode.CREATE) { if (openMode == OpenMode.CREATE) {
saveDataOrganization(); saveDataOrganization();
} }
} }
@@ -20,6 +20,7 @@ import java.util.*;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import ghidra.framework.data.OpenMode;
import ghidra.lifecycle.Internal; import ghidra.lifecycle.Internal;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.*; import ghidra.program.model.lang.*;
@@ -32,7 +33,8 @@ import ghidra.trace.model.guest.*;
import ghidra.trace.util.TraceChangeRecord; import ghidra.trace.util.TraceChangeRecord;
import ghidra.trace.util.TraceEvents; import ghidra.trace.util.TraceEvents;
import ghidra.util.LockHold; import ghidra.util.LockHold;
import ghidra.util.database.*; import ghidra.util.database.DBCachedObjectStore;
import ghidra.util.database.DBCachedObjectStoreFactory;
import ghidra.util.exception.CancelledException; import ghidra.util.exception.CancelledException;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -141,7 +143,7 @@ public class DBTracePlatformManager implements DBTraceManager, TracePlatformMana
} }
}; };
public DBTracePlatformManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTracePlatformManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, CompilerSpec baseCompilerSpec, DBTrace trace) TaskMonitor monitor, CompilerSpec baseCompilerSpec, DBTrace trace)
throws VersionException, IOException { throws VersionException, IOException {
this.dbh = dbh; this.dbh = dbh;
@@ -15,7 +15,7 @@
*/ */
package ghidra.trace.database.listing; package ghidra.trace.database.listing;
import static ghidra.lifecycle.Unfinished.TODO; import static ghidra.lifecycle.Unfinished.*;
import java.io.IOException; import java.io.IOException;
import java.math.BigInteger; import java.math.BigInteger;
@@ -25,6 +25,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import db.DBRecord; import db.DBRecord;
import ghidra.framework.data.OpenMode;
import ghidra.lifecycle.Internal; import ghidra.lifecycle.Internal;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.*; import ghidra.program.model.lang.*;
@@ -323,7 +324,7 @@ public class DBTraceCodeManager extends AbstractDBTraceSpaceBasedManager<DBTrace
protected final Map<AddressSnap, UndefinedDBTraceData> undefinedCache = protected final Map<AddressSnap, UndefinedDBTraceData> undefinedCache =
new WeakValueHashMap<>(); new WeakValueHashMap<>();
public DBTraceCodeManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceCodeManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager, DBTracePlatformManager platformManager, DBTraceThreadManager threadManager, DBTracePlatformManager platformManager,
DBTraceDataTypeManager dataTypeManager, DBTraceOverlaySpaceAdapter overlayAdapter, DBTraceDataTypeManager dataTypeManager, DBTraceOverlaySpaceAdapter overlayAdapter,
@@ -22,6 +22,7 @@ import org.apache.commons.lang3.StringUtils;
import db.DBHandle; import db.DBHandle;
import db.DBRecord; import db.DBRecord;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.program.model.listing.CodeUnit; import ghidra.program.model.listing.CodeUnit;
@@ -39,7 +40,8 @@ import ghidra.trace.model.*;
import ghidra.trace.util.TraceChangeRecord; import ghidra.trace.util.TraceChangeRecord;
import ghidra.trace.util.TraceEvents; import ghidra.trace.util.TraceEvents;
import ghidra.util.LockHold; import ghidra.util.LockHold;
import ghidra.util.database.*; import ghidra.util.database.DBCachedObjectStore;
import ghidra.util.database.DBObjectColumn;
import ghidra.util.database.annot.*; import ghidra.util.database.annot.*;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -106,7 +108,7 @@ public class DBTraceCommentAdapter
/** /**
* Construct the adapter * Construct the adapter
*/ */
public DBTraceCommentAdapter(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceCommentAdapter(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager) throws IOException, VersionException { DBTraceThreadManager threadManager) throws IOException, VersionException {
super("Comments", dbh, openMode, lock, monitor, baseLanguage, trace, threadManager, super("Comments", dbh, openMode, lock, monitor, baseLanguage, trace, threadManager,
@@ -140,8 +142,8 @@ public class DBTraceCommentAdapter
} }
String oldValue = null; String oldValue = null;
try (LockHold hold = LockHold.lock(lock.writeLock())) { try (LockHold hold = LockHold.lock(lock.writeLock())) {
for (DBTraceCommentEntry entry : reduce(TraceAddressSnapRangeQuery.intersecting( for (DBTraceCommentEntry entry : reduce(TraceAddressSnapRangeQuery
new AddressRangeImpl(address, address), lifespan)).values()) { .intersecting(new AddressRangeImpl(address, address), lifespan)).values()) {
if (entry.type == commentType) { if (entry.type == commentType) {
if (entry.getLifespan().contains(lifespan.lmin())) { if (entry.getLifespan().contains(lifespan.lmin())) {
oldValue = entry.comment; oldValue = entry.comment;
@@ -157,8 +159,7 @@ public class DBTraceCommentAdapter
trace.setChanged(new TraceChangeRecord<TraceAddressSnapRange, String>( trace.setChanged(new TraceChangeRecord<TraceAddressSnapRange, String>(
TraceEvents.byCommentType(commentType), TraceEvents.byCommentType(commentType),
DBTraceSpaceKey.create(address.getAddressSpace(), null, 0), DBTraceSpaceKey.create(address.getAddressSpace(), null, 0),
new ImmutableTraceAddressSnapRange(address, lifespan), new ImmutableTraceAddressSnapRange(address, lifespan), oldValue, comment));
oldValue, comment));
} }
/** /**
@@ -191,8 +192,8 @@ public class DBTraceCommentAdapter
*/ */
public String getComment(long snap, Address address, int commentType) { public String getComment(long snap, Address address, int commentType) {
try (LockHold hold = LockHold.lock(lock.readLock())) { try (LockHold hold = LockHold.lock(lock.readLock())) {
for (DBTraceCommentEntry entry : reduce( for (DBTraceCommentEntry entry : reduce(TraceAddressSnapRangeQuery.at(address, snap))
TraceAddressSnapRangeQuery.at(address, snap)).values()) { .values()) {
if (entry.type != commentType) { if (entry.type != commentType) {
continue; continue;
} }
@@ -23,10 +23,12 @@ import java.util.Map.Entry;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import db.*; import db.*;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
import ghidra.trace.database.DBTraceUtils; import ghidra.trace.database.DBTraceUtils;
import ghidra.trace.database.map.AbstractDBTracePropertyMap.DBTraceSaveablePropertyMapEntry;
import ghidra.trace.database.map.DBTraceAddressSnapRangePropertyMapTree.AbstractDBTraceAddressSnapRangePropertyMapData; import ghidra.trace.database.map.DBTraceAddressSnapRangePropertyMapTree.AbstractDBTraceAddressSnapRangePropertyMapData;
import ghidra.trace.database.map.DBTraceAddressSnapRangePropertyMapTree.TraceAddressSnapRangeQuery; import ghidra.trace.database.map.DBTraceAddressSnapRangePropertyMapTree.TraceAddressSnapRangeQuery;
import ghidra.trace.database.thread.DBTraceThreadManager; import ghidra.trace.database.thread.DBTraceThreadManager;
@@ -45,7 +47,7 @@ import ghidra.util.task.TaskMonitor;
public abstract class AbstractDBTracePropertyMap<T, DR extends AbstractDBTraceAddressSnapRangePropertyMapData<T>> public abstract class AbstractDBTracePropertyMap<T, DR extends AbstractDBTraceAddressSnapRangePropertyMapData<T>>
extends DBTraceAddressSnapRangePropertyMap<T, DR> implements TracePropertyMap<T> { extends DBTraceAddressSnapRangePropertyMap<T, DR> implements TracePropertyMap<T> {
public AbstractDBTracePropertyMap(String name, DBHandle dbh, DBOpenMode openMode, public AbstractDBTracePropertyMap(String name, DBHandle dbh, OpenMode openMode,
ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace, ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager, Class<DR> dataType, DBTraceThreadManager threadManager, Class<DR> dataType,
DBTraceAddressSnapRangePropertyMapDataFactory<T, DR> dataFactory) DBTraceAddressSnapRangePropertyMapDataFactory<T, DR> dataFactory)
@@ -120,17 +122,16 @@ public abstract class AbstractDBTracePropertyMap<T, DR extends AbstractDBTraceAd
} }
@Override @Override
protected DBTracePropertyMapSpace createSpace(AddressSpace space, protected DBTracePropertyMapSpace createSpace(AddressSpace space, DBTraceSpaceEntry ent)
DBTraceSpaceEntry ent) throws VersionException, IOException { throws VersionException, IOException {
return new DBTracePropertyMapSpace( return new DBTracePropertyMapSpace(
tableName(space, ent.getThreadKey(), ent.getFrameLevel()), trace.getStoreFactory(), tableName(space, ent.getThreadKey(), ent.getFrameLevel()), trace.getStoreFactory(),
lock, space, null, 0, dataType, dataFactory); lock, space, null, 0, dataType, dataFactory);
} }
@Override @Override
protected DBTracePropertyMapSpace createRegisterSpace( protected DBTracePropertyMapSpace createRegisterSpace(AddressSpace space, TraceThread thread,
AddressSpace space, TraceThread thread, DBTraceSpaceEntry ent) DBTraceSpaceEntry ent) throws VersionException, IOException {
throws VersionException, IOException {
return new DBTracePropertyMapSpace( return new DBTracePropertyMapSpace(
tableName(space, ent.getThreadKey(), ent.getFrameLevel()), trace.getStoreFactory(), tableName(space, ent.getThreadKey(), ent.getFrameLevel()), trace.getStoreFactory(),
lock, space, thread, ent.getFrameLevel(), dataType, dataFactory); lock, space, thread, ent.getFrameLevel(), dataType, dataFactory);
@@ -143,10 +144,9 @@ public abstract class AbstractDBTracePropertyMap<T, DR extends AbstractDBTraceAd
} }
@Override @Override
public TracePropertyMapSpace<T> getPropertyMapRegisterSpace(TraceThread thread, public TracePropertyMapSpace<T> getPropertyMapRegisterSpace(TraceThread thread, int frameLevel,
int frameLevel, boolean createIfAbsent) { boolean createIfAbsent) {
return (DBTracePropertyMapSpace) getForRegisterSpace(thread, frameLevel, return (DBTracePropertyMapSpace) getForRegisterSpace(thread, frameLevel, createIfAbsent);
createIfAbsent);
} }
@Override @Override
@@ -154,8 +154,7 @@ public abstract class AbstractDBTracePropertyMap<T, DR extends AbstractDBTraceAd
throw new NotYetImplementedException(); throw new NotYetImplementedException();
} }
public class DBTracePropertyMapSpace public class DBTracePropertyMapSpace extends DBTraceAddressSnapRangePropertyMapSpace<T, DR>
extends DBTraceAddressSnapRangePropertyMapSpace<T, DR>
implements TracePropertyMapSpace<T> { implements TracePropertyMapSpace<T> {
public DBTracePropertyMapSpace(String tableName, DBCachedObjectStoreFactory storeFactory, public DBTracePropertyMapSpace(String tableName, DBCachedObjectStoreFactory storeFactory,
@@ -242,7 +241,7 @@ public abstract class AbstractDBTracePropertyMap<T, DR extends AbstractDBTraceAd
public static class DBTraceIntPropertyMap public static class DBTraceIntPropertyMap
extends AbstractDBTracePropertyMap<Integer, DBTraceIntPropertyMapEntry> { extends AbstractDBTracePropertyMap<Integer, DBTraceIntPropertyMapEntry> {
public DBTraceIntPropertyMap(String name, DBHandle dbh, DBOpenMode openMode, public DBTraceIntPropertyMap(String name, DBHandle dbh, OpenMode openMode,
ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace, ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager) throws IOException, VersionException { DBTraceThreadManager threadManager) throws IOException, VersionException {
super(name, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager, super(name, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager,
@@ -287,7 +286,7 @@ public abstract class AbstractDBTracePropertyMap<T, DR extends AbstractDBTraceAd
public static class DBTraceLongPropertyMap public static class DBTraceLongPropertyMap
extends AbstractDBTracePropertyMap<Long, DBTraceLongPropertyMapEntry> { extends AbstractDBTracePropertyMap<Long, DBTraceLongPropertyMapEntry> {
public DBTraceLongPropertyMap(String name, DBHandle dbh, DBOpenMode openMode, public DBTraceLongPropertyMap(String name, DBHandle dbh, OpenMode openMode,
ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace, ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager) throws IOException, VersionException { DBTraceThreadManager threadManager) throws IOException, VersionException {
super(name, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager, super(name, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager,
@@ -340,7 +339,7 @@ public abstract class AbstractDBTracePropertyMap<T, DR extends AbstractDBTraceAd
return (Class) DBTraceSaveablePropertyMapEntry.class; return (Class) DBTraceSaveablePropertyMapEntry.class;
} }
public DBTraceSaveablePropertyMap(String name, DBHandle dbh, DBOpenMode openMode, public DBTraceSaveablePropertyMap(String name, DBHandle dbh, OpenMode openMode,
ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace, ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager, Class<T> valueClass) DBTraceThreadManager threadManager, Class<T> valueClass)
throws IOException, VersionException { throws IOException, VersionException {
@@ -456,7 +455,7 @@ public abstract class AbstractDBTracePropertyMap<T, DR extends AbstractDBTraceAd
public static class DBTraceStringPropertyMap public static class DBTraceStringPropertyMap
extends AbstractDBTracePropertyMap<String, DBTraceStringPropertyMapEntry> { extends AbstractDBTracePropertyMap<String, DBTraceStringPropertyMapEntry> {
public DBTraceStringPropertyMap(String name, DBHandle dbh, DBOpenMode openMode, public DBTraceStringPropertyMap(String name, DBHandle dbh, OpenMode openMode,
ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace, ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager) throws IOException, VersionException { DBTraceThreadManager threadManager) throws IOException, VersionException {
super(name, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager, super(name, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager,
@@ -501,7 +500,7 @@ public abstract class AbstractDBTracePropertyMap<T, DR extends AbstractDBTraceAd
public static class DBTraceVoidPropertyMap public static class DBTraceVoidPropertyMap
extends AbstractDBTracePropertyMap<Void, DBTraceVoidPropertyMapEntry> { extends AbstractDBTracePropertyMap<Void, DBTraceVoidPropertyMapEntry> {
public DBTraceVoidPropertyMap(String name, DBHandle dbh, DBOpenMode openMode, public DBTraceVoidPropertyMap(String name, DBHandle dbh, OpenMode openMode,
ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace, ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager) throws IOException, VersionException { DBTraceThreadManager threadManager) throws IOException, VersionException {
super(name, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager, super(name, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager,
@@ -24,6 +24,7 @@ import java.util.function.Predicate;
import db.DBHandle; import db.DBHandle;
import db.DBRecord; import db.DBRecord;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.AddressSetView; import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.address.AddressSpace; import ghidra.program.model.address.AddressSpace;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
@@ -40,7 +41,6 @@ import ghidra.trace.model.stack.TraceStackFrame;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.util.UnionAddressSetView; import ghidra.util.UnionAddressSetView;
import ghidra.util.database.DBCachedObjectStore; import ghidra.util.database.DBCachedObjectStore;
import ghidra.util.database.DBOpenMode;
import ghidra.util.database.spatial.SpatialMap; import ghidra.util.database.spatial.SpatialMap;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -58,7 +58,7 @@ public class DBTraceAddressSnapRangePropertyMap<T, DR extends AbstractDBTraceAdd
protected final Class<DR> dataType; protected final Class<DR> dataType;
protected final DBTraceAddressSnapRangePropertyMapDataFactory<T, DR> dataFactory; protected final DBTraceAddressSnapRangePropertyMapDataFactory<T, DR> dataFactory;
public DBTraceAddressSnapRangePropertyMap(String name, DBHandle dbh, DBOpenMode openMode, public DBTraceAddressSnapRangePropertyMap(String name, DBHandle dbh, OpenMode openMode,
ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace, ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager, Class<DR> dataType, DBTraceThreadManager threadManager, Class<DR> dataType,
DBTraceAddressSnapRangePropertyMapDataFactory<T, DR> dataFactory) DBTraceAddressSnapRangePropertyMapDataFactory<T, DR> dataFactory)
@@ -84,23 +84,22 @@ public class DBTraceAddressSnapRangePropertyMap<T, DR extends AbstractDBTraceAdd
} }
@Override @Override
protected DBTraceAddressSnapRangePropertyMapSpace<T, DR> createRegisterSpace( protected DBTraceAddressSnapRangePropertyMapSpace<T, DR> createRegisterSpace(AddressSpace space,
AddressSpace space, TraceThread thread, DBTraceSpaceEntry ent) TraceThread thread, DBTraceSpaceEntry ent) throws VersionException, IOException {
throws VersionException, IOException {
return new DBTraceAddressSnapRangePropertyMapSpace<>( return new DBTraceAddressSnapRangePropertyMapSpace<>(
tableName(space, ent.getThreadKey(), ent.getFrameLevel()), trace.getStoreFactory(), tableName(space, ent.getThreadKey(), ent.getFrameLevel()), trace.getStoreFactory(),
lock, space, thread, ent.getFrameLevel(), dataType, dataFactory); lock, space, thread, ent.getFrameLevel(), dataType, dataFactory);
} }
@Override @Override
public DBTraceAddressSnapRangePropertyMapSpace<T, DR> getRegisterSpace( public DBTraceAddressSnapRangePropertyMapSpace<T, DR> getRegisterSpace(TraceThread thread,
TraceThread thread, boolean createIfAbsent) { boolean createIfAbsent) {
return getForRegisterSpace(thread, 0, createIfAbsent); return getForRegisterSpace(thread, 0, createIfAbsent);
} }
@Override @Override
public DBTraceAddressSnapRangePropertyMapSpace<T, DR> getRegisterSpace( public DBTraceAddressSnapRangePropertyMapSpace<T, DR> getRegisterSpace(TraceStackFrame frame,
TraceStackFrame frame, boolean createIfAbsent) { boolean createIfAbsent) {
return getForRegisterSpace(frame, createIfAbsent); return getForRegisterSpace(frame, createIfAbsent);
} }
@@ -26,6 +26,7 @@ import java.util.function.Predicate;
import db.DBHandle; import db.DBHandle;
import ghidra.dbg.target.TargetMemoryRegion; import ghidra.dbg.target.TargetMemoryRegion;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.program.model.mem.MemBuffer; import ghidra.program.model.mem.MemBuffer;
@@ -41,7 +42,6 @@ import ghidra.trace.model.stack.TraceStackFrame;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.util.MathUtilities; import ghidra.util.MathUtilities;
import ghidra.util.UnionAddressSetView; import ghidra.util.UnionAddressSetView;
import ghidra.util.database.DBOpenMode;
import ghidra.util.exception.*; import ghidra.util.exception.*;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -53,7 +53,7 @@ public class DBTraceMemoryManager extends AbstractDBTraceSpaceBasedManager<DBTra
protected final DBTraceOverlaySpaceAdapter overlayAdapter; protected final DBTraceOverlaySpaceAdapter overlayAdapter;
public DBTraceMemoryManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceMemoryManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager, DBTraceOverlaySpaceAdapter overlayAdapter) DBTraceThreadManager threadManager, DBTraceOverlaySpaceAdapter overlayAdapter)
throws IOException, VersionException { throws IOException, VersionException {
@@ -91,8 +91,8 @@ public class DBTraceMemoryManager extends AbstractDBTraceSpaceBasedManager<DBTra
} }
@Override @Override
protected DBTraceMemorySpace createRegisterSpace(AddressSpace space, protected DBTraceMemorySpace createRegisterSpace(AddressSpace space, TraceThread thread,
TraceThread thread, DBTraceSpaceEntry ent) throws VersionException, IOException { DBTraceSpaceEntry ent) throws VersionException, IOException {
return new DBTraceMemorySpace(this, dbh, space, ent, thread); return new DBTraceMemorySpace(this, dbh, space, ent, thread);
} }
@@ -117,8 +117,7 @@ public class DBTraceMemoryManager extends AbstractDBTraceSpaceBasedManager<DBTra
} }
@Override @Override
public DBTraceMemorySpace getMemoryRegisterSpace(TraceThread thread, public DBTraceMemorySpace getMemoryRegisterSpace(TraceThread thread, boolean createIfAbsent) {
boolean createIfAbsent) {
return getForRegisterSpace(thread, 0, createIfAbsent); return getForRegisterSpace(thread, 0, createIfAbsent);
} }
@@ -135,8 +134,8 @@ public class DBTraceMemoryManager extends AbstractDBTraceSpaceBasedManager<DBTra
} }
@Override @Override
public TraceMemoryRegion addRegion(String path, Lifespan lifespan, public TraceMemoryRegion addRegion(String path, Lifespan lifespan, AddressRange range,
AddressRange range, Collection<TraceMemoryFlag> flags) Collection<TraceMemoryFlag> flags)
throws TraceOverlappedRegionException, DuplicateNameException { throws TraceOverlappedRegionException, DuplicateNameException {
if (trace.getObjectManager().hasSchema()) { if (trace.getObjectManager().hasSchema()) {
return trace.getObjectManager().addMemoryRegion(path, lifespan, range, flags); return trace.getObjectManager().addMemoryRegion(path, lifespan, range, flags);
@@ -223,9 +222,8 @@ public class DBTraceMemoryManager extends AbstractDBTraceSpaceBasedManager<DBTra
.getObjectsAddressSet(snap, TargetMemoryRegion.RANGE_ATTRIBUTE_NAME, .getObjectsAddressSet(snap, TargetMemoryRegion.RANGE_ATTRIBUTE_NAME,
TraceObjectMemoryRegion.class, r -> true); TraceObjectMemoryRegion.class, r -> true);
} }
return new UnionAddressSetView(getActiveMemorySpaces().stream() return new UnionAddressSetView(
.map(m -> m.getRegionsAddressSet(snap)) getActiveMemorySpaces().stream().map(m -> m.getRegionsAddressSet(snap)).toList());
.toList());
} }
@Override @Override
@@ -397,9 +395,9 @@ public class DBTraceMemoryManager extends AbstractDBTraceSpaceBasedManager<DBTra
} }
Collection<DBTraceMemoryRegion> result = new ArrayList<>(); Collection<DBTraceMemoryRegion> result = new ArrayList<>();
for (DBTraceMemorySpace space : memSpaces.values()) { for (DBTraceMemorySpace space : memSpaces.values()) {
result.addAll(space.regionMapSpace result.addAll(
.reduce(TraceAddressSnapRangeQuery.added(from, to, space.space)) space.regionMapSpace.reduce(TraceAddressSnapRangeQuery.added(from, to, space.space))
.values()); .values());
} }
return result; return result;
} }
@@ -429,9 +427,9 @@ public class DBTraceMemoryManager extends AbstractDBTraceSpaceBasedManager<DBTra
for (DBTraceMemorySpace space : memSpaces.values()) { for (DBTraceMemorySpace space : memSpaces.values()) {
AddressRange rng = AddressRange rng =
new AddressRangeImpl(space.space.getMinAddress(), space.space.getMaxAddress()); new AddressRangeImpl(space.space.getMinAddress(), space.space.getMaxAddress());
result.addAll(space.stateMapSpace result.addAll(
.reduce(TraceAddressSnapRangeQuery.enclosed(rng, between)) space.stateMapSpace.reduce(TraceAddressSnapRangeQuery.enclosed(rng, between))
.entries()); .entries());
} }
return result; return result;
} }
@@ -23,6 +23,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import ghidra.dbg.target.TargetModule; import ghidra.dbg.target.TargetModule;
import ghidra.dbg.target.TargetSection; import ghidra.dbg.target.TargetSection;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
@@ -34,7 +35,6 @@ import ghidra.trace.model.thread.TraceThread;
import ghidra.trace.util.TraceChangeRecord; import ghidra.trace.util.TraceChangeRecord;
import ghidra.trace.util.TraceEvents; import ghidra.trace.util.TraceEvents;
import ghidra.util.LockHold; import ghidra.util.LockHold;
import ghidra.util.database.DBOpenMode;
import ghidra.util.exception.DuplicateNameException; import ghidra.util.exception.DuplicateNameException;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -43,7 +43,7 @@ public class DBTraceModuleManager extends AbstractDBTraceSpaceBasedManager<DBTra
implements TraceModuleManager, DBTraceDelegatingManager<DBTraceModuleSpace> { implements TraceModuleManager, DBTraceDelegatingManager<DBTraceModuleSpace> {
public static final String NAME = "Module"; public static final String NAME = "Module";
public DBTraceModuleManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceModuleManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace) TaskMonitor monitor, Language baseLanguage, DBTrace trace)
throws VersionException, IOException { throws VersionException, IOException {
super(NAME, dbh, openMode, lock, monitor, baseLanguage, trace, null); super(NAME, dbh, openMode, lock, monitor, baseLanguage, trace, null);
@@ -70,8 +70,8 @@ public class DBTraceModuleManager extends AbstractDBTraceSpaceBasedManager<DBTra
if (!pc.getLifespan().intersects(moduleLifespan)) { if (!pc.getLifespan().intersects(moduleLifespan)) {
continue; continue;
} }
throw new DuplicateNameException("Module with path '" + throw new DuplicateNameException(
modulePath + "' already exists within an overlapping snap"); "Module with path '" + modulePath + "' already exists within an overlapping snap");
} }
} }
@@ -132,8 +132,7 @@ public class DBTraceModuleManager extends AbstractDBTraceSpaceBasedManager<DBTra
.getObjectByPath(snap, modulePath, TraceObjectModule.class); .getObjectByPath(snap, modulePath, TraceObjectModule.class);
} }
try (LockHold hold = LockHold.lock(lock.readLock())) { try (LockHold hold = LockHold.lock(lock.readLock())) {
return doGetModulesByPath(modulePath) return doGetModulesByPath(modulePath).stream()
.stream()
.filter(m -> m.getLifespan().contains(snap)) .filter(m -> m.getLifespan().contains(snap))
.findAny() .findAny()
.orElse(null); .orElse(null);
@@ -163,8 +162,8 @@ public class DBTraceModuleManager extends AbstractDBTraceSpaceBasedManager<DBTra
.getObjectsContaining(snap, address, TargetModule.RANGE_ATTRIBUTE_NAME, .getObjectsContaining(snap, address, TargetModule.RANGE_ATTRIBUTE_NAME,
TraceObjectModule.class); TraceObjectModule.class);
} }
return delegateRead(address.getAddressSpace(), return delegateRead(address.getAddressSpace(), m -> m.getModulesAt(snap, address),
m -> m.getModulesAt(snap, address), Set.of()); Set.of());
} }
@Override @Override
@@ -175,8 +174,8 @@ public class DBTraceModuleManager extends AbstractDBTraceSpaceBasedManager<DBTra
.getObjectsIntersecting(lifespan, range, TargetModule.RANGE_ATTRIBUTE_NAME, .getObjectsIntersecting(lifespan, range, TargetModule.RANGE_ATTRIBUTE_NAME,
TraceObjectModule.class); TraceObjectModule.class);
} }
return delegateRead(range.getAddressSpace(), return delegateRead(range.getAddressSpace(), m -> m.getModulesIntersecting(lifespan, range),
m -> m.getModulesIntersecting(lifespan, range), Set.of()); Set.of());
} }
@Override @Override
@@ -191,8 +190,8 @@ public class DBTraceModuleManager extends AbstractDBTraceSpaceBasedManager<DBTra
.getObjectsContaining(snap, address, TargetSection.RANGE_ATTRIBUTE_NAME, .getObjectsContaining(snap, address, TargetSection.RANGE_ATTRIBUTE_NAME,
TraceObjectSection.class); TraceObjectSection.class);
} }
return delegateRead(address.getAddressSpace(), return delegateRead(address.getAddressSpace(), m -> m.getSectionsAt(snap, address),
m -> m.getSectionsAt(snap, address), Set.of()); Set.of());
} }
@Override @Override
@@ -274,8 +273,7 @@ public class DBTraceModuleManager extends AbstractDBTraceSpaceBasedManager<DBTra
.getObjectByPath(snap, sectionPath, TraceObjectSection.class); .getObjectByPath(snap, sectionPath, TraceObjectSection.class);
} }
try (LockHold hold = LockHold.lock(lock.readLock())) { try (LockHold hold = LockHold.lock(lock.readLock())) {
return doGetSectionsByPath(sectionPath) return doGetSectionsByPath(sectionPath).stream()
.stream()
.filter(s -> s.getModule().getLifespan().contains(snap)) .filter(s -> s.getModule().getLifespan().contains(snap))
.findAny() .findAny()
.orElse(null); .orElse(null);
@@ -21,6 +21,7 @@ import java.util.*;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressRange; import ghidra.program.model.address.AddressRange;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
@@ -49,7 +50,7 @@ public class DBTraceStaticMappingManager implements TraceStaticMappingManager, D
protected final DBCachedObjectIndex<Address, DBTraceStaticMapping> mappingsByAddress; protected final DBCachedObjectIndex<Address, DBTraceStaticMapping> mappingsByAddress;
protected final Collection<DBTraceStaticMapping> view; protected final Collection<DBTraceStaticMapping> view;
public DBTraceStaticMappingManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceStaticMappingManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, DBTrace trace, DBTraceOverlaySpaceAdapter overlayAdapter) TaskMonitor monitor, DBTrace trace, DBTraceOverlaySpaceAdapter overlayAdapter)
throws VersionException, IOException { throws VersionException, IOException {
this.dbh = dbh; this.dbh = dbh;
@@ -118,8 +119,9 @@ public class DBTraceStaticMappingManager implements TraceStaticMappingManager, D
@Override @Override
public DBTraceStaticMapping findContaining(Address address, long snap) { public DBTraceStaticMapping findContaining(Address address, long snap) {
for (DBTraceStaticMapping mapping : mappingsByAddress.head(address, for (DBTraceStaticMapping mapping : mappingsByAddress.head(address, true)
true).descending().values()) { .descending()
.values()) {
if (!mapping.getLifespan().contains(snap)) { if (!mapping.getLifespan().contains(snap)) {
continue; continue;
} }
@@ -134,8 +136,9 @@ public class DBTraceStaticMappingManager implements TraceStaticMappingManager, D
@Override @Override
public DBTraceStaticMapping findAnyConflicting(AddressRange range, Lifespan lifespan, public DBTraceStaticMapping findAnyConflicting(AddressRange range, Lifespan lifespan,
URL toProgramURL, String toAddress) { URL toProgramURL, String toAddress) {
for (DBTraceStaticMapping mapping : mappingsByAddress.head(range.getMaxAddress(), for (DBTraceStaticMapping mapping : mappingsByAddress.head(range.getMaxAddress(), true)
true).descending().values()) { .descending()
.values()) {
if (!mapping.conflictsWith(range, lifespan, toProgramURL, toAddress)) { if (!mapping.conflictsWith(range, lifespan, toProgramURL, toAddress)) {
continue; continue;
} }
@@ -154,8 +157,9 @@ public class DBTraceStaticMappingManager implements TraceStaticMappingManager, D
public Collection<? extends DBTraceStaticMapping> findAllOverlapping(AddressRange range, public Collection<? extends DBTraceStaticMapping> findAllOverlapping(AddressRange range,
Lifespan lifespan) { Lifespan lifespan) {
Set<DBTraceStaticMapping> result = new HashSet<>(); Set<DBTraceStaticMapping> result = new HashSet<>();
for (DBTraceStaticMapping mapping : mappingsByAddress.head(range.getMaxAddress(), for (DBTraceStaticMapping mapping : mappingsByAddress.head(range.getMaxAddress(), true)
true).descending().values()) { .descending()
.values()) {
if (!mapping.getLifespan().intersects(lifespan)) { if (!mapping.getLifespan().intersects(lifespan)) {
continue; continue;
} }
@@ -19,6 +19,7 @@ import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.stream.Stream; import java.util.stream.Stream;
import ghidra.framework.data.OpenMode;
import ghidra.program.database.ProgramDB; import ghidra.program.database.ProgramDB;
import ghidra.program.database.function.OverlappingFunctionException; import ghidra.program.database.function.OverlappingFunctionException;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
@@ -173,7 +174,7 @@ public class DBTraceProgramViewFunctionManager implements FunctionManager {
} }
@Override @Override
public void programReady(int openMode, int currentRevision, TaskMonitor monitor) public void programReady(OpenMode openMode, int currentRevision, TaskMonitor monitor)
throws IOException, CancelledException { throws IOException, CancelledException {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@@ -22,6 +22,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import db.DBRecord; import db.DBRecord;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.program.model.listing.ProgramUserData; import ghidra.program.model.listing.ProgramUserData;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
@@ -95,7 +96,7 @@ public class DBTraceAddressPropertyManager implements TraceAddressPropertyManage
protected final TraceAddressPropertyManager apiView = protected final TraceAddressPropertyManager apiView =
new DBTraceAddressPropertyManagerApiView(this); new DBTraceAddressPropertyManagerApiView(this);
public DBTraceAddressPropertyManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceAddressPropertyManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager) throws VersionException, IOException { DBTraceThreadManager threadManager) throws VersionException, IOException {
this.dbh = dbh; this.dbh = dbh;
@@ -117,7 +118,7 @@ public class DBTraceAddressPropertyManager implements TraceAddressPropertyManage
if (ent.map == null) { if (ent.map == null) {
try { try {
propertyMapsByName.put(ent.name, propertyMapsByName.put(ent.name,
ent.map = doCreateMap(ent.name, DBOpenMode.UPDATE, ent.getValueClass())); ent.map = doCreateMap(ent.name, OpenMode.UPDATE, ent.getValueClass()));
} }
catch (Exception e) { catch (Exception e) {
Msg.error(this, "Cannot load address property " + ent.name, e); Msg.error(this, "Cannot load address property " + ent.name, e);
@@ -130,7 +131,7 @@ public class DBTraceAddressPropertyManager implements TraceAddressPropertyManage
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
protected <T> AbstractDBTracePropertyMap<T, ?> doCreateMap(String name, DBOpenMode openMode, protected <T> AbstractDBTracePropertyMap<T, ?> doCreateMap(String name, OpenMode openMode,
Class<T> valueClass) { Class<T> valueClass) {
String tableName = "AddressProperty: " + name; String tableName = "AddressProperty: " + name;
try { try {
@@ -175,7 +176,7 @@ public class DBTraceAddressPropertyManager implements TraceAddressPropertyManage
} }
DBTraceAddressPropertyEntry ent = propertyStore.create(); DBTraceAddressPropertyEntry ent = propertyStore.create();
ent.set(name, valueClass); ent.set(name, valueClass);
AbstractDBTracePropertyMap<T, ?> map = doCreateMap(name, DBOpenMode.CREATE, valueClass); AbstractDBTracePropertyMap<T, ?> map = doCreateMap(name, OpenMode.CREATE, valueClass);
ent.map = map; ent.map = map;
propertyMapsByName.put(name, map); propertyMapsByName.put(name, map);
return map; return map;
@@ -24,6 +24,7 @@ import db.DBHandle;
import db.DBRecord; import db.DBRecord;
import generic.CatenatedCollection; import generic.CatenatedCollection;
import ghidra.dbg.target.TargetRegisterContainer; import ghidra.dbg.target.TargetRegisterContainer;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.trace.database.*; import ghidra.trace.database.*;
@@ -125,7 +126,7 @@ public abstract class AbstractDBTraceSpaceBasedManager<M extends DBTraceSpaceBas
protected final Collection<M> allSpacesView = protected final Collection<M> allSpacesView =
new CatenatedCollection<>(memSpacesView, regSpacesView); new CatenatedCollection<>(memSpacesView, regSpacesView);
public AbstractDBTraceSpaceBasedManager(String name, DBHandle dbh, DBOpenMode openMode, public AbstractDBTraceSpaceBasedManager(String name, DBHandle dbh, OpenMode openMode,
ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace, ReadWriteLock lock, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager) throws IOException, VersionException { DBTraceThreadManager threadManager) throws IOException, VersionException {
this.name = name; this.name = name;
@@ -23,6 +23,7 @@ import db.DBHandle;
import generic.NestedIterator; import generic.NestedIterator;
import ghidra.dbg.target.*; import ghidra.dbg.target.*;
import ghidra.dbg.util.*; import ghidra.dbg.util.*;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressSetView; import ghidra.program.model.address.AddressSetView;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
@@ -57,10 +58,9 @@ public class DBTraceStackManager implements TraceStackManager, DBTraceManager {
protected final DBCachedObjectStore<DBTraceStackFrame> frameStore; protected final DBCachedObjectStore<DBTraceStackFrame> frameStore;
protected final DBCachedObjectIndex<Address, DBTraceStackFrame> framesByPC; protected final DBCachedObjectIndex<Address, DBTraceStackFrame> framesByPC;
public DBTraceStackManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceStackManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, DBTrace trace, DBTraceThreadManager threadManager, TaskMonitor monitor, DBTrace trace, DBTraceThreadManager threadManager,
DBTraceOverlaySpaceAdapter overlayAdapter) DBTraceOverlaySpaceAdapter overlayAdapter) throws VersionException, IOException {
throws VersionException, IOException {
this.dbh = dbh; this.dbh = dbh;
this.lock = lock; this.lock = lock;
this.trace = trace; this.trace = trace;
@@ -69,8 +69,8 @@ public class DBTraceStackManager implements TraceStackManager, DBTraceManager {
DBCachedObjectStoreFactory factory = trace.getStoreFactory(); DBCachedObjectStoreFactory factory = trace.getStoreFactory();
stackStore = factory.getOrCreateCachedStore(DBTraceStack.TABLE_NAME, stackStore = factory.getOrCreateCachedStore(DBTraceStack.TABLE_NAME, DBTraceStack.class,
DBTraceStack.class, (s, r) -> new DBTraceStack(this, s, r), true); (s, r) -> new DBTraceStack(this, s, r), true);
stacksByThreadSnap = stackStore.getIndex(ThreadSnap.class, DBTraceStack.THREAD_SNAP_COLUMN); stacksByThreadSnap = stackStore.getIndex(ThreadSnap.class, DBTraceStack.THREAD_SNAP_COLUMN);
frameStore = factory.getOrCreateCachedStore(DBTraceStackFrame.TABLE_NAME, frameStore = factory.getOrCreateCachedStore(DBTraceStackFrame.TABLE_NAME,
@@ -113,9 +113,8 @@ public class DBTraceStackManager implements TraceStackManager, DBTraceManager {
PathPredicates predicates = single(obj, TargetStack.class); PathPredicates predicates = single(obj, TargetStack.class);
if (createIfAbsent) { if (createIfAbsent) {
try (LockHold hold = trace.lockWrite()) { try (LockHold hold = trace.lockWrite()) {
TraceObjectStack stack = TraceObjectStack stack = trace.getObjectManager()
trace.getObjectManager() .getSuccessor(obj, predicates, snap, TraceObjectStack.class);
.getSuccessor(obj, predicates, snap, TraceObjectStack.class);
if (stack != null) { if (stack != null) {
return stack; return stack;
} }
@@ -187,15 +186,16 @@ public class DBTraceStackManager implements TraceStackManager, DBTraceManager {
// TODO: Should probably include a lifespan parameter? // TODO: Should probably include a lifespan parameter?
public Iterable<TraceStackFrame> getFramesIn(AddressSetView set) { public Iterable<TraceStackFrame> getFramesIn(AddressSetView set) {
if (trace.getObjectManager().hasSchema()) { if (trace.getObjectManager().hasSchema()) {
return () -> NestedIterator.start(set.iterator(), rng -> trace.getObjectManager() return () -> NestedIterator.start(set.iterator(),
.getObjectsIntersecting(Lifespan.ALL, rng, TargetStackFrame.PC_ATTRIBUTE_NAME, rng -> trace.getObjectManager()
TraceObjectStackFrame.class) .getObjectsIntersecting(Lifespan.ALL, rng,
.iterator()); TargetStackFrame.PC_ATTRIBUTE_NAME, TraceObjectStackFrame.class)
.iterator());
} }
return () -> NestedIterator.start(set.iterator(), rng -> framesByPC return () -> NestedIterator.start(set.iterator(),
.sub(rng.getMinAddress(), true, rng.getMaxAddress(), true) rng -> framesByPC.sub(rng.getMinAddress(), true, rng.getMaxAddress(), true)
.values() .values()
.iterator()); .iterator());
} }
protected void deleteStack(DBTraceStack stack) { protected void deleteStack(DBTraceStack stack) {
@@ -22,6 +22,7 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
@@ -47,10 +48,9 @@ public class DBTraceEquateManager extends AbstractDBTraceSpaceBasedManager<DBTra
protected final DBCachedObjectIndex<String, DBTraceEquate> equatesByName; protected final DBCachedObjectIndex<String, DBTraceEquate> equatesByName;
protected final DBCachedObjectIndex<Long, DBTraceEquate> equatesByValue; protected final DBCachedObjectIndex<Long, DBTraceEquate> equatesByValue;
public DBTraceEquateManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceEquateManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
Language baseLanguage, DBTrace trace, DBTraceThreadManager threadManager) DBTraceThreadManager threadManager) throws VersionException, IOException {
throws VersionException, IOException {
super(NAME, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager); super(NAME, dbh, openMode, lock, monitor, baseLanguage, trace, threadManager);
DBCachedObjectStoreFactory factory = trace.getStoreFactory(); DBCachedObjectStoreFactory factory = trace.getStoreFactory();
@@ -93,8 +93,7 @@ public class DBTraceEquateManager extends AbstractDBTraceSpaceBasedManager<DBTra
} }
@Override @Override
public DBTraceEquateSpace getEquateRegisterSpace(TraceThread thread, public DBTraceEquateSpace getEquateRegisterSpace(TraceThread thread, boolean createIfAbsent) {
boolean createIfAbsent) {
return getForRegisterSpace(thread, 0, createIfAbsent); return getForRegisterSpace(thread, 0, createIfAbsent);
} }
@@ -111,8 +110,8 @@ public class DBTraceEquateManager extends AbstractDBTraceSpaceBasedManager<DBTra
} }
@Override @Override
protected DBTraceEquateSpace createRegisterSpace(AddressSpace space, protected DBTraceEquateSpace createRegisterSpace(AddressSpace space, TraceThread thread,
TraceThread thread, DBTraceSpaceEntry ent) throws VersionException, IOException { DBTraceSpaceEntry ent) throws VersionException, IOException {
return new DBTraceEquateSpace(this, dbh, space, ent, thread); return new DBTraceEquateSpace(this, dbh, space, ent, thread);
} }
@@ -193,8 +192,7 @@ public class DBTraceEquateManager extends AbstractDBTraceSpaceBasedManager<DBTra
public Collection<? extends DBTraceEquate> getReferenced(long snap, Address address, public Collection<? extends DBTraceEquate> getReferenced(long snap, Address address,
int operandIndex) { int operandIndex) {
return delegateRead(address.getAddressSpace(), return delegateRead(address.getAddressSpace(),
m -> m.getReferenced(snap, address, operandIndex), m -> m.getReferenced(snap, address, operandIndex), Collections.emptyList());
Collections.emptyList());
} }
@Override @Override
@@ -22,6 +22,7 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.program.model.lang.Register; import ghidra.program.model.lang.Register;
@@ -38,7 +39,6 @@ import ghidra.trace.model.symbol.TraceReference;
import ghidra.trace.model.symbol.TraceReferenceManager; import ghidra.trace.model.symbol.TraceReferenceManager;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.util.UnionAddressSetView; import ghidra.util.UnionAddressSetView;
import ghidra.util.database.DBOpenMode;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -48,7 +48,7 @@ public class DBTraceReferenceManager extends AbstractDBTraceSpaceBasedManager<DB
protected final DBTraceOverlaySpaceAdapter overlayAdapter; protected final DBTraceOverlaySpaceAdapter overlayAdapter;
public DBTraceReferenceManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceReferenceManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager, DBTraceOverlaySpaceAdapter overlayAdapter) DBTraceThreadManager threadManager, DBTraceOverlaySpaceAdapter overlayAdapter)
throws VersionException, IOException { throws VersionException, IOException {
@@ -65,8 +65,8 @@ public class DBTraceReferenceManager extends AbstractDBTraceSpaceBasedManager<DB
} }
@Override @Override
protected DBTraceReferenceSpace createRegisterSpace(AddressSpace space, protected DBTraceReferenceSpace createRegisterSpace(AddressSpace space, TraceThread thread,
TraceThread thread, DBTraceSpaceEntry ent) throws VersionException, IOException { DBTraceSpaceEntry ent) throws VersionException, IOException {
return new DBTraceReferenceSpace(this, dbh, space, ent, thread); return new DBTraceReferenceSpace(this, dbh, space, ent, thread);
} }
@@ -21,6 +21,7 @@ import java.util.*;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import db.*; import db.*;
import ghidra.framework.data.OpenMode;
import ghidra.lifecycle.Internal; import ghidra.lifecycle.Internal;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.data.DataType; import ghidra.program.model.data.DataType;
@@ -138,10 +139,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
@DBAnnotatedColumn(STORAGE_COLUMN_NAME) @DBAnnotatedColumn(STORAGE_COLUMN_NAME)
static DBObjectColumn STORAGE_COLUMN; static DBObjectColumn STORAGE_COLUMN;
@DBAnnotatedField( @DBAnnotatedField(column = STORAGE_COLUMN_NAME, indexed = true, codec = VariableStorageDBFieldCodec.class)
column = STORAGE_COLUMN_NAME,
indexed = true,
codec = VariableStorageDBFieldCodec.class)
private VariableStorage storage; private VariableStorage storage;
protected final DBTraceSymbolManager manager; protected final DBTraceSymbolManager manager;
@@ -238,7 +236,7 @@ public class DBTraceSymbolManager implements TraceSymbolManager, DBTraceManager
protected final Map<Byte, AbstractDBTraceSymbolSingleTypeView<?>> symbolViews = new HashMap<>(); protected final Map<Byte, AbstractDBTraceSymbolSingleTypeView<?>> symbolViews = new HashMap<>();
public DBTraceSymbolManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceSymbolManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace, TaskMonitor monitor, Language baseLanguage, DBTrace trace,
DBTraceThreadManager threadManager, DBTraceDataTypeManager dataTypeManager, DBTraceThreadManager threadManager, DBTraceDataTypeManager dataTypeManager,
DBTraceOverlaySpaceAdapter overlayAdapter) throws VersionException, IOException { DBTraceOverlaySpaceAdapter overlayAdapter) throws VersionException, IOException {
@@ -31,6 +31,7 @@ import ghidra.dbg.target.TargetObject;
import ghidra.dbg.target.schema.*; import ghidra.dbg.target.schema.*;
import ghidra.dbg.target.schema.TargetObjectSchema.SchemaName; import ghidra.dbg.target.schema.TargetObjectSchema.SchemaName;
import ghidra.dbg.util.*; import ghidra.dbg.util.*;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
@@ -68,8 +69,8 @@ import ghidra.util.task.TaskMonitor;
public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager { public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager {
private static final int OBJECTS_CONTAINING_CACHE_SIZE = 100; private static final int OBJECTS_CONTAINING_CACHE_SIZE = 100;
public static class DBTraceObjectSchemaDBFieldCodec extends public static class DBTraceObjectSchemaDBFieldCodec
AbstractDBFieldCodec<SchemaContext, DBTraceObjectSchemaEntry, StringField> { extends AbstractDBFieldCodec<SchemaContext, DBTraceObjectSchemaEntry, StringField> {
public DBTraceObjectSchemaDBFieldCodec(Class<DBTraceObjectSchemaEntry> objectType, public DBTraceObjectSchemaDBFieldCodec(Class<DBTraceObjectSchemaEntry> objectType,
Field field, int column) { Field field, int column) {
super(SchemaContext.class, objectType, StringField.class, field, column); super(SchemaContext.class, objectType, StringField.class, field, column);
@@ -118,9 +119,7 @@ public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager
@DBAnnotatedColumn(SCHEMA_COLUMN_NAME) @DBAnnotatedColumn(SCHEMA_COLUMN_NAME)
static DBObjectColumn SCHEMA_COLUMN; static DBObjectColumn SCHEMA_COLUMN;
@DBAnnotatedField( @DBAnnotatedField(column = CONTEXT_COLUMN_NAME, codec = DBTraceObjectSchemaDBFieldCodec.class)
column = CONTEXT_COLUMN_NAME,
codec = DBTraceObjectSchemaDBFieldCodec.class)
private SchemaContext context; private SchemaContext context;
@DBAnnotatedField(column = SCHEMA_COLUMN_NAME) @DBAnnotatedField(column = SCHEMA_COLUMN_NAME)
private String schemaName; private String schemaName;
@@ -175,7 +174,7 @@ public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager
protected final Map<Class<? extends TraceObjectInterface>, Set<TargetObjectSchema>> // protected final Map<Class<? extends TraceObjectInterface>, Set<TargetObjectSchema>> //
schemasByInterface = new HashMap<>(); schemasByInterface = new HashMap<>();
public DBTraceObjectManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceObjectManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, Language baseLanguage, DBTrace trace) TaskMonitor monitor, Language baseLanguage, DBTrace trace)
throws IOException, VersionException { throws IOException, VersionException {
this.lock = lock; this.lock = lock;
@@ -185,16 +184,15 @@ public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager
schemaStore = factory.getOrCreateCachedStore(DBTraceObjectSchemaEntry.TABLE_NAME, schemaStore = factory.getOrCreateCachedStore(DBTraceObjectSchemaEntry.TABLE_NAME,
DBTraceObjectSchemaEntry.class, DBTraceObjectSchemaEntry::new, true); DBTraceObjectSchemaEntry.class, DBTraceObjectSchemaEntry::new, true);
loadRootSchema(); loadRootSchema();
objectStore = factory.getOrCreateCachedStore(DBTraceObject.TABLE_NAME, objectStore = factory.getOrCreateCachedStore(DBTraceObject.TABLE_NAME, DBTraceObject.class,
DBTraceObject.class, (s, r) -> new DBTraceObject(this, s, r), true); (s, r) -> new DBTraceObject(this, s, r), true);
valueTree = new DBTraceObjectValueRStarTree(this, factory, valueTree = new DBTraceObjectValueRStarTree(this, factory,
DBTraceObjectValueData.TABLE_NAME, ValueSpace.INSTANCE, DBTraceObjectValueData.class, DBTraceObjectValueData.TABLE_NAME, ValueSpace.INSTANCE, DBTraceObjectValueData.class,
DBTraceObjectValueNode.class, false, 50); DBTraceObjectValueNode.class, false, 50);
valueMap = valueTree.asSpatialMap(); valueMap = valueTree.asSpatialMap();
objectsByPath = objectsByPath = objectStore.getIndex(TraceObjectKeyPath.class, DBTraceObject.PATH_COLUMN);
objectStore.getIndex(TraceObjectKeyPath.class, DBTraceObject.PATH_COLUMN);
valueWbCache = new DBTraceObjectValueWriteBehindCache(this); valueWbCache = new DBTraceObjectValueWriteBehindCache(this);
@@ -297,12 +295,12 @@ public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager
return entry; return entry;
} }
protected DBTraceObjectValue doCreateValue(Lifespan lifespan, protected DBTraceObjectValue doCreateValue(Lifespan lifespan, DBTraceObject parent, String key,
DBTraceObject parent, String key, Object value) { Object value) {
// Root is never in write-behind cache // Root is never in write-behind cache
DBTraceObjectValue entry = parent == null DBTraceObjectValue entry =
? doCreateValueData(lifespan, parent, key, value).getWrapper() parent == null ? doCreateValueData(lifespan, parent, key, value).getWrapper()
: valueWbCache.doCreateValue(lifespan, parent, key, value).getWrapper(); : valueWbCache.doCreateValue(lifespan, parent, key, value).getWrapper();
if (parent != null) { if (parent != null) {
parent.notifyValueCreated(entry); parent.notifyValueCreated(entry);
} }
@@ -420,18 +418,17 @@ public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager
@Override @Override
public Stream<DBTraceObjectValue> getAllValues() { public Stream<DBTraceObjectValue> getAllValues() {
return Stream.concat( return Stream.concat(valueMap.values().stream().map(v -> v.getWrapper()), StreamUtils
valueMap.values().stream().map(v -> v.getWrapper()), .lock(lock.readLock(), valueWbCache.streamAllValues().map(v -> v.getWrapper())));
StreamUtils.lock(lock.readLock(),
valueWbCache.streamAllValues().map(v -> v.getWrapper())));
} }
protected Stream<DBTraceObjectValueData> streamValuesIntersectingData(Lifespan span, protected Stream<DBTraceObjectValueData> streamValuesIntersectingData(Lifespan span,
AddressRange range, String entryKey) { AddressRange range, String entryKey) {
return valueMap.reduce(TraceObjectValueQuery.intersecting( return valueMap.reduce(TraceObjectValueQuery.intersecting(
entryKey != null ? entryKey : EntryKeyDimension.INSTANCE.absoluteMin(), entryKey != null ? entryKey : EntryKeyDimension.INSTANCE.absoluteMin(),
entryKey != null ? entryKey : EntryKeyDimension.INSTANCE.absoluteMax(), entryKey != null ? entryKey : EntryKeyDimension.INSTANCE.absoluteMax(), span, range))
span, range)).values().stream(); .values()
.stream();
} }
protected Stream<DBTraceObjectValueBehind> streamValuesIntersectingBehind(Lifespan span, protected Stream<DBTraceObjectValueBehind> streamValuesIntersectingBehind(Lifespan span,
@@ -442,9 +439,10 @@ public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager
@Override @Override
public Collection<? extends TraceObjectValue> getValuesIntersecting(Lifespan span, public Collection<? extends TraceObjectValue> getValuesIntersecting(Lifespan span,
AddressRange range, String entryKey) { AddressRange range, String entryKey) {
return Stream.concat( return Stream
streamValuesIntersectingData(span, range, entryKey).map(v -> v.getWrapper()), .concat(
streamValuesIntersectingBehind(span, range, entryKey).map(v -> v.getWrapper())) streamValuesIntersectingData(span, range, entryKey).map(v -> v.getWrapper()),
streamValuesIntersectingBehind(span, range, entryKey).map(v -> v.getWrapper()))
.toList(); .toList();
} }
@@ -460,9 +458,9 @@ public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager
public Collection<? extends TraceObjectValue> getValuesAt(long snap, Address address, public Collection<? extends TraceObjectValue> getValuesAt(long snap, Address address,
String entryKey) { String entryKey) {
return Stream.concat( return Stream
streamValuesAtData(snap, address, entryKey).map(v -> v.getWrapper()), .concat(streamValuesAtData(snap, address, entryKey).map(v -> v.getWrapper()),
streamValuesAtBehind(snap, address, entryKey).map(v -> v.getWrapper())) streamValuesAtBehind(snap, address, entryKey).map(v -> v.getWrapper()))
.toList(); .toList();
} }
@@ -474,16 +472,14 @@ public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager
} }
Class<? extends TargetObject> targetIf = TraceObjectInterfaceUtils.toTargetIf(ifClass); Class<? extends TargetObject> targetIf = TraceObjectInterfaceUtils.toTargetIf(ifClass);
PathMatcher matcher = rootSchema.searchFor(targetIf, true); PathMatcher matcher = rootSchema.searchFor(targetIf, true);
return getValuePaths(span, matcher) return getValuePaths(span, matcher).filter(p -> {
.filter(p -> { TraceObject object = p.getDestination(getRootObject());
TraceObject object = p.getDestination(getRootObject()); if (object == null) {
if (object == null) { Msg.error(this, "NULL VALUE! " + p.getLastEntry());
Msg.error(this, "NULL VALUE! " + p.getLastEntry()); return false;
return false; }
} return true;
return true; }).map(p -> p.getDestination(getRootObject()).queryInterface(ifClass));
})
.map(p -> p.getDestination(getRootObject()).queryInterface(ifClass));
} }
@Override @Override
@@ -632,8 +628,8 @@ public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager
return Set.copyOf(result); return Set.copyOf(result);
} }
public <I extends TraceObjectInterface> Collection<I> getObjectsIntersecting( public <I extends TraceObjectInterface> Collection<I> getObjectsIntersecting(Lifespan lifespan,
Lifespan lifespan, AddressRange range, String key, Class<I> iface) { AddressRange range, String key, Class<I> iface) {
try (LockHold hold = trace.lockRead()) { try (LockHold hold = trace.lockRead()) {
Set<TargetObjectSchema> schemas; Set<TargetObjectSchema> schemas;
synchronized (schemasByInterface) { synchronized (schemasByInterface) {
@@ -802,8 +798,8 @@ public class DBTraceObjectManager implements TraceObjectManager, DBTraceManager
if (!exists.getLife().intersects(lifespan)) { if (!exists.getLife().intersects(lifespan)) {
return; return;
} }
throw new DuplicateNameException("A thread having path '" + path + throw new DuplicateNameException(
"' already exists within an overlapping snap"); "A thread having path '" + path + "' already exists within an overlapping snap");
} }
public TraceObjectThread addThread(String path, String display, Lifespan lifespan) public TraceObjectThread addThread(String path, String display, Lifespan lifespan)
@@ -21,6 +21,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import db.DBHandle; import db.DBHandle;
import ghidra.framework.data.OpenMode;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
import ghidra.trace.database.DBTraceManager; import ghidra.trace.database.DBTraceManager;
import ghidra.trace.database.target.DBTraceObject; import ghidra.trace.database.target.DBTraceObject;
@@ -44,7 +45,7 @@ public class DBTraceThreadManager implements TraceThreadManager, DBTraceManager
protected final DBCachedObjectStore<DBTraceThread> threadStore; protected final DBCachedObjectStore<DBTraceThread> threadStore;
protected final DBCachedObjectIndex<String, DBTraceThread> threadsByPath; protected final DBCachedObjectIndex<String, DBTraceThread> threadsByPath;
public DBTraceThreadManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceThreadManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, DBTrace trace, DBTraceObjectManager objectManager) TaskMonitor monitor, DBTrace trace, DBTraceObjectManager objectManager)
throws IOException, VersionException { throws IOException, VersionException {
this.lock = lock; this.lock = lock;
@@ -104,8 +105,7 @@ public class DBTraceThreadManager implements TraceThreadManager, DBTraceManager
} }
@Override @Override
public TraceThread addThread(String path, Lifespan lifespan) public TraceThread addThread(String path, Lifespan lifespan) throws DuplicateNameException {
throws DuplicateNameException {
return addThread(path, path, lifespan); return addThread(path, path, lifespan);
} }
@@ -168,8 +168,7 @@ public class DBTraceThreadManager implements TraceThreadManager, DBTraceManager
public Collection<? extends TraceThread> getLiveThreads(long snap) { public Collection<? extends TraceThread> getLiveThreads(long snap) {
if (objectManager.hasSchema()) { if (objectManager.hasSchema()) {
try (LockHold hold = LockHold.lock(lock.readLock())) { try (LockHold hold = LockHold.lock(lock.readLock())) {
return objectManager return objectManager.queryAllInterface(Lifespan.at(snap), TraceObjectThread.class)
.queryAllInterface(Lifespan.at(snap), TraceObjectThread.class)
// Exclude the destruction // Exclude the destruction
.filter(thread -> thread.getCreationSnap() <= snap && .filter(thread -> thread.getCreationSnap() <= snap &&
snap < thread.getDestructionSnap()) snap < thread.getDestructionSnap())
@@ -22,6 +22,7 @@ import java.util.Map.Entry;
import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReadWriteLock;
import db.DBHandle; import db.DBHandle;
import ghidra.framework.data.OpenMode;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
import ghidra.trace.database.DBTraceManager; import ghidra.trace.database.DBTraceManager;
import ghidra.trace.database.thread.DBTraceThreadManager; import ghidra.trace.database.thread.DBTraceThreadManager;
@@ -44,7 +45,7 @@ public class DBTraceTimeManager implements TraceTimeManager, DBTraceManager {
protected final DBCachedObjectStore<DBTraceSnapshot> snapshotStore; protected final DBCachedObjectStore<DBTraceSnapshot> snapshotStore;
protected final DBCachedObjectIndex<String, DBTraceSnapshot> snapshotsBySchedule; protected final DBCachedObjectIndex<String, DBTraceSnapshot> snapshotsBySchedule;
public DBTraceTimeManager(DBHandle dbh, DBOpenMode openMode, ReadWriteLock lock, public DBTraceTimeManager(DBHandle dbh, OpenMode openMode, ReadWriteLock lock,
TaskMonitor monitor, DBTrace trace, DBTraceThreadManager threadManager) TaskMonitor monitor, DBTrace trace, DBTraceThreadManager threadManager)
throws VersionException, IOException { throws VersionException, IOException {
this.trace = trace; this.trace = trace;
@@ -34,6 +34,7 @@ import generic.theme.GThemeDefaults.Colors.Messages;
import ghidra.app.plugin.processors.sleigh.SleighLanguage; import ghidra.app.plugin.processors.sleigh.SleighLanguage;
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
import ghidra.dbg.util.PathPredicates; import ghidra.dbg.util.PathPredicates;
import ghidra.framework.data.OpenMode;
import ghidra.pcode.exec.*; import ghidra.pcode.exec.*;
import ghidra.pcode.exec.trace.TraceSleighUtils; import ghidra.pcode.exec.trace.TraceSleighUtils;
import ghidra.program.disassemble.Disassembler; import ghidra.program.disassemble.Disassembler;
@@ -61,7 +62,6 @@ import ghidra.trace.model.target.TraceObject.ConflictResolution;
import ghidra.trace.model.thread.TraceObjectThread; import ghidra.trace.model.thread.TraceObjectThread;
import ghidra.trace.model.thread.TraceThread; import ghidra.trace.model.thread.TraceThread;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.database.DBOpenMode;
import ghidra.util.exception.*; import ghidra.util.exception.*;
import ghidra.util.task.ConsoleTaskMonitor; import ghidra.util.task.ConsoleTaskMonitor;
@@ -95,7 +95,7 @@ public class ToyDBTraceBuilder implements AutoCloseable {
public ToyDBTraceBuilder(File file) public ToyDBTraceBuilder(File file)
throws CancelledException, VersionException, LanguageNotFoundException, IOException { throws CancelledException, VersionException, LanguageNotFoundException, IOException {
DBHandle handle = new DBHandle(file); DBHandle handle = new DBHandle(file);
this.trace = new DBTrace(handle, DBOpenMode.UPDATE, new ConsoleTaskMonitor(), this); this.trace = new DBTrace(handle, OpenMode.UPDATE, new ConsoleTaskMonitor(), this);
this.language = trace.getBaseLanguage(); this.language = trace.getBaseLanguage();
this.host = trace.getPlatformManager().getHostPlatform(); this.host = trace.getPlatformManager().getHostPlatform();
} }
@@ -553,8 +553,8 @@ public class ToyDBTraceBuilder implements AutoCloseable {
* @return the instruction unit * @return the instruction unit
* @throws CodeUnitInsertionException if the instruction cannot be created * @throws CodeUnitInsertionException if the instruction cannot be created
*/ */
public DBTraceInstruction addInstruction(long snap, Address start, public DBTraceInstruction addInstruction(long snap, Address start, TracePlatform platform)
TracePlatform platform) throws CodeUnitInsertionException { throws CodeUnitInsertionException {
DBTraceCodeManager code = trace.getCodeManager(); DBTraceCodeManager code = trace.getCodeManager();
Language platformLanguage = platform.getLanguage(); Language platformLanguage = platform.getLanguage();
Disassembler dis = Disassembler dis =
@@ -637,8 +637,8 @@ public class ToyDBTraceBuilder implements AutoCloseable {
public DBTraceReference addMemoryReference(long creationSnap, Address from, Address to, public DBTraceReference addMemoryReference(long creationSnap, Address from, Address to,
int operandIndex) { int operandIndex) {
return trace.getReferenceManager() return trace.getReferenceManager()
.addMemoryReference(Lifespan.nowOn(creationSnap), from, to, .addMemoryReference(Lifespan.nowOn(creationSnap), from, to, RefType.DATA,
RefType.DATA, SourceType.DEFAULT, operandIndex); SourceType.DEFAULT, operandIndex);
} }
/** /**
@@ -655,8 +655,8 @@ public class ToyDBTraceBuilder implements AutoCloseable {
public DBTraceReference addOffsetReference(long creationSnap, Address from, Address to, public DBTraceReference addOffsetReference(long creationSnap, Address from, Address to,
boolean toAddrIsBase, long offset) { boolean toAddrIsBase, long offset) {
return trace.getReferenceManager() return trace.getReferenceManager()
.addOffsetReference(Lifespan.nowOn(creationSnap), from, to, toAddrIsBase, .addOffsetReference(Lifespan.nowOn(creationSnap), from, to, toAddrIsBase, offset,
offset, RefType.DATA, SourceType.DEFAULT, -1); RefType.DATA, SourceType.DEFAULT, -1);
} }
/** /**
@@ -677,8 +677,8 @@ public class ToyDBTraceBuilder implements AutoCloseable {
public DBTraceReference addShiftedReference(long creationSnap, Address from, Address to, public DBTraceReference addShiftedReference(long creationSnap, Address from, Address to,
int shift) { int shift) {
return trace.getReferenceManager() return trace.getReferenceManager()
.addShiftedReference(Lifespan.nowOn(creationSnap), from, .addShiftedReference(Lifespan.nowOn(creationSnap), from, to, shift, RefType.DATA,
to, shift, RefType.DATA, SourceType.DEFAULT, -1); SourceType.DEFAULT, -1);
} }
/** /**
@@ -696,8 +696,8 @@ public class ToyDBTraceBuilder implements AutoCloseable {
*/ */
public DBTraceReference addRegisterReference(long creationSnap, Address from, String to) { public DBTraceReference addRegisterReference(long creationSnap, Address from, String to) {
return trace.getReferenceManager() return trace.getReferenceManager()
.addRegisterReference(Lifespan.nowOn(creationSnap), from, .addRegisterReference(Lifespan.nowOn(creationSnap), from, language.getRegister(to),
language.getRegister(to), RefType.DATA, SourceType.DEFAULT, -1); RefType.DATA, SourceType.DEFAULT, -1);
} }
/** /**
@@ -715,8 +715,8 @@ public class ToyDBTraceBuilder implements AutoCloseable {
*/ */
public DBTraceReference addStackReference(long creationSnap, Address from, int to) { public DBTraceReference addStackReference(long creationSnap, Address from, int to) {
return trace.getReferenceManager() return trace.getReferenceManager()
.addStackReference(Lifespan.nowOn(creationSnap), from, to, .addStackReference(Lifespan.nowOn(creationSnap), from, to, RefType.DATA,
RefType.DATA, SourceType.DEFAULT, -1); SourceType.DEFAULT, -1);
} }
/** /**
@@ -24,6 +24,7 @@ import java.util.function.Predicate;
import org.junit.*; import org.junit.*;
import db.*; import db.*;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.program.model.lang.LanguageID; import ghidra.program.model.lang.LanguageID;
@@ -43,7 +44,7 @@ public class DBTraceAddressSnapRangePropertyMapAddressSetViewTest
extends AbstractGhidraHeadlessIntegrationTest { extends AbstractGhidraHeadlessIntegrationTest {
protected static class MyObject extends DBCachedDomainObjectAdapter { protected static class MyObject extends DBCachedDomainObjectAdapter {
protected MyObject(Object consumer) throws IOException { protected MyObject(Object consumer) throws IOException {
super(new DBHandle(), DBOpenMode.CREATE, new ConsoleTaskMonitor(), "Testing", 500, 1000, super(new DBHandle(), OpenMode.CREATE, new ConsoleTaskMonitor(), "Testing", 500, 1000,
consumer); consumer);
} }
@@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
import org.junit.*; import org.junit.*;
import db.*; import db.*;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.program.model.lang.LanguageID; import ghidra.program.model.lang.LanguageID;
@@ -42,7 +43,7 @@ public class DBTraceAddressSnapRangePropertyMapOcclusionIntoFutureIterableTest
extends AbstractGhidraHeadlessIntegrationTest { extends AbstractGhidraHeadlessIntegrationTest {
protected static class MyObject extends DBCachedDomainObjectAdapter { protected static class MyObject extends DBCachedDomainObjectAdapter {
protected MyObject(Object consumer) throws IOException { protected MyObject(Object consumer) throws IOException {
super(new DBHandle(), DBOpenMode.CREATE, new ConsoleTaskMonitor(), "Testing", 500, 1000, super(new DBHandle(), OpenMode.CREATE, new ConsoleTaskMonitor(), "Testing", 500, 1000,
consumer); consumer);
} }
@@ -152,8 +153,7 @@ public class DBTraceAddressSnapRangePropertyMapOcclusionIntoFutureIterableTest
@Before @Before
public void setUp() throws IOException, VersionException { public void setUp() throws IOException, VersionException {
toy = DefaultLanguageService.getLanguageService() toy = DefaultLanguageService.getLanguageService()
.getLanguage( .getLanguage(new LanguageID("Toy:BE:64:default"));
new LanguageID("Toy:BE:64:default"));
obj = new MyObject(this); obj = new MyObject(this);
factory = new DBCachedObjectStoreFactory(obj); factory = new DBCachedObjectStoreFactory(obj);
try (Transaction tx = obj.openTransaction("CreateTable")) { try (Transaction tx = obj.openTransaction("CreateTable")) {
@@ -240,12 +240,10 @@ public class DBTraceAddressSnapRangePropertyMapOcclusionIntoFutureIterableTest
} }
it = makeOcclusionIterable(tasr(0x0000, -0x0001, Long.MIN_VALUE, Long.MAX_VALUE)); it = makeOcclusionIterable(tasr(0x0000, -0x0001, Long.MIN_VALUE, Long.MAX_VALUE));
assertEquals(list( assertEquals(list(ent(0x0000, 0x0fff, 5, 10, "W"),
ent(0x0000, 0x0fff, 5, 10, "W"),
ent(0x1000, 0x1fff, Long.MIN_VALUE, Long.MIN_VALUE + 10, "S"), ent(0x1000, 0x1fff, Long.MIN_VALUE, Long.MIN_VALUE + 10, "S"),
ent(0x2000, 0x2fff, Long.MAX_VALUE - 10, Long.MAX_VALUE, "N"), ent(0x2000, 0x2fff, Long.MAX_VALUE - 10, Long.MAX_VALUE, "N"),
ent(-0x1000, -0x0001, 5, 10, "E")), ent(-0x1000, -0x0001, 5, 10, "E")), list(it));
list(it));
} }
@Test @Test
@@ -25,6 +25,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
import org.junit.*; import org.junit.*;
import db.*; import db.*;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.program.model.lang.LanguageID; import ghidra.program.model.lang.LanguageID;
@@ -42,7 +43,7 @@ public class DBTraceAddressSnapRangePropertyMapOcclusionIntoPastIterableTest
extends AbstractGhidraHeadlessIntegrationTest { extends AbstractGhidraHeadlessIntegrationTest {
protected static class MyObject extends DBCachedDomainObjectAdapter { protected static class MyObject extends DBCachedDomainObjectAdapter {
protected MyObject(Object consumer) throws IOException { protected MyObject(Object consumer) throws IOException {
super(new DBHandle(), DBOpenMode.CREATE, new ConsoleTaskMonitor(), "Testing", 500, 1000, super(new DBHandle(), OpenMode.CREATE, new ConsoleTaskMonitor(), "Testing", 500, 1000,
consumer); consumer);
} }
@@ -152,8 +153,7 @@ public class DBTraceAddressSnapRangePropertyMapOcclusionIntoPastIterableTest
@Before @Before
public void setUp() throws IOException, VersionException { public void setUp() throws IOException, VersionException {
toy = DefaultLanguageService.getLanguageService() toy = DefaultLanguageService.getLanguageService()
.getLanguage( .getLanguage(new LanguageID("Toy:BE:64:default"));
new LanguageID("Toy:BE:64:default"));
obj = new MyObject(this); obj = new MyObject(this);
factory = new DBCachedObjectStoreFactory(obj); factory = new DBCachedObjectStoreFactory(obj);
try (Transaction tid = obj.openTransaction("CreateTable")) { try (Transaction tid = obj.openTransaction("CreateTable")) {
@@ -29,6 +29,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
import org.junit.*; import org.junit.*;
import db.*; import db.*;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.lang.Language; import ghidra.program.model.lang.Language;
import ghidra.program.model.lang.LanguageID; import ghidra.program.model.lang.LanguageID;
@@ -61,7 +62,7 @@ public class DBTraceAddressSnapRangePropertyMapSpaceTest
private DBTraceAddressSnapRangePropertyMapSpace<MyEntry, MyEntry> space2; private DBTraceAddressSnapRangePropertyMapSpace<MyEntry, MyEntry> space2;
private DBTraceAddressSnapRangePropertyMapSpace<String, AltEntry> space3; private DBTraceAddressSnapRangePropertyMapSpace<String, AltEntry> space3;
protected MyObject(DBHandle dbh, DBOpenMode openMode, Language toy, Object consumer) protected MyObject(DBHandle dbh, OpenMode openMode, Language toy, Object consumer)
throws VersionException, IOException { throws VersionException, IOException {
super(dbh, openMode, new ConsoleTaskMonitor(), "Testing", 500, 1000, consumer); super(dbh, openMode, new ConsoleTaskMonitor(), "Testing", 500, 1000, consumer);
this.toy = toy; this.toy = toy;
@@ -70,12 +71,12 @@ public class DBTraceAddressSnapRangePropertyMapSpaceTest
} }
protected MyObject(Language toy, Object consumer) throws IOException, VersionException { protected MyObject(Language toy, Object consumer) throws IOException, VersionException {
this(new DBHandle(), DBOpenMode.CREATE, toy, consumer); this(new DBHandle(), OpenMode.CREATE, toy, consumer);
} }
protected MyObject(File file, Language toy, Object consumer) protected MyObject(File file, Language toy, Object consumer)
throws IOException, VersionException { throws IOException, VersionException {
this(new DBHandle(file), DBOpenMode.UPDATE, toy, consumer); this(new DBHandle(file), OpenMode.UPDATE, toy, consumer);
} }
protected void loadSpaces() throws VersionException, IOException { protected void loadSpaces() throws VersionException, IOException {
@@ -211,8 +212,7 @@ public class DBTraceAddressSnapRangePropertyMapSpaceTest
@Before @Before
public void setUp() throws IOException, VersionException { public void setUp() throws IOException, VersionException {
toy = DefaultLanguageService.getLanguageService() toy = DefaultLanguageService.getLanguageService()
.getLanguage( .getLanguage(new LanguageID("Toy:BE:64:default"));
new LanguageID("Toy:BE:64:default"));
obj = new MyObject(toy, this); obj = new MyObject(toy, this);
} }
@@ -24,13 +24,13 @@ import java.util.*;
import org.junit.Test; import org.junit.Test;
import db.Transaction;
import db.DBHandle; import db.DBHandle;
import db.Transaction;
import ghidra.framework.data.OpenMode;
import ghidra.program.model.address.*; import ghidra.program.model.address.*;
import ghidra.trace.database.DBTrace; import ghidra.trace.database.DBTrace;
import ghidra.trace.model.TraceAddressSnapRange; import ghidra.trace.model.TraceAddressSnapRange;
import ghidra.trace.model.memory.TraceMemoryState; import ghidra.trace.model.memory.TraceMemoryState;
import ghidra.util.database.DBOpenMode;
import ghidra.util.task.ConsoleTaskMonitor; import ghidra.util.task.ConsoleTaskMonitor;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -683,62 +683,52 @@ public abstract class AbstractDBTraceMemoryManagerMemoryTest
} }
try { try {
memory.findBytes(3, b.range(0x4000, 0x4003), b.buf(1, 2, 3, 4), b.buf(-1, -1, -1), memory.findBytes(3, b.range(0x4000, 0x4003), b.buf(1, 2, 3, 4), b.buf(-1, -1, -1), true,
true, TaskMonitor.DUMMY); TaskMonitor.DUMMY);
} }
catch (IllegalArgumentException e) { catch (IllegalArgumentException e) {
// pass // pass
} }
// Degenerate // Degenerate
assertNull( assertNull(memory.findBytes(2, b.range(0x4000, 0x4003), b.buf(), b.buf(), true,
memory.findBytes(2, b.range(0x4000, 0x4003), b.buf(), b.buf(), TaskMonitor.DUMMY));
true, TaskMonitor.DUMMY));
// Too soon // Too soon
assertNull( assertNull(memory.findBytes(2, b.range(0x4000, 0x4003), b.buf(1, 2, 3, 4),
memory.findBytes(2, b.range(0x4000, 0x4003), b.buf(1, 2, 3, 4), b.buf(-1, -1, -1, -1), b.buf(-1, -1, -1, -1), true, TaskMonitor.DUMMY));
true, TaskMonitor.DUMMY));
// Too small // Too small
assertNull( assertNull(memory.findBytes(3, b.range(0x4000, 0x4002), b.buf(1, 2, 3, 4),
memory.findBytes(3, b.range(0x4000, 0x4002), b.buf(1, 2, 3, 4), b.buf(-1, -1, -1, -1), b.buf(-1, -1, -1, -1), true, TaskMonitor.DUMMY));
true, TaskMonitor.DUMMY));
// Too high // Too high
assertNull( assertNull(memory.findBytes(3, b.range(0x4001, 0x4004), b.buf(1, 2, 3, 4),
memory.findBytes(3, b.range(0x4001, 0x4004), b.buf(1, 2, 3, 4), b.buf(-1, -1, -1, -1), b.buf(-1, -1, -1, -1), true, TaskMonitor.DUMMY));
true, TaskMonitor.DUMMY));
// Too high, into unknown // Too high, into unknown
assertNull( assertNull(memory.findBytes(3, b.range(0x4001, 0x4005), b.buf(1, 2, 3, 4, 5),
memory.findBytes(3, b.range(0x4001, 0x4005), b.buf(1, 2, 3, 4, 5), b.buf(-1, -1, -1, -1, -1), true, TaskMonitor.DUMMY));
b.buf(-1, -1, -1, -1, -1), true, TaskMonitor.DUMMY));
// Too low // Too low
assertNull( assertNull(memory.findBytes(3, b.range(0x3fff, 0x4002), b.buf(1, 2, 3, 4),
memory.findBytes(3, b.range(0x3fff, 0x4002), b.buf(1, 2, 3, 4), b.buf(-1, -1, -1, -1), b.buf(-1, -1, -1, -1), true, TaskMonitor.DUMMY));
true, TaskMonitor.DUMMY));
// Perfect match // Perfect match
assertEquals(b.addr(0x4000), assertEquals(b.addr(0x4000), memory.findBytes(3, b.range(0x4000, 0x4003), b.buf(1, 2, 3, 4),
memory.findBytes(3, b.range(0x4000, 0x4003), b.buf(1, 2, 3, 4), b.buf(-1, -1, -1, -1), b.buf(-1, -1, -1, -1), true, TaskMonitor.DUMMY));
true, TaskMonitor.DUMMY));
// Make it work for the match
assertEquals(b.addr(0x4000), memory.findBytes(3, b.range(0x0, -1), b.buf(1, 2, 3, 4),
b.buf(-1, -1, -1, -1), true, TaskMonitor.DUMMY));
// Make it work for the match // Make it work for the match
assertEquals(b.addr(0x4000), assertEquals(b.addr(0x4000),
memory.findBytes(3, b.range(0x0, -1), b.buf(1, 2, 3, 4), b.buf(-1, -1, -1, -1), memory.findBytes(3, b.range(0x0, -1), b.buf(1), b.buf(-1), true, TaskMonitor.DUMMY));
true, TaskMonitor.DUMMY));
// Make it work for the match
assertEquals(b.addr(0x4000),
memory.findBytes(3, b.range(0x0, -1), b.buf(1), b.buf(-1),
true, TaskMonitor.DUMMY));
// Sub match // Sub match
assertEquals(b.addr(0x4001), assertEquals(b.addr(0x4001), memory.findBytes(3, b.range(0x4000, 0x4003), b.buf(2, 3, 4),
memory.findBytes(3, b.range(0x4000, 0x4003), b.buf(2, 3, 4), b.buf(-1, -1, -1), b.buf(-1, -1, -1), true, TaskMonitor.DUMMY));
true, TaskMonitor.DUMMY));
} }
@Test @Test
@@ -811,7 +801,7 @@ public abstract class AbstractDBTraceMemoryManagerMemoryTest
DBHandle opened = new DBHandle(tmp.toFile()); DBHandle opened = new DBHandle(tmp.toFile());
DBTrace restored = null; DBTrace restored = null;
try { try {
restored = new DBTrace(opened, DBOpenMode.UPDATE, new ConsoleTaskMonitor(), this); restored = new DBTrace(opened, OpenMode.UPDATE, new ConsoleTaskMonitor(), this);
DBTraceMemorySpace rSpace = DBTraceMemorySpace rSpace =
restored.getMemoryManager().getMemorySpace(b.language.getDefaultDataSpace(), true); restored.getMemoryManager().getMemorySpace(b.language.getDefaultDataSpace(), true);
@@ -20,23 +20,22 @@ import java.io.IOException;
import db.DBHandle; import db.DBHandle;
import generic.depends.DependentServiceResolver; import generic.depends.DependentServiceResolver;
import generic.depends.err.*; import generic.depends.err.*;
import ghidra.util.database.DBOpenMode;
import ghidra.util.exception.CancelledException; import ghidra.util.exception.CancelledException;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
public abstract class DBDomainObjectSupport extends DomainObjectAdapterDB { public abstract class DBDomainObjectSupport extends DomainObjectAdapterDB {
private DBOpenMode openMode; private OpenMode openMode;
private TaskMonitor monitor; private TaskMonitor monitor;
private VersionException versionExc; private VersionException versionExc;
protected static interface ManagerSupplier<T> { protected static interface ManagerSupplier<T> {
T create(DBOpenMode openMode, TaskMonitor monitor) T create(OpenMode openMode, TaskMonitor monitor)
throws IOException, VersionException, CancelledException; throws IOException, VersionException, CancelledException;
} }
protected DBDomainObjectSupport(DBHandle dbh, DBOpenMode openMode, TaskMonitor monitor, protected DBDomainObjectSupport(DBHandle dbh, OpenMode openMode, TaskMonitor monitor,
String name, int timeInterval, int bufSize, Object consumer) { String name, int timeInterval, int bufSize, Object consumer) {
super(dbh, name, timeInterval, consumer); super(dbh, name, timeInterval, consumer);
this.openMode = openMode; this.openMode = openMode;
@@ -20,6 +20,7 @@ import java.util.concurrent.locks.*;
import db.DBHandle; import db.DBHandle;
import ghidra.framework.data.DBDomainObjectSupport; import ghidra.framework.data.DBDomainObjectSupport;
import ghidra.framework.data.OpenMode;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.Swing; import ghidra.util.Swing;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
@@ -163,7 +164,7 @@ public abstract class DBCachedDomainObjectAdapter extends DBDomainObjectSupport
/** /**
* @see {@link DBDomainObjectSupport} * @see {@link DBDomainObjectSupport}
*/ */
protected DBCachedDomainObjectAdapter(DBHandle dbh, DBOpenMode openMode, TaskMonitor monitor, protected DBCachedDomainObjectAdapter(DBHandle dbh, OpenMode openMode, TaskMonitor monitor,
String name, int timeInterval, int bufSize, Object consumer) { String name, int timeInterval, int bufSize, Object consumer) {
super(dbh, openMode, monitor, name, timeInterval, bufSize, consumer); super(dbh, openMode, monitor, name, timeInterval, bufSize, consumer);
this.rwLock = new GhidraLockWrappingRWLock(lock); this.rwLock = new GhidraLockWrappingRWLock(lock);
@@ -1,38 +0,0 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ghidra.util.database;
import db.DBConstants;
/**
* An enum, providing a type-safe version of {@link DBConstants}.
*/
public enum DBOpenMode {
CREATE(DBConstants.CREATE),
UPDATE(DBConstants.UPDATE),
READ_ONLY(DBConstants.READ_ONLY),
UPGRADE(DBConstants.UPGRADE);
private final int openMode;
private DBOpenMode(int openMode) {
this.openMode = openMode;
}
public int toInteger() {
return openMode;
}
}
@@ -23,6 +23,7 @@ import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import db.*; import db.*;
import ghidra.framework.data.OpenMode;
import ghidra.util.UniversalIdGenerator; import ghidra.util.UniversalIdGenerator;
import ghidra.util.database.annot.*; import ghidra.util.database.annot.*;
import ghidra.util.exception.VersionException; import ghidra.util.exception.VersionException;
@@ -35,7 +36,7 @@ public class DBCachedObjectStoreFactoryTest {
public static class MyDomainObject extends DBCachedDomainObjectAdapter { public static class MyDomainObject extends DBCachedDomainObjectAdapter {
protected MyDomainObject(DBHandle dbh, String name, Object consumer) { protected MyDomainObject(DBHandle dbh, String name, Object consumer) {
super(dbh, DBOpenMode.CREATE, TaskMonitor.DUMMY, name, 500, 1000, consumer); super(dbh, OpenMode.CREATE, TaskMonitor.DUMMY, name, 500, 1000, consumer);
} }
@Override @Override
@@ -33,6 +33,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
import org.junit.*; import org.junit.*;
import db.*; import db.*;
import ghidra.framework.data.OpenMode;
import ghidra.util.UniversalIdGenerator; import ghidra.util.UniversalIdGenerator;
import ghidra.util.database.DirectedIterator.Direction; import ghidra.util.database.DirectedIterator.Direction;
import ghidra.util.database.annot.*; import ghidra.util.database.annot.*;
@@ -67,7 +68,7 @@ public class DBCachedObjectStoreTest {
protected MyDomainObject(String name, int timeInterval, int bufSize, Object consumer) protected MyDomainObject(String name, int timeInterval, int bufSize, Object consumer)
throws VersionException, IOException { throws VersionException, IOException {
super(new DBHandle(), DBOpenMode.CREATE, new ConsoleTaskMonitor(), name, timeInterval, super(new DBHandle(), OpenMode.CREATE, new ConsoleTaskMonitor(), name, timeInterval,
bufSize, consumer); bufSize, consumer);
this.storeFactory = new DBCachedObjectStoreFactory(this); this.storeFactory = new DBCachedObjectStoreFactory(this);
try (Transaction tx = dbh.openTransaction(this)) { try (Transaction tx = dbh.openTransaction(this)) {
@@ -76,7 +77,7 @@ public class DBCachedObjectStoreTest {
} }
} }
protected MyDomainObject(DBHandle handle, DBOpenMode openMode, TaskMonitor monitor, protected MyDomainObject(DBHandle handle, OpenMode openMode, TaskMonitor monitor,
int timeInterval, int bufSize, Object consumer) int timeInterval, int bufSize, Object consumer)
throws VersionException, IOException { throws VersionException, IOException {
super(handle, openMode, monitor, null, timeInterval, bufSize, consumer); super(handle, openMode, monitor, null, timeInterval, bufSize, consumer);
@@ -311,8 +312,8 @@ public class DBCachedObjectStoreTest {
DBHandle opened = new DBHandle(tmp.toFile()); DBHandle opened = new DBHandle(tmp.toFile());
MyDomainObject restored = null; MyDomainObject restored = null;
try { try {
restored = new MyDomainObject(opened, DBOpenMode.READ_ONLY, new ConsoleTaskMonitor(), restored = new MyDomainObject(opened, OpenMode.IMMUTABLE, new ConsoleTaskMonitor(), 500,
500, 1000, this); 1000, this);
MyObject rObj = restored.store.getObjectAt(0x1234); MyObject rObj = restored.store.getObjectAt(0x1234);
assertEquals(0x811, rObj.f1); assertEquals(0x811, rObj.f1);
assertEquals(0x812, rObj.f2); assertEquals(0x812, rObj.f2);
@@ -1941,15 +1942,15 @@ public class DBCachedObjectStoreTest {
.map(Entry::getKey) .map(Entry::getKey)
.collect(Collectors.toList()); .collect(Collectors.toList());
assertEquals(List.of(-3L, -1L, 1L, 3L), list); assertEquals(List.of(-3L, -1L, 1L, 3L), list);
list = ((List<Entry<Long, ?>>) (List) Arrays.asList(entrySet.toArray(new Entry[4]))) list =
.stream() ((List<Entry<Long, ?>>) (List) Arrays.asList(entrySet.toArray(new Entry[4]))).stream()
.map(Entry::getKey) .map(Entry::getKey)
.collect(Collectors.toList()); .collect(Collectors.toList());
assertEquals(List.of(-3L, -1L, 1L, 3L), list); assertEquals(List.of(-3L, -1L, 1L, 3L), list);
list = ((List<Entry<Long, ?>>) (List) Arrays.asList(entrySet.toArray(new Entry[5]))) list =
.stream() ((List<Entry<Long, ?>>) (List) Arrays.asList(entrySet.toArray(new Entry[5]))).stream()
.map(nullable(Entry::getKey)) .map(nullable(Entry::getKey))
.collect(Collectors.toList()); .collect(Collectors.toList());
assertEquals(Arrays.asList(new Long[] { -3L, -1L, 1L, 3L, null }), list); assertEquals(Arrays.asList(new Long[] { -3L, -1L, 1L, 3L, null }), list);
List<Long> rList = List<Long> rList =
@@ -1957,15 +1958,15 @@ public class DBCachedObjectStoreTest {
.map(Entry::getKey) .map(Entry::getKey)
.collect(Collectors.toList()); .collect(Collectors.toList());
assertEquals(List.of(3L, 1L, -1L, -3L), rList); assertEquals(List.of(3L, 1L, -1L, -3L), rList);
rList = ((List<Entry<Long, ?>>) (List) Arrays.asList(rEntrySet.toArray(new Entry[4]))) rList =
.stream() ((List<Entry<Long, ?>>) (List) Arrays.asList(rEntrySet.toArray(new Entry[4]))).stream()
.map(Entry::getKey) .map(Entry::getKey)
.collect(Collectors.toList()); .collect(Collectors.toList());
assertEquals(List.of(3L, 1L, -1L, -3L), rList); assertEquals(List.of(3L, 1L, -1L, -3L), rList);
rList = ((List<Entry<Long, ?>>) (List) Arrays.asList(rEntrySet.toArray(new Entry[5]))) rList =
.stream() ((List<Entry<Long, ?>>) (List) Arrays.asList(rEntrySet.toArray(new Entry[5]))).stream()
.map(nullable(Entry::getKey)) .map(nullable(Entry::getKey))
.collect(Collectors.toList()); .collect(Collectors.toList());
assertEquals(Arrays.asList(new Long[] { 3L, 1L, -1L, -3L, null }), rList); assertEquals(Arrays.asList(new Long[] { 3L, 1L, -1L, -3L, null }), rList);
} }
@@ -2083,20 +2084,21 @@ public class DBCachedObjectStoreTest {
public void testAsEntrySetDescendingIterator() { public void testAsEntrySetDescendingIterator() {
populateStore(-3, -1, 1, 3); populateStore(-3, -1, 1, 3);
assertEquals(List.of(3L, 1L, -1L, -3L), IteratorUtils.toList(entrySet.descendingIterator()) assertEquals(List.of(3L, 1L, -1L, -3L),
.stream() IteratorUtils.toList(entrySet.descendingIterator())
.map(Entry::getKey) .stream()
.collect(Collectors.toList())); .map(Entry::getKey)
assertEquals(List.of(-3L, -1L, 1L, 3L), IteratorUtils.toList(rEntrySet.descendingIterator()) .collect(Collectors.toList()));
.stream() assertEquals(List.of(-3L, -1L, 1L, 3L),
.map(Entry::getKey) IteratorUtils.toList(rEntrySet.descendingIterator())
.collect(Collectors.toList())); .stream()
.map(Entry::getKey)
.collect(Collectors.toList()));
} }
@Test @Test
public void testAsEntrySetSubSet() { public void testAsEntrySetSubSet() {
assertEquals(map.subMap(1L, 2L).keySet().keySpan, assertEquals(map.subMap(1L, 2L).keySet().keySpan, entrySet.subSet(ent(1), ent(2)).keySpan);
entrySet.subSet(ent(1), ent(2)).keySpan);
assertEquals(rMap.subMap(2L, 1L).keySet().keySpan, assertEquals(rMap.subMap(2L, 1L).keySet().keySpan,
rEntrySet.subSet(ent(2), ent(1)).keySpan); rEntrySet.subSet(ent(2), ent(1)).keySpan);
assertEquals(map.subMap(1L, 2L).keySet().direction, assertEquals(map.subMap(1L, 2L).keySet().direction,
@@ -2123,10 +2125,10 @@ public class DBCachedObjectStoreTest {
new ArrayList<>(rEntrySet.subSet(ent(3), false, ent(-3), true)).stream() new ArrayList<>(rEntrySet.subSet(ent(3), false, ent(-3), true)).stream()
.map(Entry::getKey) .map(Entry::getKey)
.collect(Collectors.toList())); .collect(Collectors.toList()));
assertEquals(List.of(-3L, -1L, 1L), new ArrayList<>(entrySet.subSet(ent(-3), ent(3))) assertEquals(List.of(-3L, -1L, 1L),
.stream() new ArrayList<>(entrySet.subSet(ent(-3), ent(3))).stream()
.map(Entry::getKey) .map(Entry::getKey)
.collect(Collectors.toList())); .collect(Collectors.toList()));
assertEquals(List.of(-1L, 1L, 3L), assertEquals(List.of(-1L, 1L, 3L),
new ArrayList<>(entrySet.subSet(ent(-3), false, ent(3), true)).stream() new ArrayList<>(entrySet.subSet(ent(-3), false, ent(3), true)).stream()
@@ -2136,10 +2138,10 @@ public class DBCachedObjectStoreTest {
new ArrayList<>(rEntrySet.subSet(ent(3), true, ent(-3), false)).stream() new ArrayList<>(rEntrySet.subSet(ent(3), true, ent(-3), false)).stream()
.map(Entry::getKey) .map(Entry::getKey)
.collect(Collectors.toList())); .collect(Collectors.toList()));
assertEquals(List.of(3L, 1L, -1L), new ArrayList<>(rEntrySet.subSet(ent(3), ent(-3))) assertEquals(List.of(3L, 1L, -1L),
.stream() new ArrayList<>(rEntrySet.subSet(ent(3), ent(-3))).stream()
.map(Entry::getKey) .map(Entry::getKey)
.collect(Collectors.toList())); .collect(Collectors.toList()));
assertEquals(List.of(-3L, -1L, 1L, 3L), assertEquals(List.of(-3L, -1L, 1L, 3L),
new ArrayList<>(entrySet.subSet(ent(-3), true, ent(3), true)).stream() new ArrayList<>(entrySet.subSet(ent(-3), true, ent(3), true)).stream()
@@ -2160,27 +2162,32 @@ public class DBCachedObjectStoreTest {
populateStore(-5, -3, -1, 1, 3, 5); populateStore(-5, -3, -1, 1, 3, 5);
assertEquals(List.of(-5L, -3L), new ArrayList<>(entrySet.headSet(ent(-1), false)).stream() assertEquals(List.of(-5L, -3L),
.map(Entry::getKey) new ArrayList<>(entrySet.headSet(ent(-1), false)).stream()
.collect(Collectors.toList())); .map(Entry::getKey)
assertEquals(List.of(5L, 3L), new ArrayList<>(rEntrySet.headSet(ent(1), false)).stream() .collect(Collectors.toList()));
.map(Entry::getKey) assertEquals(List.of(5L, 3L),
.collect(Collectors.toList())); new ArrayList<>(rEntrySet.headSet(ent(1), false)).stream()
.map(Entry::getKey)
.collect(Collectors.toList()));
assertEquals(List.of(-5L, -3L, -1L), new ArrayList<>(entrySet.headSet(ent(-1), true)) assertEquals(List.of(-5L, -3L, -1L),
.stream() new ArrayList<>(entrySet.headSet(ent(-1), true)).stream()
.map(Entry::getKey) .map(Entry::getKey)
.collect(Collectors.toList())); .collect(Collectors.toList()));
assertEquals(List.of(5L, 3L, 1L), new ArrayList<>(rEntrySet.headSet(ent(1), true)).stream() assertEquals(List.of(5L, 3L, 1L),
.map(Entry::getKey) new ArrayList<>(rEntrySet.headSet(ent(1), true)).stream()
.collect(Collectors.toList())); .map(Entry::getKey)
.collect(Collectors.toList()));
assertEquals(List.of(-5L, -3L), new ArrayList<>(entrySet.headSet(ent(-1))).stream() assertEquals(List.of(-5L, -3L),
.map(Entry::getKey) new ArrayList<>(entrySet.headSet(ent(-1))).stream()
.collect(Collectors.toList())); .map(Entry::getKey)
assertEquals(List.of(5L, 3L), new ArrayList<>(rEntrySet.headSet(ent(1))).stream() .collect(Collectors.toList()));
.map(Entry::getKey) assertEquals(List.of(5L, 3L),
.collect(Collectors.toList())); new ArrayList<>(rEntrySet.headSet(ent(1))).stream()
.map(Entry::getKey)
.collect(Collectors.toList()));
} }
@Test @Test
@@ -2192,27 +2199,32 @@ public class DBCachedObjectStoreTest {
populateStore(-5, -3, -1, 1, 3, 5); populateStore(-5, -3, -1, 1, 3, 5);
assertEquals(List.of(3L, 5L), new ArrayList<>(entrySet.tailSet(ent(1), false)).stream() assertEquals(List.of(3L, 5L),
.map(Entry::getKey) new ArrayList<>(entrySet.tailSet(ent(1), false)).stream()
.collect(Collectors.toList())); .map(Entry::getKey)
assertEquals(List.of(-3L, -5L), new ArrayList<>(rEntrySet.tailSet(ent(-1), false)).stream() .collect(Collectors.toList()));
.map(Entry::getKey) assertEquals(List.of(-3L, -5L),
.collect(Collectors.toList())); new ArrayList<>(rEntrySet.tailSet(ent(-1), false)).stream()
.map(Entry::getKey)
.collect(Collectors.toList()));
assertEquals(List.of(1L, 3L, 5L), new ArrayList<>(entrySet.tailSet(ent(1), true)).stream() assertEquals(List.of(1L, 3L, 5L),
.map(Entry::getKey) new ArrayList<>(entrySet.tailSet(ent(1), true)).stream()
.collect(Collectors.toList())); .map(Entry::getKey)
assertEquals(List.of(-1L, -3L, -5L), new ArrayList<>(rEntrySet.tailSet(ent(-1), true)) .collect(Collectors.toList()));
.stream() assertEquals(List.of(-1L, -3L, -5L),
.map(Entry::getKey) new ArrayList<>(rEntrySet.tailSet(ent(-1), true)).stream()
.collect(Collectors.toList())); .map(Entry::getKey)
.collect(Collectors.toList()));
assertEquals(List.of(1L, 3L, 5L), new ArrayList<>(entrySet.tailSet(ent(1))).stream() assertEquals(List.of(1L, 3L, 5L),
.map(Entry::getKey) new ArrayList<>(entrySet.tailSet(ent(1))).stream()
.collect(Collectors.toList())); .map(Entry::getKey)
assertEquals(List.of(-1L, -3L, -5L), new ArrayList<>(rEntrySet.tailSet(ent(-1))).stream() .collect(Collectors.toList()));
.map(Entry::getKey) assertEquals(List.of(-1L, -3L, -5L),
.collect(Collectors.toList())); new ArrayList<>(rEntrySet.tailSet(ent(-1))).stream()
.map(Entry::getKey)
.collect(Collectors.toList()));
} }
@Test @Test
@@ -39,6 +39,7 @@ import org.junit.*;
import db.*; import db.*;
import generic.theme.GThemeDefaults.Colors.Palette; import generic.theme.GThemeDefaults.Colors.Palette;
import ghidra.framework.data.OpenMode;
import ghidra.util.ColorUtils; import ghidra.util.ColorUtils;
import ghidra.util.LockHold; import ghidra.util.LockHold;
import ghidra.util.database.*; import ghidra.util.database.*;
@@ -540,8 +541,9 @@ public class RStarTreeMapTest {
int x = e.getX() * rootWidth / getWidth(); int x = e.getX() * rootWidth / getWidth();
int y = e.getY() * rootHeight / getHeight(); int y = e.getY() * rootHeight / getHeight();
selected.clear(); selected.clear();
selected.addAll(asSpatialMap().reduce( selected.addAll(
IntRectQuery.intersecting(rect(x, x, y, y))).keys()); asSpatialMap().reduce(IntRectQuery.intersecting(rect(x, x, y, y)))
.keys());
repaint(); repaint();
} }
}); });
@@ -632,23 +634,23 @@ public class RStarTreeMapTest {
public final SpatialMap<IntRect, String, IntRectQuery> map; public final SpatialMap<IntRect, String, IntRectQuery> map;
public MyDomainObject(Object consumer) throws IOException, VersionException { public MyDomainObject(Object consumer) throws IOException, VersionException {
super(new DBHandle(), DBOpenMode.CREATE, new ConsoleTaskMonitor(), "Testing", 500, 1000, super(new DBHandle(), OpenMode.CREATE, new ConsoleTaskMonitor(), "Testing", 500, 1000,
consumer); consumer);
storeFactory = new DBCachedObjectStoreFactory(this); storeFactory = new DBCachedObjectStoreFactory(this);
try (Transaction tx = openTransaction("CreateMaps")) { try (Transaction tx = openTransaction("CreateMaps")) {
tree = new IntRStarTree(storeFactory, DBIntRectStringDataRecord.TABLE_NAME, tree = new IntRStarTree(storeFactory, DBIntRectStringDataRecord.TABLE_NAME, true,
true, MAX_CHILDREN); MAX_CHILDREN);
map = tree.asSpatialMap(); map = tree.asSpatialMap();
} }
} }
protected MyDomainObject(File file, Object consumer) throws IOException, VersionException { protected MyDomainObject(File file, Object consumer) throws IOException, VersionException {
super(new DBHandle(file), DBOpenMode.UPDATE, new ConsoleTaskMonitor(), "Testing", 500, super(new DBHandle(file), OpenMode.UPDATE, new ConsoleTaskMonitor(), "Testing", 500,
1000, consumer); 1000, consumer);
storeFactory = new DBCachedObjectStoreFactory(this); storeFactory = new DBCachedObjectStoreFactory(this);
// No transaction, as tree should already exist // No transaction, as tree should already exist
tree = new IntRStarTree(storeFactory, DBIntRectStringDataRecord.TABLE_NAME, tree = new IntRStarTree(storeFactory, DBIntRectStringDataRecord.TABLE_NAME, true,
true, MAX_CHILDREN); MAX_CHILDREN);
map = tree.asSpatialMap(); map = tree.asSpatialMap();
} }
@@ -767,10 +769,10 @@ public class RStarTreeMapTest {
IntRect queryRect1 = rect(1, 1, 12, 13); IntRect queryRect1 = rect(1, 1, 12, 13);
IntRect queryRect2 = rect(4, 4, 12, 13); IntRect queryRect2 = rect(4, 4, 12, 13);
List<IntRect> expected = new ArrayList<>(); List<IntRect> expected = new ArrayList<>();
IteratorUtils.filteredIterator(allRects(range), IteratorUtils
r -> queryRect1.intersects(r) && queryRect2.intersects(r)) .filteredIterator(allRects(range),
.forEachRemaining( r -> queryRect1.intersects(r) && queryRect2.intersects(r))
expected::add); .forEachRemaining(expected::add);
System.out.println(expected); System.out.println(expected);
@@ -934,8 +936,7 @@ public class RStarTreeMapTest {
loaded = new MyDomainObject(tmp.toFile(), this); loaded = new MyDomainObject(tmp.toFile(), this);
assert loaded.map.entries() assert loaded.map.entries()
.contains( .contains(new ImmutablePair<>(rect(1, 5, 6, 10), "Some value"));
new ImmutablePair<>(rect(1, 5, 6, 10), "Some value"));
} }
finally { finally {
if (loaded != null) { if (loaded != null) {
@@ -1002,18 +1003,16 @@ public class RStarTreeMapTest {
obj.map.reduce(IntRectQuery.enclosed(rect(12, 12, 6, 6))).firstValue()); obj.map.reduce(IntRectQuery.enclosed(rect(12, 12, 6, 6))).firstValue());
assertEquals("Point(12,6)", assertEquals("Point(12,6)",
obj.map.reduce(IntRectQuery.enclosed(rect(1, 12, 6, 6)) obj.map.reduce(
.starting( IntRectQuery.enclosed(rect(1, 12, 6, 6)).starting(Rectangle2DDirection.RIGHTMOST))
Rectangle2DDirection.RIGHTMOST)) .firstValue());
assertEquals("Point(6,1)",
obj.map.reduce(
IntRectQuery.enclosed(rect(6, 6, 1, 12)).starting(Rectangle2DDirection.BOTTOMMOST))
.firstValue()); .firstValue());
assertEquals("Point(6,1)", obj.map.reduce(IntRectQuery.enclosed(rect(6, 6, 1, 12))
.starting(
Rectangle2DDirection.BOTTOMMOST))
.firstValue());
assertEquals("Point(6,12)", assertEquals("Point(6,12)",
obj.map.reduce(IntRectQuery.enclosed(rect(6, 6, 1, 12)) obj.map.reduce(
.starting( IntRectQuery.enclosed(rect(6, 6, 1, 12)).starting(Rectangle2DDirection.TOPMOST))
Rectangle2DDirection.TOPMOST))
.firstValue()); .firstValue());
} }
@@ -1036,14 +1035,12 @@ public class RStarTreeMapTest {
actual.clear(); actual.clear();
points.stream() points.stream()
.filter(e -> e.getKey().enclosedBy(rect(1, 6, 1, 12))) .filter(e -> e.getKey().enclosedBy(rect(1, 6, 1, 12)))
.forEach( .forEach(e -> expected.put(e.getKey(), e.getValue()));
e -> expected.put(e.getKey(), e.getValue()));
assertEquals(72, expected.size()); // Sanity check on expected assertEquals(72, expected.size()); // Sanity check on expected
obj.map.reduce(IntRectQuery.enclosed(rect(1, 6, 1, 12))) obj.map.reduce(IntRectQuery.enclosed(rect(1, 6, 1, 12)))
.entries() .entries()
.stream() .stream()
.forEach( .forEach(e -> actual.put(e.getKey(), e.getValue()));
e -> actual.put(e.getKey(), e.getValue()));
assertEquals(expected, actual); assertEquals(expected, actual);
} }
@@ -1068,9 +1065,8 @@ public class RStarTreeMapTest {
expected = List.of("Point(6,6)", "Point(5,6)", "Point(4,6)", "Point(3,6)", "Point(2,6)", expected = List.of("Point(6,6)", "Point(5,6)", "Point(4,6)", "Point(3,6)", "Point(2,6)",
"Point(1,6)"); "Point(1,6)");
actual = new ArrayList<>(obj.map.reduce(IntRectQuery.enclosed(rect(1, 6, 6, 6)) actual = new ArrayList<>(obj.map.reduce(
.starting( IntRectQuery.enclosed(rect(1, 6, 6, 6)).starting(Rectangle2DDirection.RIGHTMOST))
Rectangle2DDirection.RIGHTMOST))
.orderedValues()); .orderedValues());
} }
@@ -1123,8 +1119,7 @@ public class RStarTreeMapTest {
Map<IntRect, String> actual = new HashMap<>(); Map<IntRect, String> actual = new HashMap<>();
points.stream() points.stream()
.filter(e -> e.getKey().enclosedBy(rect(7, 12, 1, 12))) .filter(e -> e.getKey().enclosedBy(rect(7, 12, 1, 12)))
.forEach( .forEach(e -> expected.put(e.getKey(), e.getValue()));
e -> expected.put(e.getKey(), e.getValue()));
obj.map.entries().stream().forEach(e -> actual.put(e.getKey(), e.getValue())); obj.map.entries().stream().forEach(e -> actual.put(e.getKey(), e.getValue()));
assertEquals(expected, actual); assertEquals(expected, actual);
@@ -16,9 +16,9 @@
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import db.DBConstants;
import db.DBHandle; import db.DBHandle;
import ghidra.app.script.GhidraScript; import ghidra.app.script.GhidraScript;
import ghidra.framework.data.OpenMode;
import ghidra.framework.store.db.PackedDatabase; import ghidra.framework.store.db.PackedDatabase;
import ghidra.program.database.ProgramDB; import ghidra.program.database.ProgramDB;
import ghidra.program.model.lang.LanguageNotFoundException; import ghidra.program.model.lang.LanguageNotFoundException;
@@ -75,8 +75,8 @@ public class UpgradeTestProgramScript extends GhidraScript {
} }
} }
private boolean upgradeProgramArchive(File gzf) throws IOException, CancelledException, private boolean upgradeProgramArchive(File gzf)
VersionException { throws IOException, CancelledException, VersionException {
PackedDatabase db = PackedDatabase.getPackedDatabase(gzf, TaskMonitor.DUMMY); PackedDatabase db = PackedDatabase.getPackedDatabase(gzf, TaskMonitor.DUMMY);
DBHandle dbh = null; DBHandle dbh = null;
@@ -89,7 +89,7 @@ public class UpgradeTestProgramScript extends GhidraScript {
} }
try { try {
p = new ProgramDB(dbh, DBConstants.UPDATE, monitor, this); p = new ProgramDB(dbh, OpenMode.UPDATE, monitor, this);
return false; return false;
} }
catch (LanguageNotFoundException e) { catch (LanguageNotFoundException e) {
@@ -107,7 +107,7 @@ public class UpgradeTestProgramScript extends GhidraScript {
} }
dbh = db.openForUpdate(monitor); dbh = db.openForUpdate(monitor);
p = new ProgramDB(dbh, DBConstants.UPGRADE, monitor, this); p = new ProgramDB(dbh, OpenMode.UPGRADE, monitor, this);
if (!p.isChanged()) { if (!p.isChanged()) {
return false; return false;
@@ -20,12 +20,12 @@ import java.util.*;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
import db.DBConstants;
import db.DBHandle; import db.DBHandle;
import ghidra.app.util.Option; import ghidra.app.util.Option;
import ghidra.app.util.bin.ByteProvider; import ghidra.app.util.bin.ByteProvider;
import ghidra.app.util.importer.MessageLog; import ghidra.app.util.importer.MessageLog;
import ghidra.framework.Application; import ghidra.framework.Application;
import ghidra.framework.data.OpenMode;
import ghidra.framework.model.DomainObject; import ghidra.framework.model.DomainObject;
import ghidra.framework.model.Project; import ghidra.framework.model.Project;
import ghidra.framework.store.db.PackedDatabase; import ghidra.framework.store.db.PackedDatabase;
@@ -55,8 +55,8 @@ public class GdtLoader implements Loader {
@Override @Override
public LoadResults<? extends DomainObject> load(ByteProvider provider, String filename, public LoadResults<? extends DomainObject> load(ByteProvider provider, String filename,
Project project, String projectFolderPath, LoadSpec loadSpec, List<Option> options, Project project, String projectFolderPath, LoadSpec loadSpec, List<Option> options,
MessageLog messageLog, Object consumer, TaskMonitor monitor) throws IOException, MessageLog messageLog, Object consumer, TaskMonitor monitor)
CancelledException, VersionException { throws IOException, CancelledException, VersionException {
DataTypeArchive dtArchive = DataTypeArchive dtArchive =
loadPackedProgramDatabase(provider, filename, consumer, monitor); loadPackedProgramDatabase(provider, filename, consumer, monitor);
@@ -78,15 +78,15 @@ public class GdtLoader implements Loader {
boolean success = false; boolean success = false;
DBHandle dbh = null; DBHandle dbh = null;
try { try {
if (!DataTypeArchiveContentHandler.DATA_TYPE_ARCHIVE_CONTENT_TYPE.equals( if (!DataTypeArchiveContentHandler.DATA_TYPE_ARCHIVE_CONTENT_TYPE
packedDatabase.getContentType())) { .equals(packedDatabase.getContentType())) {
throw new IOException("File imported is not a Program: " + programName); throw new IOException("File imported is not a Program: " + programName);
} }
monitor.setMessage("Restoring " + provider.getName()); monitor.setMessage("Restoring " + provider.getName());
dbh = packedDatabase.open(monitor); dbh = packedDatabase.open(monitor);
dtArchive = new DataTypeArchiveDB(dbh, DBConstants.UPGRADE, monitor, consumer); dtArchive = new DataTypeArchiveDB(dbh, OpenMode.UPGRADE, monitor, consumer);
success = true; success = true;
} }
finally { finally {
@@ -116,7 +116,8 @@ public class GdtLoader implements Loader {
} }
@Override @Override
public String validateOptions(ByteProvider provider, LoadSpec loadSpec, List<Option> options, Program program) { public String validateOptions(ByteProvider provider, LoadSpec loadSpec, List<Option> options,
Program program) {
if (options != null && options.size() > 0) { if (options != null && options.size() > 0) {
return "GDTLoader takes no options"; return "GDTLoader takes no options";
} }
@@ -20,12 +20,12 @@ import java.util.*;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
import db.DBConstants;
import db.DBHandle; import db.DBHandle;
import ghidra.app.util.Option; import ghidra.app.util.Option;
import ghidra.app.util.bin.ByteProvider; import ghidra.app.util.bin.ByteProvider;
import ghidra.app.util.importer.MessageLog; import ghidra.app.util.importer.MessageLog;
import ghidra.framework.Application; import ghidra.framework.Application;
import ghidra.framework.data.OpenMode;
import ghidra.framework.model.DomainObject; import ghidra.framework.model.DomainObject;
import ghidra.framework.model.Project; import ghidra.framework.model.Project;
import ghidra.framework.store.db.PackedDatabase; import ghidra.framework.store.db.PackedDatabase;
@@ -57,7 +57,8 @@ public class GzfLoader implements Loader {
} }
@Override @Override
public String validateOptions(ByteProvider provider, LoadSpec loadSpec, List<Option> options, Program program) { public String validateOptions(ByteProvider provider, LoadSpec loadSpec, List<Option> options,
Program program) {
if (options != null && options.size() > 0) { if (options != null && options.size() > 0) {
return "GzfLoader takes no options"; return "GzfLoader takes no options";
} }
@@ -73,8 +74,8 @@ public class GzfLoader implements Loader {
@Override @Override
public LoadResults<? extends DomainObject> load(ByteProvider provider, String programName, public LoadResults<? extends DomainObject> load(ByteProvider provider, String programName,
Project project, String projectFolderPath, LoadSpec loadSpec, List<Option> options, Project project, String projectFolderPath, LoadSpec loadSpec, List<Option> options,
MessageLog messageLog, Object consumer, TaskMonitor monitor) throws IOException, MessageLog messageLog, Object consumer, TaskMonitor monitor)
CancelledException, VersionException { throws IOException, CancelledException, VersionException {
Program program = loadPackedProgramDatabase(provider, programName, consumer, monitor); Program program = loadPackedProgramDatabase(provider, programName, consumer, monitor);
return new LoadResults<>(program, programName, projectFolderPath); return new LoadResults<>(program, programName, projectFolderPath);
@@ -95,15 +96,15 @@ public class GzfLoader implements Loader {
boolean success = false; boolean success = false;
DBHandle dbh = null; DBHandle dbh = null;
try { try {
if (!ProgramContentHandler.PROGRAM_CONTENT_TYPE.equals( if (!ProgramContentHandler.PROGRAM_CONTENT_TYPE
packedDatabase.getContentType())) { .equals(packedDatabase.getContentType())) {
throw new IOException("File imported is not a Program: " + programName); throw new IOException("File imported is not a Program: " + programName);
} }
monitor.setMessage("Restoring " + provider.getName()); monitor.setMessage("Restoring " + provider.getName());
dbh = packedDatabase.open(monitor); dbh = packedDatabase.open(monitor);
program = new ProgramDB(dbh, DBConstants.UPGRADE, monitor, consumer); program = new ProgramDB(dbh, OpenMode.UPGRADE, monitor, consumer);
success = true; success = true;
} }
finally { finally {
@@ -18,12 +18,12 @@ package ghidra.test;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import db.DBConstants;
import db.DBHandle; import db.DBHandle;
import db.buffers.BufferFile; import db.buffers.BufferFile;
import generic.test.*; import generic.test.*;
import ghidra.app.util.xml.*; import ghidra.app.util.xml.*;
import ghidra.framework.data.DomainObjectAdapterDB; import ghidra.framework.data.DomainObjectAdapterDB;
import ghidra.framework.data.OpenMode;
import ghidra.framework.model.*; import ghidra.framework.model.*;
import ghidra.framework.store.db.PrivateDatabase; import ghidra.framework.store.db.PrivateDatabase;
import ghidra.program.database.ProgramDB; import ghidra.program.database.ProgramDB;
@@ -289,7 +289,7 @@ public class TestProgramManager {
boolean success = false; boolean success = false;
try { try {
dbh = db.open(TaskMonitor.DUMMY); dbh = db.open(TaskMonitor.DUMMY);
program = new ProgramDB(dbh, DBConstants.UPDATE, null, this); program = new ProgramDB(dbh, OpenMode.UPDATE, null, this);
success = true; success = true;
} }
catch (VersionException ve) { catch (VersionException ve) {
@@ -320,7 +320,7 @@ public class TestProgramManager {
Msg.info(this, message + (endTime - startTime)); Msg.info(this, message + (endTime - startTime));
dbh = db.open(TaskMonitor.DUMMY); dbh = db.open(TaskMonitor.DUMMY);
program = new ProgramDB(dbh, DBConstants.UPDATE, null, this); program = new ProgramDB(dbh, OpenMode.UPDATE, null, this);
dbh = null; dbh = null;
success = true; success = true;
} }
@@ -466,8 +466,7 @@ public class TestProgramManager {
DBHandle dbh = db.openForUpdate(TaskMonitor.DUMMY); DBHandle dbh = db.openForUpdate(TaskMonitor.DUMMY);
try { try {
ProgramDB program = ProgramDB program = new ProgramDB(dbh, OpenMode.UPGRADE, TaskMonitor.DUMMY, this);
new ProgramDB(dbh, DBConstants.UPGRADE, TaskMonitor.DUMMY, this);
if (dbh != null) { if (dbh != null) {
dbh.save(null, null, TaskMonitor.DUMMY); dbh.save(null, null, TaskMonitor.DUMMY);
} }
@@ -84,7 +84,7 @@ public class FunctionWindowPluginTest extends AbstractGhidraHeadedIntegrationTes
int numData = functionTable.getRowCount(); int numData = functionTable.getRowCount();
CompoundCmd cmd = new CompoundCmd("Clear"); CompoundCmd<Program> cmd = new CompoundCmd<>("Clear");
FunctionIterator itr = program.getListing().getFunctions(true); FunctionIterator itr = program.getListing().getFunctions(true);
while (itr.hasNext()) { while (itr.hasNext()) {
Function f = itr.next(); Function f = itr.next();
@@ -23,8 +23,10 @@ import java.util.Iterator;
import org.junit.*; import org.junit.*;
import db.*; import db.DBHandle;
import db.Table;
import db.util.ErrorHandler; import db.util.ErrorHandler;
import ghidra.framework.data.OpenMode;
import ghidra.program.database.ProgramBuilder; import ghidra.program.database.ProgramBuilder;
import ghidra.program.database.ProgramDB; import ghidra.program.database.ProgramDB;
import ghidra.program.database.map.AddressMap; import ghidra.program.database.map.AddressMap;
@@ -153,9 +155,8 @@ public class DBPropertyMapManagerTest extends AbstractGhidraHeadedIntegrationTes
program = null; program = null;
dbh = new DBHandle(dbFile); dbh = new DBHandle(dbFile);
mgr = mgr = new DBPropertyMapManager(dbh, changeMgr, addrMap, OpenMode.UPDATE, new Lock("TEST"),
new DBPropertyMapManager(dbh, changeMgr, addrMap, DBConstants.UPDATE, new Lock("TEST"), TaskMonitor.DUMMY);
TaskMonitor.DUMMY);
PropertyMap<?> pmap = mgr.getPropertyMap("TEST"); PropertyMap<?> pmap = mgr.getPropertyMap("TEST");
assertEquals(1, pmap.getSize()); assertEquals(1, pmap.getSize());
} }
@@ -171,9 +172,8 @@ public class DBPropertyMapManagerTest extends AbstractGhidraHeadedIntegrationTes
program = null; program = null;
dbh = new DBHandle(dbFile); dbh = new DBHandle(dbFile);
mgr = mgr = new DBPropertyMapManager(dbh, changeMgr, addrMap, OpenMode.UPDATE, new Lock("TEST"),
new DBPropertyMapManager(dbh, changeMgr, addrMap, DBConstants.UPDATE, new Lock("TEST"), TaskMonitor.DUMMY);
TaskMonitor.DUMMY);
PropertyMap<?> pmap = mgr.getPropertyMap("TEST"); PropertyMap<?> pmap = mgr.getPropertyMap("TEST");
assertEquals(1, pmap.getSize()); assertEquals(1, pmap.getSize());
} }
@@ -189,9 +189,8 @@ public class DBPropertyMapManagerTest extends AbstractGhidraHeadedIntegrationTes
program = null; program = null;
dbh = new DBHandle(dbFile); dbh = new DBHandle(dbFile);
mgr = mgr = new DBPropertyMapManager(dbh, changeMgr, addrMap, OpenMode.UPDATE, new Lock("TEST"),
new DBPropertyMapManager(dbh, changeMgr, addrMap, DBConstants.UPDATE, new Lock("TEST"), TaskMonitor.DUMMY);
TaskMonitor.DUMMY);
PropertyMap<?> pmap = mgr.getPropertyMap("TEST"); PropertyMap<?> pmap = mgr.getPropertyMap("TEST");
assertEquals(1, pmap.getSize()); assertEquals(1, pmap.getSize());
} }
@@ -207,9 +206,8 @@ public class DBPropertyMapManagerTest extends AbstractGhidraHeadedIntegrationTes
program = null; program = null;
dbh = new DBHandle(dbFile); dbh = new DBHandle(dbFile);
mgr = mgr = new DBPropertyMapManager(dbh, changeMgr, addrMap, OpenMode.UPDATE, new Lock("TEST"),
new DBPropertyMapManager(dbh, changeMgr, addrMap, DBConstants.UPDATE, new Lock("TEST"), TaskMonitor.DUMMY);
TaskMonitor.DUMMY);
PropertyMap<?> pmap = mgr.getPropertyMap("TEST"); PropertyMap<?> pmap = mgr.getPropertyMap("TEST");
assertEquals(1, pmap.getSize()); assertEquals(1, pmap.getSize());
} }
@@ -226,9 +224,8 @@ public class DBPropertyMapManagerTest extends AbstractGhidraHeadedIntegrationTes
program = null; program = null;
dbh = new DBHandle(dbFile); dbh = new DBHandle(dbFile);
mgr = mgr = new DBPropertyMapManager(dbh, changeMgr, addrMap, OpenMode.UPDATE, new Lock("TEST"),
new DBPropertyMapManager(dbh, changeMgr, addrMap, DBConstants.UPDATE, new Lock("TEST"), TaskMonitor.DUMMY);
TaskMonitor.DUMMY);
PropertyMap<?> pmap = mgr.getPropertyMap("TEST"); PropertyMap<?> pmap = mgr.getPropertyMap("TEST");
assertEquals(1, pmap.getSize()); assertEquals(1, pmap.getSize());
} }
@@ -244,9 +241,8 @@ public class DBPropertyMapManagerTest extends AbstractGhidraHeadedIntegrationTes
program = null; program = null;
dbh = new DBHandle(dbFile); dbh = new DBHandle(dbFile);
mgr = mgr = new DBPropertyMapManager(dbh, changeMgr, addrMap, OpenMode.UPDATE, new Lock("TEST"),
new DBPropertyMapManager(dbh, changeMgr, addrMap, DBConstants.UPDATE, new Lock("TEST"), TaskMonitor.DUMMY);
TaskMonitor.DUMMY);
PropertyMap<?> pmap = mgr.getPropertyMap("TEST"); PropertyMap<?> pmap = mgr.getPropertyMap("TEST");
assertEquals(1, pmap.getSize()); assertEquals(1, pmap.getSize());
} }
@@ -263,9 +259,8 @@ public class DBPropertyMapManagerTest extends AbstractGhidraHeadedIntegrationTes
dbh = new DBHandle(dbFile); dbh = new DBHandle(dbFile);
dbh.startTransaction(); dbh.startTransaction();
mgr = mgr = new DBPropertyMapManager(dbh, changeMgr, addrMap, OpenMode.UPDATE, new Lock("TEST"),
new DBPropertyMapManager(dbh, changeMgr, addrMap, DBConstants.UPDATE, new Lock("TEST"), TaskMonitor.DUMMY);
TaskMonitor.DUMMY);
mgr.removePropertyMap("TEST"); mgr.removePropertyMap("TEST");
assertNull(mgr.getIntPropertyMap("TEST")); assertNull(mgr.getIntPropertyMap("TEST"));
@@ -282,9 +277,8 @@ public class DBPropertyMapManagerTest extends AbstractGhidraHeadedIntegrationTes
program = null; program = null;
dbh = new DBHandle(dbFile); dbh = new DBHandle(dbFile);
mgr = mgr = new DBPropertyMapManager(dbh, changeMgr, addrMap, OpenMode.UPDATE, new Lock("TEST"),
new DBPropertyMapManager(dbh, changeMgr, addrMap, DBConstants.UPDATE, new Lock("TEST"), TaskMonitor.DUMMY);
TaskMonitor.DUMMY);
int cnt = 0; int cnt = 0;
Iterator<String> iter = mgr.propertyManagers(); Iterator<String> iter = mgr.propertyManagers();
@@ -22,8 +22,10 @@ import java.util.Random;
import org.junit.*; import org.junit.*;
import db.*; import db.DBHandle;
import db.Table;
import db.util.ErrorHandler; import db.util.ErrorHandler;
import ghidra.framework.data.OpenMode;
import ghidra.program.database.ProgramBuilder; import ghidra.program.database.ProgramBuilder;
import ghidra.program.database.ProgramDB; import ghidra.program.database.ProgramDB;
import ghidra.program.database.map.AddressMap; import ghidra.program.database.map.AddressMap;
@@ -36,7 +38,8 @@ import ghidra.util.task.TaskMonitor;
/** /**
* *
*/ */
public class IntPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest implements ErrorHandler { public class IntPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest
implements ErrorHandler {
private DBHandle db; private DBHandle db;
private ProgramDB program; private ProgramDB program;
@@ -81,8 +84,8 @@ public class IntPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest im
} }
private void createPropertyMap(String name) throws Exception { private void createPropertyMap(String name) throws Exception {
propertyMap = new IntPropertyMapDB(db, DBConstants.CREATE, this, null, addrMap, name, propertyMap =
TaskMonitor.DUMMY); new IntPropertyMapDB(db, OpenMode.CREATE, this, null, addrMap, name, TaskMonitor.DUMMY);
propertyMap.setCacheSize(2); propertyMap.setCacheSize(2);
} }
@@ -22,8 +22,10 @@ import java.util.Random;
import org.junit.*; import org.junit.*;
import db.*; import db.DBHandle;
import db.Table;
import db.util.ErrorHandler; import db.util.ErrorHandler;
import ghidra.framework.data.OpenMode;
import ghidra.program.database.ProgramBuilder; import ghidra.program.database.ProgramBuilder;
import ghidra.program.database.ProgramDB; import ghidra.program.database.ProgramDB;
import ghidra.program.database.map.AddressMap; import ghidra.program.database.map.AddressMap;
@@ -36,7 +38,8 @@ import ghidra.util.task.TaskMonitor;
/** /**
* *
*/ */
public class LongPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest implements ErrorHandler { public class LongPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest
implements ErrorHandler {
private DBHandle db; private DBHandle db;
private ProgramDB program; private ProgramDB program;
@@ -81,7 +84,7 @@ public class LongPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest i
} }
private void createPropertyMap(String name) throws Exception { private void createPropertyMap(String name) throws Exception {
propertyMap = new LongPropertyMapDB(db, DBConstants.CREATE, this, null, addrMap, name, propertyMap = new LongPropertyMapDB(db, OpenMode.CREATE, this, null, addrMap, name,
TaskMonitor.DUMMY); TaskMonitor.DUMMY);
propertyMap.setCacheSize(2); propertyMap.setCacheSize(2);
} }
@@ -22,8 +22,10 @@ import java.util.Random;
import org.junit.*; import org.junit.*;
import db.*; import db.DBHandle;
import db.Table;
import db.util.ErrorHandler; import db.util.ErrorHandler;
import ghidra.framework.data.OpenMode;
import ghidra.program.database.ProgramBuilder; import ghidra.program.database.ProgramBuilder;
import ghidra.program.database.ProgramDB; import ghidra.program.database.ProgramDB;
import ghidra.program.database.map.AddressMap; import ghidra.program.database.map.AddressMap;
@@ -35,7 +37,8 @@ import ghidra.util.task.TaskMonitor;
/** /**
* *
*/ */
public class ObjectPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest implements ErrorHandler { public class ObjectPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest
implements ErrorHandler {
private DBHandle db; private DBHandle db;
private ProgramDB program; private ProgramDB program;
@@ -86,7 +89,7 @@ public class ObjectPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest
} }
private void createPropertyMap(String name) throws Exception { private void createPropertyMap(String name) throws Exception {
propertyMap = new ObjectPropertyMapDB<>(db, DBConstants.CREATE, this, null, addrMap, name, propertyMap = new ObjectPropertyMapDB<>(db, OpenMode.CREATE, this, null, addrMap, name,
TestSaveable.class, TaskMonitor.DUMMY, true); TestSaveable.class, TaskMonitor.DUMMY, true);
propertyMap.setCacheSize(2); propertyMap.setCacheSize(2);
} }
@@ -22,8 +22,10 @@ import java.util.Random;
import org.junit.*; import org.junit.*;
import db.*; import db.DBHandle;
import db.Table;
import db.util.ErrorHandler; import db.util.ErrorHandler;
import ghidra.framework.data.OpenMode;
import ghidra.program.database.ProgramBuilder; import ghidra.program.database.ProgramBuilder;
import ghidra.program.database.ProgramDB; import ghidra.program.database.ProgramDB;
import ghidra.program.database.map.AddressMap; import ghidra.program.database.map.AddressMap;
@@ -32,7 +34,8 @@ import ghidra.program.model.address.*;
import ghidra.test.AbstractGhidraHeadlessIntegrationTest; import ghidra.test.AbstractGhidraHeadlessIntegrationTest;
import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitor;
public class StringPropertyMapDBTest extends AbstractGhidraHeadlessIntegrationTest implements ErrorHandler { public class StringPropertyMapDBTest extends AbstractGhidraHeadlessIntegrationTest
implements ErrorHandler {
private DBHandle db; private DBHandle db;
private ProgramDB program; private ProgramDB program;
@@ -76,7 +79,7 @@ public class StringPropertyMapDBTest extends AbstractGhidraHeadlessIntegrationTe
} }
private void createPropertyMap(String name) throws Exception { private void createPropertyMap(String name) throws Exception {
propertyMap = new StringPropertyMapDB(db, DBConstants.CREATE, this, null, addrMap, name, propertyMap = new StringPropertyMapDB(db, OpenMode.CREATE, this, null, addrMap, name,
TaskMonitor.DUMMY); TaskMonitor.DUMMY);
propertyMap.setCacheSize(2); propertyMap.setCacheSize(2);
} }
@@ -21,8 +21,10 @@ import java.io.IOException;
import org.junit.*; import org.junit.*;
import db.*; import db.DBHandle;
import db.Table;
import db.util.ErrorHandler; import db.util.ErrorHandler;
import ghidra.framework.data.OpenMode;
import ghidra.program.database.ProgramBuilder; import ghidra.program.database.ProgramBuilder;
import ghidra.program.database.ProgramDB; import ghidra.program.database.ProgramDB;
import ghidra.program.database.map.AddressMap; import ghidra.program.database.map.AddressMap;
@@ -34,7 +36,8 @@ import ghidra.util.task.TaskMonitor;
/** /**
* *
*/ */
public class VoidPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest implements ErrorHandler { public class VoidPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest
implements ErrorHandler {
private DBHandle db; private DBHandle db;
private ProgramDB program; private ProgramDB program;
@@ -83,7 +86,7 @@ public class VoidPropertyMapDBTest extends AbstractGhidraHeadedIntegrationTest i
} }
private void createPropertyMap(String name) throws Exception { private void createPropertyMap(String name) throws Exception {
propertyMap = new VoidPropertyMapDB(db, DBConstants.CREATE, this, null, addrMap, name, propertyMap = new VoidPropertyMapDB(db, OpenMode.CREATE, this, null, addrMap, name,
TaskMonitor.DUMMY); TaskMonitor.DUMMY);
propertyMap.setCacheSize(2); propertyMap.setCacheSize(2);
} }

Some files were not shown because too many files have changed in this diff Show More