Skip to content

Commit

Permalink
[CONJ-687] addition of option "useMysqlMetadata" to permit MySQL meta…
Browse files Browse the repository at this point in the history
… compatibility
  • Loading branch information
rusher committed Mar 12, 2019
1 parent 09a92c9 commit 42183c0
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 21 deletions.
6 changes: 1 addition & 5 deletions src/main/java/org/mariadb/jdbc/MariaDbConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -827,11 +827,7 @@ public boolean isClosed() {
* @return meta data about the db.
*/
public DatabaseMetaData getMetaData() {
UrlParser urlParser = protocol.getUrlParser();
return new MariaDbDatabaseMetaData(
this,
urlParser.getUsername(),
urlParser.getInitialUrl());
return new MariaDbDatabaseMetaData(this, protocol.getUrlParser());
}

/**
Expand Down
32 changes: 18 additions & 14 deletions src/main/java/org/mariadb/jdbc/MariaDbDatabaseMetaData.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import org.mariadb.jdbc.internal.ColumnType;
import org.mariadb.jdbc.internal.com.read.resultset.ColumnInformation;
import org.mariadb.jdbc.internal.com.read.resultset.SelectResultSet;
Expand All @@ -76,22 +78,19 @@
public class MariaDbDatabaseMetaData implements DatabaseMetaData {

public static final String DRIVER_NAME = "MariaDB Connector/J";
private final String url;
private final MariaDbConnection connection;
private final String username;
private final UrlParser urlParser;
private boolean datePrecisionColumnExist = true;

/**
* Constructor.
*
* @param connection connection
* @param user userName
* @param url connection String url.
* @param urlParser Url parser
*/
public MariaDbDatabaseMetaData(Connection connection, String user, String url) {
public MariaDbDatabaseMetaData(Connection connection, UrlParser urlParser) {
this.connection = (MariaDbConnection) connection;
this.username = user;
this.url = url;
this.urlParser = urlParser;
}

private static String columnTypeClause(Options options) {
Expand Down Expand Up @@ -426,7 +425,7 @@ public ResultSet getImportedKeys(String catalog, String schema, String table)
}

private String dataTypeClause(String fullTypeColumnName) {
Options options = connection.getProtocol().getUrlParser().getOptions();
Options options = urlParser.getOptions();
return " CASE data_type"
+ " WHEN 'bit' THEN " + Types.BIT
+ " WHEN 'tinyblob' THEN " + Types.VARBINARY
Expand Down Expand Up @@ -740,7 +739,7 @@ public ResultSet getTables(String catalog, String schemaPattern, String tableNam
public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern,
String columnNamePattern)
throws SQLException {
Options options = connection.getProtocol().getUrlParser().getOptions();
Options options = urlParser.getOptions();
String sql = "SELECT TABLE_SCHEMA TABLE_CAT, NULL TABLE_SCHEM, TABLE_NAME, COLUMN_NAME,"
+ dataTypeClause("COLUMN_TYPE") + " DATA_TYPE,"
+ columnTypeClause(options) + " TYPE_NAME, "
Expand Down Expand Up @@ -1050,8 +1049,8 @@ public boolean generatedKeyAlwaysReturned() {
* data types where DECIMAL_DIGITS is not applicable.
* <LI><B>NUM_PREC_RADIX</B> int {@code =>} Radix (typically either 10 or 2)
* <LI><B>COLUMN_USAGE</B> String {@code =>} The allowed usage for the column. The value
* returned will correspond to the enum name returned by {@link PseudoColumnUsage#name
* PseudoColumnUsage.name()} <LI><B>REMARKS</B> String {@code =>} comment describing column (may
* returned will correspond to the enum name returned by
* PseudoColumnUsage.name() <LI><B>REMARKS</B> String {@code =>} comment describing column (may
* be <code>null</code>)
* <LI><B>CHAR_OCTET_LENGTH</B> int {@code =>} for char types the maximum number of bytes in the
* column <LI><B>IS_NULLABLE</B> String {@code =>} ISO rules are used to determine the
Expand Down Expand Up @@ -1102,11 +1101,11 @@ public boolean allTablesAreSelectable() {

@Override
public String getURL() {
return url;
return urlParser.getInitialUrl();
}

public String getUserName() {
return username;
return urlParser.getUsername();
}

public boolean isReadOnly() {
Expand All @@ -1130,7 +1129,12 @@ public boolean nullsAreSortedAtEnd() {
}

public String getDatabaseProductName() throws SQLException {
return connection.getProtocol().isServerMariaDb() ? "MariaDB" : "MySQL";
if (urlParser.getOptions().useMysqlMetadata) return "MySQL";
if (connection.getProtocol().isServerMariaDb()
&& connection.getProtocol().getServerVersion().toLowerCase(Locale.ROOT).contains("mariadb")) {
return "MariaDB";
}
return "MySQL";
}

public String getDatabaseProductVersion() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,10 @@ public enum DefaultOptions {
"indicate trust store type (JKS/PKCS12). default is null, then using java default type", false),
SERVICE_PRINCIPAL_NAME("servicePrincipalName", (String) null, "2.4.0",
"when using GSSAPI authentication, SPN (Service Principal Name) use the server SPN information. When set, "
+ "connector will use this value, ignoring server information", false);
+ "connector will use this value, ignoring server information", false),
USE_MYSQL_AS_DATABASE("useMysqlMetadata", Boolean.FALSE, "2.4.1",
"force DatabaseMetadata.getDatabaseProductName() " +
"to return \"MySQL\" as database, not real database type", false);


private final String optionName;
Expand Down
1 change: 1 addition & 0 deletions src/main/java/org/mariadb/jdbc/internal/util/Options.java
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ public class Options implements Cloneable {
public boolean nullCatalogMeansCurrent = true;
public boolean dumpQueriesOnException;
public boolean useOldAliasMetadataBehavior;
public boolean useMysqlMetadata;
public boolean allowLocalInfile = true;
public boolean cachePrepStmts = true;
public int prepStmtCacheSize = 250;
Expand Down
13 changes: 12 additions & 1 deletion src/test/java/org/mariadb/jdbc/DriverTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1664,5 +1664,16 @@ public void run() {
}
}


@Test
public void databaseType() throws SQLException {
Assume.assumeTrue(System.getenv("MAXSCALE_VERSION") == null);
Assume.assumeTrue(System.getenv("TRAVIS") != null);
boolean isMysql = System.getenv("DB").contains("mysql");
assertEquals(isMysql ? "MySQL" : "MariaDB" , sharedConnection.getMetaData().getDatabaseProductName());
if (!isMysql) {
try (Connection connection = setConnection("&useMysqlMetadata=true")) {
assertEquals("MySQL", connection.getMetaData().getDatabaseProductName());
}
}
}
}

0 comments on commit 42183c0

Please sign in to comment.