19 package org.sleuthkit.autopsy.centralrepository.datamodel;
22 import java.sql.Connection;
23 import java.sql.SQLException;
24 import java.sql.Statement;
25 import java.util.Arrays;
26 import java.util.List;
28 import java.util.concurrent.locks.ReentrantReadWriteLock;
29 import java.util.logging.Level;
30 import org.apache.commons.dbcp2.BasicDataSource;
53 private final ReentrantReadWriteLock
rwLock =
new ReentrantReadWriteLock(
true);
63 if (instance == null) {
84 if (null != connectionPool) {
85 connectionPool.close();
86 connectionPool = null;
89 }
catch (SQLException ex) {
90 throw new EamDbException(
"Failed to close existing database connections.", ex);
104 synchronized (
this) {
118 Statement dropContent = conn.createStatement();
119 dropContent.executeUpdate(
"DELETE FROM organizations");
120 dropContent.executeUpdate(
"DELETE FROM cases");
121 dropContent.executeUpdate(
"DELETE FROM data_sources");
122 dropContent.executeUpdate(
"DELETE FROM reference_sets");
123 dropContent.executeUpdate(
"DELETE FROM artifact_types");
124 dropContent.executeUpdate(
"DELETE FROM db_info");
126 String instancesTemplate =
"DELETE FROM %s_instances";
127 String referencesTemplate =
"DELETE FROM global_files";
129 dropContent.executeUpdate(String.format(instancesTemplate, type.getDbTableName()));
132 dropContent.executeUpdate(String.format(referencesTemplate, type.getDbTableName()));
136 dropContent.executeUpdate(
"VACUUM");
137 }
catch (SQLException ex) {
138 LOGGER.log(Level.WARNING,
"Failed to reset database.", ex);
156 throw new EamDbException(
"Central repository database missing");
159 connectionPool =
new BasicDataSource();
160 connectionPool.setDriverClassName(dbSettings.
getDriver());
164 connectionPool.setInitialSize(50);
165 connectionPool.setMaxTotal(-1);
166 connectionPool.setMaxIdle(-1);
167 connectionPool.setMaxWaitMillis(1000);
169 connectionPool.setConnectionInitSqls(Arrays.asList(
"PRAGMA foreign_keys = ON"));
181 synchronized (
this) {
183 throw new EamDbException(
"Central Repository module is not enabled");
186 if (connectionPool == null) {
191 return connectionPool.getConnection();
192 }
catch (SQLException ex) {
193 throw new EamDbException(
"Error getting connection from connection pool.", ex);
217 super.newDbInfo(name, value);
236 return super.getDbInfo(name);
254 super.updateDbInfo(name, value);
269 return super.newCase(autopsyCase);
286 return super.newCase(eamCase);
301 super.updateCase(eamCase);
318 return super.getCaseByUUID(caseUUID);
333 return super.getCases();
348 super.newDataSource(eamDataSource);
366 return super.getDataSource(correlationCase, dataSourceDeviceId);
381 return super.getDataSources();
397 super.addArtifact(eamArtifact);
416 return super.getArtifactInstancesByTypeValue(aType, value);
437 return super.getArtifactInstancesByPath(aType, filePath);
458 return super.getCountArtifactInstancesByTypeValue(aType, value);
468 return super.getFrequencyPercentage(corAttr);
489 return super.getCountUniqueCaseDataSourceTuplesHavingTypeValue(aType, value);
500 return super.getCountUniqueDataSources();
521 return super.getCountArtifactInstancesByCaseDataSource(caseUUID, dataSourceID);
535 super.bulkInsertArtifacts();
548 super.bulkInsertCases(cases);
568 super.setArtifactInstanceKnownStatus(eamArtifact, knownStatus);
587 return super.getArtifactInstancesKnownBad(aType, value);
605 return super.getCountArtifactInstancesKnownBad(aType, value);
627 return super.getListCasesHavingArtifactInstancesKnownBad(aType, value);
642 super.deleteReferenceSet(referenceSetID);
659 return super.isValueInReferenceSet(value, referenceSetID, correlationTypeID);
677 return super.referenceSetExists(referenceSetName, version);
695 return super.isArtifactKnownBadByReference(aType, value);
714 return super.newOrganization(eamOrg);
731 return super.getOrganizations();
750 return super.getOrganizationByID(orgID);
760 super.updateOrganization(updatedOrganization);
770 super.deleteOrganization(organizationToDelete);
788 return super.newReferenceSet(eamGlobalSet);
807 return super.getReferenceSetByID(referenceSetID);
826 return super.getAllReferenceSets(correlationType);
845 super.addReferenceInstance(eamGlobalFileInstance, correlationType);
860 super.bulkInsertReferenceTypeEntries(globalInstances, contentType);
880 return super.getReferenceInstancesByTypeValue(aType, aValue);
899 return super.newCorrelationType(newType);
918 return super.getDefinedCorrelationTypes();
937 return super.getEnabledCorrelationTypes();
956 return super.getSupportedCorrelationTypes();
973 super.updateCorrelationType(aType);
992 return super.getCorrelationTypeById(typeId);
1006 super.upgradeSchema();
1032 rwLock.writeLock().lock();
1041 rwLock.writeLock().unlock();
1050 rwLock.readLock().lock();
1059 rwLock.readLock().unlock();
List< CorrelationAttribute.Type > getSupportedCorrelationTypes()
void deleteOrganization(EamOrganization organizationToDelete)
boolean insertDefaultDatabaseContent()
Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(CorrelationAttribute.Type aType, String value)
String getDbInfo(String name)
void updateOrganization(EamOrganization updatedOrganization)
Long getCountUniqueDataSources()
void updateCorrelationType(CorrelationAttribute.Type aType)
List< EamOrganization > getOrganizations()
int getFrequencyPercentage(CorrelationAttribute corAttr)
CorrelationCase newCase(CorrelationCase eamCase)
CorrelationCase getCaseByUUID(String caseUUID)
static final int FILES_TYPE_ID
CorrelationAttribute.Type getCorrelationTypeById(int typeId)
Long getCountArtifactInstancesByCaseDataSource(String caseUUID, String dataSourceID)
void bulkInsertCases(List< CorrelationCase > cases)
long newOrganization(EamOrganization eamOrg)
Long getCountArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value)
List< CorrelationAttributeInstance > getArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value)
int bulkArtifactsThreshold
void acquireExclusiveLock()
void setArtifactInstanceKnownStatus(CorrelationAttribute eamArtifact, TskData.FileKnown knownStatus)
String getConnectionURL()
String getValidationQuery()
final List< CorrelationAttribute.Type > DEFAULT_CORRELATION_TYPES
void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, CorrelationAttribute.Type correlationType)
EamGlobalSet getReferenceSetByID(int referenceSetID)
int newReferenceSet(EamGlobalSet eamGlobalSet)
EamOrganization getOrganizationByID(int orgID)
void releaseExclusiveLock()
List< CorrelationAttributeInstance > getArtifactInstancesByTypeValue(CorrelationAttribute.Type aType, String value)
void updateCase(CorrelationCase eamCase)
static final Logger LOGGER
List< EamGlobalFileInstance > getReferenceInstancesByTypeValue(CorrelationAttribute.Type aType, String aValue)
void setupConnectionPool()
CorrelationDataSource getDataSource(CorrelationCase correlationCase, String dataSourceDeviceId)
boolean isValueInReferenceSet(String value, int referenceSetID, int correlationTypeID)
void addArtifact(CorrelationAttribute eamArtifact)
final SqliteEamDbSettings dbSettings
static void closeConnection(Connection conn)
static SqliteEamDb instance
BasicDataSource connectionPool
void newDataSource(CorrelationDataSource eamDataSource)
final ReentrantReadWriteLock rwLock
void bulkInsertArtifacts()
List< CorrelationAttribute.Type > getEnabledCorrelationTypes()
boolean referenceSetExists(String referenceSetName, String version)
void shutdownConnections()
static boolean isEnabled()
void bulkInsertReferenceTypeEntries(Set< EamGlobalFileInstance > globalInstances, CorrelationAttribute.Type contentType)
void updateDbInfo(String name, String value)
List< String > getListCasesHavingArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value)
boolean isArtifactKnownBadByReference(CorrelationAttribute.Type aType, String value)
void newDbInfo(String name, String value)
void deleteReferenceSet(int referenceSetID)
Long getCountArtifactInstancesKnownBad(CorrelationAttribute.Type aType, String value)
List< EamGlobalSet > getAllReferenceSets(CorrelationAttribute.Type correlationType)
List< CorrelationAttributeInstance > getArtifactInstancesByPath(CorrelationAttribute.Type aType, String filePath)
synchronized static Logger getLogger(String name)
CoordinationService.Lock getExclusiveMultiUserDbLock()
List< CorrelationAttribute.Type > getDefinedCorrelationTypes()
static synchronized SqliteEamDb getInstance()
List< CorrelationCase > getCases()
String getConflictClause()
int newCorrelationType(CorrelationAttribute.Type newType)
List< CorrelationDataSource > getDataSources()
CorrelationCase newCase(Case autopsyCase)