1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor;
19
20 import lombok.Getter;
21 import lombok.RequiredArgsConstructor;
22 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
23 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
24 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultColumnMetaData;
25 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultMetaData;
26 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.type.RawMemoryQueryResult;
27 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
28 import org.apache.shardingsphere.infra.executor.sql.process.Process;
29 import org.apache.shardingsphere.infra.merge.result.MergedResult;
30 import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult;
31 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
32 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminQueryExecutor;
33 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
34
35 import java.sql.Types;
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.Collections;
39 import java.util.List;
40 import java.util.concurrent.TimeUnit;
41 import java.util.stream.Collectors;
42
43
44
45
46 @RequiredArgsConstructor
47 public final class ShowProcessListExecutor implements DatabaseAdminQueryExecutor {
48
49 private final boolean showFullProcesslist;
50
51 @Getter
52 private QueryResultMetaData queryResultMetaData;
53
54 @Getter
55 private MergedResult mergedResult;
56
57 @Override
58 public void execute(final ConnectionSession connectionSession) {
59 queryResultMetaData = createQueryResultMetaData();
60 mergedResult = new TransparentMergedResult(getQueryResult());
61 }
62
63 private QueryResult getQueryResult() {
64 Collection<Process> processes = ProxyContext.getInstance().getContextManager().getPersistServiceFacade().getModeFacade().getProcessService().getProcessList();
65 if (processes.isEmpty()) {
66 return new RawMemoryQueryResult(queryResultMetaData, Collections.emptyList());
67 }
68 List<MemoryQueryResultDataRow> rows = processes.stream().map(this::getMemoryQueryResultDataRow).collect(Collectors.toList());
69 return new RawMemoryQueryResult(queryResultMetaData, rows);
70 }
71
72 private MemoryQueryResultDataRow getMemoryQueryResultDataRow(final Process process) {
73 List<Object> rowValues = new ArrayList<>(8);
74 rowValues.add(process.getId());
75 rowValues.add(process.getUsername());
76 rowValues.add(process.getHostname());
77 rowValues.add(process.getDatabaseName());
78 rowValues.add(process.isIdle() ? "Sleep" : "Execute");
79 rowValues.add(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - process.getStartMillis()));
80 String sql = null;
81 if (process.isIdle()) {
82 rowValues.add("");
83 } else {
84 int processDoneCount = process.getCompletedUnitCount().get();
85 String statePrefix = "Executing ";
86 rowValues.add(statePrefix + processDoneCount + "/" + process.getTotalUnitCount().get());
87 sql = process.getSql();
88 }
89 if (null != sql && sql.length() > 100 && !showFullProcesslist) {
90 sql = sql.substring(0, 100);
91 }
92 rowValues.add(null != sql ? sql : "");
93 return new MemoryQueryResultDataRow(rowValues);
94 }
95
96 private QueryResultMetaData createQueryResultMetaData() {
97 List<RawQueryResultColumnMetaData> columns = new ArrayList<>(8);
98 columns.add(new RawQueryResultColumnMetaData("", "Id", "Id", Types.VARCHAR, "VARCHAR", 20, 0));
99 columns.add(new RawQueryResultColumnMetaData("", "User", "User", Types.VARCHAR, "VARCHAR", 20, 0));
100 columns.add(new RawQueryResultColumnMetaData("", "Host", "Host", Types.VARCHAR, "VARCHAR", 64, 0));
101 columns.add(new RawQueryResultColumnMetaData("", "db", "db", Types.VARCHAR, "VARCHAR", 64, 0));
102 columns.add(new RawQueryResultColumnMetaData("", "Command", "Command", Types.VARCHAR, "VARCHAR", 64, 0));
103 columns.add(new RawQueryResultColumnMetaData("", "Time", "Time", Types.VARCHAR, "VARCHAR", 10, 0));
104 columns.add(new RawQueryResultColumnMetaData("", "State", "State", Types.VARCHAR, "VARCHAR", 64, 0));
105 columns.add(new RawQueryResultColumnMetaData("", "Info", "Info", Types.VARCHAR, "VARCHAR", 120, 0));
106 return new RawQueryResultMetaData(columns);
107 }
108 }