1
0
mirror of synced 2025-12-25 02:09:19 -05:00

🐛 bugfix: parsing Mysql jdbc params (#2891)

Co-authored-by: gingeard-wa <vsafronov@wakeapp.com>
Co-authored-by: Sherif Nada <snadalive@gmail.com>
This commit is contained in:
Vasily
2021-04-15 18:54:06 +03:00
committed by GitHub
parent 7611719212
commit abb54c904b
6 changed files with 77 additions and 6 deletions

View File

@@ -52,8 +52,8 @@ public class MySqlSource extends AbstractJdbcSource implements Source {
config.get("database").asText()));
// see MySqlJdbcStreamingQueryConfiguration for more context on why useCursorFetch=true is needed.
jdbc_url.append("?useCursorFetch=true");
if (config.get("jdbc_url_params") != null && !config.get("jdbc_url_params").isEmpty()) {
jdbc_url.append("&").append(config.get("jdbc_url_params"));
if (config.get("jdbc_url_params") != null && !config.get("jdbc_url_params").asText().isEmpty()) {
jdbc_url.append("&").append(config.get("jdbc_url_params").asText());
}
ImmutableMap.Builder<Object, Object> configBuilder = ImmutableMap.builder()
.put("username", config.get("username").asText())

View File

@@ -40,6 +40,7 @@ import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.MySQLContainer;
class MySqlJdbcStandardTest extends JdbcSourceStandardTest {
@@ -123,5 +124,4 @@ class MySqlJdbcStandardTest extends JdbcSourceStandardTest {
public JsonNode getConfig() {
return Jsons.clone(config);
}
}

View File

@@ -0,0 +1,71 @@
package io.airbyte.integrations.source.mysql;
import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.collect.ImmutableMap;
import io.airbyte.commons.json.Jsons;
import io.airbyte.db.Database;
import io.airbyte.db.Databases;
import io.airbyte.protocol.models.AirbyteConnectionStatus;
import org.apache.commons.lang3.RandomStringUtils;
import org.jooq.SQLDialect;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.MySQLContainer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class MySqlSourceTests {
private static final String TEST_USER = "test";
private static final String TEST_PASSWORD = "test";
private static MySQLContainer<?> container;
private JsonNode config;
private Database database;
@Test
public void testSettingTimezones() throws Exception {
// start DB
container = new MySQLContainer<>("mysql:8.0")
.withUsername(TEST_USER)
.withPassword(TEST_PASSWORD)
.withEnv("MYSQL_ROOT_HOST", "%")
.withEnv("MYSQL_ROOT_PASSWORD", TEST_PASSWORD)
.withEnv("TZ", "Europe/Moscow");
container.start();
Properties properties = new Properties();
properties.putAll(ImmutableMap.of("user", "root", "password", TEST_PASSWORD, "serverTimezone", "Europe/Moscow"));
DriverManager.getConnection(container.getJdbcUrl(), properties);
String dbName = "db_" + RandomStringUtils.randomAlphabetic(10);
config = getConfig(container, dbName, "serverTimezone=Europe/Moscow");
try(Connection connection = DriverManager.getConnection(container.getJdbcUrl(), properties)){
connection.createStatement().execute("GRANT ALL PRIVILEGES ON *.* TO '" + TEST_USER + "'@'%';\n");
connection.createStatement().execute("CREATE DATABASE " + config.get("database").asText());
}
AirbyteConnectionStatus check = new MySqlSource().check(config);
assertEquals(AirbyteConnectionStatus.Status.SUCCEEDED, check.getStatus());
// cleanup
container.close();
}
private static JsonNode getConfig(MySQLContainer dbContainer, String dbName, String jdbcParams) {
return Jsons.jsonNode(ImmutableMap.builder()
.put("host", dbContainer.getHost())
.put("port", dbContainer.getFirstMappedPort())
.put("database", dbName)
.put("username", TEST_USER)
.put("password", TEST_PASSWORD)
.put("jdbc_url_params", jdbcParams)
.build());
}
}