Stmt.java revision 17c83b1a74c906c9a36257a3a99cd1e3730b002e
1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage SQLite;
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/**
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Class to represent compiled SQLite3 statement.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Note, that all native methods of this class are
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * not synchronized, i.e. it is up to the caller
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to ensure that only one thread is in these
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * methods at any one time.
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class Stmt {
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Internal handle for the SQLite3 statement.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    private long handle = 0;
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Internal last error code for prepare()/step() methods.
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    protected int error_code = 0;
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Prepare the next SQL statement for the Stmt instance.
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @return true when the next piece of the SQL statement sequence
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * has been prepared, false on end of statement sequence.
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public native boolean prepare() throws SQLite.Exception;
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Perform one step of compiled SQLite3 statement.
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * Example:<BR>
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * <PRE>
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *   ...
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *   try {
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     Stmt s = db.prepare("select * from x; select * from y;");
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     s.bind(...);
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     ...
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     s.bind(...);
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     while (s.step(cb)) {
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *       Object o = s.value(...);
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *       ...
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     }
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     // s.reset() for re-execution or
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     // s.prepare() for the next piece of SQL
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     while (s.prepare()) {
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *       s.bind(...);
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *       ...
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *       s.bind(...);
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *       while (s.step(cb)) {
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *         Object o = s.value(...);
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *         ...
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *       }
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     }
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *   } catch (SQLite.Exception e) {
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *     s.close();
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *   }
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * </PRE>
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     *
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * @return true when row data is available, false on end
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     * of result set.
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     */
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    public native boolean step() throws SQLite.Exception;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    /**
72     * Close the compiled SQLite3 statement.
73     */
74
75    public native void close() throws SQLite.Exception;
76
77    /**
78     * Reset the compiled SQLite3 statement without
79     * clearing parameter bindings.
80     */
81
82    public native void reset() throws SQLite.Exception;
83
84    /**
85     * Clear all bound parameters of the compiled SQLite3 statement.
86     */
87
88    public native void clear_bindings() throws SQLite.Exception;
89
90    /**
91     * Bind positional integer value to compiled SQLite3 statement.
92     * @param pos parameter index, 1-based
93     * @param value value of parameter
94     */
95
96    public native void bind(int pos, int value) throws SQLite.Exception;
97
98    /**
99     * Bind positional long value to compiled SQLite3 statement.
100     * @param pos parameter index, 1-based
101     * @param value value of parameter
102     */
103
104    public native void bind(int pos, long value) throws SQLite.Exception;
105
106    /**
107     * Bind positional double value to compiled SQLite3 statement.
108     * @param pos parameter index, 1-based
109     * @param value value of parameter
110     */
111
112    public native void bind(int pos, double value) throws SQLite.Exception;
113
114    /**
115     * Bind positional byte array to compiled SQLite3 statement.
116     * @param pos parameter index, 1-based
117     * @param value value of parameter, may be null
118     */
119
120    public native void bind(int pos, byte[] value) throws SQLite.Exception;
121
122    /**
123     * Bind positional String to compiled SQLite3 statement.
124     * @param pos parameter index, 1-based
125     * @param value value of parameter, may be null
126     */
127
128    public native void bind(int pos, String value) throws SQLite.Exception;
129
130    /**
131     * Bind positional SQL null to compiled SQLite3 statement.
132     * @param pos parameter index, 1-based
133     */
134
135    public native void bind(int pos) throws SQLite.Exception;
136
137    /**
138     * Bind positional zero'ed blob to compiled SQLite3 statement.
139     * @param pos parameter index, 1-based
140     * @param length byte size of zero blob
141     */
142
143    public native void bind_zeroblob(int pos, int length)
144	throws SQLite.Exception;
145
146    /**
147     * Return number of parameters in compiled SQLite3 statement.
148     * @return int number of parameters
149     */
150
151    public native int bind_parameter_count() throws SQLite.Exception;
152
153    /**
154     * Return name of parameter in compiled SQLite3 statement.
155     * @param pos parameter index, 1-based
156     * @return String parameter name
157     */
158
159    public native String bind_parameter_name(int pos) throws SQLite.Exception;
160
161    /**
162     * Return index of named parameter in compiled SQLite3 statement.
163     * @param name of parameter
164     * @return int index of parameter, 1-based
165     */
166
167    public native int bind_parameter_index(String name)
168	throws SQLite.Exception;
169
170
171    /**
172     * Retrieve integer column from exec'ed SQLite3 statement.
173     * @param col column number, 0-based
174     * @return int column value
175     */
176
177    public native int column_int(int col) throws SQLite.Exception;
178
179    /**
180     * Retrieve long column from exec'ed SQLite3 statement.
181     * @param col column number, 0-based
182     * @return long column value
183     */
184    public native long column_long(int col) throws SQLite.Exception;
185
186    /**
187     * Retrieve double column from exec'ed SQLite3 statement.
188     * @param col column number, 0-based
189     * @return double column value
190     */
191    public native double column_double(int col) throws SQLite.Exception;
192
193    /**
194     * Retrieve blob column from exec'ed SQLite3 statement.
195     * @param col column number, 0-based
196     * @return byte[] column value
197     */
198    public native byte[] column_bytes(int col) throws SQLite.Exception;
199
200    /**
201     * Retrieve string column from exec'ed SQLite3 statement.
202     * @param col column number, 0-based
203     * @return String column value
204     */
205    public native String column_string(int col) throws SQLite.Exception;
206
207    /**
208     * Retrieve column type from exec'ed SQLite3 statement.
209     * @param col column number, 0-based
210     * @return column type code, e.g. SQLite.Constants.SQLITE_INTEGER
211     */
212    public native int column_type(int col) throws SQLite.Exception;
213
214    /**
215     * Retrieve number of columns of exec'ed SQLite3 statement.
216     * @return int number of columns
217     */
218
219    public native int column_count() throws SQLite.Exception;
220
221    /**
222     * Retrieve column data as object from exec'ed SQLite3 statement.
223     * @param col column number, 0-based
224     * @return Object or null
225     */
226
227    public Object column(int col) throws SQLite.Exception {
228        switch (column_type(col)) {
229	case Constants.SQLITE_INTEGER:
230	    return Long.valueOf(column_long(col)); // android-changed: performance;
231	case Constants.SQLITE_FLOAT:
232	    return new Double(column_double(col));
233	case Constants.SQLITE_BLOB:
234	    return column_bytes(col);
235	case Constants.SQLITE3_TEXT:
236	    return column_string(col);
237	}
238	return null;
239    }
240
241    /**
242     * Return table name of column of SQLite3 statement.
243     * @param col column number, 0-based
244     * @return String or null
245     */
246
247    public native String column_table_name(int col) throws SQLite.Exception;
248
249    /**
250     * Return database name of column of SQLite3 statement.
251     * @param col column number, 0-based
252     * @return String or null
253     */
254
255    public native String column_database_name(int col) throws SQLite.Exception;
256
257    /**
258     * Return declared column type of SQLite3 statement.
259     * @param col column number, 0-based
260     * @return String or null
261     */
262
263    public native String column_decltype(int col) throws SQLite.Exception;
264
265    /**
266     * Return origin column name of column of SQLite3 statement.
267     * @param col column number, 0-based
268     * @return String or null
269     */
270
271    public native String column_origin_name(int col) throws SQLite.Exception;
272
273    /**
274     * Destructor for object.
275     */
276
277    protected native void finalize();
278
279    /**
280     * Internal native initializer.
281     */
282
283    private static native void internal_init();
284
285    static {
286	internal_init();
287    }
288}
289