Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ private void execute(String sql) throws SQLException {
@Override
public boolean tableExists(String namespace, String table) throws Exception {
String fullTableName = rdbEngine.encloseFullTableName(namespace, table);
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
try (Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement()) {
statement.execute(sql);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ private boolean tableExistsOnCassandra(String namespace, String table) {

private boolean tableExistsOnJdbc(String namespace, String table) throws Exception {
String fullTableName = rdbEngine.encloseFullTableName(namespace, table);
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
try (Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement()) {
statement.execute(sql);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ private void createTableInternal(
requestBuilder.tableName(getFullTableName(namespace, table));

try {
if (!(ifNotExists && tableExistsInternal(namespace, table))) {
if (!(ifNotExists && internalTableExists(namespace, table))) {
client.createTable(requestBuilder.build());
waitForTableCreation(namespace, table);
}
Expand Down Expand Up @@ -543,14 +543,14 @@ private void createMetadataTableIfNotExists(boolean noBackup) throws ExecutionEx
}

private boolean metadataTableExists() throws ExecutionException {
return tableExistsInternal(Namespace.of(metadataNamespace), METADATA_TABLE);
return internalTableExists(Namespace.of(metadataNamespace), METADATA_TABLE);
}

private boolean namespacesTableExists() throws ExecutionException {
return tableExistsInternal(Namespace.of(metadataNamespace), NAMESPACES_TABLE);
return internalTableExists(Namespace.of(metadataNamespace), NAMESPACES_TABLE);
}

private boolean tableExistsInternal(Namespace namespace, String table) throws ExecutionException {
private boolean internalTableExists(Namespace namespace, String table) throws ExecutionException {
try {
client.describeTable(
DescribeTableRequest.builder().tableName(getFullTableName(namespace, table)).build());
Expand Down
38 changes: 31 additions & 7 deletions core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ public class JdbcAdmin implements DistributedStorageAdmin {

private final RdbEngineStrategy rdbEngine;
private final BasicDataSource dataSource;
private final String metadataSchema;
private final TableMetadataService tableMetadataService;
private final NamespaceMetadataService namespaceMetadataService;

Expand All @@ -67,16 +68,18 @@ public JdbcAdmin(DatabaseConfig databaseConfig) {
JdbcConfig config = new JdbcConfig(databaseConfig);
rdbEngine = RdbEngineFactory.create(config);
dataSource = JdbcUtils.initDataSourceForAdmin(config, rdbEngine);
tableMetadataService = new TableMetadataService(config.getMetadataSchema(), rdbEngine);
namespaceMetadataService = new NamespaceMetadataService(config.getMetadataSchema(), rdbEngine);
metadataSchema = config.getMetadataSchema();
tableMetadataService = new TableMetadataService(metadataSchema, rdbEngine);
namespaceMetadataService = new NamespaceMetadataService(metadataSchema, rdbEngine);
}

@SuppressFBWarnings("EI_EXPOSE_REP2")
public JdbcAdmin(BasicDataSource dataSource, JdbcConfig config) {
rdbEngine = RdbEngineFactory.create(config);
this.dataSource = dataSource;
tableMetadataService = new TableMetadataService(config.getMetadataSchema(), rdbEngine);
namespaceMetadataService = new NamespaceMetadataService(config.getMetadataSchema(), rdbEngine);
metadataSchema = config.getMetadataSchema();
tableMetadataService = new TableMetadataService(metadataSchema, rdbEngine);
namespaceMetadataService = new NamespaceMetadataService(metadataSchema, rdbEngine);
}

private static boolean hasDescClusteringOrder(TableMetadata metadata) {
Expand Down Expand Up @@ -105,6 +108,7 @@ public void createNamespace(String namespace, Map<String, String> options)

try (Connection connection = dataSource.getConnection()) {
execute(connection, rdbEngine.createSchemaSqls(namespace));
createMetadataSchemaIfNotExists(connection);
createNamespacesTableIfNotExists(connection);
namespaceMetadataService.insertIntoNamespacesTable(connection, namespace);
} catch (SQLException e) {
Expand All @@ -117,6 +121,7 @@ public void createTable(
String namespace, String table, TableMetadata metadata, Map<String, String> options)
throws ExecutionException {
try (Connection connection = dataSource.getConnection()) {
createMetadataSchemaIfNotExists(connection);
createTableInternal(connection, namespace, table, metadata, false);
addTableMetadata(connection, namespace, table, metadata, true, false);
} catch (SQLException e) {
Expand Down Expand Up @@ -221,6 +226,7 @@ public void dropNamespace(String namespace) throws ExecutionException {
execute(connection, rdbEngine.dropNamespaceSql(namespace));
namespaceMetadataService.deleteFromNamespacesTable(connection, namespace);
namespaceMetadataService.deleteNamespacesTableIfEmpty(connection);
deleteMetadataSchemaIfEmpty(connection);
} catch (SQLException e) {
rdbEngine.dropNamespaceTranslateSQLException(e, namespace);
}
Expand Down Expand Up @@ -282,7 +288,7 @@ TableMetadata getImportTableMetadata(
String catalogName = rdbEngine.getCatalogName(namespace);
String schemaName = rdbEngine.getSchemaName(namespace);

if (!tableExistsInternal(connection, namespace, table)) {
if (!internalTableExists(connection, namespace, table)) {
throw new IllegalArgumentException(
CoreError.TABLE_NOT_FOUND.buildMessage(getFullTableName(namespace, table)));
}
Expand Down Expand Up @@ -337,6 +343,7 @@ public void importTable(

try (Connection connection = dataSource.getConnection()) {
TableMetadata tableMetadata = getImportTableMetadata(namespace, table, overrideColumnsType);
createMetadataSchemaIfNotExists(connection);
createNamespacesTableIfNotExists(connection);
upsertIntoNamespacesTable(connection, namespace);
addTableMetadata(connection, namespace, table, tableMetadata, true, false);
Expand Down Expand Up @@ -473,6 +480,7 @@ public void repairNamespace(String namespace, Map<String, String> options)

try (Connection connection = dataSource.getConnection()) {
createSchemaIfNotExists(connection, namespace);
createMetadataSchemaIfNotExists(connection);
createNamespacesTableIfNotExists(connection);
upsertIntoNamespacesTable(connection, namespace);
} catch (SQLException e) {
Expand All @@ -485,6 +493,7 @@ public void repairTable(
String namespace, String table, TableMetadata metadata, Map<String, String> options)
throws ExecutionException {
try (Connection connection = dataSource.getConnection()) {
createMetadataSchemaIfNotExists(connection);
createTableInternal(connection, namespace, table, metadata, true);
addTableMetadata(connection, namespace, table, metadata, true, true);
} catch (SQLException e) {
Expand Down Expand Up @@ -720,6 +729,7 @@ public void upgrade(Map<String, String> options) throws ExecutionException {
return;
}

createMetadataSchemaIfNotExists(connection);
createNamespacesTableIfNotExists(connection);
for (String namespace : namespaceNamesOfExistingTables) {
upsertIntoNamespacesTable(connection, namespace);
Expand Down Expand Up @@ -762,6 +772,20 @@ void upsertIntoNamespacesTable(Connection connection, String namespace) throws S
namespaceMetadataService.upsertIntoNamespacesTable(connection, namespace);
}

private void createMetadataSchemaIfNotExists(Connection connection) throws SQLException {
createSchemaIfNotExists(connection, metadataSchema);
}

private void deleteMetadataSchemaIfEmpty(Connection connection) throws SQLException {
Set<String> internalTableNames = getInternalTableNames(connection, metadataSchema);
if (!internalTableNames.isEmpty()) {
return;
}

String sql = rdbEngine.deleteMetadataSchemaSql(metadataSchema);
execute(connection, sql);
}

private void createTable(Connection connection, String createTableStatement, boolean ifNotExists)
throws SQLException {
String stmt = createTableStatement;
Expand All @@ -778,10 +802,10 @@ private void createTable(Connection connection, String createTableStatement, boo
}
}

private boolean tableExistsInternal(Connection connection, String namespace, String table)
private boolean internalTableExists(Connection connection, String namespace, String table)
throws ExecutionException {
String fullTableName = encloseFullTableName(namespace, table);
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
try {
execute(connection, sql);
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,10 @@ public class NamespaceMetadataService {
}

void createNamespacesTableIfNotExists(Connection connection) throws SQLException {
if (tableExistsInternal(connection, metadataSchema, TABLE_NAME)) {
if (internalTableExists(connection, metadataSchema, TABLE_NAME)) {
return;
}

createSchemaIfNotExists(connection, metadataSchema);
String createTableStatement =
"CREATE TABLE "
+ encloseFullTableName(metadataSchema, TABLE_NAME)
Expand All @@ -52,7 +51,6 @@ void createNamespacesTableIfNotExists(Connection connection) throws SQLException
void deleteNamespacesTableIfEmpty(Connection connection) throws SQLException {
if (isNamespacesTableEmpty(connection)) {
deleteTable(connection, encloseFullTableName(metadataSchema, TABLE_NAME));
deleteMetadataSchema(connection);
}
}

Expand All @@ -75,11 +73,6 @@ private boolean isNamespacesTableEmpty(Connection connection) throws SQLExceptio
return namespaces.size() == 1 && namespaces.contains(metadataSchema);
}

private void deleteMetadataSchema(Connection connection) throws SQLException {
String sql = rdbEngine.deleteMetadataSchemaSql(metadataSchema);
execute(connection, sql);
}

void insertIntoNamespacesTable(Connection connection, String namespaceName) throws SQLException {
String insertStatement =
"INSERT INTO " + encloseFullTableName(metadataSchema, TABLE_NAME) + " VALUES (?)";
Expand Down Expand Up @@ -178,10 +171,10 @@ private void createTable(Connection connection, String createTableStatement, boo
}
}

private boolean tableExistsInternal(Connection connection, String namespace, String table)
private boolean internalTableExists(Connection connection, String namespace, String table)
throws SQLException {
String fullTableName = encloseFullTableName(namespace, table);
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
try {
execute(connection, sql);
return true;
Expand All @@ -201,18 +194,6 @@ private void deleteTable(Connection connection, String fullTableName) throws SQL
execute(connection, dropTableStatement);
}

private void createSchemaIfNotExists(Connection connection, String schema) throws SQLException {
String[] sqls = rdbEngine.createSchemaIfNotExistsSqls(schema);
try {
execute(connection, sqls);
} catch (SQLException e) {
// Suppress exceptions indicating the duplicate metadata schema
if (!rdbEngine.isCreateMetadataSchemaDuplicateSchemaError(e)) {
throw e;
}
}
}

private String enclose(String name) {
return rdbEngine.enclose(name);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ public String[] alterColumnTypeSql(
}

@Override
public String tableExistsInternalTableCheckSql(String fullTableName) {
public String internalTableExistsCheckSql(String fullTableName) {
return "SELECT 1 FROM " + fullTableName + " LIMIT 1";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ public String[] alterColumnTypeSql(
}

@Override
public String tableExistsInternalTableCheckSql(String fullTableName) {
public String internalTableExistsCheckSql(String fullTableName) {
return "SELECT 1 FROM " + fullTableName + " LIMIT 1";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ public String[] alterColumnTypeSql(
}

@Override
public String tableExistsInternalTableCheckSql(String fullTableName) {
public String internalTableExistsCheckSql(String fullTableName) {
return "SELECT 1 FROM " + fullTableName + " FETCH FIRST 1 ROWS ONLY";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public String[] alterColumnTypeSql(
}

@Override
public String tableExistsInternalTableCheckSql(String fullTableName) {
public String internalTableExistsCheckSql(String fullTableName) {
return "SELECT 1 FROM " + fullTableName + " LIMIT 1";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public String[] alterColumnTypeSql(
}

@Override
public String tableExistsInternalTableCheckSql(String fullTableName) {
public String internalTableExistsCheckSql(String fullTableName) {
return "SELECT TOP 1 1 FROM " + fullTableName;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ public String[] alterColumnTypeSql(
}

@Override
public String tableExistsInternalTableCheckSql(String fullTableName) {
public String internalTableExistsCheckSql(String fullTableName) {
return "SELECT 1 FROM " + fullTableName + " LIMIT 1";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ default String renameColumnSql(

String[] alterColumnTypeSql(String namespace, String table, String columnName, String columnType);

String tableExistsInternalTableCheckSql(String fullTableName);
String internalTableExistsCheckSql(String fullTableName);

default String createIndexSql(
String schema, String table, String indexName, String indexedColumn) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ Set<String> getNamespaceTableNames(Connection connection, String namespace) thro
}

Set<String> getNamespaceNamesOfExistingTables(Connection connection) throws SQLException {
if (!tableExistsInternal(connection, metadataSchema, TABLE_NAME)) {
if (!internalTableExists(connection, metadataSchema, TABLE_NAME)) {
return Collections.emptySet();
}

Expand Down Expand Up @@ -383,10 +383,10 @@ private void createTable(Connection connection, String createTableStatement, boo
}
}

private boolean tableExistsInternal(Connection connection, String namespace, String table)
private boolean internalTableExists(Connection connection, String namespace, String table)
throws SQLException {
String fullTableName = encloseFullTableName(namespace, table);
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
try {
execute(connection, sql);
return true;
Expand Down
Loading