Skip to content

Commit b6db89a

Browse files
author
Hiroshi Inoue
committed
Separate info30.c from info.c.
1 parent aedc8a9 commit b6db89a

File tree

1 file changed

+351
-0
lines changed

1 file changed

+351
-0
lines changed

src/interfaces/odbc/info30.c

Lines changed: 351 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,351 @@
1+
/*-------
2+
* Module: info30.c
3+
*
4+
* Description: This module contains routines related to ODBC 3.0
5+
* SQLGetInfo().
6+
*
7+
*/
8+
9+
#ifndef ODBCVER
10+
#define ODBCVER 0x0300
11+
#endif
12+
13+
#include "connection.h"
14+
#include "pgapifunc.h"
15+
16+
RETCODE SQL_API
17+
PGAPI_GetInfo30(HDBC hdbc, UWORD fInfoType, PTR rgbInfoValue,
18+
SWORD cbInfoValueMax, SWORD FAR * pcbInfoValue)
19+
{
20+
static char *func = "PGAPI_GetInfo30";
21+
ConnectionClass *conn = (ConnectionClass *) hdbc;
22+
char *p = NULL;
23+
int len = 0,
24+
value = 0;
25+
RETCODE result;
26+
27+
switch (fInfoType)
28+
{
29+
case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:
30+
len = 4;
31+
value = 0;
32+
break;
33+
case SQL_DYNAMIC_CURSOR_ATTRIBUTES2:
34+
len = 4;
35+
value = 0;
36+
break;
37+
38+
case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:
39+
len = 4;
40+
value = SQL_CA1_NEXT | SQL_CA1_ABSOLUTE |
41+
SQL_CA1_RELATIVE | SQL_CA1_BOOKMARK;
42+
break;
43+
case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:
44+
len = 4;
45+
value = 0;
46+
break;
47+
case SQL_KEYSET_CURSOR_ATTRIBUTES1:
48+
len = 4;
49+
value = SQL_CA1_NEXT | SQL_CA1_ABSOLUTE
50+
| SQL_CA1_RELATIVE | SQL_CA1_BOOKMARK
51+
| SQL_CA1_LOCK_NO_CHANGE | SQL_CA1_POS_POSITION
52+
| SQL_CA1_POS_UPDATE | SQL_CA1_POS_DELETE
53+
| SQL_CA1_POS_REFRESH
54+
/* | SQL_CA1_BULK_ADD
55+
| SQL_CA1_BULK_UPDATE_BY_BOOKMARK
56+
| SQL_CA1_BULK_DELETE_BY_BOOKMARK
57+
| SQL_CA1_BULK_FETCH_BY_BOOKMARK */
58+
;
59+
break;
60+
case SQL_KEYSET_CURSOR_ATTRIBUTES2:
61+
len = 4;
62+
value = SQL_CA2_OPT_ROWVER_CONCURRENCY |
63+
SQL_CA2_SENSITIVITY_ADDITIONS |
64+
SQL_CA2_SENSITIVITY_DELETIONS |
65+
SQL_CA2_SENSITIVITY_UPDATES;
66+
break;
67+
68+
case SQL_STATIC_CURSOR_ATTRIBUTES1:
69+
len = 4;
70+
value = SQL_CA1_NEXT | SQL_CA1_ABSOLUTE |
71+
SQL_CA1_RELATIVE | SQL_CA1_BOOKMARK |
72+
SQL_CA1_LOCK_NO_CHANGE | SQL_CA1_POS_POSITION |
73+
SQL_CA1_POS_UPDATE | SQL_CA1_POS_DELETE |
74+
SQL_CA1_POS_REFRESH;
75+
break;
76+
case SQL_STATIC_CURSOR_ATTRIBUTES2:
77+
len = 4;
78+
value = SQL_CA2_OPT_ROWVER_CONCURRENCY |
79+
SQL_CA2_SENSITIVITY_ADDITIONS |
80+
SQL_CA2_SENSITIVITY_DELETIONS |
81+
SQL_CA2_SENSITIVITY_UPDATES;
82+
break;
83+
84+
case SQL_ODBC_INTERFACE_CONFORMANCE:
85+
len = 4;
86+
value = SQL_OIC_CORE;
87+
break;
88+
case SQL_ACTIVE_ENVIRONMENTS:
89+
len = 2;
90+
value = 0;
91+
break;
92+
case SQL_AGGREGATE_FUNCTIONS:
93+
len = 4;
94+
value = SQL_AF_ALL;
95+
break;
96+
case SQL_ALTER_DOMAIN:
97+
len = 4;
98+
value = 0;
99+
break;
100+
case SQL_ASYNC_MODE:
101+
len = 4;
102+
value = SQL_AM_NONE;
103+
break;
104+
case SQL_BATCH_ROW_COUNT:
105+
len = 4;
106+
value = SQL_BRC_ROLLED_UP | SQL_BRC_EXPLICIT;
107+
break;
108+
case SQL_BATCH_SUPPORT:
109+
len = 4;
110+
value = SQL_BS_ROW_COUNT_EXPLICIT;
111+
break;
112+
case SQL_CATALOG_NAME:
113+
len = 0;
114+
if (PG_VERSION_LE(conn, 7.2))
115+
p = "N";
116+
else
117+
p = "Y"; /* hopefully */
118+
break;
119+
case SQL_COLLATION_SEQ:
120+
len = 0;
121+
p = "";
122+
break;
123+
case SQL_CREATE_ASSERTION:
124+
len = 4;
125+
value = 0;
126+
break;
127+
case SQL_CREATE_CHARACTER_SET:
128+
len = 4;
129+
value = 0;
130+
break;
131+
case SQL_CREATE_COLLATION:
132+
len = 4;
133+
value = 0;
134+
break;
135+
case SQL_CREATE_DOMAIN:
136+
len = 4;
137+
value = 0;
138+
break;
139+
case SQL_CREATE_SCHEMA:
140+
len = 4;
141+
if (PG_VERSION_LE(conn, 7.2))
142+
value = 0;
143+
else
144+
value = SQL_CS_CREATE_SCHEMA | SQL_CS_AUTHORIZATION; /* hopefully */
145+
break;
146+
case SQL_CREATE_TABLE:
147+
len = 4;
148+
value = SQL_CT_CREATE_TABLE | SQL_CT_TABLE_CONSTRAINT
149+
| SQL_CT_CONSTRAINT_NAME_DEFINITION
150+
| SQL_CT_LOCAL_TEMPORARY | SQL_CT_COLUMN_CONSTRAINT
151+
| SQL_CT_COLUMN_DEFAULT | SQL_CT_CONSTRAINT_INITIALLY_DEFERRED
152+
| SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE | SQL_CT_CONSTRAINT_DEFERRABLE;
153+
break;
154+
case SQL_CREATE_TRANSLATION:
155+
len = 4;
156+
value = 0;
157+
break;
158+
case SQL_CREATE_VIEW:
159+
len = 4;
160+
value = SQL_CV_CREATE_VIEW;
161+
break;
162+
case SQL_DDL_INDEX:
163+
len = 4;
164+
value = SQL_DI_CREATE_INDEX | SQL_DI_DROP_INDEX;
165+
break;
166+
case SQL_DESCRIBE_PARAMETER:
167+
len = 0;
168+
p = "N";
169+
break;
170+
case SQL_DROP_ASSERTION:
171+
len = 4;
172+
value = 0;
173+
break;
174+
case SQL_DROP_CHARACTER_SET:
175+
len = 4;
176+
value = 0;
177+
break;
178+
case SQL_DROP_COLLATION:
179+
len = 4;
180+
value = 0;
181+
break;
182+
case SQL_DROP_DOMAIN:
183+
len = 4;
184+
value = 0;
185+
break;
186+
case SQL_DROP_SCHEMA:
187+
len = 4;
188+
if (PG_VERSION_LE(conn, 7.2))
189+
value = 0;
190+
else
191+
value = SQL_DS_DROP_SCHEMA | SQL_DS_RESTRICT | SQL_DS_CASCADE; /* hopefully */
192+
break;
193+
case SQL_DROP_TABLE:
194+
len = 4;
195+
value = SQL_DT_DROP_TABLE;
196+
if (PG_VERSION_GT(conn, 7.2)) /* hopefully */
197+
value |= SQL_DT_RESTRICT | SQL_DT_CASCADE;
198+
break;
199+
case SQL_DROP_TRANSLATION:
200+
len = 4;
201+
value = 0;
202+
break;
203+
case SQL_DROP_VIEW:
204+
len = 4;
205+
value = SQL_DV_DROP_VIEW;
206+
if (PG_VERSION_GT(conn, 7.2)) /* hopefully */
207+
value |= SQL_DV_RESTRICT | SQL_DV_CASCADE;
208+
break;
209+
case SQL_INDEX_KEYWORDS:
210+
len = 4;
211+
value = SQL_IK_NONE;
212+
case SQL_INFO_SCHEMA_VIEWS:
213+
len = 4;
214+
value = 0;
215+
break;
216+
case SQL_INSERT_STATEMENT:
217+
len = 4;
218+
value = SQL_IS_INSERT_LITERALS | SQL_IS_INSERT_SEARCHED | SQL_IS_SELECT_INTO;
219+
break;
220+
case SQL_MAX_IDENTIFIER_LEN:
221+
len = 4;
222+
value = 32;
223+
break;
224+
case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
225+
len = 0;
226+
p = "Y";
227+
break;
228+
case SQL_PARAM_ARRAY_ROW_COUNTS:
229+
len = 4;
230+
value = SQL_PARC_NO_BATCH;
231+
break;
232+
case SQL_PARAM_ARRAY_SELECTS:
233+
len = 4;
234+
value = SQL_PAS_NO_SELECT;
235+
break;
236+
case SQL_SQL_CONFORMANCE:
237+
len = 4;
238+
value = SQL_SC_SQL92_ENTRY;
239+
break;
240+
case SQL_SQL92_DATETIME_FUNCTIONS:
241+
len = 4;
242+
value = SQL_SDF_CURRENT_DATE | SQL_SDF_CURRENT_TIME | SQL_SDF_CURRENT_TIMESTAMP;
243+
break;
244+
case SQL_SQL92_FOREIGN_KEY_DELETE_RULE:
245+
len = 4;
246+
value = SQL_SFKD_CASCADE | SQL_SFKD_NO_ACTION | SQL_SFKD_SET_DEFAULT | SQL_SFKD_SET_NULL;
247+
break;
248+
case SQL_SQL92_FOREIGN_KEY_UPDATE_RULE:
249+
len = 4;
250+
value = SQL_SFKU_CASCADE | SQL_SFKU_NO_ACTION | SQL_SFKU_SET_DEFAULT | SQL_SFKU_SET_NULL;
251+
break;
252+
case SQL_SQL92_GRANT:
253+
len = 4;
254+
value = SQL_SG_DELETE_TABLE | SQL_SG_INSERT_TABLE | SQL_SG_REFERENCES_TABLE | SQL_SG_SELECT_TABLE | SQL_SG_UPDATE_TABLE;
255+
break;
256+
case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS:
257+
len = 4;
258+
value = SQL_SNVF_BIT_LENGTH | SQL_SNVF_CHAR_LENGTH
259+
| SQL_SNVF_CHARACTER_LENGTH | SQL_SNVF_EXTRACT
260+
| SQL_SNVF_OCTET_LENGTH | SQL_SNVF_POSITION;
261+
break;
262+
case SQL_SQL92_PREDICATES:
263+
len = 4;
264+
value = SQL_SP_BETWEEN | SQL_SP_COMPARISON
265+
| SQL_SP_EXISTS | SQL_SP_IN
266+
| SQL_SP_ISNOTNULL | SQL_SP_ISNULL
267+
| SQL_SP_LIKE | SQL_SP_OVERLAPS
268+
| SQL_SP_QUANTIFIED_COMPARISON;
269+
break;
270+
case SQL_SQL92_RELATIONAL_JOIN_OPERATORS:
271+
len = 4;
272+
if (PG_VERSION_GE(conn, 7.1))
273+
value = SQL_SRJO_CROSS_JOIN | SQL_SRJO_EXCEPT_JOIN
274+
| SQL_SRJO_FULL_OUTER_JOIN | SQL_SRJO_INNER_JOIN
275+
| SQL_SRJO_INTERSECT_JOIN | SQL_SRJO_LEFT_OUTER_JOIN
276+
| SQL_SRJO_NATURAL_JOIN | SQL_SRJO_RIGHT_OUTER_JOIN
277+
| SQL_SRJO_UNION_JOIN;
278+
break;
279+
case SQL_SQL92_REVOKE:
280+
len = 4;
281+
value = SQL_SR_DELETE_TABLE | SQL_SR_INSERT_TABLE | SQL_SR_REFERENCES_TABLE | SQL_SR_SELECT_TABLE | SQL_SR_UPDATE_TABLE;
282+
break;
283+
case SQL_SQL92_ROW_VALUE_CONSTRUCTOR:
284+
len = 4;
285+
value = SQL_SRVC_VALUE_EXPRESSION | SQL_SRVC_NULL;
286+
break;
287+
case SQL_SQL92_STRING_FUNCTIONS:
288+
len = 4;
289+
value = SQL_SSF_CONVERT | SQL_SSF_LOWER
290+
| SQL_SSF_UPPER | SQL_SSF_SUBSTRING
291+
| SQL_SSF_TRANSLATE | SQL_SSF_TRIM_BOTH
292+
| SQL_SSF_TRIM_LEADING | SQL_SSF_TRIM_TRAILING;
293+
break;
294+
case SQL_SQL92_VALUE_EXPRESSIONS:
295+
len = 4;
296+
value = SQL_SVE_CASE | SQL_SVE_CAST | SQL_SVE_COALESCE | SQL_SVE_NULLIF;
297+
break;
298+
/* The followings aren't implemented yet */
299+
case SQL_DATETIME_LITERALS:
300+
len = 4;
301+
case SQL_DM_VER:
302+
len = 0;
303+
case SQL_DRIVER_HDESC:
304+
len = 4;
305+
case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
306+
len = 4;
307+
case SQL_STANDARD_CLI_CONFORMANCE:
308+
len = 4;
309+
case SQL_XOPEN_CLI_YEAR:
310+
len = 0;
311+
default:
312+
/* unrecognized key */
313+
conn->errormsg = "Unrecognized key passed to SQLGetInfo30.";
314+
conn->errornumber = CONN_NOT_IMPLEMENTED_ERROR;
315+
CC_log_error(func, "", conn);
316+
return SQL_ERROR;
317+
}
318+
result = SQL_SUCCESS;
319+
if (p)
320+
{
321+
/* char/binary data */
322+
len = strlen(p);
323+
324+
if (rgbInfoValue)
325+
{
326+
strncpy_null((char *) rgbInfoValue, p, (size_t) cbInfoValueMax);
327+
328+
if (len >= cbInfoValueMax)
329+
{
330+
result = SQL_SUCCESS_WITH_INFO;
331+
conn->errornumber = CONN_TRUNCATED;
332+
conn->errormsg = "The buffer was too small for tthe InfoValue.";
333+
}
334+
}
335+
}
336+
else
337+
{
338+
/* numeric data */
339+
if (rgbInfoValue)
340+
{
341+
if (len == 2)
342+
*((WORD *) rgbInfoValue) = (WORD) value;
343+
else if (len == 4)
344+
*((DWORD *) rgbInfoValue) = (DWORD) value;
345+
}
346+
}
347+
348+
if (pcbInfoValue)
349+
*pcbInfoValue = len;
350+
return result;
351+
}

0 commit comments

Comments
 (0)