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);
}
}
}