package org.oddjob.sql; import java.math.BigDecimal; import java.text.ParseException; import java.util.Date; import junit.framework.TestCase; import org.oddjob.Oddjob; import org.oddjob.OddjobLookup; import org.oddjob.arooa.convert.ArooaConversionException; import org.oddjob.arooa.reflect.ArooaPropertyException; import org.oddjob.arooa.types.ArooaObject; import org.oddjob.arooa.utils.DateHelper; import org.oddjob.arooa.xml.XMLConfiguration; import org.oddjob.state.ParentState; public class OracleTest extends TestCase { public void testQueryAllTypes() throws ArooaPropertyException, ArooaConversionException, ParseException { if (System.getProperty("oracle.home") == null) { return; } Oddjob oddjob = new Oddjob(); oddjob.setConfiguration(new XMLConfiguration( "org/oddjob/sql/OracleAllTypesQuery.xml", getClass().getClassLoader())); oddjob.run(); assertEquals(ParentState.COMPLETE, oddjob.lastStateEvent().getState()); OddjobLookup lookup = new OddjobLookup(oddjob); assertEquals("apples ", lookup.lookup( "query-char-types.results.row.A_CHAR", String.class)); assertEquals("oranges ", lookup.lookup( "query-char-types.results.row.AN_NCHAR", String.class)); assertEquals("pears", lookup.lookup( "query-char-types.results.row.A_VARCHAR", String.class)); assertEquals("bananas", lookup.lookup( "query-char-types.results.row.AN_NVARCHAR", String.class)); assertEquals(true, java.sql.Clob.class.isInstance(lookup.lookup( "query-char-types.results.row.A_CLOB"))); assertEquals(true, java.sql.Clob.class.isInstance(lookup.lookup( "query-char-types.results.row.AN_NCLOB"))); assertEquals("grapes", lookup.lookup( "query-char-types.results.row.A_LONG", String.class)); assertEquals(9, (byte) lookup.lookup( "query-numeric-types.results.row.A_SINGLE_DIGIT_NUMBER", byte.class)); assertEquals(99, (byte) lookup.lookup( "query-numeric-types.results.row.A_DOUBLE_DIGIT_NUMBER", byte.class)); assertEquals(999, (short) lookup.lookup( "query-numeric-types.results.row.A_THREE_DIGIT_NUMBER", short.class)); assertEquals(999888, (int) lookup.lookup( "query-numeric-types.results.row.A_SIX_DIGIT_NUMBER", int.class)); assertEquals(9998887776L, (long) lookup.lookup( "query-numeric-types.results.row.A_TEN_DIGIT_NUMBER", long.class)); assertEquals(new BigDecimal("99988877766655544433322211199988877766"), lookup.lookup("query-numeric-types.results.row.A_THIRTY_EIGHT_DIGIT_NUMBER", BigDecimal.class)); assertEquals(0.0099F, (float) lookup.lookup( "query-numeric-types.results.row.A_SMALL_DECIMAL", float.class)); assertEquals(new BigDecimal("0.99988877766655544433322211199988877766"), lookup.lookup("query-numeric-types.results.row.A_SMALL_PRECISE_DECIMAL", BigDecimal.class)); assertEquals(9998887.77, (double) lookup.lookup( "query-numeric-types.results.row.A_MEDIUM_DECIMAL", double.class)); assertEquals(new BigDecimal("999888777666555444333222111999888777.66"), lookup.lookup("query-numeric-types.results.row.A_LARGE_DECIMAL", BigDecimal.class)); assertEquals(new BigDecimal("900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), lookup.lookup( "query-numeric-types.results.row.A_NUMBER", BigDecimal.class)); assertEquals(new BigDecimal("99988877766655544433322211199988877766"), lookup.lookup( "query-numeric-types.results.row.AN_INTEGER")); assertEquals(new Double("1.0E+100"), lookup.lookup( "query-numeric-types.results.row.A_FLOAT")); assertEquals(DateHelper.parseDate("2012-12-28"), lookup.lookup( "query-date-types.results.row.A_DATE", Date.class)); assertEquals("2012-12-28 18:45:23.045", lookup.lookup( "query-date-types.results.row.A_TIMESTAMP", String.class)); assertEquals("1000-1", lookup.lookup( "query-date-types.results.row.A_YEAR_INTERVAL", String.class)); assertEquals("500 5:12:10.222", lookup.lookup( "query-date-types.results.row.A_DAY_INTERVAL", String.class)); oddjob.destroy(); } public void testTypeBasedDialect() throws ArooaPropertyException, ArooaConversionException, ParseException { if (System.getProperty("oracle.home") == null) { return; } Oddjob oddjob = new Oddjob(); oddjob.setConfiguration(new XMLConfiguration( "org/oddjob/sql/OracleAllTypesQuery.xml", getClass().getClassLoader())); oddjob.setExport("dialect", new ArooaObject(new TypeBasedDialect())); oddjob.run(); assertEquals(ParentState.COMPLETE, oddjob.lastStateEvent().getState()); OddjobLookup lookup = new OddjobLookup(oddjob); assertEquals("apples ", lookup.lookup( "query-char-types.results.row.A_CHAR", String.class)); assertEquals("oranges ", lookup.lookup( "query-char-types.results.row.AN_NCHAR", String.class)); assertEquals("pears", lookup.lookup( "query-char-types.results.row.A_VARCHAR", String.class)); assertEquals("bananas", lookup.lookup( "query-char-types.results.row.AN_NVARCHAR", String.class)); assertEquals(true, java.sql.Clob.class.isInstance(lookup.lookup( "query-char-types.results.row.A_CLOB"))); assertEquals(true, java.sql.Clob.class.isInstance(lookup.lookup( "query-char-types.results.row.AN_NCLOB"))); assertEquals("grapes", lookup.lookup( "query-char-types.results.row.A_LONG", String.class)); assertEquals(9, (byte) lookup.lookup( "query-numeric-types.results.row.A_SINGLE_DIGIT_NUMBER", byte.class)); assertEquals(99, (byte) lookup.lookup( "query-numeric-types.results.row.A_DOUBLE_DIGIT_NUMBER", byte.class)); assertEquals(999, (short) lookup.lookup( "query-numeric-types.results.row.A_THREE_DIGIT_NUMBER", short.class)); assertEquals(999888, (int) lookup.lookup( "query-numeric-types.results.row.A_SIX_DIGIT_NUMBER", int.class)); assertEquals(9998887776L, (long) lookup.lookup( "query-numeric-types.results.row.A_TEN_DIGIT_NUMBER", long.class)); assertEquals(new BigDecimal("99988877766655544433322211199988877766"), lookup.lookup("query-numeric-types.results.row.A_THIRTY_EIGHT_DIGIT_NUMBER", BigDecimal.class)); assertEquals(0.0099F, (float) lookup.lookup( "query-numeric-types.results.row.A_SMALL_DECIMAL", float.class)); assertEquals(new BigDecimal("0.99988877766655544433322211199988877766"), lookup.lookup("query-numeric-types.results.row.A_SMALL_PRECISE_DECIMAL", BigDecimal.class)); assertEquals(9998887.77, (double) lookup.lookup( "query-numeric-types.results.row.A_MEDIUM_DECIMAL", double.class)); assertEquals(new BigDecimal("999888777666555444333222111999888777.66"), lookup.lookup("query-numeric-types.results.row.A_LARGE_DECIMAL", BigDecimal.class)); assertEquals(new BigDecimal("900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), lookup.lookup( "query-numeric-types.results.row.A_NUMBER", BigDecimal.class)); assertEquals(new BigDecimal("99988877766655544433322211199988877766"), lookup.lookup( "query-numeric-types.results.row.AN_INTEGER")); assertEquals(new BigDecimal("1.0E+100").toPlainString(), lookup.lookup( "query-numeric-types.results.row.A_FLOAT").toString()); assertEquals(DateHelper.parseDate("2012-12-28"), lookup.lookup( "query-date-types.results.row.A_DATE", Date.class)); assertEquals("2012-12-28 18:45:23.045", lookup.lookup( "query-date-types.results.row.A_TIMESTAMP", String.class)); assertEquals("1000-1", lookup.lookup( "query-date-types.results.row.A_YEAR_INTERVAL", String.class)); assertEquals("500 5:12:10.222", lookup.lookup( "query-date-types.results.row.A_DAY_INTERVAL", String.class)); oddjob.destroy(); } }