/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ext.mysql;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.connection.DBPClientHome;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.*;
/**
* MySQL utils
*/
public class MySQLUtils {
private static final Log log = Log.getLog(MySQLUtils.class);
private static Map<String, Integer> typeMap = new HashMap<>();
public static final String COLUMN_POSTFIX_PRIV = "_priv";
static {
typeMap.put("bit", java.sql.Types.BIT);
typeMap.put("bool", java.sql.Types.BOOLEAN);
typeMap.put("boolean", java.sql.Types.BOOLEAN);
typeMap.put("tinyint", java.sql.Types.TINYINT);
typeMap.put("smallint", java.sql.Types.SMALLINT);
typeMap.put("mediumint", java.sql.Types.INTEGER);
typeMap.put("int", java.sql.Types.INTEGER);
typeMap.put("integer", java.sql.Types.INTEGER);
typeMap.put("int24", java.sql.Types.INTEGER);
typeMap.put("bigint", java.sql.Types.BIGINT);
typeMap.put("real", java.sql.Types.DOUBLE);
typeMap.put("float", java.sql.Types.FLOAT);
typeMap.put("decimal", java.sql.Types.DECIMAL);
typeMap.put("dec", java.sql.Types.DECIMAL);
typeMap.put("numeric", java.sql.Types.DECIMAL);
typeMap.put("double", java.sql.Types.DOUBLE);
typeMap.put("double precision", java.sql.Types.DOUBLE);
typeMap.put("char", java.sql.Types.CHAR);
typeMap.put("varchar", java.sql.Types.VARCHAR);
typeMap.put("date", java.sql.Types.DATE);
typeMap.put("time", java.sql.Types.TIME);
typeMap.put("year", java.sql.Types.DATE);
typeMap.put("timestamp", java.sql.Types.TIMESTAMP);
typeMap.put("datetime", java.sql.Types.TIMESTAMP);
typeMap.put("tinyblob", java.sql.Types.BINARY);
typeMap.put("blob", java.sql.Types.LONGVARBINARY);
typeMap.put("mediumblob", java.sql.Types.LONGVARBINARY);
typeMap.put("longblob", java.sql.Types.LONGVARBINARY);
typeMap.put("tinytext", java.sql.Types.VARCHAR);
typeMap.put("text", java.sql.Types.VARCHAR);
typeMap.put("mediumtext", java.sql.Types.VARCHAR);
typeMap.put("longtext", java.sql.Types.VARCHAR);
typeMap.put(MySQLConstants.TYPE_NAME_ENUM, java.sql.Types.CHAR);
typeMap.put(MySQLConstants.TYPE_NAME_SET, java.sql.Types.CHAR);
typeMap.put("geometry", java.sql.Types.BINARY);
typeMap.put("binary", java.sql.Types.BINARY);
typeMap.put("varbinary", java.sql.Types.VARBINARY);
}
public static int typeNameToValueType(String typeName)
{
Integer valueType = typeMap.get(typeName.toLowerCase(Locale.ENGLISH));
return valueType == null ? java.sql.Types.OTHER : valueType;
}
public static List<String> collectPrivilegeNames(ResultSet resultSet)
{
// Now collect all privileges columns
try {
List<String> privs = new ArrayList<>();
ResultSetMetaData rsMetaData = resultSet.getMetaData();
int colCount = rsMetaData.getColumnCount();
for (int i = 0; i < colCount; i++) {
String colName = rsMetaData.getColumnName(i + 1);
if (colName.toLowerCase(Locale.ENGLISH).endsWith(COLUMN_POSTFIX_PRIV)) {
privs.add(colName.substring(0, colName.length() - COLUMN_POSTFIX_PRIV.length()));
}
}
return privs;
} catch (SQLException e) {
log.debug(e);
return Collections.emptyList();
}
}
public static Map<String, Boolean> collectPrivileges(List<String> privNames, ResultSet resultSet)
{
// Now collect all privileges columns
Map<String, Boolean> privs = new TreeMap<>();
for (String privName : privNames) {
privs.put(privName, "Y".equals(JDBCUtils.safeGetString(resultSet, privName + COLUMN_POSTFIX_PRIV)));
}
return privs;
}
public static String getMySQLConsoleBinaryName()
{
return RuntimeUtils.getNativeBinaryName("mysql");
}
public static String determineCurrentDatabase(JDBCSession session) throws DBCException {
// Get active schema
try {
try (JDBCPreparedStatement dbStat = session.prepareStatement("SELECT DATABASE()")) {
try (JDBCResultSet resultSet = dbStat.executeQuery()) {
if (resultSet.next()) {
return resultSet.getString(1);
}
return null;
}
}
} catch (SQLException e) {
throw new DBCException(e, session.getDataSource());
}
}
}