private Stream<IDatabaseDialect> filterUsableDialects( Stream<IDatabaseDialect> stream, boolean usableOnly ) { if ( usableOnly ) { return stream.filter( dialect -> { if ( dialect instanceof IDriverLocator ) { return ( (IDriverLocator) dialect ).isUsable(); } else { return ClassUtil.canLoadClass( dialect.getNativeDriver() ); } } ); } return stream; }
/** * Will resolve a database type based on the prefix of the jdbc URL, which we assume originated from one of these * classes * * @param urlPrefix * @return */ private IDatabaseType resolveDatabaseType( String urlPrefix ) { DatabaseDialectService databaseDialectService = new DatabaseDialectService( false ); List<IDatabaseDialect> databaseDialects = databaseDialectService.getDatabaseDialects(); String nativePre = null; for ( IDatabaseDialect databaseDialect : databaseDialects ) { // // NOTE - The GenericDatabaseDialect and the AccessDatabaseDialect // both return null for the value of getNativeJdbcPre - so - this // requires a null-check. // // MB // nativePre = databaseDialect.getNativeJdbcPre(); if ( ( nativePre != null ) && ( nativePre.startsWith( urlPrefix ) ) ) { return databaseDialect.getDatabaseType(); } } return null; }
String retval = ""; String fieldname = v.getName(); int length = v.getLength(); int precision = v.getPrecision(); int type = v.getType(); switch ( type ) { case IValueMeta.TYPE_DATE:
sanitizer.sanitizeConnectionParameters( connection ); if ( connection.getPassword() == null ) { // Can have an empty password but not a null one connection.setPassword( "" ); //$NON-NLS-1$ IDatabaseDialect dialect = dialectService.getDialect( connection ); String driverClass = null; if ( connection.getDatabaseType().getShortName().equals( "GENERIC" ) ) { driverClass = connection.getAttributes().get( GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS ); } else { driverClass = dialect.getNativeDriver(); if ( connection.getAccessType().equals( DatabaseAccessType.JNDI ) ) { pentahoConnection = PentahoConnectionFactory .getConnection( IPentahoConnection.SQL_DATASOURCE, connection.getDatabaseName(), null, this ); } else { if ( connection.isUsingConnectionPool() ) { Properties props = new Properties(); props.put( IPentahoConnection.CONNECTION_NAME, connection.getName() ); props.put( IPentahoConnection.CONNECTION, connection ); pentahoConnection = PentahoConnectionFactory.getConnection( IPentahoConnection.SQL_DATASOURCE, props, null, this ); } else { pentahoConnection = PentahoConnectionFactory.getConnection( IPentahoConnection.SQL_DATASOURCE, driverClass, dialect.getURLWithExtraOptions( connection ), connection.getUsername(), getConnectionPassword( connection.getName(), connection.getPassword() ), null, this );
public static SQLConnection getConnection( String connectionName ) throws DatasourceServiceException { IDatabaseConnection connection = null; try { ConnectionServiceImpl service = new ConnectionServiceImpl(); connection = service.getConnectionByName( connectionName ); DatabaseDialectService dialectService = new DatabaseDialectService(); IDatabaseDialect dialect = dialectService.getDialect( connection ); String driverClass = null; if ( connection.getDatabaseType().getShortName().equals( "GENERIC" ) ) { driverClass = connection.getAttributes().get( GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS ); } else { driverClass = dialect.getNativeDriver(); } return new SQLConnection( driverClass, dialect.getURLWithExtraOptions( connection ), connection.getUsername(), connection.getPassword(), null ); } catch ( ConnectionServiceException e1 ) { return null; } catch ( DatabaseDialectException e ) { return null; } }
String url = null; try { if ( databaseConnection.getAccessType().equals( DatabaseAccessType.JNDI ) ) { throw new DBDatasourceServiceException( Messages.getInstance().getErrorString( "PooledDatasourceHelper.ERROR_0008_UNABLE_TO_POOL_DATASOURCE_IT_IS_JNDI", databaseConnection.getName() ) ); throw new DBDatasourceServiceException( Messages.getInstance().getErrorString( "PooledDatasourceHelper.ERROR_0005_UNABLE_TO_POOL_DATASOURCE_NO_DIALECT_SERVICE", databaseConnection.getName() ) ); IDatabaseDialect dialect = databaseDialectService.getDialect( databaseConnection ); if ( dialect == null || dialect.getDatabaseType() == null ) { throw new DBDatasourceServiceException( Messages.getInstance().getErrorString( "PooledDatasourceHelper.ERROR_0004_UNABLE_TO_POOL_DATASOURCE_NO_DIALECT", databaseConnection.getName() ) ); if ( databaseConnection.getDatabaseType().getShortName().equals( "GENERIC" ) ) { //$NON-NLS-1$ driverClass = databaseConnection.getAttributes().get( GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS ); if ( StringUtils.isEmpty( driverClass ) ) { throw new DBDatasourceServiceException( Messages.getInstance().getErrorString( "PooledDatasourceHelper.ERROR_0006_UNABLE_TO_POOL_DATASOURCE_NO_CLASSNAME", databaseConnection.getName() ) ); driverClass = dialect.getNativeDriver(); if ( StringUtils.isEmpty( driverClass ) ) { throw new DBDatasourceServiceException( Messages.getInstance().getErrorString( "PooledDatasourceHelper.ERROR_0007_UNABLE_TO_POOL_DATASOURCE_NO_DRIVER", databaseConnection.getName() ) ); url = dialect.getURLWithExtraOptions( databaseConnection ); } catch ( DatabaseDialectException e ) {
Messages.getInstance().getErrorString( "PooledDatasourceHelper.ERROR_0001_DATASOURCE_CANNOT_LOAD_DIALECT_SVC" ) ) ).getDialect( databaseConnection ); if ( databaseConnection.getDatabaseType() == null && dialect == null ) { "PooledDatasourceHelper.ERROR_0001_DATASOURCE_CREATE_ERROR_NO_DIALECT", databaseConnection.getName() ) ); if ( databaseConnection.getDatabaseType().getShortName().equals( "GENERIC" ) ) { //$NON-NLS-1$ String driverClassName = databaseConnection.getAttributes().get( GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS ); if ( !StringUtils.isEmpty( driverClassName ) ) { initDriverClass( basicDatasource, dialect, driverClassName, databaseConnection.getName() ); } else { "PooledDatasourceHelper.ERROR_0002_DATASOURCE_CREATE_ERROR_NO_CLASSNAME", databaseConnection.getName() ) ); if ( !StringUtils.isEmpty( dialect.getNativeDriver() ) ) { initDriverClass( basicDatasource, dialect, dialect.getNativeDriver(), databaseConnection.getName() ); } else { "PooledDatasourceHelper.ERROR_0003_DATASOURCE_CREATE_ERROR_NO_DRIVER", databaseConnection.getName() ) ); basicDatasource.setUrl( dialect.getURLWithExtraOptions( databaseConnection ) ); } catch ( DatabaseDialectException e ) { basicDatasource.setUrl( null ); basicDatasource.setUsername( databaseConnection.getUsername() ); basicDatasource.setPassword( databaseConnection.getPassword() );
@Test public void testSuccessfulDriverInitInConvertGeneric() throws DBDatasourceServiceException { when( databaseType.getShortName() ).thenReturn( "GENERIC" ); when( connection.getAttributes() ).thenReturn( ImmutableMap.of( GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS, nativeDriverName ) ); when( connection.getUsername() ).thenReturn( "suzy" ); when( connection.getPassword() ).thenReturn( "password" ); when( ( (IDriverLocator) driverLocatorDialect ).initialize( nativeDriverName ) ).thenReturn( true ); DriverManagerDataSource dataSource = (DriverManagerDataSource) PooledDatasourceHelper.convert( connection, () -> dialectService ); verify( ( (IDriverLocator) driverLocatorDialect ), times( 1 ) ).initialize( nativeDriverName ); assertThat( dataSource.getUrl(), is( jdbcUrl ) ); assertThat( dataSource.getUsername(), is( "suzy" ) ); assertThat( dataSource.getPassword(), is( "password" ) ); }
java.sql.Connection conn = null; String driverClass = connection.getAccessType().getClass().toString(); if ( StringUtils.isEmpty( driverClass ) ) { logger DatabaseDialectService dialectService = new DatabaseDialectService(); IDatabaseDialect dialect = dialectService.getDialect( connection ); conn = DriverManager.getConnection( dialect.getURLWithExtraOptions( connection ), connection.getUsername(), connection.getPassword() ); return conn; } catch ( SQLException e ) {
@Before public void before() throws DatabaseDialectException { when( dialectService.getDialect( connection ) ).thenReturn( driverLocatorDialect ); when( connection.getDatabaseType() ).thenReturn( databaseType ); when( connection.getDatabaseType().getShortName() ).thenReturn( "SomeDBType" ); when( driverLocatorDialect.getNativeDriver() ).thenReturn( nativeDriverName ); when( driverLocatorDialect.getURLWithExtraOptions( connection ) ).thenReturn( jdbcUrl ); when( plainDialect.getNativeDriver() ).thenReturn( nativeDriverName ); when( plainDialect.getURLWithExtraOptions( connection ) ).thenReturn( jdbcUrl ); }
/** * Create a database connection * * @param driver * String name of the driver to use * @param url * String name of the url used to create the connection. * * @return IDatabaseConnection for the given parameters */ @GET @Path( "/createDatabaseConnection" ) @Produces( { APPLICATION_JSON } ) @Facet( name = "Unsupported" ) public IDatabaseConnection createDatabaseConnection( @QueryParam( "driver" ) String driver, @QueryParam( "url" ) String url ) { for ( IDatabaseDialect dialect : dialectService.getDatabaseDialects() ) { if ( dialect.getNativeDriver() != null && dialect.getNativeDriver().equals( driver ) ) { if ( dialect.getNativeJdbcPre() != null && url.startsWith( dialect.getNativeJdbcPre() ) ) { return dialect.createNativeConnection( url ); } } } // if no native driver was found, create a custom dialect object. IDatabaseConnection conn = genericDialect.createNativeConnection( url ); conn.getAttributes().put( GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS, driver ); return conn; }
@Before public void setup() { when( unusableDatabaseDialect.getDatabaseType() ).thenReturn( unusableDatabaseType ); when( unusableDatabaseDialect.isUsable() ).thenReturn( false ); when( usableDatabaseDialect.getDatabaseType() ).thenReturn( usableDatabaseType ); when( usableDatabaseDialect.isUsable() ).thenReturn( true ); when( unusableIDialect.getDatabaseType() ).thenReturn( unusableIDialectType ); when( unusableIDialect.getNativeDriver() ).thenReturn( "fake.class" ); when( usableIDialect.getDatabaseType() ).thenReturn( usableIDialectType ); when( usableIDialect.getNativeDriver() ).thenReturn( Object.class.getCanonicalName() ); Function<Class<IDatabaseDialect>, List<IDatabaseDialect>> dialectGetter = mock( Function.class ); databaseDialects = new ArrayList<>( Arrays.asList( unusableDatabaseDialect, unusableIDialect, usableDatabaseDialect, usableIDialect ) ); when( dialectGetter.apply( IDatabaseDialect.class ) ).thenReturn( databaseDialects ); pentahoSystemDatabaseDialectProvider = new PentahoSystemDatabaseDialectProvider( dialectGetter ); }
@Test public void testDialectWithNoDriverSpecified() throws DBDatasourceServiceException { when( dialectService.getDialect( connection ) ).thenReturn( driverLocatorDialect ); when( driverLocatorDialect.getNativeDriver() ).thenReturn( "" ); try { PooledDatasourceHelper.convert( connection, () -> dialectService ); fail( "Expected exception, driver class not specified in dialect." ); } catch ( Exception e ) { assertThat( e, instanceOf( DBDatasourceServiceException.class ) ); } }
@Test( expected = DriverNotInitializedException.class ) public void testDriverNotInitialized() throws DBDatasourceServiceException { when( dialectService.getDialect( connection ) ).thenReturn( driverLocatorDialect ); when( ( (IDriverLocator) driverLocatorDialect ).initialize( nativeDriverName ) ).thenReturn( false ); PooledDatasourceHelper.convert( connection, () -> dialectService ); }
@Test public void testSuccessfulDriverInitInConvertNonGeneric() throws DBDatasourceServiceException { when( ( (IDriverLocator) driverLocatorDialect ).initialize( nativeDriverName ) ).thenReturn( true ); PooledDatasourceHelper.convert( connection, () -> dialectService ); verify( ( (IDriverLocator) driverLocatorDialect ), times( 1 ) ).initialize( nativeDriverName ); }
/** * Returns database dialect registered to the Pentaho System for specified database type. * * @param usableOnly * @param databaseType * @return database dialect or null. */ @Override public IDatabaseDialect getDialect( boolean usableOnly, IDatabaseType databaseType ) { if ( databaseType == null ) { return null; } Stream<IDatabaseDialect> dialects = getDialectStream().filter( dialect -> dialect.getDatabaseType().equals( databaseType ) ); return filterUsableDialects( dialects, usableOnly ).findFirst().orElse( null ); } }
DatabaseDialectService dialectService = new DatabaseDialectService(); IDatabaseDialect dialect = dialectService.getDialect( connection ); String driverClass = null; if ( connection.getDatabaseType().getShortName().equals( "GENERIC" ) ) { driverClass = connection.getAttributes().get( GenericDatabaseDialect.ATTRIBUTE_CUSTOM_DRIVER_CLASS ); } else { driverClass = dialect.getNativeDriver(); conn = DriverManager.getConnection( dialect.getURLWithExtraOptions( connection ), connection.getUsername(), connection.getPassword() ); return conn; } catch ( SQLException e ) {
String retval = ""; String fieldname = v.getName(); int length = v.getLength(); int precision = v.getPrecision(); int type = v.getType(); switch ( type ) { case IValueMeta.TYPE_DATE:
@Test public void testThatFailedDriverInitThrowsInConvert() throws DBDatasourceServiceException { when( ( (IDriverLocator) driverLocatorDialect ).initialize( nativeDriverName ) ).thenReturn( false ); try { PooledDatasourceHelper.convert( connection, () -> dialectService ); fail( "Expected exception" ); } catch ( Exception e ) { assertThat( e.getMessage(), containsString( nativeDriverName ) ); } }
/** * For dialects which implement IDriverLocator, this method will use the provided * initialize() implementation. For all others, will initialize drivers via the call to * {@link DriverManagerDataSource#setDriverClassName(String)} (which internally uses Class.forName()) * @throws DBDatasourceServiceException */ private static void initDriverClass( DriverManagerDataSource driverManagerDataSource, IDatabaseDialect dialect, String driverClassName, String databaseConnectionName ) throws DBDatasourceServiceException { if ( dialect instanceof IDriverLocator ) { if ( !( (IDriverLocator) dialect ).initialize( driverClassName ) ) { throw new DriverNotInitializedException( Messages.getInstance() .getErrorString( "PooledDatasourceHelper.ERROR_0009_UNABLE_TO_POOL_DATASOURCE_CANT_INITIALIZE", databaseConnectionName, driverClassName ) ); } return; } try { driverManagerDataSource.setDriverClassName( driverClassName ); } catch ( Throwable th ) { throw new DBDatasourceServiceException( Messages.getInstance().getErrorString( "PooledDatasourceHelper.ERROR_0002_DATASOURCE_CREATE_ERROR_NO_CLASSNAME", databaseConnectionName ), th ); } }