diff --git a/base/src/org/compiere/util/DB.java b/base/src/org/compiere/util/DB.java index 997c7cca4b..03a5a5473a 100644 --- a/base/src/org/compiere/util/DB.java +++ b/base/src/org/compiere/util/DB.java @@ -76,6 +76,7 @@ import org.compiere.process.SequenceCheck; *
  • FR [ 1986583 ] Add DB.executeUpdateEx(String, Object[], String) *
  • BF [ 2030233 ] Remove duplicate code from DB class *
  • FR [ 2107062 ] Add more DB.getKeyNamePairs methods + *
  • FR [ 2448461 ] Introduce DB.getSQLValue*Ex methods */ public final class DB { @@ -1161,6 +1162,19 @@ public final class DB } return retValue; } + + /** + * Get String Value from sql + * @param trxName trx + * @param sql sql + * @param params collection of parameters + * @return first value or -1 + * @throws DBException if there is any SQLException + */ + public static int getSQLValueEx (String trxName, String sql, Collection params) + { + return getSQLValueEx(trxName, sql, params.toArray(new Object[params.size()])); + } /** * Get int Value from sql @@ -1192,9 +1206,7 @@ public final class DB */ public static int getSQLValue (String trxName, String sql, Collection params) { - Object[] arr = new Object[params.size()]; - params.toArray(arr); - return getSQLValue(trxName, sql, arr); + return getSQLValue(trxName, sql, params.toArray(new Object[params.size()])); } /** @@ -1203,8 +1215,9 @@ public final class DB * @param sql sql * @param params array of parameters * @return first value or null + * @throws DBException if there is any SQLException */ - public static String getSQLValueString (String trxName, String sql, Object... params) + public static String getSQLValueStringEx (String trxName, String sql, Object... params) { String retValue = null; PreparedStatement pstmt = null; @@ -1219,9 +1232,9 @@ public final class DB else log.info("No Value " + sql); } - catch (Exception e) + catch (SQLException e) { - log.log(Level.SEVERE, sql, getSQLException(e)); + throw new DBException(e, sql); } finally { @@ -1231,6 +1244,40 @@ public final class DB return retValue; } + /** + * Get String Value from sql + * @param trxName trx + * @param sql sql + * @param params collection of parameters + * @return first value or null + * @throws DBException if there is any SQLException + */ + public static String getSQLValueStringEx (String trxName, String sql, Collection params) + { + return getSQLValueStringEx(trxName, sql, params.toArray(new Object[params.size()])); + } + + /** + * Get String Value from sql + * @param trxName trx + * @param sql sql + * @param params array of parameters + * @return first value or null + */ + public static String getSQLValueString (String trxName, String sql, Object... params) + { + String retValue = null; + try + { + retValue = getSQLValueStringEx(trxName, sql, params); + } + catch (Exception e) + { + log.log(Level.SEVERE, sql, getSQLException(e)); + } + return retValue; + } + /** * Get String Value from sql * @param trxName trx @@ -1240,9 +1287,7 @@ public final class DB */ public static String getSQLValueString (String trxName, String sql, Collection params) { - Object[] arr = new Object[params.size()]; - params.toArray(arr); - return getSQLValueString(trxName, sql, arr); + return getSQLValueString(trxName, sql, params.toArray(new Object[params.size()])); } /** @@ -1281,6 +1326,20 @@ public final class DB return retValue; } + /** + * Get BigDecimal Value from sql + * @param trxName trx + * @param sql sql + * @param params collection of parameters + * @return first value or null if not found + * @throws DBException if there is any SQLException + */ + public static BigDecimal getSQLValueBDEx (String trxName, String sql, Collection params) throws DBException + { + return getSQLValueBDEx(trxName, sql, params.toArray(new Object[params.size()])); + } + + /** * Get BigDecimal Value from sql * @param trxName trx @@ -1311,9 +1370,7 @@ public final class DB */ public static BigDecimal getSQLValueBD (String trxName, String sql, Collection params) { - Object[] arr = new Object[params.size()]; - params.toArray(arr); - return getSQLValueBD(trxName, sql, arr); + return getSQLValueBD(trxName, sql, params.toArray(new Object[params.size()])); } /** @@ -1322,8 +1379,9 @@ public final class DB * @param sql sql * @param params array of parameters * @return first value or null + * @throws DBException if there is any SQLException */ - public static Timestamp getSQLValueTS (String trxName, String sql, Object... params) + public static Timestamp getSQLValueTSEx (String trxName, String sql, Object... params) { Timestamp retValue = null; PreparedStatement pstmt = null; @@ -1338,9 +1396,9 @@ public final class DB else log.info("No Value " + sql); } - catch (Exception e) + catch (SQLException e) { - log.log(Level.SEVERE, sql, getSQLException(e)); + throw new DBException(e, sql); } finally { @@ -1349,6 +1407,39 @@ public final class DB } return retValue; } + + /** + * Get BigDecimal Value from sql + * @param trxName trx + * @param sql sql + * @param params collection of parameters + * @return first value or null if not found + * @throws DBException if there is any SQLException + */ + public static Timestamp getSQLValueTSEx (String trxName, String sql, Collection params) throws DBException + { + return getSQLValueTSEx(trxName, sql, params.toArray(new Object[params.size()])); + } + + /** + * Get Timestamp Value from sql + * @param trxName trx + * @param sql sql + * @param params array of parameters + * @return first value or null + */ + public static Timestamp getSQLValueTS (String trxName, String sql, Object... params) + { + try + { + return getSQLValueTSEx(trxName, sql, params); + } + catch (Exception e) + { + log.log(Level.SEVERE, sql, getSQLException(e)); + } + return null; + } /** * Get Timestamp Value from sql diff --git a/extend/src/test/functional/DBTest.java b/extend/src/test/functional/DBTest.java index 63eb9e0130..fde70b098b 100644 --- a/extend/src/test/functional/DBTest.java +++ b/extend/src/test/functional/DBTest.java @@ -4,9 +4,11 @@ package test.functional; import java.math.BigDecimal; +import java.sql.Timestamp; import org.adempiere.exceptions.DBException; import org.compiere.util.DB; +import org.compiere.util.TimeUtil; import test.AdempiereTestCase; @@ -27,7 +29,7 @@ public class DBTest extends AdempiereTestCase DBException ex = null; try { - DB.getSQLValueEx(null, "SELECT 10 FROM INEXISTENT_TABLE"); + result = DB.getSQLValueEx(null, "SELECT 10 FROM INEXISTENT_TABLE"); } catch (DBException e) { @@ -59,7 +61,7 @@ public class DBTest extends AdempiereTestCase DBException ex = null; try { - DB.getSQLValueBDEx(null, "SELECT 10 FROM INEXISTENT_TABLE"); + result = DB.getSQLValueBDEx(null, "SELECT 10 FROM INEXISTENT_TABLE"); } catch (DBException e) { @@ -79,4 +81,72 @@ public class DBTest extends AdempiereTestCase result = DB.getSQLValueBD(null, "SELECT 10 FROM INEXISTENT_TABLE"); assertNull("Error should be signaled", result); } + + public void test_getSQLValueStringEx() throws Exception + { + String result = DB.getSQLValueStringEx(null, "SELECT 'string' FROM DUAL"); + assertEquals("string", result); + // + result = DB.getSQLValueStringEx(null, "SELECT 10 FROM AD_SYSTEM WHERE 1=2"); + assertNull("No value should be returned", result); + // + DBException ex = null; + try + { + result = DB.getSQLValueStringEx(null, "SELECT 'string' FROM INEXISTENT_TABLE"); + } + catch (DBException e) + { + ex = e; + } + assertNotNull("No DBException Was Throwed", ex); + } + + public void test_getSQLValueString() throws Exception + { + String result = DB.getSQLValueString(null, "SELECT 'string' FROM DUAL"); + assertEquals("string", result); + // + result = DB.getSQLValueString(null, "SELECT 'string' FROM AD_SYSTEM WHERE 1=2"); + assertNull("No value should be returned", result); + // + result = DB.getSQLValueString(null, "SELECT 'string' FROM INEXISTENT_TABLE"); + assertNull("Error should be signaled", result); + } + + public void test_getSQLValueTSEx() throws Exception + { + final Timestamp target = TimeUtil.getDay(2008, 01, 01); + // + Timestamp result = DB.getSQLValueTSEx(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM AD_SYSTEM"); + assertEquals(target, result); + // + result = DB.getSQLValueTSEx(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM AD_SYSTEM WHERE 1=2"); + assertNull("No value should be returned", result); + // + DBException ex = null; + try + { + result = DB.getSQLValueTSEx(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM INEXISTENT_TABLE"); + } + catch (DBException e) + { + ex = e; + } + assertNotNull("No DBException Was Throwed", ex); + } + + public void test_getSQLValueTS() throws Exception + { + final Timestamp target = TimeUtil.getDay(2008, 01, 01); + // + Timestamp result = DB.getSQLValueTS(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM DUAL"); + assertEquals(target, result); + // + result = DB.getSQLValueTS(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM AD_SYSTEM WHERE 1=2"); + assertNull("No value should be returned", result); + // + result = DB.getSQLValueTS(null, "SELECT TO_DATE('2008-01-01','YYYY-MM-DD') FROM INEXISTENT_TABLE"); + assertNull("Error should be signaled", result); + } }