Hi All
As part of a standardisation process, I'm trying to get Keycloak working with Informix DB, the enterprise DB!
I understand that Keycloak does not officially support Informix however given the use of JPA / Hibernate I though there was a good chance it would work out of the box.
However this has proven not the case. The connection dialect does indeed recognise Informix but does not appear to correctly map to this DB.
The issue I've come across is the handling of boolean conditional in SQL.
In RoleEntry.java the query
@NamedQuery(name="getRealmRoleByName", query="select role from RoleEntity role where role.applicationRole = false and role.name = :name and role.realm = :realm")
Generates the following
select
roleentity0_.id as id1_15_,
roleentity0_.APP_REALM_CONSTRAINT as APP_REAL2_15_,
roleentity0_.APPLICATION as APPLICAT7_15_,
roleentity0_.APPLICATION_ROLE as APPLICAT3_15_,
roleentity0_.DESCRIPTION as DESCRIPT4_15_,
roleentity0_.NAME as NAME5_15_,
roleentity0_.REALM as REALM8_15_,
roleentity0_.REALM_ID as REALM_ID6_15_
from
KEYCLOAK_ROLE roleentity0_
where
roleentity0_.APPLICATION_ROLE=0
The above does not work with Informix as 't', 'f', true and false respectively is used. So it should be
where
roleentity0_.APPLICATION_ROLE='f'
Looking through the code, it appears I cannot configure this. Happy to be proven wrong here!
I found I could override within Hibernate using the property
hibernate.query.substitutions=true t, false f
I've added this change into DefaultJpaConnectionProviderFactory.java
String querySubstitutions = config.get("querySubstitutions");
if (querySubstitutions != null) {
logger.debug("hibernate.query.substitutions=" + querySubstitutions);
properties.put("hibernate.query.substitutions", querySubstitutions);
}
Adding the setting in keycloak-server.json
"connectionsJpa": {
"default": {
"dataSource": "java:jboss/datasources/KeycloakDS",
"databaseSchema": "update",
"querySubstitutions" : "true t, false f"
}
However I've found the translation is not occurring as I would have expected.
Can you please advise on the approach I'm taking or any alternatives I have not looked into?
Also once we get this working with Informix how can I get it added to the supported DB list?