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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy