1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.driver.jdbc.adapter;
19
20 import com.google.common.io.CharStreams;
21 import lombok.Getter;
22 import org.apache.shardingsphere.driver.jdbc.unsupported.AbstractUnsupportedOperationPreparedStatement;
23 import org.apache.shardingsphere.infra.exception.generic.UnknownSQLException;
24
25 import java.io.IOException;
26 import java.io.InputStream;
27 import java.io.Reader;
28 import java.math.BigDecimal;
29 import java.net.URL;
30 import java.sql.Array;
31 import java.sql.Blob;
32 import java.sql.Clob;
33 import java.sql.Date;
34 import java.sql.PreparedStatement;
35 import java.sql.SQLException;
36 import java.sql.SQLXML;
37 import java.sql.Time;
38 import java.sql.Timestamp;
39 import java.util.ArrayList;
40 import java.util.Calendar;
41 import java.util.LinkedList;
42 import java.util.List;
43
44
45
46
47 public abstract class AbstractPreparedStatementAdapter extends AbstractUnsupportedOperationPreparedStatement {
48
49 private final List<PreparedStatementInvocationReplayer> setParameterMethodInvocations = new LinkedList<>();
50
51 @Getter
52 private final List<Object> parameters = new ArrayList<>();
53
54 @Override
55 public final void setNull(final int parameterIndex, final int sqlType) {
56 setParameter(parameterIndex, null);
57 }
58
59 @Override
60 public final void setNull(final int parameterIndex, final int sqlType, final String typeName) {
61 setParameter(parameterIndex, null);
62 }
63
64 @Override
65 public final void setBoolean(final int parameterIndex, final boolean x) {
66 setParameter(parameterIndex, x);
67 }
68
69 @Override
70 public final void setByte(final int parameterIndex, final byte x) {
71 setParameter(parameterIndex, x);
72 }
73
74 @Override
75 public final void setShort(final int parameterIndex, final short x) {
76 setParameter(parameterIndex, x);
77 }
78
79 @Override
80 public final void setInt(final int parameterIndex, final int x) {
81 setParameter(parameterIndex, x);
82 }
83
84 @Override
85 public final void setLong(final int parameterIndex, final long x) {
86 setParameter(parameterIndex, x);
87 }
88
89 @Override
90 public final void setFloat(final int parameterIndex, final float x) {
91 setParameter(parameterIndex, x);
92 }
93
94 @Override
95 public final void setDouble(final int parameterIndex, final double x) {
96 setParameter(parameterIndex, x);
97 }
98
99 @Override
100 public final void setString(final int parameterIndex, final String x) {
101 setParameter(parameterIndex, x);
102 }
103
104 @Override
105 public final void setBigDecimal(final int parameterIndex, final BigDecimal x) {
106 setParameter(parameterIndex, x);
107 }
108
109 @Override
110 public final void setDate(final int parameterIndex, final Date x) {
111 setParameter(parameterIndex, x);
112 }
113
114 @Override
115 public final void setDate(final int parameterIndex, final Date x, final Calendar cal) {
116 setParameter(parameterIndex, x);
117 }
118
119 @Override
120 public final void setTime(final int parameterIndex, final Time x) {
121 setParameter(parameterIndex, x);
122 }
123
124 @Override
125 public final void setTime(final int parameterIndex, final Time x, final Calendar cal) {
126 setParameter(parameterIndex, x);
127 }
128
129 @Override
130 public final void setTimestamp(final int parameterIndex, final Timestamp x) {
131 setParameter(parameterIndex, x);
132 }
133
134 @Override
135 public final void setTimestamp(final int parameterIndex, final Timestamp x, final Calendar cal) {
136 setParameter(parameterIndex, x);
137 }
138
139 @Override
140 public final void setBytes(final int parameterIndex, final byte[] x) {
141 setParameter(parameterIndex, x);
142 }
143
144 @Override
145 public final void setBlob(final int parameterIndex, final Blob x) {
146 setParameter(parameterIndex, x);
147 }
148
149 @Override
150 public final void setBlob(final int parameterIndex, final InputStream x) {
151 setParameter(parameterIndex, x);
152 }
153
154 @Override
155 public final void setBlob(final int parameterIndex, final InputStream x, final long length) {
156 setParameter(parameterIndex, x);
157 }
158
159 @Override
160 public final void setClob(final int parameterIndex, final Clob x) {
161 setParameter(parameterIndex, x);
162 }
163
164 @Override
165 public final void setClob(final int parameterIndex, final Reader x) {
166 setParameter(parameterIndex, x);
167 }
168
169 @Override
170 public final void setClob(final int parameterIndex, final Reader x, final long length) {
171 setParameter(parameterIndex, x);
172 }
173
174 @Override
175 public void setArray(final int parameterIndex, final Array x) {
176 setParameter(parameterIndex, x);
177 }
178
179 @Override
180 public final void setAsciiStream(final int parameterIndex, final InputStream x) {
181 setParameter(parameterIndex, x);
182 }
183
184 @Override
185 public final void setAsciiStream(final int parameterIndex, final InputStream x, final int length) {
186 setParameter(parameterIndex, x);
187 }
188
189 @Override
190 public final void setAsciiStream(final int parameterIndex, final InputStream x, final long length) {
191 setParameter(parameterIndex, x);
192 }
193
194 @Override
195 public final void setUnicodeStream(final int parameterIndex, final InputStream x, final int length) {
196 setParameter(parameterIndex, x);
197 }
198
199 @Override
200 public final void setBinaryStream(final int parameterIndex, final InputStream x) {
201 setParameter(parameterIndex, x);
202 }
203
204 @Override
205 public final void setBinaryStream(final int parameterIndex, final InputStream x, final int length) {
206 setParameter(parameterIndex, x);
207 }
208
209 @Override
210 public final void setBinaryStream(final int parameterIndex, final InputStream x, final long length) {
211 setParameter(parameterIndex, x);
212 }
213
214 @Override
215 public final void setCharacterStream(final int parameterIndex, final Reader x) {
216 try {
217 setParameter(parameterIndex, CharStreams.toString(x));
218 } catch (final IOException ex) {
219 throw new UnknownSQLException(ex);
220 }
221 }
222
223 @Override
224 public final void setCharacterStream(final int parameterIndex, final Reader x, final int length) {
225 try {
226 setParameter(parameterIndex, CharStreams.toString(x));
227 } catch (final IOException ex) {
228 throw new UnknownSQLException(ex);
229 }
230 }
231
232 @Override
233 public final void setCharacterStream(final int parameterIndex, final Reader x, final long length) {
234 try {
235 setParameter(parameterIndex, CharStreams.toString(x));
236 } catch (final IOException ex) {
237 throw new UnknownSQLException(ex);
238 }
239 }
240
241 @Override
242 public final void setURL(final int parameterIndex, final URL x) {
243 setParameter(parameterIndex, x);
244 }
245
246 @Override
247 public final void setSQLXML(final int parameterIndex, final SQLXML x) {
248 setParameter(parameterIndex, x);
249 }
250
251 @Override
252 public final void setObject(final int parameterIndex, final Object x) {
253 setParameter(parameterIndex, x);
254 }
255
256 @Override
257 public final void setObject(final int parameterIndex, final Object x, final int targetSqlType) {
258 setParameter(parameterIndex, x);
259 }
260
261 @Override
262 public final void setObject(final int parameterIndex, final Object x, final int targetSqlType, final int scaleOrLength) {
263 setParameter(parameterIndex, x);
264 }
265
266 private void setParameter(final int parameterIndex, final Object value) {
267 if (parameters.size() == parameterIndex - 1) {
268 parameters.add(value);
269 return;
270 }
271 for (int i = parameters.size(); i <= parameterIndex - 1; i++) {
272 parameters.add(null);
273 }
274 parameters.set(parameterIndex - 1, value);
275 }
276
277 protected final void replaySetParameter(final PreparedStatement preparedStatement, final List<Object> params) throws SQLException {
278 setParameterMethodInvocations.clear();
279 addParameters(params);
280 for (PreparedStatementInvocationReplayer each : setParameterMethodInvocations) {
281 each.replayOn(preparedStatement);
282 }
283 }
284
285 private void addParameters(final List<Object> params) {
286 int i = 0;
287 for (Object each : params) {
288 int index = ++i;
289 setParameterMethodInvocations.add(preparedStatement -> preparedStatement.setObject(index, each));
290 }
291 }
292
293 @Override
294 public final void clearParameters() {
295 parameters.clear();
296 setParameterMethodInvocations.clear();
297 }
298
299 @FunctionalInterface
300 private interface PreparedStatementInvocationReplayer {
301
302 void replayOn(PreparedStatement preparedStatement) throws SQLException;
303 }
304 }