/** * 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 ); } }
/** * 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; }
@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 ); }
if ( dialect == null || dialect.getDatabaseType() == null ) { throw new DBDatasourceServiceException( Messages.getInstance().getErrorString( "PooledDatasourceHelper.ERROR_0004_UNABLE_TO_POOL_DATASOURCE_NO_DIALECT", databaseConnection.getName() ) );