diff --git a/api/src/org/labkey/api/ApiModule.java b/api/src/org/labkey/api/ApiModule.java index b28cf36e71d..a14f28c3fef 100644 --- a/api/src/org/labkey/api/ApiModule.java +++ b/api/src/org/labkey/api/ApiModule.java @@ -504,13 +504,11 @@ public void registerServlets(ServletContext servletCtx) ParameterSubstitutionTest.class, Portal.TestCase.class, PropertyManager.TestCase.class, - //RateLimiter.TestCase.class, RecordFactory.TestCase.class, ResultSetDataIterator.TestCase.class, ResultSetSelectorTestCase.class, RoleSet.TestCase.class, RowTrackingResultSetWrapper.TestCase.class, - SQLFragment.IntegrationTestCase.class, SecurityManager.TestCase.class, SimpleTranslator.TranslateTestCase.class, SqlSelectorTestCase.class, diff --git a/api/src/org/labkey/api/data/BaseColumnInfo.java b/api/src/org/labkey/api/data/BaseColumnInfo.java index 6990d288da8..b9bf8250798 100644 --- a/api/src/org/labkey/api/data/BaseColumnInfo.java +++ b/api/src/org/labkey/api/data/BaseColumnInfo.java @@ -158,7 +158,6 @@ public BaseColumnInfo(ColumnInfo from) this(from, from.getParentTable()); } - public BaseColumnInfo(ColumnInfo from, TableInfo parent) { this(from.getFieldKey(), parent, from.getJdbcType()); @@ -199,7 +198,6 @@ public BaseColumnInfo(ResultSetMetaData rsmd, int col) throws SQLException setAlias(SqlDialect.makeDatabaseIdentifier(rsmd.getColumnName(col), new SQLFragment(rsmd.getColumnName(col)))); } - /* Most ColumnInfos represent a column in the database. However, some are created only for meta-data purposes. * e.g. for DataLoader or "fake" ResultsImpl. * These columns do not have a SqlDialect. This constructor method is useful in that case. In particular it will @@ -235,7 +233,6 @@ public SQLFragment getSql() } } - /* used by TableInfo.addColumn */ public boolean lockName() { @@ -243,7 +240,6 @@ public boolean lockName() return true; } - /** use setFieldKey() avoid ambiguity when columns have "/" */ public void setName(@NotNull String name) { @@ -255,7 +251,6 @@ public void setName(@NotNull String name) _fieldKey = newFieldKey; } - @Override @NotNull public String getName() { @@ -265,7 +260,6 @@ public String getName() return _fieldKey.toString(); } - @Override public void setFieldKey(@NotNull FieldKey key) { @@ -273,14 +267,12 @@ public void setFieldKey(@NotNull FieldKey key) _fieldKey = Objects.requireNonNull(key); } - @Override @NotNull public FieldKey getFieldKey() { return _fieldKey; } - // use only for debugging, will change after call to getAlias() @Override public boolean isAliasSet() @@ -363,7 +355,6 @@ public void copyAttributesFrom(ColumnInfo col) setUserEditable(col.isUserEditable()); //This can impact UniqueId fields if not set } - /* * copy "non-core" attributes, e.g. leave key and type information alone */ @@ -538,7 +529,6 @@ public void setExtraAttributesFrom(BaseColumnInfo col) setScannable(col.isScannable()); } - /** * copy the url string expression from col with the specified rewrites * @param col source of the url StringExpression @@ -571,7 +561,6 @@ public void copyURLFrom(ColumnInfo col, @Nullable FieldKey parent, @Nullable Map setOnClick(col.getOnClick()); } - /* only copy if all field keys are in the map */ public void copyURLFromStrict(ColumnInfo col, Map remap) { @@ -698,7 +687,6 @@ public SqlDialect getSqlDialect() return _parentTable.getSqlDialect(); } - // Return the actual value we have stashed; use this when copying attributes, so you don't hard-code label @Override public String getLabelValue() @@ -706,7 +694,6 @@ public String getLabelValue() return _label; } - @Override public String getLabel() { @@ -715,7 +702,6 @@ public String getLabel() return _label; } - @Override public boolean isFormatStringSet() { @@ -843,14 +829,12 @@ public TableDescription getFkTableDescription() return getFk().getLookupTableDescription(); } - @Override public boolean isUserEditable() { return _isUserEditable; } - @Override public void setUserEditable(boolean editable) { @@ -858,7 +842,6 @@ public void setUserEditable(boolean editable) _isUserEditable = editable; } - @Override public void setDisplayColumnFactory(DisplayColumnFactory factory) { @@ -898,25 +881,23 @@ public boolean isVersionColumn() return JdbcType.BINARY == getJdbcType() && 8 == getScale() && "timestamp".equals(getSqlTypeName()); } - @Override public SQLFragment getVersionUpdateExpression() { if (JdbcType.TIMESTAMP == getJdbcType()) - { - return new SQLFragment("CURRENT_TIMESTAMP"); // Instead of {fn now()} -- see #27534 - } - else if ("_ts".equalsIgnoreCase(getName()) && !getSqlDialect().isSqlServer() && JdbcType.BIGINT == getJdbcType()) + return new SQLFragment().appendNowTimestamp(); + + if (JdbcType.BIGINT == getJdbcType() && "_ts".equalsIgnoreCase(getName()) && !getSqlDialect().isSqlServer()) { TableInfo t = getParentTable(); String tsName = t.getSchema().getName() + "." + Objects.requireNonNull(t.getMetaDataIdentifier()).getId() + "_ts"; String sqlString = getSqlDialect().getStringHandler().quoteStringLiteral(tsName); return new SQLFragment("nextval(" + sqlString + ")"); } + return null; } - @Override public String getInputType() { @@ -936,7 +917,6 @@ else if (getJdbcType() == JdbcType.BOOLEAN) return _inputType; } - @Override public int getInputLength() { @@ -951,7 +931,6 @@ public int getInputLength() return _inputLength; } - @Override public int getInputRows() { @@ -1094,7 +1073,6 @@ public void copyToXml(ColumnType xmlCol, boolean full) } } - public void loadFromXml(ColumnType xmlCol, boolean merge) { checkLocked(); @@ -1448,7 +1426,6 @@ public static boolean booleanFromString(String str) } } - public static boolean booleanFromObj(Object o) { if (null == o) @@ -1657,7 +1634,6 @@ public DisplayColumn getRenderer() } } - public static Collection createFromDatabaseMetaData(String schemaName, SchemaTableInfo parentTable, @Nullable String columnNamePattern) throws SQLException { //Use linked hash map to preserve ordering... @@ -1801,7 +1777,6 @@ else if (key.pkColumnNames.size() == 2 && "container".equalsIgnoreCase(key.fkCol return colMap.values(); } - private static void inferMetadata(BaseColumnInfo col) { String colName = col.getName(); @@ -1856,7 +1831,6 @@ private static void inferMetadata(BaseColumnInfo col) } } - @Override public String getSqlTypeName() { @@ -1874,8 +1848,6 @@ public String getSqlTypeName() return _sqlTypeName; } - - @Override public void setSqlTypeName(String sqlTypeName) { @@ -1908,7 +1880,6 @@ public void setJdbcType(JdbcType type) _sqlTypeName = null; } - @Override public @NotNull JdbcType getJdbcType() { @@ -1932,7 +1903,6 @@ public void setJdbcType(JdbcType type) return _jdbcType == null ? JdbcType.OTHER : _jdbcType; } - @Override public ForeignKey getFk() { @@ -1960,7 +1930,6 @@ public void setFk(@NotNull Builder b) _fk = b.build(); } - @Override public void setScale(int scale) { @@ -1975,7 +1944,6 @@ public void setPrecision(int precision) super.setPrecision(precision); } - /** @return whether the column is part of the primary key for the table */ @Override public boolean isKeyField() @@ -1983,7 +1951,6 @@ public boolean isKeyField() return _isKeyField; } - @Override public void setKeyField(boolean keyField) { @@ -2053,14 +2020,12 @@ public void setIsUnselectable(boolean b) _isUnselectable = b; } - @Override public TableInfo getParentTable() { return _parentTable; } - @Override public void setParentTable(TableInfo parentTable) { @@ -2182,7 +2147,6 @@ public void setValidators(List validators) _validators = copyFixedList(validators); } - @Override public void checkLocked() { @@ -2219,7 +2183,6 @@ public void setCalculated(boolean calculated) _calculated = calculated; } - // If true, you can't use this column when auto-generating LabKey SQL, it is not selected in the underlying query // only query can set this true @Override diff --git a/api/src/org/labkey/api/data/SQLFragment.java b/api/src/org/labkey/api/data/SQLFragment.java index 7704f82b272..744d025f7db 100644 --- a/api/src/org/labkey/api/data/SQLFragment.java +++ b/api/src/org/labkey/api/data/SQLFragment.java @@ -52,8 +52,6 @@ /** * Holds both the SQL text and JDBC parameter values to use during invocation. - * User: Matthew - * Date: Apr 19, 2006 */ public class SQLFragment implements Appendable, CharSequence { @@ -609,6 +607,21 @@ else if (Double.isFinite(N.doubleValue())) return this; } + public final SQLFragment appendNowTimestamp() + { + return appendValue(new NowTimestamp()); + } + + // Issue 27534: Stop using {fn now()} in function declarations + // Issue 48864: Query Table's use of web server time can cause discrepancies in created/modified timestamps + public final SQLFragment appendValue(NowTimestamp now) + { + if (null == now) + return appendNull(); + getStringBuilder().append("CURRENT_TIMESTAMP"); + return this; + } + public final SQLFragment appendValue(java.util.Date d) { if (null == d) @@ -1293,17 +1306,6 @@ public void testMysql() } } - - public static class IntegrationTestCase extends Assert - { - @Test - public void test() - { - // try some Dialect stuff and CTE executed against core schema - } - } - - @Override public boolean equals(Object obj) { @@ -1340,4 +1342,18 @@ public static SQLFragment join(Iterable fragments, String separator return new SQLFragment(sql, params); } + + // Marker interface to hint that this value may be replaced by CURRENT_TIMESTAMP + public static class NowTimestamp extends java.sql.Timestamp + { + public NowTimestamp() + { + this(System.currentTimeMillis()); + } + + public NowTimestamp(long ms) + { + super(ms); + } + } } diff --git a/api/src/org/labkey/api/data/StatementUtils.java b/api/src/org/labkey/api/data/StatementUtils.java index 3aeb539d8d8..580a3432ad1 100644 --- a/api/src/org/labkey/api/data/StatementUtils.java +++ b/api/src/org/labkey/api/data/StatementUtils.java @@ -29,7 +29,6 @@ import org.labkey.api.collections.Sets; import org.labkey.api.data.dialect.MockSqlDialect; import org.labkey.api.data.dialect.SqlDialect; -import org.labkey.api.dataiterator.SimpleTranslator; import org.labkey.api.dataiterator.TableInsertUpdateDataIterator; import org.labkey.api.exp.MvColumn; import org.labkey.api.exp.PropertyType; @@ -346,7 +345,6 @@ private void initParameterHolder(ParameterHolder ph) ph.variableName = makeVariableName(name); } - private ParameterHolder createParameter(String name, JdbcType type) { ParameterHolder ph = parameters.get(name); @@ -359,7 +357,6 @@ private ParameterHolder createParameter(String name, JdbcType type) return ph; } - private ParameterHolder createParameter(String name, String uri, JdbcType type) { ParameterHolder ph = parameters.get(name); @@ -676,7 +673,7 @@ public ParameterMapStatement createStatement(Connection conn, @Nullable Containe if (null != col) { cols.add(col); - values.add(new SQLFragment("CURRENT_TIMESTAMP")); // Instead of {fn now()} -- see #27534 + values.add(new SQLFragment().appendNowTimestamp()); done.add("Created"); } } @@ -693,7 +690,7 @@ public ParameterMapStatement createStatement(Connection conn, @Nullable Containe if (_updateBuiltInColumns && null != colModified) { cols.add(colModified); - values.add(new SQLFragment("CURRENT_TIMESTAMP")); // Instead of {fn now()} -- see #27534 + values.add(new SQLFragment().appendNowTimestamp()); done.add("Modified"); } ColumnInfo colVersion = table.getVersionColumn(); @@ -1243,9 +1240,9 @@ private void toLiteral(SQLFragment f, Object value) f.append(value.toString()); return; } - if (value instanceof SimpleTranslator.NowTimestamp) + if (value instanceof SQLFragment.NowTimestamp now) { - f.append("CURRENT_TIMESTAMP"); // Instead of {fn now()} -- see #27534 + f.appendValue(now); return; } if (value instanceof java.sql.Date sqlDate) @@ -1408,8 +1405,9 @@ public void testToLiteral() assertEquals(new SQLFragment("1234567890"), actual); // NowTimestamp - actual = runToLiteral.apply(new SimpleTranslator.NowTimestamp(dateLong)); - assertEquals(new SQLFragment("CURRENT_TIMESTAMP"), actual); + var now = new SQLFragment.NowTimestamp(dateLong); + actual = runToLiteral.apply(now); + assertEquals(new SQLFragment().appendValue(now), actual); // sql.Date var sqlDate = new java.sql.Date(dateLong); diff --git a/api/src/org/labkey/api/data/Table.java b/api/src/org/labkey/api/data/Table.java index ac80f5b39a5..d28580ad7a7 100644 --- a/api/src/org/labkey/api/data/Table.java +++ b/api/src/org/labkey/api/data/Table.java @@ -646,7 +646,6 @@ static void doClose(@Nullable ResultSet rs, @Nullable Statement stmt, @Nullable if (null != conn) scope.releaseConnection(conn); } - /** * return a 'clean' list of fields to update */ @@ -661,7 +660,6 @@ protected static Map _getTableData(TableInfo table, K from, return _getTableData(table, fields, insert); } - protected static Map _getTableData(TableInfo table, Map fields, boolean insert) { if (!(fields instanceof CaseInsensitiveHashMap)) @@ -678,7 +676,6 @@ protected static Map _getTableData(TableInfo table, Map _getTableData(TableInfo table, Map fields, java.sql.Timestamp date) + protected static void _insertSpecialFields(User user, TableInfo table, Map fields, SQLFragment.NowTimestamp now) { ColumnInfo col = table.getColumn(OWNER_COLUMN_NAME); if (null != col && null != user) @@ -723,7 +718,7 @@ protected static void _insertSpecialFields(User user, TableInfo table, Map fields, java.sql.Timestamp date) + protected static void _updateSpecialFields(@Nullable User user, TableInfo table, Map fields, SQLFragment.NowTimestamp now) { ColumnInfo colModifiedBy = table.getColumn(MODIFIED_BY_COLUMN_NAME); if (null != colModifiedBy && null != user) @@ -754,11 +749,11 @@ protected static void _updateSpecialFields(@Nullable User user, TableInfo table, ColumnInfo colModified = table.getColumn(MODIFIED_COLUMN_NAME); if (null != colModified) - fields.put(colModified.getName(), date); + fields.put(colModified.getName(), now); ColumnInfo colVersion = table.getVersionColumn(); if (null != colVersion && colVersion != colModified && colVersion.getJdbcType() == JdbcType.TIMESTAMP) - fields.put(colVersion.getName(), date); + fields.put(colVersion.getName(), now); } protected static void _copyUpdateSpecialFields(TableInfo table, Object returnObject, Map fields) @@ -821,22 +816,19 @@ public static K insert(@Nullable User user, TableInfo table, K fieldsIn) { assert assertInDb(table); - // _executeTriggers(table, fields); - SQLFragment insertSQL = new SQLFragment(); SQLFragment columnSQL = new SQLFragment(); SQLFragment valueSQL = new SQLFragment(); ColumnInfo autoIncColumn = null; - ColumnInfo versionColumn = null; String comma = ""; //noinspection unchecked Map fields = fieldsIn instanceof Map ? _getTableData(table, (Map)fieldsIn, true) : _getTableData(table, fieldsIn, true); - java.sql.Timestamp date = new java.sql.Timestamp(System.currentTimeMillis()); - _insertSpecialFields(user, table, fields, date); - _updateSpecialFields(user, table, fields, date); + SQLFragment.NowTimestamp now = new SQLFragment.NowTimestamp(); + _insertSpecialFields(user, table, fields, now); + _updateSpecialFields(user, table, fields, now); List columns = table.getColumns(); @@ -868,6 +860,8 @@ else if (column.isAutoIncrement()) valueSQL.append(comma); if (null == value || value instanceof String s && s.isEmpty()) valueSQL.append("NULL"); + else if (value instanceof SQLFragment.NowTimestamp ts) + valueSQL.appendValue(ts); else { // Validate the value @@ -937,7 +931,7 @@ else if (column.isAutoIncrement()) _copyInsertSpecialFields(returnObject, fields); _copyUpdateSpecialFields(table, returnObject, fields); } - catch(SQLException e) + catch (SQLException e) { logException(insertSQL, conn, e, Level.WARN); throw new RuntimeSQLException(e); @@ -966,8 +960,6 @@ public static K update(@Nullable User user, TableInfo table, K fieldsIn, @Nu assert assertInDb(table); assert null != pkVals; - // _executeTriggers(table, previous, fields); - SQLFragment setSQL = new SQLFragment(); SQLFragment whereSQL = new SQLFragment(); String comma = ""; @@ -1028,8 +1020,7 @@ else if (pkVals instanceof Map) Map fields = fieldsIn instanceof Map ? _getTableData(table, (Map)fieldsIn, true) : _getTableData(table, fieldsIn, true); - java.sql.Timestamp date = new java.sql.Timestamp(System.currentTimeMillis()); - _updateSpecialFields(user, table, fields, date); + _updateSpecialFields(user, table, fields, new SQLFragment.NowTimestamp()); List columns = table.getColumns(); ColumnInfo colModified = table.getColumn(MODIFIED_COLUMN_NAME); @@ -1069,11 +1060,12 @@ else if (pkVals instanceof Map) Object value = fields.get(column.getName()); setSQL.append(comma); setSQL.appendIdentifier(column.getSelectIdentifier()); + setSQL.append("="); if (null == value || value instanceof String s && s.isEmpty()) - { - setSQL.append("=NULL"); - } + setSQL.append("NULL"); + else if (value instanceof SQLFragment.NowTimestamp ts) + setSQL.appendValue(ts); else { // Validate the value @@ -1085,7 +1077,7 @@ else if (pkVals instanceof Map) throw new RuntimeValidationException(msg, column.getName()); // CONSIDER: would prefer throwing ValidationException instead, but it's not a RuntimeException } - setSQL.append("=?"); + setSQL.append("?"); if (value instanceof Parameter.JdbcParameterValue) setSQL.add(value); else diff --git a/api/src/org/labkey/api/dataiterator/SimpleTranslator.java b/api/src/org/labkey/api/dataiterator/SimpleTranslator.java index a015956b15c..803c2663799 100644 --- a/api/src/org/labkey/api/dataiterator/SimpleTranslator.java +++ b/api/src/org/labkey/api/dataiterator/SimpleTranslator.java @@ -48,6 +48,7 @@ import org.labkey.api.data.LookupResolutionType; import org.labkey.api.data.MultiValuedForeignKey; import org.labkey.api.data.MvUtil; +import org.labkey.api.data.SQLFragment; import org.labkey.api.data.SimpleFilter; import org.labkey.api.data.TableDescription; import org.labkey.api.data.TableInfo; @@ -1056,7 +1057,7 @@ private class TimestampColumn implements Supplier public Object get() { if (null == _ts) - _ts = new NowTimestamp(System.currentTimeMillis()); + _ts = new SQLFragment.NowTimestamp(); return _ts; } } @@ -1085,8 +1086,8 @@ public Object get() // shared tables should be Integer->Integer Integer valueAsInt = null; - if (value instanceof String) - valueAsInt = Integer.parseInt((String)value); + if (value instanceof String stringValue) + valueAsInt = Integer.parseInt(stringValue); if (_dataspaceTableIdMap.containsKey(valueAsInt)) { value = _dataspaceTableIdMap.get(valueAsInt); @@ -1979,12 +1980,12 @@ public boolean isConstant(int i) Supplier c = _outputColumns.get(i).getValue(); if (c instanceof ConstantColumn) return true; - if (c instanceof PassthroughColumn) - return _data.isConstant(((PassthroughColumn)c).index); - if (c instanceof AliasColumn) - return isConstant(((AliasColumn)c).index); - if (c instanceof SimpleConvertColumn) - return _data.isConstant(((SimpleConvertColumn)c).index); + if (c instanceof PassthroughColumn pc) + return _data.isConstant(pc.index); + if (c instanceof AliasColumn ac) + return isConstant(ac.index); + if (c instanceof SimpleConvertColumn scc) + return _data.isConstant(scc.index); if (c instanceof TimestampColumn) return true; return false; @@ -1995,18 +1996,16 @@ public boolean isConstant(int i) public Object getConstantValue(int i) { Supplier c = _outputColumns.get(i).getValue(); - if (c instanceof ConstantColumn) - return ((ConstantColumn)c).k; - if (c instanceof PassthroughColumn) - return _data.getConstantValue(((PassthroughColumn)c).index); - if (c instanceof AliasColumn) - return getConstantValue(((AliasColumn)c).index); + if (c instanceof ConstantColumn cc) + return cc.k; + if (c instanceof PassthroughColumn pc) + return _data.getConstantValue(pc.index); + if (c instanceof AliasColumn ac) + return getConstantValue(ac.index); if (c instanceof SimpleConvertColumn scc) - { return scc.convert(_data.getConstantValue(scc.index)); - } if (c instanceof TimestampColumn) - return new NowTimestamp(System.currentTimeMillis()); + return new SQLFragment.NowTimestamp(); throw new IllegalStateException("shouldn't call this method unless isConstant()==true"); } @@ -2017,17 +2016,6 @@ public void close() throws IOException _data.close(); } - - // this is a marker interface to hint that this value may be replaced by {ts now()} - public static class NowTimestamp extends java.sql.Timestamp - { - public NowTimestamp(long ms) - { - super(ms); - } - } - - @Override public void debugLogInfo(StringBuilder sb) { diff --git a/audit/src/org/labkey/audit/AuditLogImpl.java b/audit/src/org/labkey/audit/AuditLogImpl.java index 810d90ee07d..dd38dba1fbe 100644 --- a/audit/src/org/labkey/audit/AuditLogImpl.java +++ b/audit/src/org/labkey/audit/AuditLogImpl.java @@ -55,7 +55,6 @@ import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -63,10 +62,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; -/** - * User: Karl Lum - * Date: Oct 4, 2007 - */ public class AuditLogImpl implements AuditLogService, StartupListener { private static final AuditLogImpl _instance = new AuditLogImpl(); @@ -171,12 +166,6 @@ private K _addEvents(@Nullable User user, List eve transactionEvents.add(event); } - // ensure some standard fields - if (event.getCreated() == null) - event.setCreated(new Date()); - if (event.getCreatedBy() == null) - event.setCreatedBy(user); - if (event.getImpersonatedBy() == null && user.isImpersonated()) { User impersonatingUser = user.getImpersonatingUser(); diff --git a/audit/src/org/labkey/audit/model/LogManager.java b/audit/src/org/labkey/audit/model/LogManager.java index 0f64bba8367..801701f1db4 100644 --- a/audit/src/org/labkey/audit/model/LogManager.java +++ b/audit/src/org/labkey/audit/model/LogManager.java @@ -55,11 +55,6 @@ import java.util.Objects; import java.util.Optional; - -/** - * User: Karl Lum - * Date: Oct 4, 2007 - */ public class LogManager { private static final Logger _log = org.apache.logging.log4j.LogManager.getLogger(LogManager.class); @@ -94,11 +89,11 @@ public K insertEvent(User user, K type) { TableInfo table = schema.getTable(provider.getEventName(), false); - if (table instanceof DefaultAuditTypeTable) + if (table instanceof DefaultAuditTypeTable auditTypeTable) { // consider using etl data iterator for inserts type = validateFields(provider, type); - TableInfo dbTable = ((DefaultAuditTypeTable)table).getRealTable(); + TableInfo dbTable = auditTypeTable.getRealTable(); K ret = Table.insert(user, dbTable, type); return ret; } @@ -149,7 +144,7 @@ public void insertEvents(User user, List events) Container c = type.getContainer(); UserSchema schema = AuditLogService.getAuditLogSchema(user, c != null ? c : ContainerManager.getRoot()); TableInfo table = null==schema ? null : schema.getTable(provider.getEventName(), false); - TableInfo dbTable = table instanceof DefaultAuditTypeTable ? ((DefaultAuditTypeTable) table).getRealTable() : null; + TableInfo dbTable = table instanceof DefaultAuditTypeTable auditTypeTable ? auditTypeTable.getRealTable() : null; Logger auditLogger = getAuditLogger(type); SQLException sqlx = null;