in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/HibernateDatastore.java [572:642]
private void addTenantForSchemaInternal(final String schemaName) {
if( multiTenantMode != MultiTenancySettings.MultiTenancyMode.SCHEMA ) {
throw new ConfigurationException("The method [addTenantForSchema] can only be called with multi-tenancy mode SCHEMA. Current mode is: " + multiTenantMode);
}
HibernateConnectionSourceFactory factory = (HibernateConnectionSourceFactory) connectionSources.getFactory();
HibernateConnectionSource defaultConnectionSource = (HibernateConnectionSource) connectionSources.getDefaultConnectionSource();
HibernateConnectionSourceSettings tenantSettings;
try {
tenantSettings = (HibernateConnectionSourceSettings)connectionSources.getDefaultConnectionSource().getSettings().clone();
} catch (CloneNotSupportedException e) {
throw new ConfigurationException("Couldn't clone default Hibernate settings! " + e.getMessage(), e);
}
tenantSettings.getHibernate().put(Environment.DEFAULT_SCHEMA, schemaName);
String dbCreate = tenantSettings.getDataSource().getDbCreate();
SchemaAutoTooling schemaAutoTooling = dbCreate != null ? SchemaAutoTooling.interpret(dbCreate) : null;
if(schemaAutoTooling != null && schemaAutoTooling != SchemaAutoTooling.VALIDATE && schemaAutoTooling != SchemaAutoTooling.NONE) {
Connection connection = null;
try {
connection = defaultConnectionSource.getDataSource().getConnection();
try {
schemaHandler.useSchema(connection, schemaName);
} catch (Exception e) {
// schema doesn't exist
schemaHandler.createSchema(connection, schemaName);
}
} catch (SQLException e) {
throw new DatastoreConfigurationException(String.format("Failed to create schema for name [%s]", schemaName));
}
finally {
if(connection != null) {
try {
schemaHandler.useDefaultSchema(connection);
connection.close();
} catch (SQLException e) {
//ignore
}
}
}
}
DataSource dataSource = defaultConnectionSource.getDataSource();
dataSource = new MultiTenantDataSource(dataSource, schemaName) {
@Override
public Connection getConnection() throws SQLException {
Connection connection = super.getConnection();
schemaHandler.useSchema(connection, schemaName);
return new MultiTenantConnection(connection, schemaHandler);
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
Connection connection = super.getConnection(username, password);
schemaHandler.useSchema(connection, schemaName);
return new MultiTenantConnection(connection, schemaHandler);
}
};
DefaultConnectionSource<DataSource, DataSourceSettings> dataSourceConnectionSource = new DefaultConnectionSource<>(schemaName, dataSource, tenantSettings.getDataSource());
ConnectionSource<SessionFactory, HibernateConnectionSourceSettings> connectionSource = factory.create(schemaName, dataSourceConnectionSource, tenantSettings);
SingletonConnectionSources<SessionFactory, HibernateConnectionSourceSettings> singletonConnectionSources = new SingletonConnectionSources<>(connectionSource, connectionSources.getBaseConfiguration());
HibernateDatastore childDatastore = new HibernateDatastore(singletonConnectionSources, (HibernateMappingContext) mappingContext, eventPublisher) {
@Override
protected HibernateGormEnhancer initialize() {
return null;
}
};
datastoresByConnectionSource.put(connectionSource.getName(), childDatastore);
}