package com.eas.client; import com.eas.client.sqldrivers.SqlDriver; import com.eas.client.metadata.Fields; import com.eas.client.sqldrivers.GenericSqlDriver; import java.sql.*; import java.util.Iterator; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; import java.util.ServiceLoader; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * * @author mg */ public class SQLUtils { public static final String TABLE_NAME_2_SQL = "select * from %s"; public static final String PARAMETER_NAME_REGEXP = ":{1}([A-za-z]\\w*\\b)"; public static final String PROPERTIES_VALUE_REGEXP = "={1}([A-za-z]\\w+\\b)"; public static final String SQL_SELECT_COMMON_WHERE_BY_FIELD = "select * from %s where %s.%s = :%s"; public static final String SQL_SELECT_COMMON_WHERE_ISNULL_FIELD = "select * from %s where %s.%s is null"; public static final String SQL_PARAMETER_FIELD_VALUE = "fieldValue"; public static final String SQL_UPDATE_COMMON_WHERE_BY_FIELD = "update %s set %s = %s where %s.%s = :" + SQL_PARAMETER_FIELD_VALUE; public static final String SQL_UPDATE2_COMMON_WHERE_BY_FIELD = "update %s set %s = %s, %s = %s where %s.%s = :" + SQL_PARAMETER_FIELD_VALUE; public static final String SQL_UPDATE3_COMMON_WHERE_BY_FIELD = "update %s set %s = %s, %s = %s, %s = %s where %s.%s = :" + SQL_PARAMETER_FIELD_VALUE; public static final String SQL_UPDATE4_COMMON_WHERE_BY_FIELD = "update %s set %s = %s, %s = %s, %s = %s, %s = %s where %s.%s = :" + SQL_PARAMETER_FIELD_VALUE; public static final String SQL_DELETE_COMMON_WHERE_BY_FIELD = "delete from %s where %s.%s = :" + SQL_PARAMETER_FIELD_VALUE; public static final String SQL_INSERT_COMMON_ID_FIELD = "insert into %s columns = (%s) values = ( :" + SQL_PARAMETER_FIELD_VALUE + ")"; public static final String SQL_MAX_COMMON_BY_FIELD = "select max(%s) %s from %s"; private static final SqlDriver GENERIC_DRIVER = new GenericSqlDriver(); private static final Set<SqlDriver> DRIVERS = new ConcurrentHashMap<SqlDriver, Boolean>() { { ServiceLoader<SqlDriver> loader = ServiceLoader.load(SqlDriver.class); Iterator<SqlDriver> drivers = loader.iterator(); while (drivers.hasNext()) { try { put(drivers.next(), true); } catch (Throwable t) { Logger.getLogger(SQLUtils.class.getName()).log(Level.WARNING, null, t); } } } }.keySet(); public static String dialectByUrl(String aJdbcUrl) { String dialect = null; if (aJdbcUrl != null) { aJdbcUrl = aJdbcUrl.toLowerCase(); if (aJdbcUrl.contains("jdbc:oracle")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_ORACLE_DIALECT; } else if (aJdbcUrl.contains("jdbc:jtds:sqlserver")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_MSSQL_DIALECT; } else if (aJdbcUrl.contains("jdbc:postgre")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_POSTGRE_DIALECT; } else if (aJdbcUrl.contains("jdbc:db2")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_DB2_DIALECT; } else if (aJdbcUrl.contains("jdbc:mysql")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_MYSQL_DIALECT; } else if (aJdbcUrl.contains("jdbc:h2")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_H2_DIALECT; } } return dialect; } public static String dialectByProductName(String aName) { String dialect = null; if (aName != null) { aName = aName.toLowerCase(); if (aName.contains("oracle")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_ORACLE_DIALECT; } else if (aName.contains("microsoft")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_MSSQL_DIALECT; } else if (aName.contains("postgre")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_POSTGRE_DIALECT; } else if (aName.contains("db2")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_DB2_DIALECT; } else if (aName.contains("mysql")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_MYSQL_DIALECT; } else if (aName.contains("h2")) { //NOI18N dialect = ClientConstants.SERVER_PROPERTY_H2_DIALECT; } } return dialect; } public static SqlDriver getSqlDriver(String aDialect) { return DRIVERS.stream() .filter(sqlDriver -> sqlDriver.is(aDialect)) .findFirst() .orElse(GENERIC_DRIVER); } public static SqlQuery validateTableSqlQuery(String aTableDatasource, String tableName, String tableSchemaName, DatabasesClient aClient) throws Exception { return validateTableSqlQuery(aTableDatasource, tableName, tableSchemaName, aClient, true); } public static SqlQuery validateTableSqlQuery(String aTableDatasource, String aTableName, String aTableSchemaName, DatabasesClient aClient, boolean forceMdQuery) throws Exception { String fullTableName = aTableName; if (aTableSchemaName != null && !aTableSchemaName.isEmpty()) { fullTableName = aTableSchemaName + "." + fullTableName; } SqlQuery query = new SqlQuery(aClient, aTableDatasource, SQLUtils.makeQueryByTableName(fullTableName)); MetadataCache mdCache = aClient.getMetadataCache(aTableDatasource); if (mdCache != null) { Fields tableFields = forceMdQuery || mdCache.containsTableMetadata(fullTableName) ? mdCache.getTableMetadata(fullTableName) : null; if (tableFields != null) { query.setFields(tableFields.copy()); } else { throw new Exception("Table " + fullTableName + " doesn't exist. Datasource: " + aTableDatasource); } } return query; } public static String extractSchemaName(String aName) { int indexOfDot = aName.indexOf('.'); if (indexOfDot != -1) { return aName.substring(0, indexOfDot); } return ""; } public static String extractTableName(String aName) { int indexOfDot = aName.indexOf('.'); if (indexOfDot != -1) { return aName.substring(indexOfDot + 1); } return aName; } public static String getLocalizedPkName() { return DbLocalizations.getString("PRIMARY_KEY"); } public static String getLocalizedFkName() { return DbLocalizations.getString("FOREIGN_KEY"); } public static String makeQueryByTableName(String aTableName) { return String.format(TABLE_NAME_2_SQL, aTableName); } /* public static String makeTableNameMetadataQuery(String aTableName) { return makeQueryMetadataQuery(makeQueryByTableName(aTableName)); } public static final String SQL_FALSE_CONDITION = " where 1=0"; public static final String SQL_2_METADTA_TAIL = "t01010101" + SQL_FALSE_CONDITION; public static final String SQL_2_METADTA = "select * from ( %s ) " + SQL_2_METADTA_TAIL; public static String makeQueryMetadataQuery(String sql) { if (sql != null && !sql.isEmpty()) { if (!sql.endsWith(SQL_2_METADTA_TAIL)) { String lsql = sql.toLowerCase().replaceAll("[\n\r]", ""); if (lsql.matches(".+\\bwhere\\b.+") // complex queries || lsql.matches(".+\\border\\b.+") || lsql.matches(".+\\bgroup\\b.+") || lsql.matches(".+\\bconnect\\b.+")) { return String.format(SQL_2_METADTA, sql); } else // simple queries { return sql + SQL_FALSE_CONDITION; } } else {// bypass return sql; } } return ""; } */ public static final ResourceBundle DbLocalizations = ResourceBundle.getBundle("com/eas/client/DbLocalizations"); public static String clob2String(Clob source) { if (source != null) { try { return source.getSubString(1, (int) source.length()); } catch (SQLException sqlEx) { Logger.getLogger(SQLUtils.class.getName()).log(Level.SEVERE, null, sqlEx); } } return null; } public static SqlQuery constructQueryByTableName(DatabasesClient aClient, String aTableName) { if (aTableName != null) { SqlQuery query = new SqlQuery(aClient, SQLUtils.makeQueryByTableName(aTableName)); return query; } return null; } }