Autopsy  4.10.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
SqliteEamDb.java
Go to the documentation of this file.
1 /*
2  * Central Repository
3  *
4  * Copyright 2015-2019 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.centralrepository.datamodel;
20 
21 import java.sql.Connection;
22 import java.sql.ResultSet;
23 import java.sql.SQLException;
24 import java.sql.Statement;
25 import java.util.Arrays;
26 import java.util.List;
27 import java.util.Set;
28 import java.util.concurrent.locks.ReentrantReadWriteLock;
29 import java.util.logging.Level;
30 import org.apache.commons.dbcp2.BasicDataSource;
32 import org.sleuthkit.datamodel.TskData;
35 
41 final class SqliteEamDb extends AbstractSqlEamDb {
42 
43  private final static Logger LOGGER = Logger.getLogger(SqliteEamDb.class.getName());
44 
45  private static SqliteEamDb instance;
46 
47  private BasicDataSource connectionPool = null;
48 
49  private final SqliteEamDbSettings dbSettings;
50 
51  // While the Sqlite database should only be used for single users, it is still
52  // possible for multiple threads to attempt to write to the database simultaneously.
53  private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(true);
54 
63  public synchronized static SqliteEamDb getInstance() throws EamDbException {
64  if (instance == null) {
65  instance = new SqliteEamDb();
66  }
67 
68  return instance;
69  }
70 
77  private SqliteEamDb() throws EamDbException {
78  dbSettings = new SqliteEamDbSettings();
79  bulkArtifactsThreshold = dbSettings.getBulkThreshold();
80  }
81 
82  @Override
83  public void shutdownConnections() throws EamDbException {
84  try {
85  synchronized (this) {
86  if (null != connectionPool) {
87  connectionPool.close();
88  connectionPool = null; // force it to be re-created on next connect()
89  }
90  clearCaches();
91  }
92  } catch (SQLException ex) {
93  throw new EamDbException("Failed to close existing database connections.", ex); // NON-NLS
94  }
95  }
96 
97  @Override
98  public void updateSettings() {
99  synchronized (this) {
100  dbSettings.loadSettings();
101  bulkArtifactsThreshold = dbSettings.getBulkThreshold();
102  }
103  }
104 
105  @Override
106  public void saveSettings() {
107  synchronized (this) {
108  dbSettings.saveSettings();
109  }
110  }
111 
112  @Override
113  public void reset() throws EamDbException {
114  try {
115  acquireExclusiveLock();
116 
117  Connection conn = connect();
118 
119  try {
120 
121  Statement dropContent = conn.createStatement();
122  dropContent.executeUpdate("DELETE FROM organizations");
123  dropContent.executeUpdate("DELETE FROM cases");
124  dropContent.executeUpdate("DELETE FROM data_sources");
125  dropContent.executeUpdate("DELETE FROM reference_sets");
126  dropContent.executeUpdate("DELETE FROM artifact_types");
127  dropContent.executeUpdate("DELETE FROM db_info");
128 
129  String instancesTemplate = "DELETE FROM %s_instances";
130  String referencesTemplate = "DELETE FROM global_files";
131  for (CorrelationAttributeInstance.Type type : defaultCorrelationTypes) {
132  dropContent.executeUpdate(String.format(instancesTemplate, type.getDbTableName()));
133  // FUTURE: support other reference types
134  if (type.getId() == CorrelationAttributeInstance.FILES_TYPE_ID) {
135  dropContent.executeUpdate(String.format(referencesTemplate, type.getDbTableName()));
136  }
137  }
138 
139  dropContent.executeUpdate("VACUUM");
140  } catch (SQLException ex) {
141  LOGGER.log(Level.WARNING, "Failed to reset database.", ex);
142  } finally {
143  EamDbUtil.closeConnection(conn);
144  }
145 
146  dbSettings.insertDefaultDatabaseContent();
147  } finally {
148  releaseExclusiveLock();
149  }
150  }
151 
156  private void setupConnectionPool(boolean foreignKeysEnabled) throws EamDbException {
157 
158  if (dbSettings.dbFileExists() == false) {
159  throw new EamDbException("Central repository database missing");
160  }
161 
162  connectionPool = new BasicDataSource();
163  connectionPool.setDriverClassName(dbSettings.getDriver());
164  connectionPool.setUrl(dbSettings.getConnectionURL());
165 
166  // tweak pool configuration
167  connectionPool.setInitialSize(50);
168  connectionPool.setMaxTotal(-1);
169  connectionPool.setMaxIdle(-1);
170  connectionPool.setMaxWaitMillis(1000);
171  connectionPool.setValidationQuery(dbSettings.getValidationQuery());
172  if (foreignKeysEnabled) {
173  connectionPool.setConnectionInitSqls(Arrays.asList("PRAGMA foreign_keys = ON"));
174  } else {
175  connectionPool.setConnectionInitSqls(Arrays.asList("PRAGMA foreign_keys = OFF"));
176  }
177  }
178 
188  @Override
189  protected Connection connect(boolean foreignKeys) throws EamDbException {
190  synchronized (this) {
191  if (!EamDb.isEnabled()) {
192  throw new EamDbException("Central Repository module is not enabled"); // NON-NLS
193  }
194  if (connectionPool == null) {
195  setupConnectionPool(foreignKeys);
196  }
197  try {
198  return connectionPool.getConnection();
199  } catch (SQLException ex) {
200  throw new EamDbException("Error getting connection from connection pool.", ex); // NON-NLS
201  }
202  }
203  }
204 
212  @Override
213  protected Connection connect() throws EamDbException {
214  return connect(true);
215  }
216 
217  @Override
218  protected String getConflictClause() {
219  // For sqlite, our conflict clause is part of the table schema
220  return "";
221  }
222 
231  @Override
232  public void newDbInfo(String name, String value) throws EamDbException {
233  try {
234  acquireExclusiveLock();
235  super.newDbInfo(name, value);
236  } finally {
237  releaseExclusiveLock();
238  }
239  }
240 
250  @Override
251  public String getDbInfo(String name) throws EamDbException {
252  try {
253  acquireSharedLock();
254  return super.getDbInfo(name);
255  } finally {
256  releaseSharedLock();
257  }
258  }
259 
268  @Override
269  public void updateDbInfo(String name, String value) throws EamDbException {
270  try {
271  acquireExclusiveLock();
272  super.updateDbInfo(name, value);
273  } finally {
274  releaseExclusiveLock();
275  }
276  }
277 
283  @Override
284  public CorrelationCase newCase(Case autopsyCase) throws EamDbException {
285  try {
286  acquireExclusiveLock();
287  return super.newCase(autopsyCase);
288  } finally {
289  releaseExclusiveLock();
290  }
291  }
292 
293  @Override
294  public void addDataSourceObjectId(int rowId, long dataSourceObjectId) throws EamDbException {
295  try {
296  acquireExclusiveLock();
297  super.addDataSourceObjectId(rowId, dataSourceObjectId);
298  } finally {
299  releaseExclusiveLock();
300  }
301  }
302 
310  @Override
311  public CorrelationCase newCase(CorrelationCase eamCase) throws EamDbException {
312  try {
313  acquireExclusiveLock();
314  return super.newCase(eamCase);
315  } finally {
316  releaseExclusiveLock();
317  }
318  }
319 
325  @Override
326  public void updateCase(CorrelationCase eamCase) throws EamDbException {
327  try {
328  acquireExclusiveLock();
329  super.updateCase(eamCase);
330  } finally {
331  releaseExclusiveLock();
332  }
333  }
334 
342  @Override
343  public CorrelationCase getCaseByUUID(String caseUUID) throws EamDbException {
344  try {
345  acquireSharedLock();
346  return super.getCaseByUUID(caseUUID);
347  } finally {
348  releaseSharedLock();
349  }
350  }
351 
359  @Override
360  public CorrelationCase getCaseById(int caseId) throws EamDbException {
361  try {
362  acquireSharedLock();
363  return super.getCaseById(caseId);
364  } finally {
365  releaseSharedLock();
366  }
367 
368  }
369 
375  @Override
376  public List<CorrelationCase> getCases() throws EamDbException {
377  try {
378  acquireSharedLock();
379  return super.getCases();
380  } finally {
381  releaseSharedLock();
382  }
383  }
384 
390  @Override
391  public CorrelationDataSource newDataSource(CorrelationDataSource eamDataSource) throws EamDbException {
392  try {
393  acquireExclusiveLock();
394  return super.newDataSource(eamDataSource);
395  } finally {
396  releaseExclusiveLock();
397  }
398  }
399 
409  @Override
410  public CorrelationDataSource getDataSource(CorrelationCase correlationCase, Long caseDbDataSourceId) throws EamDbException {
411  try {
412  acquireSharedLock();
413  return super.getDataSource(correlationCase, caseDbDataSourceId);
414  } finally {
415  releaseSharedLock();
416  }
417  }
418 
428  @Override
429  public CorrelationDataSource getDataSourceById(CorrelationCase correlationCase, int dataSourceId) throws EamDbException {
430  try {
431  acquireSharedLock();
432  return super.getDataSourceById(correlationCase, dataSourceId);
433  } finally {
434  releaseSharedLock();
435  }
436  }
437 
443  @Override
444  public List<CorrelationDataSource> getDataSources() throws EamDbException {
445  try {
446  acquireSharedLock();
447  return super.getDataSources();
448  } finally {
449  releaseSharedLock();
450  }
451  }
452 
461  @Override
462  public void updateDataSourceName(CorrelationDataSource eamDataSource, String newName) throws EamDbException {
463  try {
464  acquireExclusiveLock();
465  super.updateDataSourceName(eamDataSource, newName);
466  } finally {
467  releaseExclusiveLock();
468  }
469  }
470 
476  @Override
477  public void updateDataSourceMd5Hash(CorrelationDataSource eamDataSource) throws EamDbException {
478  try {
479  acquireExclusiveLock();
480  super.updateDataSourceMd5Hash(eamDataSource);
481  } finally {
482  releaseExclusiveLock();
483  }
484  }
485 
491  @Override
492  public void updateDataSourceSha1Hash(CorrelationDataSource eamDataSource) throws EamDbException {
493  try {
494  acquireExclusiveLock();
495  super.updateDataSourceSha1Hash(eamDataSource);
496  } finally {
497  releaseExclusiveLock();
498  }
499  }
500 
507  @Override
508  public void updateDataSourceSha256Hash(CorrelationDataSource eamDataSource) throws EamDbException {
509  try {
510  acquireExclusiveLock();
511  super.updateDataSourceSha256Hash(eamDataSource);
512  } finally {
513  releaseExclusiveLock();
514  }
515  }
516 
523  @Override
524  public void addArtifactInstance(CorrelationAttributeInstance eamArtifact) throws EamDbException {
525  try {
526  acquireExclusiveLock();
527  super.addArtifactInstance(eamArtifact);
528  } finally {
529  releaseExclusiveLock();
530  }
531  }
532 
533  @Override
534  public List<CorrelationAttributeInstance> getArtifactInstancesByTypeValue(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
535  try {
536  acquireSharedLock();
537  return super.getArtifactInstancesByTypeValue(aType, value);
538  } finally {
539  releaseSharedLock();
540  }
541  }
542 
543  @Override
544  public List<CorrelationAttributeInstance> getArtifactInstancesByTypeValues(CorrelationAttributeInstance.Type aType, List<String> values) throws EamDbException, CorrelationAttributeNormalizationException {
545  try {
546  acquireSharedLock();
547  return super.getArtifactInstancesByTypeValues(aType, values);
548  } finally {
549  releaseSharedLock();
550  }
551  }
552 
553  @Override
554  public List<CorrelationAttributeInstance> getArtifactInstancesByTypeValuesAndCases(CorrelationAttributeInstance.Type aType, List<String> values, List<Integer> caseIds) throws EamDbException, CorrelationAttributeNormalizationException {
555  try {
556  acquireSharedLock();
557  return super.getArtifactInstancesByTypeValuesAndCases(aType, values, caseIds);
558  } finally {
559  releaseSharedLock();
560  }
561  }
562 
574  @Override
575  public List<CorrelationAttributeInstance> getArtifactInstancesByPath(CorrelationAttributeInstance.Type aType, String filePath) throws EamDbException {
576  try {
577  acquireSharedLock();
578  return super.getArtifactInstancesByPath(aType, filePath);
579  } finally {
580  releaseSharedLock();
581  }
582  }
583 
596  @Override
597  public Long getCountArtifactInstancesByTypeValue(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
598  try {
599  acquireSharedLock();
600  return super.getCountArtifactInstancesByTypeValue(aType, value);
601  } finally {
602  releaseSharedLock();
603  }
604  }
605 
606  @Override
607  public int getFrequencyPercentage(CorrelationAttributeInstance corAttr) throws EamDbException, CorrelationAttributeNormalizationException {
608  try {
609  acquireSharedLock();
610  return super.getFrequencyPercentage(corAttr);
611  } finally {
612  releaseSharedLock();
613  }
614  }
615 
628  @Override
629  public Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
630  try {
631  acquireSharedLock();
632  return super.getCountUniqueCaseDataSourceTuplesHavingTypeValue(aType, value);
633  } finally {
634  releaseSharedLock();
635  }
636  }
637 
638  @Override
639  public Long getCountUniqueDataSources() throws EamDbException {
640  try {
641  acquireSharedLock();
642  return super.getCountUniqueDataSources();
643  } finally {
644  releaseSharedLock();
645  }
646  }
647 
659  @Override
660  public Long getCountArtifactInstancesByCaseDataSource(CorrelationDataSource correlationDataSource) throws EamDbException {
661  try {
662  acquireSharedLock();
663  return super.getCountArtifactInstancesByCaseDataSource(correlationDataSource);
664  } finally {
665  releaseSharedLock();
666  }
667  }
668 
673  @Override
674  public void commitAttributeInstancesBulk() throws EamDbException {
675  try {
676  acquireExclusiveLock();
677  super.commitAttributeInstancesBulk();
678  } finally {
679  releaseExclusiveLock();
680  }
681  }
682 
686  @Override
687  public void bulkInsertCases(List<CorrelationCase> cases) throws EamDbException {
688  try {
689  acquireExclusiveLock();
690  super.bulkInsertCases(cases);
691  } finally {
692  releaseExclusiveLock();
693  }
694  }
695 
706  @Override
707  public void setAttributeInstanceKnownStatus(CorrelationAttributeInstance eamArtifact, TskData.FileKnown knownStatus) throws EamDbException {
708  try {
709  acquireExclusiveLock();
710  super.setAttributeInstanceKnownStatus(eamArtifact, knownStatus);
711  } finally {
712  releaseExclusiveLock();
713  }
714  }
715 
725  @Override
726  public List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
727  try {
728  acquireSharedLock();
729  return super.getArtifactInstancesKnownBad(aType, value);
730  } finally {
731  releaseSharedLock();
732  }
733  }
734 
746  @Override
747  public List<CorrelationAttributeInstance> getArtifactInstancesKnownBad(CorrelationAttributeInstance.Type aType) throws EamDbException {
748  try {
749  acquireSharedLock();
750  return super.getArtifactInstancesKnownBad(aType);
751  } finally {
752  releaseSharedLock();
753  }
754  }
755 
764  @Override
765  public Long getCountArtifactInstancesKnownBad(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
766  try {
767  acquireSharedLock();
768  return super.getCountArtifactInstancesKnownBad(aType, value);
769  } finally {
770  releaseSharedLock();
771  }
772  }
773 
786  @Override
787  public List<String> getListCasesHavingArtifactInstancesKnownBad(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
788  try {
789  acquireSharedLock();
790  return super.getListCasesHavingArtifactInstancesKnownBad(aType, value);
791  } finally {
792  releaseSharedLock();
793  }
794  }
795 
803  @Override
804  public void deleteReferenceSet(int referenceSetID) throws EamDbException {
805  try {
806  acquireExclusiveLock();
807  super.deleteReferenceSet(referenceSetID);
808  } finally {
809  releaseExclusiveLock();
810  }
811  }
812 
822  @Override
823  public boolean isValueInReferenceSet(String value, int referenceSetID, int correlationTypeID) throws EamDbException, CorrelationAttributeNormalizationException {
824  try {
825  acquireSharedLock();
826  return super.isValueInReferenceSet(value, referenceSetID, correlationTypeID);
827  } finally {
828  releaseSharedLock();
829  }
830  }
831 
840  @Override
841  public void processInstanceTable(CorrelationAttributeInstance.Type type, InstanceTableCallback instanceTableCallback) throws EamDbException {
842  try {
843  acquireSharedLock();
844  super.processInstanceTable(type, instanceTableCallback);
845  } finally {
846  releaseSharedLock();
847  }
848  }
849 
858  @Override
859  public void processInstanceTableWhere(CorrelationAttributeInstance.Type type, String whereClause, InstanceTableCallback instanceTableCallback) throws EamDbException {
860  try {
861  acquireSharedLock();
862  super.processInstanceTableWhere(type, whereClause, instanceTableCallback);
863  } finally {
864  releaseSharedLock();
865  }
866  }
867 
880  @Override
881  public boolean referenceSetExists(String referenceSetName, String version) throws EamDbException {
882  try {
883  acquireSharedLock();
884  return super.referenceSetExists(referenceSetName, version);
885  } finally {
886  releaseSharedLock();
887  }
888  }
889 
898  @Override
899  public boolean isArtifactKnownBadByReference(CorrelationAttributeInstance.Type aType, String value) throws EamDbException, CorrelationAttributeNormalizationException {
900  try {
901  acquireSharedLock();
902  return super.isArtifactKnownBadByReference(aType, value);
903  } finally {
904  releaseSharedLock();
905  }
906  }
907 
917  @Override
918  public EamOrganization newOrganization(EamOrganization eamOrg) throws EamDbException {
919  try {
920  acquireExclusiveLock();
921  return super.newOrganization(eamOrg);
922  } finally {
923  releaseExclusiveLock();
924  }
925  }
926 
934  @Override
935  public List<EamOrganization> getOrganizations() throws EamDbException {
936  try {
937  acquireSharedLock();
938  return super.getOrganizations();
939  } finally {
940  releaseSharedLock();
941  }
942  }
943 
953  @Override
954  public EamOrganization getOrganizationByID(int orgID) throws EamDbException {
955  try {
956  acquireSharedLock();
957  return super.getOrganizationByID(orgID);
958  } finally {
959  releaseSharedLock();
960  }
961  }
962 
963  @Override
964  public void updateOrganization(EamOrganization updatedOrganization) throws EamDbException {
965  try {
966  acquireExclusiveLock();
967  super.updateOrganization(updatedOrganization);
968  } finally {
969  releaseExclusiveLock();
970  }
971  }
972 
973  @Override
974  public void deleteOrganization(EamOrganization organizationToDelete) throws EamDbException {
975  try {
976  acquireExclusiveLock();
977  super.deleteOrganization(organizationToDelete);
978  } finally {
979  releaseExclusiveLock();
980  }
981  }
982 
992  @Override
993  public int newReferenceSet(EamGlobalSet eamGlobalSet) throws EamDbException {
994  try {
995  acquireExclusiveLock();
996  return super.newReferenceSet(eamGlobalSet);
997  } finally {
998  releaseExclusiveLock();
999  }
1000  }
1001 
1011  @Override
1012  public EamGlobalSet getReferenceSetByID(int referenceSetID) throws EamDbException {
1013  try {
1014  acquireSharedLock();
1015  return super.getReferenceSetByID(referenceSetID);
1016  } finally {
1017  releaseSharedLock();
1018  }
1019  }
1020 
1030  @Override
1031  public List<EamGlobalSet> getAllReferenceSets(CorrelationAttributeInstance.Type correlationType) throws EamDbException {
1032  try {
1033  acquireSharedLock();
1034  return super.getAllReferenceSets(correlationType);
1035  } finally {
1036  releaseSharedLock();
1037  }
1038  }
1039 
1049  @Override
1050  public void addReferenceInstance(EamGlobalFileInstance eamGlobalFileInstance, CorrelationAttributeInstance.Type correlationType) throws EamDbException {
1051  try {
1052  acquireExclusiveLock();
1053  super.addReferenceInstance(eamGlobalFileInstance, correlationType);
1054  } finally {
1055  releaseExclusiveLock();
1056  }
1057  }
1058 
1064  @Override
1065  public void bulkInsertReferenceTypeEntries(Set<EamGlobalFileInstance> globalInstances, CorrelationAttributeInstance.Type contentType) throws EamDbException {
1066  try {
1067  acquireExclusiveLock();
1068  super.bulkInsertReferenceTypeEntries(globalInstances, contentType);
1069  } finally {
1070  releaseExclusiveLock();
1071  }
1072  }
1073 
1084  @Override
1085  public List<EamGlobalFileInstance> getReferenceInstancesByTypeValue(CorrelationAttributeInstance.Type aType, String aValue) throws EamDbException, CorrelationAttributeNormalizationException {
1086  try {
1087  acquireSharedLock();
1088  return super.getReferenceInstancesByTypeValue(aType, aValue);
1089  } finally {
1090  releaseSharedLock();
1091  }
1092  }
1093 
1103  @Override
1104  public int newCorrelationType(CorrelationAttributeInstance.Type newType) throws EamDbException {
1105  try {
1106  acquireExclusiveLock();
1107  return super.newCorrelationType(newType);
1108  } finally {
1109  releaseExclusiveLock();
1110  }
1111  }
1112 
1122  @Override
1123  public List<CorrelationAttributeInstance.Type> getDefinedCorrelationTypes() throws EamDbException {
1124  try {
1125  acquireSharedLock();
1126  return super.getDefinedCorrelationTypes();
1127  } finally {
1128  releaseSharedLock();
1129  }
1130  }
1131 
1141  @Override
1142  public List<CorrelationAttributeInstance.Type> getEnabledCorrelationTypes() throws EamDbException {
1143  try {
1144  acquireSharedLock();
1145  return super.getEnabledCorrelationTypes();
1146  } finally {
1147  releaseSharedLock();
1148  }
1149  }
1150 
1160  @Override
1161  public List<CorrelationAttributeInstance.Type> getSupportedCorrelationTypes() throws EamDbException {
1162  try {
1163  acquireSharedLock();
1164  return super.getSupportedCorrelationTypes();
1165  } finally {
1166  releaseSharedLock();
1167  }
1168  }
1169 
1177  @Override
1178  public void updateCorrelationType(CorrelationAttributeInstance.Type aType) throws EamDbException {
1179  try {
1180  acquireExclusiveLock();
1181  super.updateCorrelationType(aType);
1182  } finally {
1183  releaseExclusiveLock();
1184  }
1185  }
1186 
1196  @Override
1197  public CorrelationAttributeInstance.Type getCorrelationTypeById(int typeId) throws EamDbException {
1198  try {
1199  acquireSharedLock();
1200  return super.getCorrelationTypeById(typeId);
1201  } finally {
1202  releaseSharedLock();
1203  }
1204  }
1205 
1211  @Override
1212  public void upgradeSchema() throws EamDbException, SQLException, IncompatibleCentralRepoException {
1213  try {
1214  acquireExclusiveLock();
1215  super.upgradeSchema();
1216  } finally {
1217  releaseExclusiveLock();
1218  }
1219  }
1220 
1232  @Override
1233  public CoordinationService.Lock getExclusiveMultiUserDbLock() throws EamDbException {
1234  // Multiple users are not supported for SQLite
1235  return null;
1236  }
1237 
1243  private void acquireExclusiveLock() {
1244  rwLock.writeLock().lock();
1245  }
1246 
1252  private void releaseExclusiveLock() {
1253  rwLock.writeLock().unlock();
1254  }
1255 
1261  private void acquireSharedLock() {
1262  rwLock.readLock().lock();
1263  }
1264 
1270  private void releaseSharedLock() {
1271  rwLock.readLock().unlock();
1272  }
1273 
1274  @Override
1275  boolean doesColumnExist(Connection conn, String tableName, String columnName) throws SQLException {
1276  final String tableInfoQueryTemplate = "PRAGMA table_info(%s)"; //NON-NLS
1277  ResultSet resultSet = null;
1278  Statement statement = null;
1279  boolean columnExists = false;
1280  try {
1281  statement = conn.createStatement();
1282  resultSet = statement.executeQuery(String.format(tableInfoQueryTemplate, tableName));
1283  while (resultSet.next()) {
1284  // the second value ( 2 ) is the column name
1285  if (resultSet.getString(2).equals(columnName)) {
1286  columnExists = true;
1287  break;
1288  }
1289  }
1290  } finally {
1291  EamDbUtil.closeResultSet(resultSet);
1292  EamDbUtil.closeStatement(statement);
1293  }
1294  return columnExists;
1295  }
1296 }

Copyright © 2012-2018 Basis Technology. Generated on: Fri Mar 22 2019
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.