| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 |
| * <p/> |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * <p/> |
| * 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.apache.hive.beeline; |
| |
| import org.apache.hive.jdbc.Utils; |
| |
| import java.sql.SQLException; |
| |
| /** |
| * We need to update some client side information after executing some Hive Commands |
| */ |
| public class ClientCommandHookFactory { |
| private final static ClientCommandHookFactory instance = new ClientCommandHookFactory(); |
| |
| private ClientCommandHookFactory() { |
| } |
| |
| public static ClientCommandHookFactory get() { |
| return instance; |
| } |
| |
| public class SetCommandHook extends ClientHook { |
| |
| public SetCommandHook(String sql) { |
| super(sql); |
| } |
| |
| @Override |
| public void postHook(BeeLine beeLine) { |
| if (!beeLine.isBeeLine()) { |
| beeLine.getOpts().setHiveConf(beeLine.getCommands().getHiveConf(false)); |
| } |
| } |
| } |
| |
| public class UseCommandHook extends ClientHook { |
| |
| public UseCommandHook(String sql) { |
| super(sql); |
| } |
| |
| @Override |
| public void postHook(BeeLine beeLine) { |
| // Handler multi-line sql |
| String line = sql.replaceAll("\\s+", " "); |
| String strs[] = line.split(" "); |
| String dbName; |
| if (strs == null || strs.length != 2) { |
| // unable to parse the use command |
| dbName = ""; |
| } else { |
| dbName = strs[1]; |
| } |
| beeLine.setCurrentDatabase(dbName); |
| } |
| } |
| |
| public class ConnectCommandHook extends ClientHook { |
| |
| public ConnectCommandHook(String sql) { |
| super(sql); |
| } |
| |
| @Override |
| public void postHook(BeeLine beeLine) { |
| // Handler multi-line sql |
| String line = sql.replaceAll("\\s+", " "); |
| String strs[] = line.split(" "); |
| String dbName; |
| if (strs == null || strs.length < 1) { |
| // unable to parse the connect command |
| dbName = ""; |
| } else { |
| try { |
| dbName = Utils.parseURL(strs[1]).getDbName(); |
| } catch (Exception e) { |
| // unable to parse the connect command |
| dbName = ""; |
| } |
| } |
| beeLine.setCurrentDatabase(dbName); |
| } |
| } |
| |
| public class GoCommandHook extends ClientHook { |
| |
| public GoCommandHook(String sql) { |
| super(sql); |
| } |
| |
| @Override |
| public void postHook(BeeLine beeLine) { |
| String dbName = ""; |
| try { |
| dbName = beeLine.getDatabaseConnection().getConnection().getSchema(); |
| } catch (SQLException e) { |
| // unable to get the database, set the dbName empty |
| } |
| beeLine.setCurrentDatabase(dbName); |
| } |
| } |
| |
| public ClientHook getHook(BeeLine beeLine, String cmdLine) { |
| if (!beeLine.isBeeLine()) { |
| // In compatibility mode we need to hook to set, and use |
| if (cmdLine.toLowerCase().startsWith("set")) { |
| // Only set A = B command needs updating the configuration stored in client side. |
| if (cmdLine.contains("=")) { |
| return new SetCommandHook(cmdLine); |
| } else { |
| return null; |
| } |
| } else if (cmdLine.toLowerCase().startsWith("use")) { |
| return new UseCommandHook(cmdLine); |
| } else { |
| return null; |
| } |
| } else { |
| // In beeline mode we need to hook to use, connect, go, in case |
| // the ShowDbInPrompt is set, so the database name is needed |
| if (beeLine.getOpts().getShowDbInPrompt()) { |
| if (cmdLine.toLowerCase().startsWith("use")) { |
| return new UseCommandHook(cmdLine); |
| } else if (cmdLine.toLowerCase().startsWith("connect")) { |
| return new ConnectCommandHook(cmdLine); |
| } else if (cmdLine.toLowerCase().startsWith("go")) { |
| return new GoCommandHook(cmdLine); |
| } else { |
| return null; |
| } |
| } else { |
| return null; |
| } |
| } |
| } |
| } |