View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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   * Adapter for {@code PreparedStatement}.
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 }