19 package org.sleuthkit.datamodel;
21 import com.google.common.base.Strings;
22 import java.sql.PreparedStatement;
23 import java.sql.SQLException;
24 import java.sql.Statement;
25 import org.apache.commons.lang3.StringUtils;
26 import java.util.List;
27 import java.util.Arrays;
28 import java.util.ArrayList;
29 import java.util.HashMap;
30 import java.util.Iterator;
31 import java.util.LinkedList;
33 import java.util.Objects;
34 import java.util.Optional;
35 import java.util.Queue;
36 import java.util.logging.Level;
37 import java.util.logging.Logger;
50 class TskCaseDbBridge {
52 private static final Logger logger = Logger.getLogger(TskCaseDbBridge.class.getName());
54 private final SleuthkitCase caseDb;
55 private CaseDbTransaction trans = null;
56 private final AddDataSourceCallbacks addDataSourceCallbacks;
57 private final Host imageHost;
59 private final Map<Long, Long> fsIdToRootDir =
new HashMap<>();
60 private final Map<Long, TskData.TSK_FS_TYPE_ENUM> fsIdToFsType =
new HashMap<>();
61 private final Map<ParentCacheKey, Long> parentDirCache =
new HashMap<>();
63 private final Map<String, OsAccount> ownerIdToAccountMap =
new HashMap<>();
65 private static final long BATCH_FILE_THRESHOLD = 500;
66 private final Queue<FileInfo> batchedFiles =
new LinkedList<>();
67 private final Queue<LayoutRangeInfo> batchedLayoutRanges =
new LinkedList<>();
68 private final List<Long> layoutFileIds =
new ArrayList<>();
70 TskCaseDbBridge(SleuthkitCase caseDb, AddDataSourceCallbacks addDataSourceCallbacks, Host host) {
72 this.addDataSourceCallbacks = addDataSourceCallbacks;
82 private void beginTransaction() throws TskCoreException {
83 trans = caseDb.beginTransaction();
91 private void commitTransaction() throws TskCoreException {
99 private void revertTransaction() {
105 }
catch (TskCoreException ex) {
106 logger.log(Level.SEVERE,
"Error rolling back transaction", ex);
114 addBatchedFilesToDb();
115 addBatchedLayoutRangesToDb();
116 processLayoutFiles();
138 long addImageInfo(
int type,
long ssize, String timezone,
139 long size, String md5, String sha1, String sha256, String deviceId,
140 String collectionDetails, String[] paths) {
143 long objId = addImageToDb(TskData.TSK_IMG_TYPE_ENUM.valueOf(type), ssize, size,
144 timezone, md5, sha1, sha256, deviceId, collectionDetails, trans);
145 for (
int i = 0;i < paths.length;i++) {
146 addImageNameToDb(objId, paths[i], i, trans);
150 }
catch (TskCoreException ex) {
151 logger.log(Level.SEVERE,
"Error adding image to the database", ex);
163 void addAcquisitionDetails(
long imgId, String details) {
166 caseDb.setAcquisitionDetails(imgId, details, trans);
168 }
catch (TskCoreException ex) {
169 logger.log(Level.SEVERE,
"Error adding image details \"" + details +
"\" to image with ID " + imgId, ex);
185 long addVsInfo(
long parentObjId,
int vsType,
long imgOffset,
long blockSize) {
188 VolumeSystem vs = caseDb.addVolumeSystem(parentObjId, TskData.TSK_VS_TYPE_ENUM.valueOf(vsType), imgOffset, blockSize, trans);
191 }
catch (TskCoreException ex) {
192 logger.log(Level.SEVERE,
"Error adding volume system to the database - parent obj ID: " + parentObjId
193 +
", image offset: " + imgOffset, ex);
212 long addVolume(
long parentObjId,
long addr,
long start,
long length, String desc,
216 Volume vol = caseDb.addVolume(parentObjId, addr, start, length, desc, flags, trans);
219 }
catch (TskCoreException ex) {
220 logger.log(Level.SEVERE,
"Error adding volume to the database - parent object ID: " + parentObjId
221 +
", addr: " + addr, ex);
236 long addPool(
long parentObjId,
int poolType) {
239 Pool pool = caseDb.addPool(parentObjId, TskData.TSK_POOL_TYPE_ENUM.valueOf(poolType), trans);
242 }
catch (TskCoreException ex) {
243 logger.log(Level.SEVERE,
"Error adding pool to the database - parent object ID: " + parentObjId, ex);
264 long addFileSystem(
long parentObjId,
long imgOffset,
int fsType,
long blockSize,
long blockCount,
265 long rootInum,
long firstInum,
long lastInum) {
268 FileSystem fs = caseDb.addFileSystem(parentObjId, imgOffset, TskData.TSK_FS_TYPE_ENUM.valueOf(fsType), blockSize, blockCount,
269 rootInum, firstInum, lastInum, null, trans);
271 fsIdToFsType.put(fs.getId(), TskData.TSK_FS_TYPE_ENUM.valueOf(fsType));
273 }
catch (TskCoreException ex) {
274 logger.log(Level.SEVERE,
"Error adding file system to the database - parent object ID: " + parentObjId
275 +
", offset: " + imgOffset, ex);
322 long addFile(
long parentObjId,
323 long fsObjId,
long dataSourceObjId,
325 int attrType,
int attrId, String name,
326 long metaAddr,
long metaSeq,
327 int dirType,
int metaType,
int dirFlags,
int metaFlags,
329 long crtime,
long ctime,
long atime,
long mtime,
330 int meta_mode,
int gid,
int uid,
331 String escaped_path, String extension,
332 long seq,
long parMetaAddr,
long parSeq, String ownerUid) {
335 batchedFiles.add(
new FileInfo(parentObjId,
336 fsObjId, dataSourceObjId,
338 attrType, attrId, name,
340 dirType, metaType, dirFlags, metaFlags,
342 crtime, ctime, atime, mtime,
344 escaped_path, extension,
345 seq, parMetaAddr, parSeq, ownerUid));
349 if ((fsObjId == parentObjId)
350 || (batchedFiles.size() > BATCH_FILE_THRESHOLD)) {
351 return addBatchedFilesToDb();
361 private long addBatchedFilesToDb() {
362 List<Long> newObjIds =
new ArrayList<>();
367 Iterator<FileInfo> it = batchedFiles.iterator();
369 while (it.hasNext()) {
370 FileInfo fileInfo = it.next();
371 String ownerUid = fileInfo.ownerUid;
372 if (Strings.isNullOrEmpty(fileInfo.ownerUid) ==
false) {
374 if (this.ownerIdToAccountMap.containsKey(ownerUid)) {
380 Optional<OsAccount> ownerAccount = caseDb.getOsAccountManager().getWindowsOsAccount(ownerUid, null, null, imageHost);
381 if (ownerAccount.isPresent()) {
383 ownerIdToAccountMap.put(ownerUid, ownerAccount.get());
387 OsAccountManager accountMgr = caseDb.getOsAccountManager();
388 OsAccount newAccount = accountMgr.newWindowsOsAccount(ownerUid, null, null, imageHost, OsAccountRealm.RealmScope.UNKNOWN);
389 Content ds = caseDb.getContentById(fileInfo.dataSourceObjId);
390 if (ds instanceof DataSource) {
391 accountMgr.newOsAccountInstance(newAccount, (DataSource)ds, OsAccountInstance.OsAccountInstanceType.ACCESSED);
393 ownerIdToAccountMap.put(ownerUid, newAccount);
395 }
catch (NotUserSIDException ex) {
397 ownerIdToAccountMap.put(ownerUid, null);
406 while ((fileInfo = batchedFiles.poll()) != null) {
407 long computedParentObjId = fileInfo.parentObjId;
410 if (fileInfo.parentObjId == 0) {
411 computedParentObjId = getParentObjId(fileInfo);
414 Long ownerAccountObjId = OsAccount.NO_ACCOUNT;
415 if (Strings.isNullOrEmpty(fileInfo.ownerUid) ==
false) {
416 if (ownerIdToAccountMap.containsKey(fileInfo.ownerUid)) {
418 if (Objects.nonNull(ownerIdToAccountMap.get(fileInfo.ownerUid))) {
419 ownerAccountObjId = ownerIdToAccountMap.get(fileInfo.ownerUid).getId();
423 throw new TskCoreException(String.format(
"Failed to add file. Owner account not found for file with parent object ID: %d, name: %s, owner id: %s", fileInfo.parentObjId, fileInfo.name, fileInfo.ownerUid));
431 if ((fileInfo.parentObjId == fileInfo.fsObjId)
432 && (fileInfo.metaType != TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue())) {
433 fileInfo.metaType = TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue();
436 long objId = addFileToDb(computedParentObjId,
437 fileInfo.fsObjId, fileInfo.dataSourceObjId,
439 fileInfo.attrType, fileInfo.attrId, fileInfo.name,
440 fileInfo.metaAddr, fileInfo.metaSeq,
441 fileInfo.dirType, fileInfo.metaType, fileInfo.dirFlags, fileInfo.metaFlags,
443 fileInfo.crtime, fileInfo.ctime, fileInfo.atime, fileInfo.mtime,
444 fileInfo.meta_mode, fileInfo.gid, fileInfo.uid,
445 null, TskData.FileKnown.UNKNOWN,
446 fileInfo.escaped_path, fileInfo.extension, fileInfo.ownerUid, ownerAccountObjId,
448 if (fileInfo.fsObjId != fileInfo.parentObjId) {
450 newObjIds.add(objId);
454 if (fileInfo.parentObjId == fileInfo.fsObjId) {
455 fsIdToRootDir.put(fileInfo.fsObjId, objId);
459 if ((fileInfo.metaType == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue()
460 || (fileInfo.metaType == TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_VIRT_DIR.getValue()))
461 && (fileInfo.name != null)
462 && ! fileInfo.name.equals(
".")
463 && ! fileInfo.name.equals(
"..")) {
464 String dirName = fileInfo.escaped_path + fileInfo.name;
465 ParentCacheKey key =
new ParentCacheKey(fileInfo.fsObjId, fileInfo.metaAddr, fileInfo.seq, dirName);
466 parentDirCache.put(key, objId);
468 }
catch (TskCoreException ex) {
469 if (computedParentObjId > 0) {
471 logger.log(Level.SEVERE,
"Error adding file to the database - parent object ID: " + computedParentObjId
472 +
", file system object ID: " + fileInfo.fsObjId +
", name: " + fileInfo.name, ex);
475 logger.log(Level.SEVERE,
"Error adding file to the database", ex);
481 addDataSourceCallbacks.onFilesAdded(newObjIds);
482 }
catch (Exception ex) {
484 logger.log(Level.SEVERE,
"Unexpected error from files added callback", ex);
486 }
catch (TskCoreException ex) {
487 logger.log(Level.SEVERE,
"Error adding batched files to database", ex);
503 private long getParentObjId(FileInfo fileInfo)
throws TskCoreException {
505 String parentPath = fileInfo.escaped_path;
506 if(parentPath.endsWith(
"/") && ! parentPath.equals(
"/")) {
507 parentPath = parentPath.substring(0, parentPath.lastIndexOf(
'/'));
511 ParentCacheKey key =
new ParentCacheKey(fileInfo.fsObjId, fileInfo.parMetaAddr, fileInfo.parSeq, parentPath);
512 if (parentDirCache.containsKey(key)) {
513 return parentDirCache.get(key);
517 throw new TskCoreException(
"Could not find parent (fsObjId: " +fileInfo.fsObjId +
", parMetaAddr: " + fileInfo.parMetaAddr
518 +
", parSeq: " + fileInfo.parSeq +
", parentPath: " + parentPath +
")");
535 long addLayoutFile(
long parentObjId,
536 long fsObjId,
long dataSourceObjId,
538 String name,
long size) {
542 Long fsObjIdForDb = fsObjId;
548 long objId = addFileToDb(parentObjId,
549 fsObjIdForDb, dataSourceObjId,
553 TskData.TSK_FS_NAME_TYPE_ENUM.REG.getValue(),
554 TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_REG.getValue(),
555 TskData.TSK_FS_NAME_FLAG_ENUM.UNALLOC.getValue(),
556 TskData.TSK_FS_META_FLAG_ENUM.UNALLOC.getValue(),
558 null, null, null, null,
560 null, TskData.FileKnown.UNKNOWN,
561 null, null, null, OsAccount.NO_ACCOUNT,
566 layoutFileIds.add(objId);
569 }
catch (TskCoreException ex) {
570 logger.log(Level.SEVERE,
"Error adding layout file to the database - parent object ID: " + parentObjId
571 +
", file system object ID: " + fsObjId +
", name: " + name, ex);
588 long addLayoutFileRange(
long objId,
long byteStart,
long byteLen,
long seq) {
589 batchedLayoutRanges.add(
new LayoutRangeInfo(objId, byteStart, byteLen, seq));
591 if (batchedLayoutRanges.size() > BATCH_FILE_THRESHOLD) {
592 return addBatchedLayoutRangesToDb();
602 private long addBatchedLayoutRangesToDb() {
605 LayoutRangeInfo range;
606 while ((range = batchedLayoutRanges.poll()) != null) {
608 addLayoutFileRangeToDb(range.objId, range.byteStart, range.byteLen, range.seq, trans);
609 }
catch (TskCoreException ex) {
610 logger.log(Level.SEVERE,
"Error adding layout file range to the database - layout file ID: " + range.objId
611 +
", byte start: " + range.byteStart +
", length: " + range.byteLen +
", seq: " + range.seq, ex);
616 }
catch (TskCoreException ex) {
617 logger.log(Level.SEVERE,
"Error adding batched files to database", ex);
628 void processLayoutFiles() {
629 addDataSourceCallbacks.onFilesAdded(layoutFileIds);
630 layoutFileIds.clear();
642 long addUnallocFsBlockFilesParent(
long fsObjId, String name) {
644 if (! fsIdToRootDir.containsKey(fsObjId)) {
645 logger.log(Level.SEVERE,
"Error - root directory for file system ID {0} not found", fsObjId);
649 VirtualDirectory dir = caseDb.addVirtualDirectory(fsIdToRootDir.get(fsObjId), name, trans);
651 addDataSourceCallbacks.onFilesAdded(Arrays.asList(dir.getId()));
653 }
catch (TskCoreException ex) {
654 logger.log(Level.SEVERE,
"Error creating virtual directory " + name +
" under file system ID " + fsObjId, ex);
663 private class ParentCacheKey {
678 ParentCacheKey(
long fsObjId,
long metaAddr,
long seqNum, String path) {
679 this.fsObjId = fsObjId;
680 this.metaAddr = metaAddr;
681 if (ownerIdToAccountMap.containsKey(fsObjId)
682 && (ownerIdToAccountMap.get(fsObjId).equals(TskData.TSK_FS_TYPE_ENUM.TSK_FS_TYPE_NTFS)
683 || ownerIdToAccountMap.get(fsObjId).equals(TskData.TSK_FS_TYPE_ENUM.TSK_FS_TYPE_NTFS_DETECT))) {
684 this.seqNum = seqNum;
692 public boolean equals(Object obj) {
693 if (! (obj instanceof ParentCacheKey)) {
697 ParentCacheKey otherKey = (ParentCacheKey) obj;
698 if (this.fsObjId != otherKey.fsObjId
699 ||
this.metaAddr != otherKey.metaAddr
700 ||
this.seqNum != otherKey.seqNum) {
704 return StringUtils.equals(this.path, otherKey.path);
708 public int hashCode() {
710 hash = 31 * hash + (int) (this.fsObjId ^ (this.fsObjId >>> 32));
711 hash = 31 * hash + (int) (this.metaAddr ^ (this.metaAddr >>> 32));
712 hash = 31 * hash + (int) (this.seqNum ^ (this.seqNum >>> 32));
713 hash = 31 * hash + Objects.hashCode(this.path);
722 private class LayoutRangeInfo {
728 LayoutRangeInfo(
long objId,
long byteStart,
long byteLen,
long seq) {
730 this.byteStart = byteStart;
731 this.byteLen = byteLen;
740 private class FileInfo {
743 long dataSourceObjId;
769 FileInfo(
long parentObjId,
770 long fsObjId,
long dataSourceObjId,
772 int attrType,
int attrId, String name,
773 long metaAddr,
long metaSeq,
774 int dirType,
int metaType,
int dirFlags,
int metaFlags,
776 long crtime,
long ctime,
long atime,
long mtime,
777 int meta_mode,
int gid,
int uid,
778 String escaped_path, String extension,
779 long seq,
long parMetaAddr,
long parSeq, String ownerUid) {
781 this.parentObjId = parentObjId;
782 this.fsObjId = fsObjId;
783 this.dataSourceObjId = dataSourceObjId;
784 this.fsType = fsType;
785 this.attrType = attrType;
786 this.attrId = attrId;
788 this.metaAddr = metaAddr;
789 this.metaSeq = metaSeq;
790 this.dirType = dirType;
791 this.metaType = metaType;
792 this.dirFlags = dirFlags;
793 this.metaFlags = metaFlags;
795 this.crtime = crtime;
799 this.meta_mode = meta_mode;
802 this.escaped_path = escaped_path;
803 this.extension = extension;
805 this.parMetaAddr = parMetaAddr;
806 this.parSeq = parSeq;
807 this.ownerUid = ownerUid;
854 private long addFileToDb(
long parentObjId,
855 Long fsObjId,
long dataSourceObjId,
857 Integer attrType, Integer attrId, String name,
858 Long metaAddr, Long metaSeq,
859 int dirType,
int metaType,
int dirFlags,
int metaFlags,
861 Long crtime, Long ctime, Long atime, Long mtime,
862 Integer meta_mode, Integer gid, Integer uid,
863 String md5, TskData.FileKnown known,
864 String escaped_path, String extension, String ownerUid, Long ownerAcctObjId,
865 boolean hasLayout, CaseDbTransaction transaction)
throws TskCoreException {
868 SleuthkitCase.CaseDbConnection connection = transaction.getConnection();
872 long objectId = caseDb.addObject(parentObjId, TskData.ObjectType.ABSTRACTFILE.getObjectType(), connection);
874 String fileInsert =
"INSERT INTO tsk_files (fs_obj_id, obj_id, data_source_obj_id, type, attr_type, attr_id, name, meta_addr, meta_seq, dir_type, meta_type, dir_flags, meta_flags, size, crtime, ctime, atime, mtime, mode, gid, uid, md5, known, parent_path, extension, has_layout, owner_uid, os_account_obj_id)"
875 +
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
876 PreparedStatement preparedStatement = connection.getPreparedStatement(fileInsert, Statement.NO_GENERATED_KEYS);
877 preparedStatement.clearParameters();
879 if (fsObjId != null) {
880 preparedStatement.setLong(1, fsObjId);
882 preparedStatement.setNull(1, java.sql.Types.BIGINT);
884 preparedStatement.setLong(2, objectId);
885 preparedStatement.setLong(3, dataSourceObjId);
886 preparedStatement.setShort(4, (
short) fsType);
887 if (attrType != null) {
888 preparedStatement.setShort(5, attrType.shortValue());
890 preparedStatement.setNull(5, java.sql.Types.SMALLINT);
892 if (attrId != null) {
893 preparedStatement.setInt(6, attrId);
895 preparedStatement.setNull(6, java.sql.Types.INTEGER);
897 preparedStatement.setString(7, name);
898 if (metaAddr != null) {
899 preparedStatement.setLong(8, metaAddr);
901 preparedStatement.setNull(8, java.sql.Types.BIGINT);
903 if (metaSeq != null) {
904 preparedStatement.setInt(9, metaSeq.intValue());
906 preparedStatement.setNull(9, java.sql.Types.INTEGER);
908 preparedStatement.setShort(10, (
short) dirType);
909 preparedStatement.setShort(11, (
short) metaType);
910 preparedStatement.setShort(12, (
short) dirFlags);
911 preparedStatement.setShort(13, (
short) metaFlags);
912 preparedStatement.setLong(14, size < 0 ? 0 : size);
913 if (crtime != null) {
914 preparedStatement.setLong(15, crtime);
916 preparedStatement.setNull(15, java.sql.Types.BIGINT);
919 preparedStatement.setLong(16, ctime);
921 preparedStatement.setNull(16, java.sql.Types.BIGINT);
924 preparedStatement.setLong(17, atime);
926 preparedStatement.setNull(17, java.sql.Types.BIGINT);
929 preparedStatement.setLong(18, mtime);
931 preparedStatement.setNull(18, java.sql.Types.BIGINT);
933 if (meta_mode != null) {
934 preparedStatement.setLong(19, meta_mode);
936 preparedStatement.setNull(19, java.sql.Types.BIGINT);
939 preparedStatement.setLong(20, gid);
941 preparedStatement.setNull(20, java.sql.Types.BIGINT);
944 preparedStatement.setLong(21, uid);
946 preparedStatement.setNull(21, java.sql.Types.BIGINT);
948 preparedStatement.setString(22, md5);
949 preparedStatement.setInt(23, known.getFileKnownValue());
950 preparedStatement.setString(24, escaped_path);
951 preparedStatement.setString(25, extension);
953 preparedStatement.setInt(26, 1);
955 preparedStatement.setNull(26, java.sql.Types.INTEGER);
958 preparedStatement.setString(27, ownerUid);
960 if (ownerAcctObjId != OsAccount.NO_ACCOUNT) {
961 preparedStatement.setLong(28, ownerAcctObjId);
963 preparedStatement.setNull(28, java.sql.Types.BIGINT);
966 connection.executeUpdate(preparedStatement);
970 && TskData.TSK_DB_FILES_TYPE_ENUM.SLACK.getFileType() != fsType
971 && (!name.equals(
".")) && (!name.equals(
".."))) {
972 TimelineManager timelineManager = caseDb.getTimelineManager();
973 DerivedFile derivedFile =
new DerivedFile(caseDb, objectId, dataSourceObjId, name,
974 TskData.TSK_FS_NAME_TYPE_ENUM.valueOf((
short) dirType),
975 TskData.TSK_FS_META_TYPE_ENUM.valueOf((
short) metaType),
976 TskData.TSK_FS_NAME_FLAG_ENUM.valueOf(dirFlags),
978 size, ctime, crtime, atime, mtime, null, null, null, escaped_path, null, parentObjId, null, null, extension, ownerUid, ownerAcctObjId);
980 timelineManager.addEventsForNewFileQuiet(derivedFile, connection);
984 }
catch (SQLException ex) {
985 throw new TskCoreException(
"Failed to add file system file", ex);
1008 private long addImageToDb(TskData.TSK_IMG_TYPE_ENUM type,
long sectorSize,
long size,
1009 String timezone, String md5, String sha1, String sha256,
1010 String deviceId, String collectionDetails,
1011 CaseDbTransaction transaction)
throws TskCoreException {
1014 SleuthkitCase.CaseDbConnection connection = transaction.getConnection();
1015 long newObjId = caseDb.addObject(0, TskData.ObjectType.IMG.getObjectType(), connection);
1019 String imageInfoSql =
"INSERT INTO tsk_image_info (obj_id, type, ssize, tzone, size, md5, sha1, sha256, display_name)"
1020 +
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
1021 PreparedStatement preparedStatement = connection.getPreparedStatement(imageInfoSql, Statement.NO_GENERATED_KEYS);
1022 preparedStatement.clearParameters();
1023 preparedStatement.setLong(1, newObjId);
1024 preparedStatement.setShort(2, (
short) type.getValue());
1025 preparedStatement.setLong(3, sectorSize);
1026 preparedStatement.setString(4, timezone);
1028 long savedSize = size < 0 ? 0 : size;
1029 preparedStatement.setLong(5, savedSize);
1030 preparedStatement.setString(6, md5);
1031 preparedStatement.setString(7, sha1);
1032 preparedStatement.setString(8, sha256);
1033 preparedStatement.setString(9, null);
1034 connection.executeUpdate(preparedStatement);
1037 String dataSourceInfoSql =
"INSERT INTO data_source_info (obj_id, device_id, time_zone, acquisition_details, host_id) VALUES (?, ?, ?, ?, ?)";
1038 preparedStatement = connection.getPreparedStatement(dataSourceInfoSql, Statement.NO_GENERATED_KEYS);
1039 preparedStatement.clearParameters();
1040 preparedStatement.setLong(1, newObjId);
1041 preparedStatement.setString(2, deviceId);
1042 preparedStatement.setString(3, timezone);
1043 preparedStatement.setString(4, collectionDetails);
1044 preparedStatement.setLong(5, imageHost.getHostId());
1045 connection.executeUpdate(preparedStatement);
1048 }
catch (SQLException ex) {
1049 throw new TskCoreException(String.format(
"Error adding image to database"), ex);
1063 private void addImageNameToDb(
long objId, String name,
long sequence,
1064 CaseDbTransaction transaction)
throws TskCoreException {
1066 SleuthkitCase.CaseDbConnection connection = transaction.getConnection();
1068 String imageNameSql =
"INSERT INTO tsk_image_names (obj_id, name, sequence) VALUES (?, ?, ?)";
1069 PreparedStatement preparedStatement = connection.getPreparedStatement(imageNameSql, Statement.NO_GENERATED_KEYS);
1070 preparedStatement.clearParameters();
1071 preparedStatement.setLong(1, objId);
1072 preparedStatement.setString(2, name);
1073 preparedStatement.setLong(3, sequence);
1074 connection.executeUpdate(preparedStatement);
1075 }
catch (SQLException ex) {
1076 throw new TskCoreException(String.format(
"Error adding image name %s to image with object ID %d", name, objId), ex);
1091 void addLayoutFileRangeToDb(
long objId,
long byteStart,
long byteLen,
1092 long seq, CaseDbTransaction transaction)
throws TskCoreException {
1094 SleuthkitCase.CaseDbConnection connection = transaction.getConnection();
1096 String insertRangeSql =
"INSERT INTO tsk_file_layout (obj_id, byte_start, byte_len, sequence) "
1097 +
"VALUES (?, ?, ?, ?)";
1098 PreparedStatement preparedStatement = connection.getPreparedStatement(insertRangeSql, Statement.NO_GENERATED_KEYS);
1099 preparedStatement.clearParameters();
1100 preparedStatement.setLong(1, objId);
1101 preparedStatement.setLong(2, byteStart);
1102 preparedStatement.setLong(3, byteLen);
1103 preparedStatement.setLong(4, seq);
1104 connection.executeUpdate(preparedStatement);
1105 }
catch (SQLException ex) {
1106 throw new TskCoreException(
"Error adding layout range to file with obj ID " + objId, ex);