/** * PermissionsEx * Copyright (C) zml and PermissionsEx contributors * * 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 ninja.leaping.permissionsex.backend.sql.dao; import ninja.leaping.permissionsex.backend.sql.SqlDao; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * DAO covering legacy operations. Some things in here might be mildly weird because * they have to handle bridging between two models of working with the database. */ public class LegacyDao { public static final LegacyDao INSTANCE = new LegacyDao(); private static final Pattern TABLE_PATTERN = Pattern.compile("\\{([^}]+)\\}"); protected LegacyDao() { } public String getSelectEntitiesQuery() { return "SELECT (`name`, `type`) FROM {permissions_entity}"; } public String getSelectOptionsQuery() { return "SELECT `permission`, `value`, `world` FROM `{permissions}` WHERE `name` = ? AND `type` = ? AND LENGTH(`value`) > 0"; } public String getSelectOptionQuery() { return "SELECT `value` FROM `{permissions}` WHERE `name` = ? AND `type` = ? AND `permission` = ? AND `world` = ? AND LENGTH(`value`) > 0"; } public String getInsertOptionQuery() { return "INSERT INTO `{permissions}` (`name`, `type`, `permission`, `world`, `value`) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)"; } public String getSelectPermissionQuery() { return "SELECT `permission`, `world` FROM `{permissions}` WHERE `name` = ? AND `type` = ? AND LENGTH(`value`) = 0 ORDER BY `id` DESC"; } public String getSelectParentsQuery() { return "SELECT `id`, `parent`, `world` FROM `{}permissions_inheritance_old` WHERE `child` = ? AND `type` = ? ORDER BY `world`, `id` DESC"; } public PreparedStatement prepareStatement(SqlDao dao, String query) throws SQLException { StringBuffer ret = new StringBuffer(); Matcher m = TABLE_PATTERN.matcher(query); while (m.find()) { m.appendReplacement(ret, dao.getDataStore().getTableName(m.group(1), true)); } m.appendTail(ret); return dao.prepareStatement(ret.toString()); } public boolean hasTable(SqlDao dao, String table) throws SQLException { return dao.getConnection().getMetaData().getTables(null, null, dao.getDataStore().getTableName(table, true).toUpperCase(), null).next(); // Upper-case for H2 } public void renameTable(SqlDao dao, String oldName, String newName) throws SQLException { final String expandedOld = dao.getDataStore().getTableName(oldName, true); final String expandedNew = dao.getDataStore().getTableName(newName, false); try (PreparedStatement stmt = prepareStatement(dao, "ALTER TABLE `" + expandedOld + "` RENAME `" + expandedNew + "`")) { /*try (PreparedStatement stmt = prepareStatement(dao, dao.getRenameTableQuery())) { stmt.setString(1, expandedOld); stmt.setString(2, expandedNew);*/ stmt.executeUpdate(); } } public String getOption(SqlDao dao, String name, LegacyMigration.Type type, String world, String option) throws SQLException { try (PreparedStatement stmt = dao.prepareStatement(getSelectOptionQuery())) { stmt.setString(1, name); stmt.setInt(2, type.ordinal()); stmt.setString(3, option); if (world == null) { stmt.setNull(4, Types.VARCHAR); } else { stmt.setString(4, world); } ResultSet rs = stmt.executeQuery(); if (rs.next()) { return rs.getString(1); } else { return null; } } } }