private void runConsole()

in fastmodel-driver/fastmodel-driver-cli/src/main/java/com/aliyun/fastmodel/driver/cli/command/Console.java [125:207]


    private void runConsole(QueryRunner queryRunner, AtomicBoolean exiting) {
        LineReader reader = null;
        try {
            reader = LineReaderBuilder.builder().terminal(TerminalUtils.getTerminal()).
                variable(HISTORY_FILE, getHistoryFile()).
                variable(SECONDARY_PROMPT_PATTERN, colored("%P -> "))
                .variable(
                    LineReader.BLINK_MATCHING_PAREN, 0).parser(new InputParser())
                .highlighter(
                    new InputHighlighter()
                ).completer(new AggregateCompleter(getCompleters())).build();
            reader.unsetOpt(Option.HISTORY_TIMESTAMPED);
            String remaining = "";
            while (!exiting.get()) {
                String line;
                try {
                    String prompt = PROMPT;
                    String database = queryRunner.getProperties().getProperty("database");
                    if (StringUtils.isNotBlank(database)) {
                        prompt = PROMPT + ":" + database;
                    }
                    String commandPrompt = prompt + ">";
                    line = reader.readLine(colored(commandPrompt), null, remaining);
                } catch (UserInterruptException e) {
                    if (!e.getPartialLine().isEmpty()) {
                        reader.getHistory().add(e.getPartialLine());
                    }
                    remaining = "";
                    continue;
                } catch (EndOfFileException e) {
                    System.out.println();
                    return;
                }
                String command = CharMatcher.is(';').or(whitespace()).trimTrailingFrom(line);
                switch (command.toLowerCase(Locale.ENGLISH)) {
                    case "exit":
                    case "quit":
                        return;
                    case "history":
                        for (History.Entry entry : reader.getHistory()) {
                            System.out.println(new AttributedStringBuilder().style(DEFAULT.foreground(CYAN))
                                .append(format("%5d", entry.index() + 1)).style(DEFAULT).append("  ")
                                .append(entry.line())
                                .toAnsi(reader.getTerminal()));
                        }
                        continue;
                    case "help":
                        System.out.println();
                        System.out.println(getHelpText());
                        continue;
                    default:
                        break;
                }
                //判断是否为dump
                String dumpCommand = getCommand(line);
                boolean isDump = StringUtils.equalsIgnoreCase(dumpCommand, "dump");
                String afterLine = isDump ? getStatement(line) : line;
                DumpInfo dumpInfo = DumpInfo.builder()
                    .dump(isDump)
                    .build();

                StatementSplitter statementSplitter = new StatementSplitter(afterLine, STATEMENT_DELIMITERS);
                for (StatementText split : statementSplitter.getStatements()) {
                    String statement = split.getStatement();
                    if (StatementSplitter.isEmptyStatement(statement)) {
                        continue;
                    }
                    String replace = StringUtils.replace(statement, "\n", " ");
                    process(queryRunner, replace, reader.getTerminal(), dumpInfo);
                }
                remaining = whitespace().trimTrailingFrom(statementSplitter.getPartialStatement());
            }
        } catch (Exception e) {
            System.err.println(e.getMessage());
        } finally {
            try (Closer closer = Closer.create()) {
                closer.register(reader.getHistory()::save);
                closer.register(reader.getTerminal());
            } catch (IOException e) {
                e.printStackTrace(System.err);
            }
        }
    }