mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 16:06:15 +00:00
4626 add upgrade code for Central repository data_sources unique constraint change
This commit is contained in:
parent
d800c28c1b
commit
deb9670dd8
@ -61,7 +61,7 @@ abstract class AbstractSqlEamDb implements EamDb {
|
||||
static final String SCHEMA_MINOR_VERSION_KEY = "SCHEMA_MINOR_VERSION";
|
||||
static final String CREATION_SCHEMA_MAJOR_VERSION_KEY = "CREATION_SCHEMA_MAJOR_VERSION";
|
||||
static final String CREATION_SCHEMA_MINOR_VERSION_KEY = "CREATION_SCHEMA_MINOR_VERSION";
|
||||
static final CaseDbSchemaVersionNumber SOFTWARE_CR_DB_SCHEMA_VERSION = new CaseDbSchemaVersionNumber(1, 2);
|
||||
static final CaseDbSchemaVersionNumber SOFTWARE_CR_DB_SCHEMA_VERSION = new CaseDbSchemaVersionNumber(1, 3);
|
||||
|
||||
protected final List<CorrelationAttributeInstance.Type> defaultCorrelationTypes;
|
||||
|
||||
@ -625,7 +625,7 @@ abstract class AbstractSqlEamDb implements EamDb {
|
||||
// This data source is already in the central repo
|
||||
return eamDataSource;
|
||||
}
|
||||
|
||||
|
||||
Connection conn = connect();
|
||||
|
||||
PreparedStatement preparedStatement = null;
|
||||
@ -650,7 +650,7 @@ abstract class AbstractSqlEamDb implements EamDb {
|
||||
/*
|
||||
* If nothing was inserted, then return the data source that
|
||||
* exists in the Central Repository.
|
||||
*
|
||||
*
|
||||
* This is expected to occur with PostgreSQL Central Repository
|
||||
* databases.
|
||||
*/
|
||||
@ -675,7 +675,7 @@ abstract class AbstractSqlEamDb implements EamDb {
|
||||
* If an exception was thrown causing us to not return a new data
|
||||
* source, attempt to get an existing data source with the same case
|
||||
* ID and data source object ID.
|
||||
*
|
||||
*
|
||||
* This exception block is expected to occur with SQLite Central
|
||||
* Repository databases.
|
||||
*/
|
||||
@ -3582,7 +3582,28 @@ abstract class AbstractSqlEamDb implements EamDb {
|
||||
statement.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATION_SCHEMA_MAJOR_VERSION_KEY + "','" + creationMajorVer + "')");
|
||||
statement.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATION_SCHEMA_MINOR_VERSION_KEY + "','" + creationMinorVer + "')");
|
||||
}
|
||||
|
||||
/*
|
||||
* Update to 1.3
|
||||
*/
|
||||
if (dbSchemaVersion.compareTo(new CaseDbSchemaVersionNumber(1, 3)) < 0) {
|
||||
switch (selectedPlatform) {
|
||||
case POSTGRESQL:
|
||||
statement.execute("ALTER TABLE data_sources DROP CONSTRAINT datasource_unique");
|
||||
statement.execute("ALTER TABLE data_sources ADD CONSTRAINT datasource_unique UNIQUE (case_id, device_id, name, datasource_obj_id)");
|
||||
|
||||
break;
|
||||
case SQLITE:
|
||||
statement.execute("ALTER TABLE data_sources RENAME TO old_data_sources");
|
||||
statement.execute(SqliteEamDbSettings.getCreateDataSourcesTableStatement());
|
||||
statement.execute(SqliteEamDbSettings.getAddDataSourcesNameIndexStatement());
|
||||
statement.execute(SqliteEamDbSettings.getAddDataSourcesObjectIdIndexStatement());
|
||||
statement.execute("INSERT INTO data_sources SELECT * FROM old_data_sources");
|
||||
statement.execute("DROP TABLE old_data_sources");
|
||||
break;
|
||||
default:
|
||||
throw new EamDbException("Currently selected database platform \"" + selectedPlatform.name() + "\" can not be upgraded.");
|
||||
}
|
||||
}
|
||||
updateSchemaVersion(conn);
|
||||
conn.commit();
|
||||
logger.log(Level.INFO, String.format("Central Repository schema updated to version %s", SOFTWARE_CR_DB_SCHEMA_VERSION));
|
||||
|
@ -339,23 +339,6 @@ public final class PostgresEamDbSettings {
|
||||
String casesIdx1 = "CREATE INDEX IF NOT EXISTS cases_org_id ON cases (org_id)";
|
||||
String casesIdx2 = "CREATE INDEX IF NOT EXISTS cases_case_uid ON cases (case_uid)";
|
||||
|
||||
StringBuilder createDataSourcesTable = new StringBuilder();
|
||||
createDataSourcesTable.append("CREATE TABLE IF NOT EXISTS data_sources (");
|
||||
createDataSourcesTable.append("id SERIAL PRIMARY KEY,");
|
||||
createDataSourcesTable.append("case_id integer NOT NULL,");
|
||||
createDataSourcesTable.append("device_id text NOT NULL,");
|
||||
createDataSourcesTable.append("name text NOT NULL,");
|
||||
createDataSourcesTable.append("datasource_obj_id BIGINT,");
|
||||
createDataSourcesTable.append("md5 text DEFAULT NULL,");
|
||||
createDataSourcesTable.append("sha1 text DEFAULT NULL,");
|
||||
createDataSourcesTable.append("sha256 text DEFAULT NULL,");
|
||||
createDataSourcesTable.append("foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,");
|
||||
createDataSourcesTable.append("CONSTRAINT datasource_unique UNIQUE (case_id, device_id, name, datasource_obj_id)");
|
||||
createDataSourcesTable.append(")");
|
||||
|
||||
String dataSourceIdx1 = "CREATE INDEX IF NOT EXISTS data_sources_name ON data_sources (name)";
|
||||
String dataSourceIdx2 = "CREATE INDEX IF NOT EXISTS data_sources_object_id ON data_sources (datasource_obj_id)";
|
||||
|
||||
StringBuilder createReferenceSetsTable = new StringBuilder();
|
||||
createReferenceSetsTable.append("CREATE TABLE IF NOT EXISTS reference_sets (");
|
||||
createReferenceSetsTable.append("id SERIAL PRIMARY KEY,");
|
||||
@ -422,9 +405,9 @@ public final class PostgresEamDbSettings {
|
||||
stmt.execute(casesIdx1);
|
||||
stmt.execute(casesIdx2);
|
||||
|
||||
stmt.execute(createDataSourcesTable.toString());
|
||||
stmt.execute(dataSourceIdx1);
|
||||
stmt.execute(dataSourceIdx2);
|
||||
stmt.execute(getCreateDataSourcesTableStatement());
|
||||
stmt.execute(getAddDataSourcesNameIndexStatement());
|
||||
stmt.execute(getAddDataSourcesObjectIdIndexStatement());
|
||||
|
||||
stmt.execute(createReferenceSetsTable.toString());
|
||||
stmt.execute(referenceSetsIdx1);
|
||||
@ -487,21 +470,50 @@ public final class PostgresEamDbSettings {
|
||||
*/
|
||||
static String getCreateArtifactInstancesTableTemplate() {
|
||||
// Each "%s" will be replaced with the relevant TYPE_instances table name.
|
||||
StringBuilder createArtifactInstancesTableTemplate = new StringBuilder();
|
||||
createArtifactInstancesTableTemplate.append("CREATE TABLE IF NOT EXISTS %s (");
|
||||
createArtifactInstancesTableTemplate.append("id SERIAL PRIMARY KEY,");
|
||||
createArtifactInstancesTableTemplate.append("case_id integer NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("data_source_id integer NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("value text NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("file_path text NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("known_status integer NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("comment text,");
|
||||
createArtifactInstancesTableTemplate.append("file_obj_id BIGINT,");
|
||||
createArtifactInstancesTableTemplate.append("CONSTRAINT %s_multi_unique_ UNIQUE (data_source_id, value, file_path),");
|
||||
createArtifactInstancesTableTemplate.append("foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,");
|
||||
createArtifactInstancesTableTemplate.append("foreign key (data_source_id) references data_sources(id) ON UPDATE SET NULL ON DELETE SET NULL");
|
||||
createArtifactInstancesTableTemplate.append(")");
|
||||
return createArtifactInstancesTableTemplate.toString();
|
||||
return ("CREATE TABLE IF NOT EXISTS %s (id SERIAL PRIMARY KEY,case_id integer NOT NULL,"
|
||||
+ "data_source_id integer NOT NULL,value text NOT NULL,file_path text NOT NULL,"
|
||||
+ "known_status integer NOT NULL,comment text,file_obj_id BIGINT,"
|
||||
+ "CONSTRAINT %s_multi_unique_ UNIQUE (data_source_id, value, file_path),"
|
||||
+ "foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,"
|
||||
+ "foreign key (data_source_id) references data_sources(id) ON UPDATE SET NULL ON DELETE SET NULL)");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the statement String for creating a new data_sources table in a
|
||||
* Postgres central repository.
|
||||
*
|
||||
* @return a String which is a statement for cretating a new data_sources
|
||||
* table
|
||||
*/
|
||||
static String getCreateDataSourcesTableStatement() {
|
||||
return "CREATE TABLE IF NOT EXISTS data_sources "
|
||||
+ "(id SERIAL PRIMARY KEY,case_id integer NOT NULL,device_id text NOT NULL,"
|
||||
+ "name text NOT NULL,datasource_obj_id BIGINT,md5 text DEFAULT NULL,"
|
||||
+ "sha1 text DEFAULT NULL,sha256 text DEFAULT NULL,"
|
||||
+ "foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,"
|
||||
+ "CONSTRAINT datasource_unique UNIQUE (case_id, device_id, name, datasource_obj_id))";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the statement for creating an index on the name column of the
|
||||
* data_sources table.
|
||||
*
|
||||
* @return a String which is a statement for adding an index on the name
|
||||
* column of the data_sources table.
|
||||
*/
|
||||
static String getAddDataSourcesNameIndexStatement() {
|
||||
return "CREATE INDEX IF NOT EXISTS data_sources_name ON data_sources (name)";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the statement for creating an index on the data_sources_object_id
|
||||
* column of the data_sources table.
|
||||
*
|
||||
* @return a String which is a statement for adding an index on the
|
||||
* data_sources_object_id column of the data_sources table.
|
||||
*/
|
||||
static String getAddDataSourcesObjectIdIndexStatement() {
|
||||
return "CREATE INDEX IF NOT EXISTS data_sources_object_id ON data_sources (datasource_obj_id)";
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -282,23 +282,6 @@ public final class SqliteEamDbSettings {
|
||||
String casesIdx1 = "CREATE INDEX IF NOT EXISTS cases_org_id ON cases (org_id)";
|
||||
String casesIdx2 = "CREATE INDEX IF NOT EXISTS cases_case_uid ON cases (case_uid)";
|
||||
|
||||
StringBuilder createDataSourcesTable = new StringBuilder();
|
||||
createDataSourcesTable.append("CREATE TABLE IF NOT EXISTS data_sources (");
|
||||
createDataSourcesTable.append("id integer primary key autoincrement NOT NULL,");
|
||||
createDataSourcesTable.append("case_id integer NOT NULL,");
|
||||
createDataSourcesTable.append("device_id text NOT NULL,");
|
||||
createDataSourcesTable.append("name text NOT NULL,");
|
||||
createDataSourcesTable.append("datasource_obj_id integer,");
|
||||
createDataSourcesTable.append("md5 text DEFAULT NULL,");
|
||||
createDataSourcesTable.append("sha1 text DEFAULT NULL,");
|
||||
createDataSourcesTable.append("sha256 text DEFAULT NULL,");
|
||||
createDataSourcesTable.append("foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,");
|
||||
createDataSourcesTable.append("CONSTRAINT datasource_unique UNIQUE (case_id, device_id, name, datasource_obj_id)");
|
||||
createDataSourcesTable.append(")");
|
||||
|
||||
String dataSourceIdx1 = "CREATE INDEX IF NOT EXISTS data_sources_name ON data_sources (name)";
|
||||
String dataSourceIdx2 = "CREATE INDEX IF NOT EXISTS data_sources_object_id ON data_sources (datasource_obj_id)";
|
||||
|
||||
StringBuilder createReferenceSetsTable = new StringBuilder();
|
||||
createReferenceSetsTable.append("CREATE TABLE IF NOT EXISTS reference_sets (");
|
||||
createReferenceSetsTable.append("id integer primary key autoincrement NOT NULL,");
|
||||
@ -371,9 +354,9 @@ public final class SqliteEamDbSettings {
|
||||
stmt.execute(casesIdx1);
|
||||
stmt.execute(casesIdx2);
|
||||
|
||||
stmt.execute(createDataSourcesTable.toString());
|
||||
stmt.execute(dataSourceIdx1);
|
||||
stmt.execute(dataSourceIdx2);
|
||||
stmt.execute(getCreateDataSourcesTableStatement());
|
||||
stmt.execute(getAddDataSourcesNameIndexStatement());
|
||||
stmt.execute(getAddDataSourcesObjectIdIndexStatement());
|
||||
|
||||
stmt.execute(createReferenceSetsTable.toString());
|
||||
stmt.execute(referenceSetsIdx1);
|
||||
@ -435,21 +418,49 @@ public final class SqliteEamDbSettings {
|
||||
*/
|
||||
static String getCreateArtifactInstancesTableTemplate() {
|
||||
// Each "%s" will be replaced with the relevant TYPE_instances table name.
|
||||
StringBuilder createArtifactInstancesTableTemplate = new StringBuilder();
|
||||
createArtifactInstancesTableTemplate.append("CREATE TABLE IF NOT EXISTS %s (");
|
||||
createArtifactInstancesTableTemplate.append("id integer primary key autoincrement NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("case_id integer NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("data_source_id integer NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("value text NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("file_path text NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("known_status integer NOT NULL,");
|
||||
createArtifactInstancesTableTemplate.append("comment text,");
|
||||
createArtifactInstancesTableTemplate.append("file_obj_id integer,");
|
||||
createArtifactInstancesTableTemplate.append("CONSTRAINT %s_multi_unique UNIQUE(data_source_id, value, file_path) ON CONFLICT IGNORE,");
|
||||
createArtifactInstancesTableTemplate.append("foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,");
|
||||
createArtifactInstancesTableTemplate.append("foreign key (data_source_id) references data_sources(id) ON UPDATE SET NULL ON DELETE SET NULL");
|
||||
createArtifactInstancesTableTemplate.append(")");
|
||||
return createArtifactInstancesTableTemplate.toString();
|
||||
return "CREATE TABLE IF NOT EXISTS %s (id integer primary key autoincrement NOT NULL,"
|
||||
+ "case_id integer NOT NULL,data_source_id integer NOT NULL,value text NOT NULL,"
|
||||
+ "file_path text NOT NULL,known_status integer NOT NULL,comment text,file_obj_id integer,"
|
||||
+ "CONSTRAINT %s_multi_unique UNIQUE(data_source_id, value, file_path) ON CONFLICT IGNORE,"
|
||||
+ "foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,"
|
||||
+ "foreign key (data_source_id) references data_sources(id) ON UPDATE SET NULL ON DELETE SET NULL)";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the statement String for creating a new data_sources table in a
|
||||
* Sqlite central repository.
|
||||
*
|
||||
* @return a String which is a statement for cretating a new data_sources
|
||||
* table
|
||||
*/
|
||||
static String getCreateDataSourcesTableStatement() {
|
||||
return "CREATE TABLE IF NOT EXISTS data_sources (id integer primary key autoincrement NOT NULL,"
|
||||
+ "case_id integer NOT NULL,device_id text NOT NULL,name text NOT NULL,datasource_obj_id integer,"
|
||||
+ "md5 text DEFAULT NULL,sha1 text DEFAULT NULL,sha256 text DEFAULT NULL,"
|
||||
+ "foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,"
|
||||
+ "CONSTRAINT datasource_unique UNIQUE (case_id, device_id, name, datasource_obj_id))";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the statement for creating an index on the name column of the
|
||||
* data_sources table.
|
||||
*
|
||||
* @return a String which is a statement for adding an index on the name
|
||||
* column of the data_sources table.
|
||||
*/
|
||||
static String getAddDataSourcesNameIndexStatement() {
|
||||
return "CREATE INDEX IF NOT EXISTS data_sources_name ON data_sources (name)";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the statement for creating an index on the data_sources_object_id
|
||||
* column of the data_sources table.
|
||||
*
|
||||
* @return a String which is a statement for adding an index on the
|
||||
* data_sources_object_id column of the data_sources table.
|
||||
*/
|
||||
static String getAddDataSourcesObjectIdIndexStatement() {
|
||||
return "CREATE INDEX IF NOT EXISTS data_sources_object_id ON data_sources (datasource_obj_id)";
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user