1 | /* |
2 | * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, |
3 | * and the EPL 1.0 (http://h2database.com/html/license.html). |
4 | * Initial Developer: H2 Group |
5 | */ |
6 | package org.h2.expression; |
7 | |
8 | import java.io.IOException; |
9 | import java.sql.ResultSetMetaData; |
10 | |
11 | import org.h2.api.ErrorCode; |
12 | import org.h2.message.DbException; |
13 | import org.h2.value.Transfer; |
14 | import org.h2.value.Value; |
15 | |
16 | /** |
17 | * A client side (remote) parameter. |
18 | */ |
19 | public class ParameterRemote implements ParameterInterface { |
20 | |
21 | private Value value; |
22 | private final int index; |
23 | private int dataType = Value.UNKNOWN; |
24 | private long precision; |
25 | private int scale; |
26 | private int nullable = ResultSetMetaData.columnNullableUnknown; |
27 | |
28 | public ParameterRemote(int index) { |
29 | this.index = index; |
30 | } |
31 | |
32 | @Override |
33 | public void setValue(Value newValue, boolean closeOld) { |
34 | if (closeOld && value != null) { |
35 | value.close(); |
36 | } |
37 | value = newValue; |
38 | } |
39 | |
40 | @Override |
41 | public Value getParamValue() { |
42 | return value; |
43 | } |
44 | |
45 | @Override |
46 | public void checkSet() { |
47 | if (value == null) { |
48 | throw DbException.get(ErrorCode.PARAMETER_NOT_SET_1, "#" + (index + 1)); |
49 | } |
50 | } |
51 | |
52 | @Override |
53 | public boolean isValueSet() { |
54 | return value != null; |
55 | } |
56 | |
57 | @Override |
58 | public int getType() { |
59 | return value == null ? dataType : value.getType(); |
60 | } |
61 | |
62 | @Override |
63 | public long getPrecision() { |
64 | return value == null ? precision : value.getPrecision(); |
65 | } |
66 | |
67 | @Override |
68 | public int getScale() { |
69 | return value == null ? scale : value.getScale(); |
70 | } |
71 | |
72 | @Override |
73 | public int getNullable() { |
74 | return nullable; |
75 | } |
76 | |
77 | /** |
78 | * Write the parameter meta data from the transfer object. |
79 | * |
80 | * @param transfer the transfer object |
81 | */ |
82 | public void readMetaData(Transfer transfer) throws IOException { |
83 | dataType = transfer.readInt(); |
84 | precision = transfer.readLong(); |
85 | scale = transfer.readInt(); |
86 | nullable = transfer.readInt(); |
87 | } |
88 | |
89 | /** |
90 | * Write the parameter meta data to the transfer object. |
91 | * |
92 | * @param transfer the transfer object |
93 | * @param p the parameter |
94 | */ |
95 | public static void writeMetaData(Transfer transfer, ParameterInterface p) |
96 | throws IOException { |
97 | transfer.writeInt(p.getType()); |
98 | transfer.writeLong(p.getPrecision()); |
99 | transfer.writeInt(p.getScale()); |
100 | transfer.writeInt(p.getNullable()); |
101 | } |
102 | |
103 | } |