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

future-architect / uroborosql / #832

03 May 2025 06:41AM UTC coverage: 89.859% (-0.06%) from 89.914%
#832

Pull #350

HidekiSugimoto189
add matrix test and dialect flag.
Pull Request #350: Add multi sqlfile bulk update method.

14 of 16 new or added lines in 3 files covered. (87.5%)

5 existing lines in 1 file now uncovered.

8701 of 9683 relevant lines covered (89.86%)

0.9 hits per line

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

80.0
/src/main/java/jp/co/future/uroborosql/dialect/OracleDialect.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.dialect;
8

9
import java.util.Collections;
10
import java.util.HashSet;
11
import java.util.List;
12
import java.util.Set;
13
import java.util.stream.Collectors;
14

15
import jp.co.future.uroborosql.connection.ConnectionSupplier;
16

17
/**
18
 * Oracle共通の抽象Dialect
19
 *
20
 * @author H.Sugimoto
21
 */
22
public abstract class OracleDialect extends AbstractDialect {
23
        /**
24
         * 悲観ロックのErrorCode もしくは SqlState. Oracleの場合errorCodeで判定する.
25
         * <pre>ORA-00054: リソース・ビジー。NOWAITが指定されているか、タイムアウトしました</pre>
26
         * <pre>ORA-30006: リソース・ビジー; WAITタイムアウトの期限に達しました。</pre>
27
         */
28
        private static final Set<String> pessimisticLockingErrorCodes = Collections
1✔
29
                        .unmodifiableSet(new HashSet<>(List.of("54", "30006")));
1✔
30

31
        /**
32
         * コンストラクタ
33
         * @param escapeChar like検索時のエスケープ文字
34
         * @param wildcards like検索時のワイルドカード文字配列
35
         */
36
        protected OracleDialect(final char escapeChar, final char[] wildcards) {
37
                super(escapeChar, wildcards);
1✔
38
        }
1✔
39

40
        /**
41
         * {@inheritDoc}
42
         *
43
         * @see jp.co.future.uroborosql.dialect.Dialect#getDatabaseName()
44
         */
45
        @Override
46
        public String getDatabaseName() {
47
                return "Oracle";
1✔
48
        }
49

50
        /**
51
         * {@inheritDoc}
52
         *
53
         * @see jp.co.future.uroborosql.dialect.Dialect#supportsNullValuesOrdering()
54
         */
55
        @Override
56
        public boolean supportsNullValuesOrdering() {
57
                return true;
1✔
58
        }
59

60
        /**
61
         * {@inheritDoc}
62
         *
63
         * @see jp.co.future.uroborosql.dialect.Dialect#supportsIdentity()
64
         */
65
        @Override
66
        public boolean supportsIdentity() {
67
                return false;
1✔
68
        }
69

70
        /**
71
         * {@inheritDoc}
72
         *
73
         * @see jp.co.future.uroborosql.dialect.Dialect#supportsOptimizerHints()
74
         */
75
        @Override
76
        public boolean supportsOptimizerHints() {
77
                return true;
1✔
78
        }
79

80
        /**
81
         * {@inheritDoc}
82
         *
83
         * @see jp.co.future.uroborosql.dialect.Dialect#supportsUpdateChained()
84
         */
85
        @Override
86
        public boolean supportsUpdateChained() {
NEW
87
                return false;
×
88
        }
89

90
        /**
91
         * {@inheritDoc}
92
         *
93
         * @see jp.co.future.uroborosql.dialect.Dialect#getSequenceNextValSql(java.lang.String)
94
         */
95
        @Override
96
        public String getSequenceNextValSql(final String sequenceName) {
97
                return sequenceName + ".nextval";
1✔
98
        }
99

100
        /**
101
         * {@inheritDoc}
102
         *
103
         * @see jp.co.future.uroborosql.dialect.Dialect#accept(jp.co.future.uroborosql.connection.ConnectionSupplier)
104
         */
105
        @Override
106
        public boolean accept(final ConnectionSupplier supplier) {
107
                if (supplier == null) {
1✔
108
                        return false;
×
109
                }
110

111
                var parts = supplier.getDatabaseName().split("-", 2);
1✔
112
                var databaseName = parts[0];
1✔
113

114
                if (!databaseName.startsWith(getDatabaseName())) {
1✔
115
                        return false;
1✔
116
                }
117

118
                var databaseVersion = parts[1];
1✔
119

120
                try {
121
                        var majorVersion = Integer.parseInt(databaseVersion.substring(0, databaseVersion.indexOf(".")));
1✔
122
                        return isTargetVersion(majorVersion);
1✔
123
                } catch (NumberFormatException ex) {
×
124
                        return false;
×
125
                }
126
        }
127

128
        /**
129
         * 対象のOracleバージョンかどうかを判定する
130
         *
131
         * @param majorVersion コネクションから取得したメジャーバージョン
132
         * @return 対象のバージョンの場合<code>true</code>
133
         */
134
        protected abstract boolean isTargetVersion(int majorVersion);
135

136
        /**
137
         * {@inheritDoc}
138
         *
139
         * @see jp.co.future.uroborosql.dialect.Dialect#getModLiteral(java.lang.String, java.lang.String)
140
         */
141
        @Override
142
        public String getModLiteral(final String dividend, final String divisor) {
143
                return "MOD(" + dividend + ", " + divisor + ")";
×
144
        }
145

146
        /**
147
         * {@inheritDoc}
148
         *
149
         * @see jp.co.future.uroborosql.dialect.Dialect#addOptimizerHints(java.lang.StringBuilder, java.util.List)
150
         */
151
        @Override
152
        public StringBuilder addOptimizerHints(final StringBuilder sql, final List<String> hints) {
153
                var hintStr = "$1 /*+ " + hints.stream().collect(Collectors.joining(" ")) + " */";
1✔
154
                return new StringBuilder(sql.toString().replaceFirst("(SELECT( /\\*.+\\*/)*)", hintStr));
1✔
155
        }
156

157
        /**
158
         * {@inheritDoc}
159
         *
160
         * @see jp.co.future.uroborosql.dialect.Dialect#getPessimisticLockingErrorCodes()
161
         */
162
        @Override
163
        public Set<String> getPessimisticLockingErrorCodes() {
164
                return pessimisticLockingErrorCodes;
1✔
165
        }
166
}
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