/*
* 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.model;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPKeywordType;
import org.jkiss.dbeaver.model.DBUtils;
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.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLHelpProvider;
import org.jkiss.dbeaver.model.sql.SQLHelpTopic;
import org.jkiss.utils.CommonUtils;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* MySQLHelpProvider
*/
public class MySQLHelpProvider implements SQLHelpProvider
{
private static final Log log = Log.getLog(MySQLHelpProvider.class);
private final MySQLDataSource dataSource;
private final Map<String, SQLHelpTopic> topicCache = new HashMap<>();
private boolean isLoaded = false;
public MySQLHelpProvider(MySQLDataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public SQLHelpTopic findHelpTopic(DBRProgressMonitor monitor, String keyword, DBPKeywordType keywordType) {
return selectHelpTopic(monitor, keyword);
}
private SQLHelpTopic selectHelpTopic(DBRProgressMonitor monitor, String topic) {
if (CommonUtils.isEmpty(topic)) {
return null;
}
if (!isLoaded) {
loadTopics(monitor);
}
synchronized (topicCache) {
return topicCache.get(topic.toUpperCase(Locale.ENGLISH));
}
}
private void loadTopics(DBRProgressMonitor monitor) {
try (final JDBCSession session = DBUtils.openMetaSession(monitor, dataSource, "Read MySQL help topicc")) {
try (JDBCPreparedStatement dbStat = session.prepareStatement(
"SELECT name, description, example, url FROM mysql.help_topic")) {
try (JDBCResultSet dbResult = dbStat.executeQuery()) {
while (dbResult.next()) {
String topicName = dbResult.getString(1);
SQLHelpTopic helpTopic = new SQLHelpTopic();
helpTopic.setContents("<pre>" + dbResult.getString(2) + "</pre>");
helpTopic.setExample(dbResult.getString(3));
helpTopic.setUrl(dbResult.getString(4));
if (topicName != null) {
synchronized (topicCache) {
topicCache.put(topicName.toUpperCase(Locale.ENGLISH), helpTopic);
}
}
}
}
} catch (SQLException e) {
log.error("Error reading help topics", e);
}
}
finally {
isLoaded = true;
}
}
}