diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java index da64ae96fef1501d7c167f0240f3f09e0178475f..897faa2f7f60645819974a15c5d9cfe0f68374e2 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java @@ -2107,21 +2107,25 @@ private CaseDbSchemaVersionNumber updateFromSchema8dot4toSchema8dot5(CaseDbSchem } Statement statement = connection.createStatement(); - ResultSet results = null; - acquireSingleUserCaseWriteLock(); try { switch (getDatabaseType()) { case POSTGRESQL: - statement.execute("CREATE TABLE tag_sets (tag_set_id BIGSERIAL PRIMARY KEY, name TEXT UNIQUE)"); + statement.execute("CREATE TABLE tsk_tag_sets (tag_set_id BIGSERIAL PRIMARY KEY, name TEXT UNIQUE)"); break; case SQLITE: - statement.execute("CREATE TABLE tag_sets (tag_set_id INTEGER PRIMARY KEY, name TEST UNIQUE)"); + statement.execute("CREATE TABLE tsk_tag_sets (tag_set_id INTEGER PRIMARY KEY, name TEXT UNIQUE)"); break; } - statement.execute("ALTER TABLE tag_names ADD COLUMN tag_set_id INTEGER REFERENCES tag_sets(tag_set_id)"); - statement.execute("INSERT INTO tag_sets (name) VALUES ('Project VIC (United States)')"); + statement.execute("ALTER TABLE tag_names ADD COLUMN tag_set_id INTEGER REFERENCES tsk_tag_sets(tag_set_id)"); + + String insertStmt = "INSERT INTO tsk_tag_sets (name) VALUES ('Project VIC (United States)')"; + if (getDatabaseType() == DbType.POSTGRESQL) { + statement.execute(insertStmt, Statement.RETURN_GENERATED_KEYS); + } else { + statement.execute(insertStmt); + } try (ResultSet resultSet = statement.getGeneratedKeys()) { if (resultSet != null && resultSet.next()) { int tagSetId = resultSet.getInt(1); @@ -2140,10 +2144,9 @@ private CaseDbSchemaVersionNumber updateFromSchema8dot4toSchema8dot5(CaseDbSchem return new CaseDbSchemaVersionNumber(8, 5); } finally { - closeResultSet(results); closeStatement(statement); releaseSingleUserCaseWriteLock(); - } + } } /** @@ -9642,7 +9645,7 @@ public List<TagName> getTagNamesInUse() throws TskCoreException { while (resultSet.next()) { tagNames.add(new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), - TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getInt("tag_set_id"))); //NON-NLS + TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"))); //NON-NLS } return tagNames; } catch (SQLException ex) { @@ -9686,7 +9689,7 @@ public List<TagName> getTagNamesInUse(long dsObjId) throws TskCoreException { while (resultSet.next()) { tagNames.add(new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), - TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getInt("tag_set_id"))); //NON-NLS + TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"))); //NON-NLS } return tagNames; } catch (SQLException ex) { @@ -9824,7 +9827,7 @@ public List<ContentTag> getAllContentTags() throws TskCoreException { while (resultSet.next()) { TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), - TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getInt("tag_set_id")); //NON-NLS + TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id")); //NON-NLS Content content = getContentById(resultSet.getLong("obj_id")); //NON-NLS tags.add(new ContentTag(resultSet.getLong("tag_id"), content, tagName, resultSet.getString("comment"), resultSet.getLong("begin_byte_offset"), resultSet.getLong("end_byte_offset"), resultSet.getString("login_name"))); //NON-NLS @@ -9954,7 +9957,7 @@ public ContentTag getContentTagByID(long contentTagID) throws TskCoreException { while (resultSet.next()) { TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), - TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getInt("tag_set_id")); + TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id")); tag = new ContentTag(resultSet.getLong("tag_id"), getContentById(resultSet.getLong("obj_id")), tagName, resultSet.getString("comment"), resultSet.getLong("begin_byte_offset"), resultSet.getLong("end_byte_offset"), resultSet.getString("login_name")); } @@ -10090,7 +10093,7 @@ public List<ContentTag> getContentTagsByContent(Content content) throws TskCoreE while (resultSet.next()) { TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), - TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getInt("tag_set_id")); //NON-NLS + TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id")); //NON-NLS ContentTag tag = new ContentTag(resultSet.getLong("tag_id"), content, tagName, resultSet.getString("comment"), resultSet.getLong("begin_byte_offset"), resultSet.getLong("end_byte_offset"), resultSet.getString("login_name")); //NON-NLS tags.add(tag); @@ -10166,11 +10169,11 @@ public List<BlackboardArtifactTag> getAllBlackboardArtifactTags() throws TskCore // LEFT OUTER JOIN tsk_examiners ON blackboard_artifact_tags.examiner_id = tsk_examiners.examiner_id PreparedStatement statement = connection.getPreparedStatement(PREPARED_STATEMENT.SELECT_ARTIFACT_TAGS); resultSet = connection.executeQuery(statement); - ArrayList<BlackboardArtifactTag> tags = new ArrayList<BlackboardArtifactTag>(); + ArrayList<BlackboardArtifactTag> tags = new ArrayList<>(); while (resultSet.next()) { TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), - TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getInt("tag_set_id")); //NON-NLS + TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id")); //NON-NLS BlackboardArtifact artifact = getBlackboardArtifact(resultSet.getLong("artifact_id")); //NON-NLS Content content = getContentById(artifact.getObjectID()); BlackboardArtifactTag tag = new BlackboardArtifactTag(resultSet.getLong("tag_id"), @@ -10400,7 +10403,7 @@ public BlackboardArtifactTag getBlackboardArtifactTagByID(long artifactTagID) th while (resultSet.next()) { TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), - TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getInt("tag_set_id")); + TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id")); BlackboardArtifact artifact = getBlackboardArtifact(resultSet.getLong("artifact_id")); //NON-NLS Content content = getContentById(artifact.getObjectID()); tag = new BlackboardArtifactTag(resultSet.getLong("tag_id"), @@ -10444,11 +10447,11 @@ public List<BlackboardArtifactTag> getBlackboardArtifactTagsByArtifact(Blackboar statement.clearParameters(); statement.setLong(1, artifact.getArtifactID()); resultSet = connection.executeQuery(statement); - ArrayList<BlackboardArtifactTag> tags = new ArrayList<BlackboardArtifactTag>(); + ArrayList<BlackboardArtifactTag> tags = new ArrayList<>(); while (resultSet.next()) { TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"), resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")), - TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getInt("tag_set_id")); //NON-NLS + TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id")); //NON-NLS Content content = getContentById(artifact.getObjectID()); BlackboardArtifactTag tag = new BlackboardArtifactTag(resultSet.getLong("tag_id"), artifact, content, tagName, resultSet.getString("comment"), resultSet.getString("login_name")); //NON-NLS diff --git a/bindings/java/src/org/sleuthkit/datamodel/TagName.java b/bindings/java/src/org/sleuthkit/datamodel/TagName.java index 86a79db6e4bb5de47658081dcba445cbe96a39d3..0d446f9b62f18cb0e6a1ec1cb71f3abbe4c9de6e 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/TagName.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TagName.java @@ -86,10 +86,10 @@ public static HTML_COLOR getColorByName(String colorName) { private final String description; private final HTML_COLOR color; private final TskData.FileKnown knownStatus; - private final int tagSetId; - + private final long tagSetId; + // Clients of the org.sleuthkit.datamodel package should not directly create these objects. - TagName(long id, String displayName, String description, HTML_COLOR color, TskData.FileKnown knownStatus, int tagSetId) { + TagName(long id, String displayName, String description, HTML_COLOR color, TskData.FileKnown knownStatus, long tagSetId) { this.id = id; this.displayName = displayName; this.description = description; @@ -97,7 +97,7 @@ public static HTML_COLOR getColorByName(String colorName) { this.knownStatus = knownStatus; this.tagSetId = tagSetId; } - + public long getId() { return id; } @@ -117,8 +117,8 @@ public HTML_COLOR getColor() { public TskData.FileKnown getKnownStatus() { return knownStatus; } - - int getTagSetId() { + + long getTagSetId() { return tagSetId; } @@ -142,7 +142,7 @@ public int hashCode() { hash = 89 * hash + (this.description != null ? this.description.hashCode() : 0); hash = 89 * hash + (this.color != null ? this.color.hashCode() : 0); hash = 89 * hash + (this.knownStatus != null ? this.knownStatus.hashCode() : 0); - hash = 89 * hash + tagSetId; + hash = 89 * hash + (int) (this.id ^ (this.tagSetId >>> 32)); return hash; } diff --git a/bindings/java/src/org/sleuthkit/datamodel/TagSet.java b/bindings/java/src/org/sleuthkit/datamodel/TagSet.java index 9d8aabaf31a430b01642a437f1ccd1d8ad1ecf63..2821aff4d08f8534f93babfa886f1786b114b908 100755 --- a/bindings/java/src/org/sleuthkit/datamodel/TagSet.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TagSet.java @@ -18,7 +18,6 @@ */ package org.sleuthkit.datamodel; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -30,19 +29,19 @@ public class TagSet { private final String setName; private final long id; - private final List<TagName> tagNameList = new ArrayList<>(); + private final List<TagName> tagNameList; /** * Construct a TagSet. * - * @param id Tag set id value. + * @param id Tag set id value. * @param setName Name of tag set. */ - TagSet(long id, String setName) { + TagSet(long id, String setName, List<TagName> tagNameList) { if (setName == null || setName.isEmpty()) { throw new IllegalArgumentException("TagSet name must be a non-empty string"); } - + this.tagNameList = tagNameList; this.id = id; this.setName = setName; } @@ -65,35 +64,9 @@ public List<TagName> getTagNames() { return Collections.unmodifiableList(tagNameList); } - /** - * Adds a TagName to the tag set. - * - * @param tagName - */ - void addTagName(TagName tagName) { - if (tagName == null) { - throw new IllegalArgumentException("Cannot add NULL value to TagSet"); - } - - tagNameList.add(tagName); - } - - /** - * Add a list of TagName objects to the tag set. - * - * @param tagNameList - */ - void addTagNames(List<TagName> tagNameList) { - if (tagNameList == null) { - throw new IllegalArgumentException("Cannot add a NULL list to TagSet"); - } - - tagNameList.addAll(tagNameList); - } - /** * Return the TagSet id. - * + * * @return TagSet id value. */ long getId() { diff --git a/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java b/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java index 965dde8be8c1d4cab6a520a4701e76f2a4f378a3..0fb319766962749bd598930f19f1b449f4207eeb 100755 --- a/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.List; import org.sleuthkit.datamodel.SleuthkitCase.CaseDbConnection; +import static org.sleuthkit.datamodel.TskData.DbType.POSTGRESQL; /** * Provides an API to manage Tags. @@ -52,21 +53,20 @@ public class TaggingManager { public List<TagSet> getTagSets() throws TskCoreException { List<TagSet> tagSetList = new ArrayList<>(); CaseDbConnection connection = skCase.getConnection(); - skCase.acquireSingleUserCaseWriteLock(); - String getAllTagSetsQuery = "SELECT * FROM tag_sets"; + skCase.acquireSingleUserCaseReadLock(); + String getAllTagSetsQuery = "SELECT * FROM tsk_tag_sets"; try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(getAllTagSetsQuery);) { while (resultSet.next()) { int setID = resultSet.getInt("tag_set_id"); String setName = resultSet.getString("name"); - TagSet set = new TagSet(setID, setName); - set.addTagNames(getTagNamesByTagSetID(setID)); + TagSet set = new TagSet(setID, setName, getTagNamesByTagSetID(setID)); tagSetList.add(set); } } catch (SQLException ex) { throw new TskCoreException("Error occurred getting TagSet list.", ex); } finally { connection.close(); - skCase.releaseSingleUserCaseWriteLock(); + skCase.releaseSingleUserCaseReadLock(); } return tagSetList; } @@ -74,13 +74,14 @@ public List<TagSet> getTagSets() throws TskCoreException { /** * Inserts a row into the tag_sets table in the case database. * - * @param name The tag set name. + * @param name The tag set name. + * @param tagNames * * @return A TagSet object for the new row. * * @throws TskCoreException */ - public TagSet addTagSet(String name) throws TskCoreException { + public TagSet addTagSet(String name, List<TagName> tagNames) throws TskCoreException { if (name == null || name.isEmpty()) { throw new IllegalArgumentException("Error adding TagSet, TagSet name must be non-empty string."); } @@ -91,15 +92,40 @@ public TagSet addTagSet(String name) throws TskCoreException { skCase.acquireSingleUserCaseWriteLock(); try (Statement stmt = connection.createStatement()) { connection.beginTransaction(); - // INSERT INTO tag_sets (name) VALUES('%s') - stmt.execute(String.format("INSERT INTO tag_sets (name) VALUES('%s')", name)); + String query = String.format("INSERT INTO tsk_tag_sets (name) VALUES('%s')", name); + + if (skCase.getDatabaseType() == POSTGRESQL) { + stmt.execute(query, Statement.RETURN_GENERATED_KEYS); + } else { + stmt.execute(query); + } try (ResultSet resultSet = stmt.getGeneratedKeys()) { resultSet.next(); int setID = resultSet.getInt(1); - tagSet = new TagSet(setID, name); + List<TagName> updatedTags = new ArrayList<>(); + if (tagNames != null) { + // Get all of the TagName ids they can be updated in one + // SQL call. + List<String> idList = new ArrayList<>(); + for (TagName tagName : tagNames) { + idList.add(Long.toString(tagName.getId())); + } + + stmt.executeUpdate(String.format("UPDATE tag_names SET tag_set_id = %d WHERE tag_name_id IN (%s)", setID, String.join(",", idList))); + + for (TagName tagName : tagNames) { + updatedTags.add(new TagName(tagName.getId(), + tagName.getDisplayName(), + tagName.getDescription(), + tagName.getColor(), + tagName.getKnownStatus(), + setID)); + } + } + tagSet = new TagSet(setID, name, updatedTags); } connection.commitTransaction(); } catch (SQLException ex) { @@ -114,32 +140,29 @@ public TagSet addTagSet(String name) throws TskCoreException { } /** - * Remove a row from the tag set table. The TagNames in the TagSet will not - * be deleted, nor will any tags with the TagNames from the deleted tag set + * Remove a row from the tag set table. The TagNames in the TagSet will not + * be deleted, nor will any tags with the TagNames from the deleted tag set * be deleted. * - * @param name Name of tag set to be deleted. + * @param tagSet TagSet to be deleted * * @throws TskCoreException */ - public void deletedTagSet(String name) throws TskCoreException, SQLException { - if (name == null || name.isEmpty()) { - throw new IllegalArgumentException("Error adding deleting TagSet, TagSet name must be non-empty string."); + public void deletedTagSet(TagSet tagSet) throws TskCoreException { + if (tagSet == null) { + throw new IllegalArgumentException("Error adding deleting TagSet, TagSet object was null"); } CaseDbConnection connection = skCase.getConnection(); skCase.acquireSingleUserCaseWriteLock(); - - java.sql.PreparedStatement stmt2 = connection.prepareStatement("statement", 0); - try (Statement stmt = connection.createStatement()) { connection.beginTransaction(); - String queryTemplate = "DELETE FROM tag_sets WHERE name = '%s'"; - stmt.execute(String.format(queryTemplate, name)); + String queryTemplate = "DELETE FROM tsk_tag_sets WHERE tag_set_id = '%d'"; + stmt.execute(String.format(queryTemplate, tagSet.getId())); connection.commitTransaction(); } catch (SQLException ex) { connection.rollbackTransaction(); - throw new TskCoreException(String.format("Error deleting tag set %s.", name), ex); + throw new TskCoreException(String.format("Error deleting tag set where id = %d.", tagSet.getId()), ex); } finally { connection.close(); skCase.releaseSingleUserCaseWriteLock(); @@ -152,13 +175,23 @@ public void deletedTagSet(String name) throws TskCoreException, SQLException { * @param tagSet The tag set being added to. * @param tagName The tag name to add to the set. * + * @return TagSet TagSet object with newly added TagName. + * * @throws TskCoreException */ - public void addTagNameToTagSet(TagSet tagSet, TagName tagName) throws TskCoreException { + public TagSet addTagNameToTagSet(TagSet tagSet, TagName tagName) throws TskCoreException { if (tagSet == null || tagName == null) { throw new IllegalArgumentException("NULL value passed to addTagToTagSet"); } + // Make sure the tagName is not already in the list. + List<TagName> setTagNameList = tagSet.getTagNames(); + for (TagName tag : setTagNameList) { + if (tagName.getId() == tag.getId()) { + return tagSet; + } + } + CaseDbConnection connection = skCase.getConnection(); skCase.acquireSingleUserCaseWriteLock(); @@ -169,6 +202,13 @@ public void addTagNameToTagSet(TagSet tagSet, TagName tagName) throws TskCoreExc stmt.executeUpdate(String.format(queryTemplate, tagSet.getId(), tagName.getId())); connection.commitTransaction(); + + List<TagName> newTagNameList = new ArrayList<>(); + newTagNameList.addAll(setTagNameList); + newTagNameList.add(new TagName(tagName.getId(), tagName.getDisplayName(), tagName.getDescription(), tagName.getColor(), tagName.getKnownStatus(), tagSet.getId())); + + return new TagSet(tagSet.getId(), tagSet.getName(), newTagNameList); + } catch (SQLException ex) { connection.rollbackTransaction(); throw new TskCoreException(String.format("Error adding TagName (id=%d) to TagSet (id=%s)", tagName.getId(), tagSet.getId()), ex); @@ -204,11 +244,11 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T connection.beginTransaction(); // If a TagName is part of a TagSet remove any existing tags from the // set that are currenctly on the artifact - int tagSetId = tagName.getTagSetId(); + long tagSetId = tagName.getTagSetId(); if (tagSetId > 0) { // Get the list of all of the blackboardArtifactTags that use // TagName for the given artifact. - String selectQuery = String.format("SELECT * from blackboard_artifact_tags JOIN tag_names ON tag_names.tag_name_id = blackboard_artifact_tags.tag_name_id JOIN tsk_examiners on tsk_examiners.examiner_id = blackboard_artifact_tags.examiner_id WHERE artifact_id = %d AND tag_names.tag_set_id = %d", artifact.getId(), tagSetId); + String selectQuery = String.format("SELECT * from blackboard_artifact_tags JOIN tag_names ON tag_names.tag_name_id = blackboard_artifact_tags.tag_name_id JOIN tsk_examiners on tsk_examiners.examiner_id = blackboard_artifact_tags.examiner_id WHERE artifact_id = %d AND tag_names.tag_set_id = %d", artifact.getArtifactID(), tagSetId); try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(selectQuery)) { while (resultSet.next()) { @@ -221,7 +261,7 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T resultSet.getString("login_name")); removedTags.add(bat); - removedTagIds.add(Long.toString(bat.getId())); + removedTagIds.add(Long.toString(bat.getId())); } } @@ -238,13 +278,18 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T BlackboardArtifactTag artifactTag = null; try (Statement stmt = connection.createStatement()) { Examiner currentExaminer = skCase.getCurrentExaminer(); - String queryTemplate = "INSERT INTO blackboard_artifact_tags (artifact_id, tag_name_id, comment, examiner_id) VALUES (%d, %d, '%s', %d)"; - - stmt.executeUpdate(String.format(queryTemplate, + String query = String.format( + "INSERT INTO blackboard_artifact_tags (artifact_id, tag_name_id, comment, examiner_id) VALUES (%d, %d, '%s', %d)", artifact.getArtifactID(), tagName.getId(), comment, - currentExaminer.getId())); + currentExaminer.getId()); + + if (skCase.getDatabaseType() == POSTGRESQL) { + stmt.execute(query, Statement.RETURN_GENERATED_KEYS); + } else { + stmt.execute(query); + } try (ResultSet resultSet = stmt.getGeneratedKeys()) { resultSet.next(); @@ -286,7 +331,7 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c skCase.acquireSingleUserCaseWriteLock(); try { connection.beginTransaction(); - int tagSetId = tagName.getTagSetId(); + long tagSetId = tagName.getTagSetId(); if (tagSetId > 0) { String selectQuery = String.format("SELECT * from content_tags JOIN tag_names ON tag_names.tag_name_id = content_tags.tag_name_id JOIN tsk_examiners on tsk_examiners.examiner_id = content_tags.examiner_id WHERE obj_id = %d AND tag_names.tag_set_id = %d", content.getId(), tagSetId); @@ -301,8 +346,8 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c resultSet.getLong("begin_byte_offset"), resultSet.getLong("end_byte_offset"), resultSet.getString("login_name")); - - removedTagIds.add(Long.toString(bat.getId())); + + removedTagIds.add(Long.toString(bat.getId())); removedTags.add(bat); } } @@ -327,7 +372,11 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c endByteOffset, currentExaminer.getId()); - stmt.executeUpdate(query); + if (skCase.getDatabaseType() == POSTGRESQL) { + stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS); + } else { + stmt.executeUpdate(query); + } try (ResultSet resultSet = stmt.getGeneratedKeys()) { resultSet.next(); diff --git a/tsk/auto/db_postgresql.cpp b/tsk/auto/db_postgresql.cpp index 241ebf88f85155372906a567b805ebf8005f3563..653050780086c8f68d4e78495fe4544500093fd6 100755 --- a/tsk/auto/db_postgresql.cpp +++ b/tsk/auto/db_postgresql.cpp @@ -563,9 +563,9 @@ int TskDbPostgreSQL::initialize() { || attempt_exec("CREATE TABLE tsk_files_derived_method (derived_id BIGSERIAL PRIMARY KEY, tool_name TEXT NOT NULL, tool_version TEXT NOT NULL, other TEXT)", "Error creating tsk_files_derived_method table: %s\n") || - attempt_exec("CREATE TABLE tag_sets (tag_set_id BIGSERIAL PRIMARY KEY, name TEXT UNIQUE);", "Error creating tag_sets table: %s\n") + attempt_exec("CREATE TABLE tsk_tag_sets (tag_set_id BIGSERIAL PRIMARY KEY, name TEXT UNIQUE);", "Error creating tsk_tag_sets table: %s\n") || - attempt_exec("CREATE TABLE tag_names (tag_name_id BIGSERIAL PRIMARY KEY, display_name TEXT UNIQUE, description TEXT NOT NULL, color TEXT NOT NULL, knownStatus INTEGER NOT NULL, tag_set_id INTEGER, FOREIGN KEY(tag_set_id) REFERENCES tag_sets(tag_set_id) ON DELETE SET NULL)", "Error creating tag_names table: %s\n") + attempt_exec("CREATE TABLE tag_names (tag_name_id BIGSERIAL PRIMARY KEY, display_name TEXT UNIQUE, description TEXT NOT NULL, color TEXT NOT NULL, knownStatus INTEGER NOT NULL, tag_set_id INTEGER, FOREIGN KEY(tag_set_id) REFERENCES tsk_tag_sets(tag_set_id) ON DELETE SET NULL)", "Error creating tag_names table: %s\n") || attempt_exec("CREATE TABLE blackboard_artifact_types (artifact_type_id BIGSERIAL PRIMARY KEY, type_name TEXT NOT NULL, display_name TEXT)", "Error creating blackboard_artifact_types table: %s\n") || diff --git a/tsk/auto/db_sqlite.cpp b/tsk/auto/db_sqlite.cpp index 2ba2810748005726ee147d58682ef1a9ccd2e2f3..5625c5ad21207d7754d9616559b41930ce89d1f3 100644 --- a/tsk/auto/db_sqlite.cpp +++ b/tsk/auto/db_sqlite.cpp @@ -285,7 +285,7 @@ TskDbSqlite::initialize() } if (attempt_exec - ("CREATE TABLE tsk_objects (obj_id INTEGER PRIMARY KEY, par_obj_id INTEGER, type INTEGER NOT NULL, UNIQUE (obj_id), FOREIGN KEY (par_obj_id) references tsk_objects(obj_id) ON DELETE SET NULL);", + ("CREATE TABLE tsk_objects (obj_id INTEGER PRIMARY KEY, par_obj_id INTEGER, type INTEGER NOT NULL, UNIQUE (obj_id), FOREIGN KEY (par_obj_id) references tsk_objects(obj_id) ON DELETE CASCADE);", "Error creating tsk_objects table: %s\n") || attempt_exec @@ -339,10 +339,10 @@ TskDbSqlite::initialize() "Error creating tsk_files_derived_method table: %s\n") || attempt_exec - ("CREATE TABLE tag_sets (tag_set_id INTEGER PRIMARY KEY, name TEST UNIQUE)", "Error creating tag_sets table: %s\n") + ("CREATE TABLE tsk_tag_sets (tag_set_id INTEGER PRIMARY KEY, name TEXT UNIQUE)", "Error creating tsk_tag_sets table: %s\n") || attempt_exec - ("CREATE TABLE tag_names (tag_name_id INTEGER PRIMARY KEY, display_name TEXT UNIQUE, description TEXT NOT NULL, color TEXT NOT NULL, knownStatus INTEGER NOT NULL, tag_set_id INTEGER, FOREIGN KEY(tag_set_id) REFERENCES tag_sets(tag_set_id) ON DELETE SET NULL)", + ("CREATE TABLE tag_names (tag_name_id INTEGER PRIMARY KEY, display_name TEXT UNIQUE, description TEXT NOT NULL, color TEXT NOT NULL, knownStatus INTEGER NOT NULL, tag_set_id INTEGER, FOREIGN KEY(tag_set_id) REFERENCES tsk_tag_sets(tag_set_id) ON DELETE SET NULL)", "Error creating tag_names table: %s\n") || attempt_exec("CREATE TABLE review_statuses (review_status_id INTEGER PRIMARY KEY, "