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);