1 /*
2 * Copyright (c) 2012-2023, jcabi.com
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met: 1) Redistributions of source code must retain the above
8 * copyright notice, this list of conditions and the following
9 * disclaimer. 2) Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution. 3) Neither the name of the jcabi.com nor
13 * the names of its contributors may be used to endorse or promote
14 * products derived from this software without specific prior written
15 * permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
19 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28 * OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 package com.jcabi.jdbc;
31
32 import java.sql.CallableStatement;
33 import java.sql.ResultSet;
34 import java.sql.SQLException;
35 import java.sql.Statement;
36 import lombok.EqualsAndHashCode;
37 import lombok.ToString;
38
39 /**
40 * Outcome of a stored procedure with OUT parameters.
41 * @since 0.17
42 * @param <T> Type of the returned result, which <b>has to be</b> Object[]
43 */
44 @ToString
45 @EqualsAndHashCode
46 public final class StoredProcedureOutcome<T> implements Outcome<T> {
47
48 /**
49 * OUT parameters' indexes.
50 */
51 private final transient int[] indexes;
52
53 /**
54 * Ctor.
55 * @param indexes Indexes of the OUT params.
56 * <b>Index count starts from 1</b>.
57 */
58 @SuppressWarnings("PMD.ConstructorOnlyInitializesOrCallOtherConstructors")
59 public StoredProcedureOutcome(final int... indexes) {
60 if (indexes.length == 0) {
61 throw new IllegalArgumentException(
62 "At least one OUT param's index needs to be specified"
63 );
64 }
65 final int size = indexes.length;
66 this.indexes = new int[size];
67 for (int idx = 0; idx < size; ++idx) {
68 this.indexes[idx] = indexes[idx];
69 }
70 }
71
72 @Override
73 @SuppressWarnings("unchecked")
74 public T handle(final ResultSet rset, final Statement stmt)
75 throws SQLException {
76 final int params = this.indexes.length;
77 final Object[] outs = new Object[params];
78 if (stmt instanceof CallableStatement) {
79 for (int idx = 0; idx < params; ++idx) {
80 outs[idx] = ((CallableStatement) stmt).getObject(
81 this.indexes[idx]
82 );
83 }
84 }
85 return (T) outs;
86 }
87
88 }