Skip to content

Commit b052c4e

Browse files
snuyanzinvlsi
authored andcommitted
SqlLine integration
1 parent a57a5ba commit b052c4e

File tree

7 files changed

+209
-2
lines changed

7 files changed

+209
-2
lines changed

MatCalciteDependencies/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424
<artifactId>jsr305</artifactId>
2525
<version>3.0.2</version>
2626
</dependency>
27+
<dependency>
28+
<groupId>sqlline</groupId>
29+
<artifactId>sqlline</artifactId>
30+
<version>1.9.0</version>
31+
</dependency>
2732
</dependencies>
2833

2934
<build>

MatCalcitePlugin/src/com/github/vlsi/mat/calcite/Executor.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.github.vlsi.mat.calcite;
22

3+
import sqlline.MCPSqlLine;
34
import com.google.common.base.Joiner;
45
import com.google.common.escape.Escaper;
56
import com.google.common.escape.Escapers;
@@ -15,22 +16,40 @@
1516
import java.io.File;
1617
import java.io.FileReader;
1718
import java.io.FileWriter;
19+
import java.io.IOException;
1820
import java.sql.Connection;
1921
import java.sql.PreparedStatement;
2022
import java.sql.ResultSet;
2123
import java.sql.ResultSetMetaData;
2224
import java.util.ArrayList;
2325
import java.util.List;
2426

27+
import static org.jline.terminal.TerminalBuilder.PROP_JANSI;
28+
2529
public class Executor implements IApplication {
2630

2731
@Override
2832
public Object start(IApplicationContext context) {
2933
String[] args = (String[]) context.getArguments().get("application.args");
3034
char delimiter = ',';
3135

32-
if (args.length < 3) {
36+
if (args.length == 0 || (args.length < 3 && !"sqlline".equalsIgnoreCase(args[0]))) {
3337
System.out.println("java com.github.vlsi.mat.calcite.Executor <heap-dump> <query> <result>");
38+
System.out.println("java com.github.vlsi.mat.calcite.Executor sqlline");
39+
return IApplication.EXIT_OK;
40+
}
41+
42+
if ("sqlline".equalsIgnoreCase(args[0])) {
43+
try {
44+
System.setProperty(PROP_JANSI, Boolean.TRUE.toString());
45+
MCPSqlLine sqlLine = new MCPSqlLine();
46+
String[] sqllineArgs = new String[args.length - 1];
47+
System.arraycopy(args, 1, sqllineArgs, 0, args.length - 1);
48+
sqlLine.begin(sqllineArgs, null, false);
49+
} catch (IOException e) {
50+
e.printStackTrace();
51+
return IApplication.EXIT_OK;
52+
}
3453
return IApplication.EXIT_OK;
3554
}
3655

@@ -57,7 +76,6 @@ public Object start(IApplicationContext context) {
5776
return IApplication.EXIT_OK;
5877
}
5978

60-
6179
try (Connection con = CalciteDataSource.getConnection(openSnapshot(heapFile));
6280
BufferedWriter w = new BufferedWriter(new FileWriter(resultsFile))) {
6381
PreparedStatement ps = con.prepareStatement(sbQuery.toString());
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.github.vlsi.mat.calcite.cli;
2+
3+
import org.jline.builtins.Completers;
4+
5+
import java.nio.file.FileSystems;
6+
import java.nio.file.Files;
7+
import java.nio.file.Path;
8+
import java.nio.file.PathMatcher;
9+
10+
public class DumpFileNameCompleter extends Completers.FileNameCompleter {
11+
private static final PathMatcher DUMP_FILE_MATCHER =
12+
FileSystems.getDefault().getPathMatcher("glob:**.{bin,hprof}");
13+
14+
@Override
15+
protected boolean accept(Path path) {
16+
return super.accept(path)
17+
&& (Files.isDirectory(path) || DUMP_FILE_MATCHER.matches(path));
18+
}
19+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.github.vlsi.mat.calcite.cli;
2+
3+
import sqlline.Application;
4+
import sqlline.CommandHandler;
5+
import sqlline.MCPSqlLine;
6+
import sqlline.SqlLine;
7+
8+
import java.util.ArrayList;
9+
import java.util.Collection;
10+
import java.util.HashSet;
11+
import java.util.Set;
12+
13+
public class MCPApplication extends Application {
14+
private static final Set<String> ALLOWED_SQLLINE_COMMANDS = new HashSet<String>() {{
15+
add("quit");
16+
add("history");
17+
add("verbose");
18+
add("run");
19+
add("list");
20+
add("all");
21+
add("go");
22+
add("script");
23+
add("record");
24+
add("brief");
25+
add("close");
26+
add("closeall");
27+
add("outputformat");
28+
add("set");
29+
add("help");
30+
add("reset");
31+
add("save");
32+
add("rerun");
33+
add("prompthandler");
34+
}};
35+
36+
@Override
37+
public Collection<CommandHandler> getCommandHandlers(SqlLine sqlLine) {
38+
Collection<CommandHandler> handlers = new ArrayList<>();
39+
for (CommandHandler commandHandler : super.getCommandHandlers(sqlLine)) {
40+
if (ALLOWED_SQLLINE_COMMANDS.contains(commandHandler.getName())) {
41+
handlers.add(commandHandler);
42+
}
43+
}
44+
handlers.add(new OpenDumpCommandHandler((MCPSqlLine) sqlLine, new DumpFileNameCompleter(), "Open heap dump",
45+
"open_dump"));
46+
return handlers;
47+
}
48+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.github.vlsi.mat.calcite.cli;
2+
3+
import org.eclipse.mat.SnapshotException;
4+
import org.eclipse.mat.snapshot.ISnapshot;
5+
import org.eclipse.mat.snapshot.SnapshotFactory;
6+
import org.eclipse.mat.util.VoidProgressListener;
7+
import org.jline.reader.Completer;
8+
import sqlline.AbstractCommandHandler;
9+
import sqlline.Commands;
10+
import sqlline.DispatchCallback;
11+
import sqlline.MCPDatabaseConnection;
12+
import sqlline.MCPSqlLine;
13+
14+
import java.io.File;
15+
import java.util.Collections;
16+
import java.util.List;
17+
18+
public class OpenDumpCommandHandler extends AbstractCommandHandler {
19+
public OpenDumpCommandHandler(MCPSqlLine sqlLine, List<Completer> completers,
20+
String helpText, String... cmds) {
21+
super(sqlLine, cmds, helpText, completers);
22+
}
23+
24+
public OpenDumpCommandHandler(MCPSqlLine sqlLine, Completer completer,
25+
String helpText, String... cmds) {
26+
this(sqlLine, Collections.singletonList(completer), helpText, cmds);
27+
}
28+
29+
public void execute(String line, DispatchCallback callback) {
30+
final String[] parts = sqlLine.split(line, " ", 0);
31+
if (parts.length != 2) {
32+
sqlLine.error("Usage: open_dump <path to file>");
33+
callback.setToFailure();
34+
return;
35+
}
36+
// replace ~/ with user directory
37+
final String filename = Commands.expand(parts[1]);
38+
if (!new File(filename).isFile()) {
39+
sqlLine.error("Dump file " + filename + " does not exists!");
40+
callback.setToFailure();
41+
return;
42+
}
43+
44+
final MCPSqlLine mcpSqlLine = (MCPSqlLine) sqlLine;
45+
final MCPDatabaseConnection mcpDatabaseConnection;
46+
try {
47+
mcpDatabaseConnection = new MCPDatabaseConnection(mcpSqlLine, filename, openSnapshot(new File(filename)));
48+
} catch (SnapshotException e) {
49+
callback.setToFailure();
50+
mcpSqlLine.error(e);
51+
return;
52+
}
53+
try {
54+
mcpSqlLine.setUpConnection(mcpDatabaseConnection);
55+
callback.setToSuccess();
56+
} catch (Exception e) {
57+
mcpDatabaseConnection.close();
58+
mcpSqlLine.removeConnection(mcpDatabaseConnection);
59+
callback.setToFailure();
60+
mcpSqlLine.error(e);
61+
}
62+
}
63+
64+
private static ISnapshot openSnapshot(File heapDump) throws SnapshotException {
65+
System.out.println("exists = " + heapDump.exists() + ", file = " + heapDump.getAbsolutePath());
66+
return SnapshotFactory.openSnapshot(heapDump, new VoidProgressListener());
67+
}
68+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package sqlline;
2+
3+
import com.github.vlsi.mat.calcite.CalciteDataSource;
4+
5+
import org.eclipse.mat.snapshot.ISnapshot;
6+
7+
import java.sql.SQLException;
8+
9+
public class MCPDatabaseConnection extends DatabaseConnection {
10+
private final ISnapshot snapshot;
11+
12+
public MCPDatabaseConnection(MCPSqlLine sqlLine, String filename, ISnapshot snapshot) {
13+
super(sqlLine, null, filename, "username", "password", null);
14+
this.snapshot = snapshot;
15+
}
16+
17+
@Override
18+
boolean connect() throws SQLException {
19+
connection = CalciteDataSource.getConnection(snapshot);
20+
return true;
21+
}
22+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package sqlline;
2+
3+
import com.github.vlsi.mat.calcite.cli.MCPApplication;
4+
5+
import java.lang.reflect.Proxy;
6+
import java.sql.Connection;
7+
import java.sql.DatabaseMetaData;
8+
import java.sql.SQLException;
9+
10+
public class MCPSqlLine extends SqlLine {
11+
void setAppConfig(Application application) {
12+
super.setAppConfig(new MCPApplication());
13+
}
14+
15+
public void setUpConnection(final MCPDatabaseConnection mcpDatabaseConnection) throws SQLException {
16+
getDatabaseConnections().setConnection(mcpDatabaseConnection);
17+
Connection connection = getDatabaseConnection().getConnection();
18+
mcpDatabaseConnection.meta = (DatabaseMetaData) Proxy.newProxyInstance(
19+
DatabaseMetaData.class.getClassLoader(),
20+
new Class[]{DatabaseMetaData.class},
21+
new DatabaseMetaDataHandler(connection.getMetaData()));
22+
}
23+
24+
public void removeConnection(final MCPDatabaseConnection mcpDatabaseConnection) {
25+
getDatabaseConnections().removeConnection(mcpDatabaseConnection);
26+
}
27+
}

0 commit comments

Comments
 (0)