diff --git a/app/src/main/java/io/apicurio/registry/storage/impl/sql/AbstractSqlRegistryStorage.java b/app/src/main/java/io/apicurio/registry/storage/impl/sql/AbstractSqlRegistryStorage.java index 9491d57fbc..06aba595c7 100644 --- a/app/src/main/java/io/apicurio/registry/storage/impl/sql/AbstractSqlRegistryStorage.java +++ b/app/src/main/java/io/apicurio/registry/storage/impl/sql/AbstractSqlRegistryStorage.java @@ -177,7 +177,6 @@ public abstract class AbstractSqlRegistryStorage implements RegistryStorage { private static int DB_VERSION = Integer .valueOf(IoUtil.toString(AbstractSqlRegistryStorage.class.getResourceAsStream("db-version"))) .intValue(); - private static final Object inmemorySequencesMutex = new Object(); private static final ObjectMapper mapper = new ObjectMapper(); @@ -234,6 +233,10 @@ protected SqlStatements sqlStatements() { @Info(category = "storage", description = "SQL init", availableSince = "2.0.0.Final") boolean initDB; + @ConfigProperty(name = "apicurio.sql.db-schema", defaultValue = "*") + @Info(category = "storage", description = "Database schema name (only needed when running two instances of Registry against the same database, in multiple schemas)", availableSince = "3.0.6") + String dbSchema; + @Inject @ConfigProperty(name = "apicurio.events.kafka.topic", defaultValue = "registry-events") @Info(category = "storage", description = "Storage event topic") @@ -327,8 +330,15 @@ protected void initialize(HandleFactory handleFactory, boolean emitStorageReadyE */ private boolean isDatabaseInitializedRaw(Handle handle) { log.info("Checking to see if the DB is initialized."); - int count = handle.createQuery(this.sqlStatements.isDatabaseInitialized()).mapTo(Integer.class).one(); - return count > 0; + if ("*".equals(dbSchema)) { + int count = handle.createQuery(this.sqlStatements.isDatabaseInitialized()).mapTo(Integer.class) + .one(); + return count > 0; + } else { + int count = handle.createQuery(this.sqlStatements.isDatabaseSchemaInitialized()).bind(0, dbSchema) + .mapTo(Integer.class).one(); + return count > 0; + } } /** diff --git a/app/src/main/java/io/apicurio/registry/storage/impl/sql/CommonSqlStatements.java b/app/src/main/java/io/apicurio/registry/storage/impl/sql/CommonSqlStatements.java index fbc791c6ef..112ab1563d 100644 --- a/app/src/main/java/io/apicurio/registry/storage/impl/sql/CommonSqlStatements.java +++ b/app/src/main/java/io/apicurio/registry/storage/impl/sql/CommonSqlStatements.java @@ -16,6 +16,19 @@ public abstract class CommonSqlStatements implements SqlStatements { public CommonSqlStatements() { } + /** + * @see SqlStatements#isDatabaseInitialized() + */ + @Override + public String isDatabaseInitialized() { + return "SELECT count(*) AS count FROM information_schema.tables WHERE table_name = 'apicurio'"; + } + + @Override + public String isDatabaseSchemaInitialized() { + return "SELECT count(*) AS count FROM information_schema.tables WHERE table_schema = ? AND table_name = 'apicurio'"; + } + /** * @see io.apicurio.registry.storage.impl.sql.SqlStatements#databaseInitialization() */ diff --git a/app/src/main/java/io/apicurio/registry/storage/impl/sql/H2SqlStatements.java b/app/src/main/java/io/apicurio/registry/storage/impl/sql/H2SqlStatements.java index ad87337b16..15282c6fe9 100644 --- a/app/src/main/java/io/apicurio/registry/storage/impl/sql/H2SqlStatements.java +++ b/app/src/main/java/io/apicurio/registry/storage/impl/sql/H2SqlStatements.java @@ -45,6 +45,11 @@ public String isDatabaseInitialized() { return "SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_name = 'APICURIO'"; } + @Override + public String isDatabaseSchemaInitialized() { + return "SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = ? AND table_name = 'APICURIO'"; + } + /** * @see io.apicurio.registry.storage.impl.sql.SqlStatements#getNextSequenceValue() */ diff --git a/app/src/main/java/io/apicurio/registry/storage/impl/sql/MySQLSqlStatements.java b/app/src/main/java/io/apicurio/registry/storage/impl/sql/MySQLSqlStatements.java index 2ce9b9912e..184a2d837f 100644 --- a/app/src/main/java/io/apicurio/registry/storage/impl/sql/MySQLSqlStatements.java +++ b/app/src/main/java/io/apicurio/registry/storage/impl/sql/MySQLSqlStatements.java @@ -36,14 +36,6 @@ public boolean isForeignKeyViolation(Exception error) { return error.getMessage().contains("foreign key constraint fails"); } - /** - * @see io.apicurio.registry.storage.impl.sql.SqlStatements#isDatabaseInitialized() - */ - @Override - public String isDatabaseInitialized() { - return "SELECT count(*) AS count FROM information_schema.tables WHERE table_name = 'artifacts'"; - } - /** * @see io.apicurio.registry.storage.impl.sql.SqlStatements#getNextSequenceValue() */ diff --git a/app/src/main/java/io/apicurio/registry/storage/impl/sql/PostgreSQLSqlStatements.java b/app/src/main/java/io/apicurio/registry/storage/impl/sql/PostgreSQLSqlStatements.java index f9827f2fd6..77c313ed14 100644 --- a/app/src/main/java/io/apicurio/registry/storage/impl/sql/PostgreSQLSqlStatements.java +++ b/app/src/main/java/io/apicurio/registry/storage/impl/sql/PostgreSQLSqlStatements.java @@ -36,14 +36,6 @@ public boolean isForeignKeyViolation(Exception error) { return error.getMessage().contains("violates foreign key constraint"); } - /** - * @see io.apicurio.registry.storage.impl.sql.SqlStatements#isDatabaseInitialized() - */ - @Override - public String isDatabaseInitialized() { - return "SELECT count(*) AS count FROM information_schema.tables WHERE table_name = 'artifacts'"; - } - /** * @see io.apicurio.registry.storage.impl.sql.SqlStatements#getNextSequenceValue() */ diff --git a/app/src/main/java/io/apicurio/registry/storage/impl/sql/SQLServerSqlStatements.java b/app/src/main/java/io/apicurio/registry/storage/impl/sql/SQLServerSqlStatements.java index 27c22c0a75..b7a9d2affd 100644 --- a/app/src/main/java/io/apicurio/registry/storage/impl/sql/SQLServerSqlStatements.java +++ b/app/src/main/java/io/apicurio/registry/storage/impl/sql/SQLServerSqlStatements.java @@ -37,14 +37,6 @@ public boolean isForeignKeyViolation(Exception error) { return error.getMessage().contains("conflicted with the FOREIGN KEY constraint"); } - /** - * @see SqlStatements#isDatabaseInitialized() - */ - @Override - public String isDatabaseInitialized() { - return "SELECT count(*) AS count FROM information_schema.tables WHERE table_name = 'artifacts'"; - } - @Override public String upsertBranch() { return """ diff --git a/app/src/main/java/io/apicurio/registry/storage/impl/sql/SqlStatements.java b/app/src/main/java/io/apicurio/registry/storage/impl/sql/SqlStatements.java index f16cae7b84..a625b9c4e8 100644 --- a/app/src/main/java/io/apicurio/registry/storage/impl/sql/SqlStatements.java +++ b/app/src/main/java/io/apicurio/registry/storage/impl/sql/SqlStatements.java @@ -28,6 +28,11 @@ public interface SqlStatements { */ public String isDatabaseInitialized(); + /** + * A statement that returns 'true' if the database (with schema) has already been initialized. + */ + public String isDatabaseSchemaInitialized(); + /** * A sequence of statements needed to initialize the database. */ diff --git a/app/src/main/resources/application.properties b/app/src/main/resources/application.properties index c665918bdf..1eb9efe422 100644 --- a/app/src/main/resources/application.properties +++ b/app/src/main/resources/application.properties @@ -163,6 +163,7 @@ apicurio.import.work-dir=${java.io.tmpdir} ## SQL Storage apicurio.storage.sql.kind=h2 apicurio.sql.init=true +apicurio.sql.db-schema=* apicurio.datasource.url=jdbc:h2:mem:db_${quarkus.uuid} apicurio.datasource.username=sa diff --git a/docs/modules/ROOT/partials/getting-started/ref-registry-all-configs.adoc b/docs/modules/ROOT/partials/getting-started/ref-registry-all-configs.adoc index f9668dbcbd..8d9e628aa6 100644 --- a/docs/modules/ROOT/partials/getting-started/ref-registry-all-configs.adoc +++ b/docs/modules/ROOT/partials/getting-started/ref-registry-all-configs.adoc @@ -815,6 +815,11 @@ The following {registry} configuration options are available for each component |`true` | |Kafka sql storage topic auto create +|`apicurio.sql.db-schema` +|`string` +| +|`3.0.6` +|Database schema name (only needed when running two instances of Registry against the same database, in multiple schemas) |`apicurio.sql.init` |`boolean` |`true`