mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-13 00:16:16 +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 SCHEMA_MINOR_VERSION_KEY = "SCHEMA_MINOR_VERSION";
|
||||||
static final String CREATION_SCHEMA_MAJOR_VERSION_KEY = "CREATION_SCHEMA_MAJOR_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 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;
|
protected final List<CorrelationAttributeInstance.Type> defaultCorrelationTypes;
|
||||||
|
|
||||||
@ -625,7 +625,7 @@ abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
// This data source is already in the central repo
|
// This data source is already in the central repo
|
||||||
return eamDataSource;
|
return eamDataSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
Connection conn = connect();
|
Connection conn = connect();
|
||||||
|
|
||||||
PreparedStatement preparedStatement = null;
|
PreparedStatement preparedStatement = null;
|
||||||
@ -650,7 +650,7 @@ abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
/*
|
/*
|
||||||
* If nothing was inserted, then return the data source that
|
* If nothing was inserted, then return the data source that
|
||||||
* exists in the Central Repository.
|
* exists in the Central Repository.
|
||||||
*
|
*
|
||||||
* This is expected to occur with PostgreSQL Central Repository
|
* This is expected to occur with PostgreSQL Central Repository
|
||||||
* databases.
|
* databases.
|
||||||
*/
|
*/
|
||||||
@ -675,7 +675,7 @@ abstract class AbstractSqlEamDb implements EamDb {
|
|||||||
* If an exception was thrown causing us to not return a new data
|
* 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
|
* source, attempt to get an existing data source with the same case
|
||||||
* ID and data source object ID.
|
* ID and data source object ID.
|
||||||
*
|
*
|
||||||
* This exception block is expected to occur with SQLite Central
|
* This exception block is expected to occur with SQLite Central
|
||||||
* Repository databases.
|
* 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_MAJOR_VERSION_KEY + "','" + creationMajorVer + "')");
|
||||||
statement.execute("INSERT INTO db_info (name, value) VALUES ('" + AbstractSqlEamDb.CREATION_SCHEMA_MINOR_VERSION_KEY + "','" + creationMinorVer + "')");
|
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);
|
updateSchemaVersion(conn);
|
||||||
conn.commit();
|
conn.commit();
|
||||||
logger.log(Level.INFO, String.format("Central Repository schema updated to version %s", SOFTWARE_CR_DB_SCHEMA_VERSION));
|
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 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)";
|
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();
|
StringBuilder createReferenceSetsTable = new StringBuilder();
|
||||||
createReferenceSetsTable.append("CREATE TABLE IF NOT EXISTS reference_sets (");
|
createReferenceSetsTable.append("CREATE TABLE IF NOT EXISTS reference_sets (");
|
||||||
createReferenceSetsTable.append("id SERIAL PRIMARY KEY,");
|
createReferenceSetsTable.append("id SERIAL PRIMARY KEY,");
|
||||||
@ -422,9 +405,9 @@ public final class PostgresEamDbSettings {
|
|||||||
stmt.execute(casesIdx1);
|
stmt.execute(casesIdx1);
|
||||||
stmt.execute(casesIdx2);
|
stmt.execute(casesIdx2);
|
||||||
|
|
||||||
stmt.execute(createDataSourcesTable.toString());
|
stmt.execute(getCreateDataSourcesTableStatement());
|
||||||
stmt.execute(dataSourceIdx1);
|
stmt.execute(getAddDataSourcesNameIndexStatement());
|
||||||
stmt.execute(dataSourceIdx2);
|
stmt.execute(getAddDataSourcesObjectIdIndexStatement());
|
||||||
|
|
||||||
stmt.execute(createReferenceSetsTable.toString());
|
stmt.execute(createReferenceSetsTable.toString());
|
||||||
stmt.execute(referenceSetsIdx1);
|
stmt.execute(referenceSetsIdx1);
|
||||||
@ -487,21 +470,50 @@ public final class PostgresEamDbSettings {
|
|||||||
*/
|
*/
|
||||||
static String getCreateArtifactInstancesTableTemplate() {
|
static String getCreateArtifactInstancesTableTemplate() {
|
||||||
// Each "%s" will be replaced with the relevant TYPE_instances table name.
|
// Each "%s" will be replaced with the relevant TYPE_instances table name.
|
||||||
StringBuilder createArtifactInstancesTableTemplate = new StringBuilder();
|
return ("CREATE TABLE IF NOT EXISTS %s (id SERIAL PRIMARY KEY,case_id integer NOT NULL,"
|
||||||
createArtifactInstancesTableTemplate.append("CREATE TABLE IF NOT EXISTS %s (");
|
+ "data_source_id integer NOT NULL,value text NOT NULL,file_path text NOT NULL,"
|
||||||
createArtifactInstancesTableTemplate.append("id SERIAL PRIMARY KEY,");
|
+ "known_status integer NOT NULL,comment text,file_obj_id BIGINT,"
|
||||||
createArtifactInstancesTableTemplate.append("case_id integer NOT NULL,");
|
+ "CONSTRAINT %s_multi_unique_ UNIQUE (data_source_id, value, file_path),"
|
||||||
createArtifactInstancesTableTemplate.append("data_source_id integer NOT NULL,");
|
+ "foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,"
|
||||||
createArtifactInstancesTableTemplate.append("value text NOT NULL,");
|
+ "foreign key (data_source_id) references data_sources(id) ON UPDATE SET NULL ON DELETE SET 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,");
|
* Get the statement String for creating a new data_sources table in a
|
||||||
createArtifactInstancesTableTemplate.append("CONSTRAINT %s_multi_unique_ UNIQUE (data_source_id, value, file_path),");
|
* Postgres central repository.
|
||||||
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");
|
* @return a String which is a statement for cretating a new data_sources
|
||||||
createArtifactInstancesTableTemplate.append(")");
|
* table
|
||||||
return createArtifactInstancesTableTemplate.toString();
|
*/
|
||||||
|
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 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)";
|
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();
|
StringBuilder createReferenceSetsTable = new StringBuilder();
|
||||||
createReferenceSetsTable.append("CREATE TABLE IF NOT EXISTS reference_sets (");
|
createReferenceSetsTable.append("CREATE TABLE IF NOT EXISTS reference_sets (");
|
||||||
createReferenceSetsTable.append("id integer primary key autoincrement NOT NULL,");
|
createReferenceSetsTable.append("id integer primary key autoincrement NOT NULL,");
|
||||||
@ -371,9 +354,9 @@ public final class SqliteEamDbSettings {
|
|||||||
stmt.execute(casesIdx1);
|
stmt.execute(casesIdx1);
|
||||||
stmt.execute(casesIdx2);
|
stmt.execute(casesIdx2);
|
||||||
|
|
||||||
stmt.execute(createDataSourcesTable.toString());
|
stmt.execute(getCreateDataSourcesTableStatement());
|
||||||
stmt.execute(dataSourceIdx1);
|
stmt.execute(getAddDataSourcesNameIndexStatement());
|
||||||
stmt.execute(dataSourceIdx2);
|
stmt.execute(getAddDataSourcesObjectIdIndexStatement());
|
||||||
|
|
||||||
stmt.execute(createReferenceSetsTable.toString());
|
stmt.execute(createReferenceSetsTable.toString());
|
||||||
stmt.execute(referenceSetsIdx1);
|
stmt.execute(referenceSetsIdx1);
|
||||||
@ -435,21 +418,49 @@ public final class SqliteEamDbSettings {
|
|||||||
*/
|
*/
|
||||||
static String getCreateArtifactInstancesTableTemplate() {
|
static String getCreateArtifactInstancesTableTemplate() {
|
||||||
// Each "%s" will be replaced with the relevant TYPE_instances table name.
|
// Each "%s" will be replaced with the relevant TYPE_instances table name.
|
||||||
StringBuilder createArtifactInstancesTableTemplate = new StringBuilder();
|
return "CREATE TABLE IF NOT EXISTS %s (id integer primary key autoincrement NOT NULL,"
|
||||||
createArtifactInstancesTableTemplate.append("CREATE TABLE IF NOT EXISTS %s (");
|
+ "case_id integer NOT NULL,data_source_id integer NOT NULL,value text NOT NULL,"
|
||||||
createArtifactInstancesTableTemplate.append("id integer primary key autoincrement NOT NULL,");
|
+ "file_path text NOT NULL,known_status integer NOT NULL,comment text,file_obj_id integer,"
|
||||||
createArtifactInstancesTableTemplate.append("case_id integer NOT NULL,");
|
+ "CONSTRAINT %s_multi_unique UNIQUE(data_source_id, value, file_path) ON CONFLICT IGNORE,"
|
||||||
createArtifactInstancesTableTemplate.append("data_source_id integer NOT NULL,");
|
+ "foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,"
|
||||||
createArtifactInstancesTableTemplate.append("value text NOT NULL,");
|
+ "foreign key (data_source_id) references data_sources(id) ON UPDATE SET NULL ON DELETE SET 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,");
|
* Get the statement String for creating a new data_sources table in a
|
||||||
createArtifactInstancesTableTemplate.append("CONSTRAINT %s_multi_unique UNIQUE(data_source_id, value, file_path) ON CONFLICT IGNORE,");
|
* Sqlite central repository.
|
||||||
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");
|
* @return a String which is a statement for cretating a new data_sources
|
||||||
createArtifactInstancesTableTemplate.append(")");
|
* table
|
||||||
return createArtifactInstancesTableTemplate.toString();
|
*/
|
||||||
|
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