• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

future-architect / uroborosql / #769

12 Sep 2024 02:26PM UTC coverage: 90.35% (-0.9%) from 91.21%
#769

Pull #332

HidekiSugimoto189
Refactoring log-related class and method names.
Pull Request #332: Enable per-SQL-ID log suppression (#322)

384 of 587 new or added lines in 32 files covered. (65.42%)

9 existing lines in 7 files now uncovered.

8885 of 9834 relevant lines covered (90.35%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.47
/src/main/java/jp/co/future/uroborosql/client/command/DescCommand.java
1
/**
2
 * Copyright (c) 2017-present, Future Corporation
3
 *
4
 * This source code is licensed under the MIT license found in the
5
 * LICENSE file in the root directory of this source tree.
6
 */
7
package jp.co.future.uroborosql.client.command;
8

9
import java.io.UnsupportedEncodingException;
10
import java.nio.charset.Charset;
11
import java.sql.SQLException;
12
import java.util.ArrayList;
13
import java.util.HashMap;
14
import java.util.Map;
15
import java.util.Objects;
16
import java.util.Properties;
17

18
import org.jline.reader.LineReader;
19
import org.jline.terminal.Terminal;
20

21
import jp.co.future.uroborosql.client.completer.TableNameCompleter;
22
import jp.co.future.uroborosql.config.SqlConfig;
23
import jp.co.future.uroborosql.utils.ObjectUtils;
24

25
/**
26
 * Describe table Command
27
 *
28
 * @author H.Sugimoto
29
 */
30
public class DescCommand extends ReplCommand {
31
        /** DESCで表示する項目 */
32
        private static final String[] DESC_COLUMN_LABELS = { "TABLE_NAME", "COLUMN_NAME", "TYPE_NAME", "COLUMN_SIZE",
1✔
33
                        "DECIMAL_DIGITS", "IS_NULLABLE", "COLUMN_DEF", "REMARKS" };
34

35
        /**
36
         * Constructor
37
         */
38
        @SuppressWarnings("unchecked")
39
        public DescCommand() {
40
                super(false, TableNameCompleter.class);
1✔
41
        }
1✔
42

43
        /**
44
         * {@inheritDoc}
45
         *
46
         * @see jp.co.future.uroborosql.client.command.ReplCommand#execute(org.jline.reader.LineReader, java.lang.String[], jp.co.future.uroborosql.config.SqlConfig, java.util.Properties)
47
         */
48
        @Override
49
        public boolean execute(final LineReader reader, final String[] parts, final SqlConfig sqlConfig,
50
                        final Properties props) {
51
                var writer = reader.getTerminal().writer();
1✔
52

53
                var tableNamePattern = parts.length > 1 ? parts[parts.length - 1] : "%";
1✔
54

55
                try {
56
                        var conn = sqlConfig.getConnectionSupplier().getConnection();
1✔
57
                        var md = conn.getMetaData();
1✔
58

59
                        var columns = new ArrayList<Map<String, String>>();
1✔
60
                        var labelLength = new HashMap<String, Integer>();
1✔
61
                        for (var label : DESC_COLUMN_LABELS) {
1✔
62
                                labelLength.put(label, label.length());
1✔
63
                        }
64
                        try (var rs = md.getColumns(conn.getCatalog(), conn.getSchema(), tableNamePattern, null)) {
1✔
65
                                while (rs.next()) {
1✔
66
                                        var column = new HashMap<String, String>();
1✔
67
                                        for (var label : DESC_COLUMN_LABELS) {
1✔
68
                                                var value = Objects.toString(rs.getString(label), "");
1✔
69
                                                column.put(label, value);
1✔
70
                                                labelLength.compute(label,
1✔
71
                                                                (k, v) -> v == null ? getByteLength(value)
1✔
72
                                                                                : v.compareTo(getByteLength(value)) >= 0 ? v : getByteLength(value));
1✔
73
                                        }
74
                                        columns.add(column);
1✔
75
                                }
1✔
76
                        }
77

78
                        // ラベル
79
                        writer.print("-");
1✔
80
                        for (var label : DESC_COLUMN_LABELS) {
1✔
81
                                writer.print(ObjectUtils.rightPad("", labelLength.get(label), "-"));
1✔
82
                                writer.print("-");
1✔
83
                        }
84
                        writer.println();
1✔
85
                        writer.print("|");
1✔
86
                        for (var label : DESC_COLUMN_LABELS) {
1✔
87
                                writer.print(ObjectUtils.rightPad(label, labelLength.get(label)));
1✔
88
                                writer.print("|");
1✔
89
                        }
90
                        writer.println();
1✔
91
                        // カラムデータ
92
                        String tableName = null;
1✔
93
                        var breakFlag = false;
1✔
94
                        for (var column : columns) {
1✔
95
                                if (tableName == null || !tableName.equalsIgnoreCase(column.get("TABLE_NAME"))) {
1✔
96
                                        tableName = column.get("TABLE_NAME");
1✔
97
                                        breakFlag = true;
1✔
98
                                }
99
                                if (breakFlag) {
1✔
100
                                        writer.print("-");
1✔
101
                                        for (var label : DESC_COLUMN_LABELS) {
1✔
102
                                                writer.print(ObjectUtils.rightPad("", labelLength.get(label), "-"));
1✔
103
                                                writer.print("-");
1✔
104
                                        }
105
                                        writer.println();
1✔
106
                                        breakFlag = false;
1✔
107
                                }
108

109
                                writer.print("|");
1✔
110
                                for (var label : DESC_COLUMN_LABELS) {
1✔
111
                                        var val = column.get(label);
1✔
112
                                        if (ObjectUtils.isNumeric(val)) {
1✔
113
                                                writer.print(ObjectUtils.leftPad(val, labelLength.get(label)));
1✔
114
                                        } else {
115
                                                writer.print(ObjectUtils.rightPad(val, labelLength.get(label)));
1✔
116
                                        }
117
                                        writer.print("|");
1✔
118
                                }
119
                                writer.println();
1✔
120
                        }
1✔
121
                        writer.print("-");
1✔
122
                        for (var label : DESC_COLUMN_LABELS) {
1✔
123
                                writer.print(ObjectUtils.rightPad("", labelLength.get(label), "-"));
1✔
124
                                writer.print("-");
1✔
125
                        }
126
                        writer.println();
1✔
127
                } catch (SQLException ex) {
×
NEW
128
                        errorWith(REPL_LOG)
×
NEW
129
                                        .setMessage(ex.getMessage())
×
NEW
130
                                        .setCause(ex)
×
NEW
131
                                        .log();
×
132
                }
1✔
133
                writer.flush();
1✔
134

135
                return true;
1✔
136
        }
137

138
        /**
139
         * オブジェクトの文字列表現のバイト数(デフォルトエンコーディング)を取得する
140
         *
141
         * @param val 計算対象オブジェクト
142
         * @return バイト数
143
         */
144
        private int getByteLength(final Object val) {
145
                if (val == null) {
1✔
146
                        return 0;
×
147
                }
148
                var str = val.toString();
1✔
149
                try {
150
                        return str.getBytes(Charset.defaultCharset().displayName()).length;
1✔
151
                } catch (UnsupportedEncodingException ex) {
×
152
                        return 1;
×
153
                }
154
        }
155

156
        /**
157
         * {@inheritDoc}
158
         *
159
         * @see jp.co.future.uroborosql.client.command.ReplCommand#showHelp(org.jline.terminal.Terminal)
160
         */
161
        @Override
162
        public void showHelp(final Terminal terminal) {
163
                terminal.writer().println("\t" + this.toString() + "\t: describe table.");
1✔
164
                terminal.writer().println("\t\tex) desc [table name]<Enter> : Show table description.");
1✔
165
        }
1✔
166

167
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc