1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
/*
* Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
*/
#include "h2odbc.h"
SQLRETURN SQL_API SQLSetStmtAttr(SQLHSTMT StatementHandle,
SQLINTEGER Attribute, SQLPOINTER Value,
SQLINTEGER StringLength) {
trace("SQLSetStmtAttr");
Statement* stat=Statement::cast(StatementHandle);
if(stat==0) {
return SQL_INVALID_HANDLE;
}
stat->setError(0);
switch(Attribute) {
case SQL_ATTR_APP_PARAM_DESC:
trace(" SQL_ATTR_APP_ROW_DESC TODO");
// todo
return SQL_ERROR;
case SQL_ATTR_APP_ROW_DESC:
trace(" SQL_ATTR_APP_ROW_DESC TODO");
// todo
return SQL_ERROR;
case SQL_ATTR_ASYNC_ENABLE:
trace(" SQL_ATTR_ASYNC_ENABLE TODO not supported");
// TODO should support that!
if((SQLUINTEGER)Value != SQL_ASYNC_ENABLE_OFF) {
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
}
break;
case SQL_ATTR_CONCURRENCY: {
trace(" SQL_ATTR_CONCURRENCY");
// option value can be changed
SQLUINTEGER type = (SQLUINTEGER)Value;
switch(type) {
case SQL_CONCUR_READ_ONLY:
trace(" SQL_CONCUR_READ_ONLY");
break;
case SQL_CONCUR_LOCK:
trace(" SQL_CONCUR_LOCK");
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
break;
case SQL_CONCUR_ROWVER:
trace(" SQL_CONCUR_ROWVER");
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
break;
case SQL_CONCUR_VALUES:
trace(" SQL_CONCUR_ROWVER");
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
break;
default:
trace(" =? %d TODO", type);
return SQL_ERROR;
}
break;
}
case SQL_ATTR_CURSOR_SCROLLABLE:
trace(" SQL_ATTR_CURSOR_SCROLLABLE TODO");
break;
case SQL_ATTR_CURSOR_SENSITIVITY: {
trace(" SQL_ATTR_CURSOR_SENSITIVITY TODO");
// it seems this must be supported!
SQLUINTEGER type = (SQLUINTEGER)Value;
switch(type) {
case SQL_UNSPECIFIED:
trace(" SQL_UNSPECIFIED");
break;
case SQL_INSENSITIVE:
trace(" SQL_INSENSITIVE");
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
break;
case SQL_SENSITIVE:
trace(" SQL_SENSITIVE");
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
break;
default:
trace(" =? %d TODO", type);
return SQL_ERROR;
}
break;
}
case SQL_ATTR_CURSOR_TYPE: {
trace(" SQL_ATTR_CURSOR_TYPE");
// option value can be changed
SQLUINTEGER type = (SQLUINTEGER)Value;
switch(type) {
case SQL_CURSOR_FORWARD_ONLY:
trace(" SQL_CURSOR_FORWARD_ONLY");
break;
case SQL_CURSOR_STATIC:
trace(" SQL_CURSOR_STATIC");
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
break;
case SQL_CURSOR_KEYSET_DRIVEN:
trace(" SQL_CURSOR_KEYSET_DRIVEN");
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
break;
case SQL_CURSOR_DYNAMIC:
trace(" SQL_CURSOR_DYNAMIC");
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
break;
default:
trace(" =? %d TODO", type);
return SQL_ERROR;
}
break;
}
case SQL_ATTR_IMP_PARAM_DESC:
trace(" SQL_ATTR_IMP_PARAM_DESC TODO");
return SQL_ERROR;
case SQL_ATTR_ROW_NUMBER:
trace(" SQL_ATTR_ROW_NUMBER TODO");
return SQL_ERROR;
case SQL_ATTR_IMP_ROW_DESC:
trace(" SQL_ATTR_IMP_ROW_DESC TODO");
return SQL_ERROR;
case SQL_ATTR_QUERY_TIMEOUT:
trace(" SQL_ATTR_QUERY_TIMEOUT");
// option value can be changed
if((SQLUINTEGER)Value != 0) {
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
}
break;
case SQL_ATTR_ENABLE_AUTO_IPD:
trace(" SQL_ATTR_ENABLE_AUTO_IPD TODO");
break;
case SQL_ATTR_FETCH_BOOKMARK_PTR:
trace(" SQL_ATTR_FETCH_BOOKMARK_PTR TODO");
break;
case SQL_ATTR_KEYSET_SIZE:
trace(" SQL_ATTR_KEYSET_SIZE");
// option value can be changed
if((SQLUINTEGER)Value != 0) {
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
}
break;
case SQL_ATTR_MAX_LENGTH:
trace(" SQL_ATTR_MAX_LENGTH %d", Value);
// option value can be changed
if((SQLUINTEGER)Value != 0) {
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
}
break;
case SQL_ATTR_MAX_ROWS:
trace(" SQL_ATTR_MAX_ROWS");
// option value can be changed
if((SQLUINTEGER)Value != 0) {
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
}
break;
case SQL_ATTR_METADATA_ID:
trace(" SQL_ATTR_METADATA_ID TODO");
break;
case SQL_ATTR_NOSCAN:
trace(" SQL_ATTR_NOSCAN TODO");
break;
case SQL_ATTR_PARAM_BIND_OFFSET_PTR:
trace(" SQL_ATTR_PARAM_BIND_OFFSET_PTR TODO");
break;
case SQL_ATTR_PARAM_BIND_TYPE:
trace(" SQL_ATTR_PARAM_BIND_TYPE TODO");
break;
case SQL_ATTR_PARAM_OPERATION_PTR:
trace(" SQL_ATTR_PARAM_OPERATION_PTR TODO");
break;
case SQL_ATTR_PARAM_STATUS_PTR:
trace(" SQL_ATTR_PARAM_STATUS_PTR TODO");
break;
case SQL_ATTR_PARAMS_PROCESSED_PTR:
trace(" SQL_ATTR_PARAMS_PROCESSED_PTR TODO");
break;
case SQL_ATTR_PARAMSET_SIZE:
trace(" SQL_ATTR_PARAMSET_SIZE TODO");
// TODO it seems all drivers must support arrays, but the MySQL driver doesn't support it
if((SQLUINTEGER)Value != 1) {
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
}
break;
case SQL_ATTR_RETRIEVE_DATA:
trace(" SQL_ATTR_RETRIEVE_DATA TODO");
break;
case SQL_ATTR_ROW_ARRAY_SIZE:
trace(" SQL_ATTR_ROW_ARRAY_SIZE");
// option value can be changed
if((SQLUINTEGER)Value != 1) {
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
}
break;
case SQL_ATTR_ROW_BIND_OFFSET_PTR:
trace(" SQL_ATTR_ROW_BIND_OFFSET_PTR TODO");
break;
case SQL_ATTR_ROW_BIND_TYPE:
trace(" SQL_ATTR_ROW_BIND_TYPE TODO");
if(Value == SQL_BIND_BY_COLUMN) {
// column wise binding
// SQL_BIND_BY_COLUMN = 0UL
trace(" SQL_BIND_BY_COLUMN TODO");
stat->getAppRowDesc()->setBindingType(false, 0);
} else {
// row wise binding
trace(" row wise binding size=%d", Value);
stat->getAppRowDesc()->setBindingType(true, (int)Value);
}
break;
case SQL_ATTR_ROW_OPERATION_PTR:
trace(" SQL_ATTR_ROW_OPERATION_PTR TODO");
break;
case SQL_ATTR_ROW_STATUS_PTR:
trace(" SQL_ATTR_ROW_STATUS_PTR");
stat->getAppRowDesc()->setStatusPointer((SQLUSMALLINT*)Value);
break;
case SQL_ATTR_ROWS_FETCHED_PTR:
trace(" SQL_ATTR_ROWS_FETCHED_PTR");
stat->getImpRowDesc()->setRowsProcessedPointer((SQLUINTEGER*)Value);
break;
case SQL_ATTR_SIMULATE_CURSOR: {
trace(" SQL_ATTR_SIMULATE_CURSOR");
// option value can be changed
if((SQLUINTEGER)Value != SQL_SC_NON_UNIQUE) {
stat->setError(E_01S02);
return SQL_SUCCESS_WITH_INFO;
}
break;
}
case SQL_ATTR_USE_BOOKMARKS: {
trace(" SQL_ATTR_USE_BOOKMARKS");
switch((int)Value) {
case SQL_UB_OFF:
trace(" SQL_UB_OFF");
stat->setUseBookmarks(false);
break;
case SQL_UB_FIXED:
trace(" SQL_UB_FIXED TODO");
break;
case SQL_UB_VARIABLE:
trace(" SQL_UB_VARIABLE");
stat->setUseBookmarks(true);
break;
default:
trace(" ? %d TODO", Value);
}
break;
}
default:
trace(" ? %d TODO",Attribute);
break;
}
return SQL_SUCCESS;
}