Autopsy  4.8.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
PostgresEamDbSettings.java
Go to the documentation of this file.
1 /*
2  * Central Repository
3  *
4  * Copyright 2015-2017 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.DriverManager;
23 import java.sql.PreparedStatement;
24 import java.sql.ResultSet;
25 import java.sql.SQLException;
26 import java.sql.Statement;
27 import java.util.List;
28 import java.util.Properties;
29 import java.util.logging.Level;
30 import java.util.regex.Pattern;
35 
41 public final class PostgresEamDbSettings {
42 
43  private final static Logger LOGGER = Logger.getLogger(PostgresEamDbSettings.class.getName());
44  private final String DEFAULT_HOST = ""; // NON-NLS
45  private final int DEFAULT_PORT = 5432;
46  private final String DEFAULT_DBNAME = "central_repository"; // NON-NLS
47  private final String DEFAULT_USERNAME = "";
48  private final String DEFAULT_PASSWORD = "";
49  private final String VALIDATION_QUERY = "SELECT version()"; // NON-NLS
50  private final String JDBC_BASE_URI = "jdbc:postgresql://"; // NON-NLS
51  private final String JDBC_DRIVER = "org.postgresql.Driver"; // NON-NLS
52  private final String DB_NAMES_REGEX = "[a-z][a-z0-9_]*"; // only lower case
53  private final String DB_USER_NAMES_REGEX = "[a-zA-Z]\\w*";
54  private String host;
55  private int port;
56  private String dbName;
57  private int bulkThreshold;
58  private String userName;
59  private String password;
60 
62  loadSettings();
63  }
64 
65  public void loadSettings() {
66  host = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.host"); // NON-NLS
67  if (host == null || host.isEmpty()) {
68  host = DEFAULT_HOST;
69  }
70 
71  try {
72  String portString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.port"); // NON-NLS
73  if (portString == null || portString.isEmpty()) {
74  port = DEFAULT_PORT;
75  } else {
76  port = Integer.parseInt(portString);
77  if (port < 0 || port > 65535) {
78  port = DEFAULT_PORT;
79  }
80  }
81  } catch (NumberFormatException ex) {
82  port = DEFAULT_PORT;
83  }
84 
85  dbName = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.dbName"); // NON-NLS
86  if (dbName == null || dbName.isEmpty()) {
87  dbName = DEFAULT_DBNAME;
88  }
89 
90  try {
91  String bulkThresholdString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.bulkThreshold"); // NON-NLS
92  if (bulkThresholdString == null || bulkThresholdString.isEmpty()) {
93  this.bulkThreshold = AbstractSqlEamDb.DEFAULT_BULK_THRESHHOLD;
94  } else {
95  this.bulkThreshold = Integer.parseInt(bulkThresholdString);
96  if (getBulkThreshold() <= 0) {
97  this.bulkThreshold = AbstractSqlEamDb.DEFAULT_BULK_THRESHHOLD;
98  }
99  }
100  } catch (NumberFormatException ex) {
101  this.bulkThreshold = AbstractSqlEamDb.DEFAULT_BULK_THRESHHOLD;
102  }
103 
104  userName = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.user"); // NON-NLS
105  if (userName == null || userName.isEmpty()) {
106  userName = DEFAULT_USERNAME;
107  }
108 
109  password = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.password"); // NON-NLS
110  if (password == null || password.isEmpty()) {
111  password = DEFAULT_PASSWORD;
112  } else {
113  try {
114  password = TextConverter.convertHexTextToText(password);
115  } catch (TextConverterException ex) {
116  LOGGER.log(Level.WARNING, "Failed to convert password from hex text to text.", ex);
117  password = DEFAULT_PASSWORD;
118  }
119  }
120  }
121 
122  public void saveSettings() {
123  ModuleSettings.setConfigSetting("CentralRepository", "db.postgresql.host", getHost()); // NON-NLS
124  ModuleSettings.setConfigSetting("CentralRepository", "db.postgresql.port", Integer.toString(port)); // NON-NLS
125  ModuleSettings.setConfigSetting("CentralRepository", "db.postgresql.dbName", getDbName()); // NON-NLS
126  ModuleSettings.setConfigSetting("CentralRepository", "db.postgresql.bulkThreshold", Integer.toString(getBulkThreshold())); // NON-NLS
127  ModuleSettings.setConfigSetting("CentralRepository", "db.postgresql.user", getUserName()); // NON-NLS
128  try {
129  ModuleSettings.setConfigSetting("CentralRepository", "db.postgresql.password", TextConverter.convertTextToHexText(getPassword())); // NON-NLS
130  } catch (TextConverterException ex) {
131  LOGGER.log(Level.SEVERE, "Failed to convert password from text to hex text.", ex);
132  }
133  }
134 
143  String getConnectionURL(boolean usePostgresDb) {
144  StringBuilder url = new StringBuilder();
145  url.append(getJDBCBaseURI());
146  url.append(getHost());
147  url.append("/"); // NON-NLS
148  if (usePostgresDb) {
149  url.append("postgres"); // NON-NLS
150  } else {
151  url.append(getDbName());
152  }
153 
154  return url.toString();
155  }
156 
163  private Connection getEphemeralConnection(boolean usePostgresDb) {
164  Connection conn;
165  try {
166  String url = getConnectionURL(usePostgresDb);
167  Properties props = new Properties();
168  props.setProperty("user", getUserName());
169  props.setProperty("password", getPassword());
170 
171  Class.forName(getDriver());
172  conn = DriverManager.getConnection(url, props);
173  } catch (ClassNotFoundException | SQLException ex) {
174  // TODO: Determine why a connection failure (ConnectionException) re-throws
175  // the SQLException and does not print this log message?
176  LOGGER.log(Level.SEVERE, "Failed to acquire ephemeral connection to postgresql."); // NON-NLS
177  conn = null;
178  }
179  return conn;
180  }
181 
188  public boolean verifyConnection() {
189  Connection conn = getEphemeralConnection(true);
190  if (null == conn) {
191  return false;
192  }
193 
194  boolean result = EamDbUtil.executeValidationQuery(conn, VALIDATION_QUERY);
196  return result;
197  }
198 
204  public boolean verifyDatabaseExists() {
205  Connection conn = getEphemeralConnection(true);
206  if (null == conn) {
207  return false;
208  }
209 
210  String sql = "SELECT datname FROM pg_catalog.pg_database WHERE lower(datname) = lower(?) LIMIT 1"; // NON-NLS
211  PreparedStatement ps = null;
212  ResultSet rs = null;
213  try {
214  ps = conn.prepareStatement(sql);
215  ps.setString(1, getDbName());
216  rs = ps.executeQuery();
217  if (rs.next()) {
218  return true;
219  }
220  } catch (SQLException ex) {
221  LOGGER.log(Level.SEVERE, "Failed to execute database existance query.", ex); // NON-NLS
222  return false;
223  } finally {
227  }
228  return false;
229  }
230 
237  public boolean verifyDatabaseSchema() {
238  Connection conn = getEphemeralConnection(false);
239  if (null == conn) {
240  return false;
241  }
242 
243  boolean result = EamDbUtil.schemaVersionIsSet(conn);
244 
246  return result;
247  }
248 
249  public boolean createDatabase() {
250  Connection conn = getEphemeralConnection(true);
251  if (null == conn) {
252  return false;
253  }
254 
255  String sql = "CREATE DATABASE %s OWNER %s"; // NON-NLS
256  try {
257  Statement stmt;
258  stmt = conn.createStatement();
259  stmt.execute(String.format(sql, getDbName(), getUserName()));
260  } catch (SQLException ex) {
261  LOGGER.log(Level.SEVERE, "Failed to execute create database statement.", ex); // NON-NLS
262  return false;
263  } finally {
265  }
266  return true;
267 
268  }
269 
270  public boolean deleteDatabase() {
271  Connection conn = getEphemeralConnection(true);
272  if (null == conn) {
273  return false;
274  }
275 
276  String sql = "DROP DATABASE %s"; // NON-NLS
277  try {
278  Statement stmt;
279  stmt = conn.createStatement();
280  stmt.execute(String.format(sql, getDbName()));
281  } catch (SQLException ex) {
282  LOGGER.log(Level.SEVERE, "Failed to execute drop database statement.", ex); // NON-NLS
283  return false;
284  } finally {
286  }
287  return true;
288 
289  }
290 
302  public boolean initializeDatabaseSchema() {
303  // The "id" column is an alias for the built-in 64-bit int "rowid" column.
304  // It is autoincrementing by default and must be of type "integer primary key".
305  // We've omitted the autoincrement argument because we are not currently
306  // using the id value to search for specific rows, so we do not care
307  // if a rowid is re-used after an existing rows was previously deleted.
308  StringBuilder createOrganizationsTable = new StringBuilder();
309  createOrganizationsTable.append("CREATE TABLE IF NOT EXISTS organizations (");
310  createOrganizationsTable.append("id SERIAL PRIMARY KEY,");
311  createOrganizationsTable.append("org_name text NOT NULL,");
312  createOrganizationsTable.append("poc_name text NOT NULL,");
313  createOrganizationsTable.append("poc_email text NOT NULL,");
314  createOrganizationsTable.append("poc_phone text NOT NULL,");
315  createOrganizationsTable.append("CONSTRAINT org_name_unique UNIQUE (org_name)");
316  createOrganizationsTable.append(")");
317 
318  // NOTE: The organizations will only have a small number of rows, so
319  // an index is probably not worthwhile.
320  StringBuilder createCasesTable = new StringBuilder();
321  createCasesTable.append("CREATE TABLE IF NOT EXISTS cases (");
322  createCasesTable.append("id SERIAL PRIMARY KEY,");
323  createCasesTable.append("case_uid text NOT NULL,");
324  createCasesTable.append("org_id integer,");
325  createCasesTable.append("case_name text NOT NULL,");
326  createCasesTable.append("creation_date text NOT NULL,");
327  createCasesTable.append("case_number text,");
328  createCasesTable.append("examiner_name text,");
329  createCasesTable.append("examiner_email text,");
330  createCasesTable.append("examiner_phone text,");
331  createCasesTable.append("notes text,");
332  createCasesTable.append("foreign key (org_id) references organizations(id) ON UPDATE SET NULL ON DELETE SET NULL,");
333  createCasesTable.append("CONSTRAINT case_uid_unique UNIQUE (case_uid)");
334  createCasesTable.append(")");
335 
336  // NOTE: when there are few cases in the cases table, these indices may not be worthwhile
337  String casesIdx1 = "CREATE INDEX IF NOT EXISTS cases_org_id ON cases (org_id)";
338  String casesIdx2 = "CREATE INDEX IF NOT EXISTS cases_case_uid ON cases (case_uid)";
339 
340  StringBuilder createDataSourcesTable = new StringBuilder();
341  createDataSourcesTable.append("CREATE TABLE IF NOT EXISTS data_sources (");
342  createDataSourcesTable.append("id SERIAL PRIMARY KEY,");
343  createDataSourcesTable.append("case_id integer NOT NULL,");
344  createDataSourcesTable.append("device_id text NOT NULL,");
345  createDataSourcesTable.append("name text NOT NULL,");
346  createDataSourcesTable.append("foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,");
347  createDataSourcesTable.append("CONSTRAINT datasource_unique UNIQUE (case_id, device_id, name)");
348  createDataSourcesTable.append(")");
349 
350  String dataSourceIdx1 = "CREATE INDEX IF NOT EXISTS data_sources_name ON data_sources (name)";
351 
352  StringBuilder createReferenceSetsTable = new StringBuilder();
353  createReferenceSetsTable.append("CREATE TABLE IF NOT EXISTS reference_sets (");
354  createReferenceSetsTable.append("id SERIAL PRIMARY KEY,");
355  createReferenceSetsTable.append("org_id integer NOT NULL,");
356  createReferenceSetsTable.append("set_name text NOT NULL,");
357  createReferenceSetsTable.append("version text NOT NULL,");
358  createReferenceSetsTable.append("known_status integer NOT NULL,");
359  createReferenceSetsTable.append("read_only boolean NOT NULL,");
360  createReferenceSetsTable.append("type integer NOT NULL,");
361  createReferenceSetsTable.append("import_date text NOT NULL,");
362  createReferenceSetsTable.append("foreign key (org_id) references organizations(id) ON UPDATE SET NULL ON DELETE SET NULL,");
363  createReferenceSetsTable.append("CONSTRAINT hash_set_unique UNIQUE (set_name, version)");
364  createReferenceSetsTable.append(")");
365 
366  String referenceSetsIdx1 = "CREATE INDEX IF NOT EXISTS reference_sets_org_id ON reference_sets (org_id)";
367 
368  // Each "%s" will be replaced with the relevant reference_TYPE table name.
369  StringBuilder createReferenceTypesTableTemplate = new StringBuilder();
370  createReferenceTypesTableTemplate.append("CREATE TABLE IF NOT EXISTS %s (");
371  createReferenceTypesTableTemplate.append("id SERIAL PRIMARY KEY,");
372  createReferenceTypesTableTemplate.append("reference_set_id integer,");
373  createReferenceTypesTableTemplate.append("value text NOT NULL,");
374  createReferenceTypesTableTemplate.append("known_status integer NOT NULL,");
375  createReferenceTypesTableTemplate.append("comment text,");
376  createReferenceTypesTableTemplate.append("CONSTRAINT %s_multi_unique UNIQUE (reference_set_id, value),");
377  createReferenceTypesTableTemplate.append("foreign key (reference_set_id) references reference_sets(id) ON UPDATE SET NULL ON DELETE SET NULL");
378  createReferenceTypesTableTemplate.append(")");
379 
380  // Each "%s" will be replaced with the relevant reference_TYPE table name.
381  String referenceTypesIdx1 = "CREATE INDEX IF NOT EXISTS %s_value ON %s (value)";
382  String referenceTypesIdx2 = "CREATE INDEX IF NOT EXISTS %s_value_known_status ON %s (value, known_status)";
383 
384  StringBuilder createCorrelationTypesTable = new StringBuilder();
385  createCorrelationTypesTable.append("CREATE TABLE IF NOT EXISTS correlation_types (");
386  createCorrelationTypesTable.append("id SERIAL PRIMARY KEY,");
387  createCorrelationTypesTable.append("display_name text NOT NULL,");
388  createCorrelationTypesTable.append("db_table_name text NOT NULL,");
389  createCorrelationTypesTable.append("supported integer NOT NULL,");
390  createCorrelationTypesTable.append("enabled integer NOT NULL,");
391  createCorrelationTypesTable.append("CONSTRAINT correlation_types_names UNIQUE (display_name, db_table_name)");
392  createCorrelationTypesTable.append(")");
393 
394  // Each "%s" will be replaced with the relevant TYPE_instances table name.
395  StringBuilder createArtifactInstancesTableTemplate = new StringBuilder();
396  createArtifactInstancesTableTemplate.append("CREATE TABLE IF NOT EXISTS %s (");
397  createArtifactInstancesTableTemplate.append("id SERIAL PRIMARY KEY,");
398  createArtifactInstancesTableTemplate.append("case_id integer NOT NULL,");
399  createArtifactInstancesTableTemplate.append("data_source_id integer NOT NULL,");
400  createArtifactInstancesTableTemplate.append("value text NOT NULL,");
401  createArtifactInstancesTableTemplate.append("file_path text NOT NULL,");
402  createArtifactInstancesTableTemplate.append("known_status integer NOT NULL,");
403  createArtifactInstancesTableTemplate.append("comment text,");
404  createArtifactInstancesTableTemplate.append("CONSTRAINT %s_multi_unique_ UNIQUE (data_source_id, value, file_path),");
405  createArtifactInstancesTableTemplate.append("foreign key (case_id) references cases(id) ON UPDATE SET NULL ON DELETE SET NULL,");
406  createArtifactInstancesTableTemplate.append("foreign key (data_source_id) references data_sources(id) ON UPDATE SET NULL ON DELETE SET NULL");
407  createArtifactInstancesTableTemplate.append(")");
408 
409  // Each "%s" will be replaced with the relevant TYPE_instances table name.
410  String instancesIdx1 = "CREATE INDEX IF NOT EXISTS %s_case_id ON %s (case_id)";
411  String instancesIdx2 = "CREATE INDEX IF NOT EXISTS %s_data_source_id ON %s (data_source_id)";
412  String instancesIdx3 = "CREATE INDEX IF NOT EXISTS %s_value ON %s (value)";
413  String instancesIdx4 = "CREATE INDEX IF NOT EXISTS %s_value_known_status ON %s (value, known_status)";
414 
415  StringBuilder createDbInfoTable = new StringBuilder();
416  createDbInfoTable.append("CREATE TABLE IF NOT EXISTS db_info (");
417  createDbInfoTable.append("id SERIAL PRIMARY KEY NOT NULL,");
418  createDbInfoTable.append("name text NOT NULL,");
419  createDbInfoTable.append("value text NOT NULL");
420  createDbInfoTable.append(")");
421 
422  // NOTE: the db_info table currenly only has 1 row, so having an index
423  // provides no benefit.
424  Connection conn = null;
425  try {
426  conn = getEphemeralConnection(false);
427  if (null == conn) {
428  return false;
429  }
430  Statement stmt = conn.createStatement();
431 
432  stmt.execute(createOrganizationsTable.toString());
433 
434  stmt.execute(createCasesTable.toString());
435  stmt.execute(casesIdx1);
436  stmt.execute(casesIdx2);
437 
438  stmt.execute(createDataSourcesTable.toString());
439  stmt.execute(dataSourceIdx1);
440 
441  stmt.execute(createReferenceSetsTable.toString());
442  stmt.execute(referenceSetsIdx1);
443 
444  stmt.execute(createCorrelationTypesTable.toString());
445 
446  stmt.execute(createDbInfoTable.toString());
447 
448  // Create a separate instance and reference table for each correlation type
450 
451  String reference_type_dbname;
452  String instance_type_dbname;
453  for (CorrelationAttributeInstance.Type type : DEFAULT_CORRELATION_TYPES) {
454  reference_type_dbname = EamDbUtil.correlationTypeToReferenceTableName(type);
455  instance_type_dbname = EamDbUtil.correlationTypeToInstanceTableName(type);
456 
457  stmt.execute(String.format(createArtifactInstancesTableTemplate.toString(), instance_type_dbname, instance_type_dbname));
458  stmt.execute(String.format(instancesIdx1, instance_type_dbname, instance_type_dbname));
459  stmt.execute(String.format(instancesIdx2, instance_type_dbname, instance_type_dbname));
460  stmt.execute(String.format(instancesIdx3, instance_type_dbname, instance_type_dbname));
461  stmt.execute(String.format(instancesIdx4, instance_type_dbname, instance_type_dbname));
462 
463  // FUTURE: allow more than the FILES type
464  if (type.getId() == CorrelationAttributeInstance.FILES_TYPE_ID) {
465  stmt.execute(String.format(createReferenceTypesTableTemplate.toString(), reference_type_dbname, reference_type_dbname));
466  stmt.execute(String.format(referenceTypesIdx1, reference_type_dbname, reference_type_dbname));
467  stmt.execute(String.format(referenceTypesIdx2, reference_type_dbname, reference_type_dbname));
468  }
469  }
470 
471  } catch (SQLException ex) {
472  LOGGER.log(Level.SEVERE, "Error initializing db schema.", ex); // NON-NLS
473  return false;
474  } catch (EamDbException ex) {
475  LOGGER.log(Level.SEVERE, "Error getting default correlation types. Likely due to one or more Type's with an invalid db table name."); // NON-NLS
476  return false;
477  } finally {
479  }
480  return true;
481  }
482 
483  public boolean insertDefaultDatabaseContent() {
484  Connection conn = getEphemeralConnection(false);
485  if (null == conn) {
486  return false;
487  }
488 
489  boolean result = EamDbUtil.insertDefaultCorrelationTypes(conn)
490  && EamDbUtil.updateSchemaVersion(conn)
491  && EamDbUtil.insertDefaultOrganization(conn);
493 
494  return result;
495  }
496 
497  boolean isChanged() {
498  String hostString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.host"); // NON-NLS
499  String portString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.port"); // NON-NLS
500  String dbNameString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.dbName"); // NON-NLS
501  String bulkThresholdString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.bulkThreshold"); // NON-NLS
502  String userNameString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.user"); // NON-NLS
503  String userPasswordString = ModuleSettings.getConfigSetting("CentralRepository", "db.postgresql.password"); // NON-NLS
504 
505  return !host.equals(hostString) || !Integer.toString(port).equals(portString)
506  || !dbName.equals(dbNameString) || !Integer.toString(bulkThreshold).equals(bulkThresholdString)
507  || !userName.equals(userNameString) || !password.equals(userPasswordString);
508  }
509 
513  public String getHost() {
514  return host;
515  }
516 
520  public void setHost(String host) throws EamDbException {
521  if (null != host && !host.isEmpty()) {
522  this.host = host;
523  } else {
524  throw new EamDbException("Invalid host name. Cannot be empty."); // NON-NLS
525  }
526  }
527 
531  public int getPort() {
532  return port;
533  }
534 
538  public void setPort(int port) throws EamDbException {
539  if (port > 0 && port < 65535) {
540  this.port = port;
541  } else {
542  throw new EamDbException("Invalid port. Must be a number greater than 0."); // NON-NLS
543  }
544  }
545 
552  public String getDbName() {
553  return dbName.toLowerCase();
554  }
555 
559  public void setDbName(String dbName) throws EamDbException {
560  if (dbName == null || dbName.isEmpty()) {
561  throw new EamDbException("Invalid database name. Cannot be empty."); // NON-NLS
562  } else if (!Pattern.matches(DB_NAMES_REGEX, dbName)) {
563  throw new EamDbException("Invalid database name. Name must start with a lowercase letter and can only contain lowercase letters, numbers, and '_'."); // NON-NLS
564  }
565 
566  this.dbName = dbName.toLowerCase();
567  }
568 
572  int getBulkThreshold() {
573  return bulkThreshold;
574  }
575 
579  public void setBulkThreshold(int bulkThreshold) throws EamDbException {
580  if (bulkThreshold > 0) {
581  this.bulkThreshold = bulkThreshold;
582  } else {
583  throw new EamDbException("Invalid bulk threshold."); // NON-NLS
584  }
585  }
586 
590  public String getUserName() {
591  return userName;
592  }
593 
597  public void setUserName(String userName) throws EamDbException {
598  if (userName == null || userName.isEmpty()) {
599  throw new EamDbException("Invalid user name. Cannot be empty."); // NON-NLS
600  } else if (!Pattern.matches(DB_USER_NAMES_REGEX, userName)) {
601  throw new EamDbException("Invalid user name. Name must start with a letter and can only contain letters, numbers, and '_'."); // NON-NLS
602  }
603  this.userName = userName;
604  }
605 
609  public String getPassword() {
610  return password;
611  }
612 
616  public void setPassword(String password) throws EamDbException {
617  if (password == null || password.isEmpty()) {
618  throw new EamDbException("Invalid user password. Cannot be empty."); // NON-NLS
619  }
620  this.password = password;
621  }
622 
626  String getValidationQuery() {
627  return VALIDATION_QUERY;
628  }
629 
633  String getDriver() {
634  return JDBC_DRIVER;
635  }
636 
640  String getJDBCBaseURI() {
641  return JDBC_BASE_URI;
642  }
643 
644 }
static String correlationTypeToInstanceTableName(CorrelationAttributeInstance.Type type)
Definition: EamDbUtil.java:349
static boolean executeValidationQuery(Connection conn, String validationQuery)
Definition: EamDbUtil.java:321
static synchronized void setConfigSetting(String moduleName, String settingName, String settingVal)
static boolean insertDefaultCorrelationTypes(Connection conn)
Definition: EamDbUtil.java:102
static String getConfigSetting(String moduleName, String settingName)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
static String correlationTypeToReferenceTableName(CorrelationAttributeInstance.Type type)
Definition: EamDbUtil.java:360
static String convertTextToHexText(String property)
static String convertHexTextToText(String property)

Copyright © 2012-2018 Basis Technology. Generated on: Thu Oct 4 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.