~ubuntu-branches/ubuntu/lucid/psqlodbc/lucid

« back to all changes in this revision

Viewing changes to info30.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2004-05-13 10:47:36 UTC
  • Revision ID: james.westby@ubuntu.com-20040513104736-a530gmn0p3knep89
Tags: upstream-07.03.0200
ImportĀ upstreamĀ versionĀ 07.03.0200

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*-------
 
2
 * Module:                      info30.c
 
3
 *
 
4
 * Description:         This module contains routines related to ODBC 3.0
 
5
 *                      SQLGetInfo().
 
6
 *
 
7
 */
 
8
 
 
9
#include "psqlodbc.h"
 
10
 
 
11
#if (ODBCVER >= 0x0300)
 
12
#include "connection.h"
 
13
#include "pgapifunc.h"
 
14
 
 
15
RETCODE         SQL_API
 
16
PGAPI_GetInfo30(HDBC hdbc, UWORD fInfoType, PTR rgbInfoValue,
 
17
                                SWORD cbInfoValueMax, SWORD FAR * pcbInfoValue)
 
18
{
 
19
        CSTR func = "PGAPI_GetInfo30";
 
20
        ConnectionClass *conn = (ConnectionClass *) hdbc;
 
21
        ConnInfo        *ci = &(conn->connInfo);
 
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; /* others aren't allowed in ODBC spec */
 
41
                        break;
 
42
                case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:
 
43
                        len = 4;
 
44
                        value = SQL_CA2_READ_ONLY_CONCURRENCY;
 
45
                        break;
 
46
                case SQL_KEYSET_CURSOR_ATTRIBUTES1:
 
47
                        len = 4;
 
48
                        value = SQL_CA1_NEXT | SQL_CA1_ABSOLUTE
 
49
                                | SQL_CA1_RELATIVE | SQL_CA1_BOOKMARK
 
50
                                | SQL_CA1_LOCK_NO_CHANGE | SQL_CA1_POS_POSITION
 
51
                                | SQL_CA1_POS_REFRESH;
 
52
                        if (ci->updatable_cursors || ci->drivers.lie)
 
53
                                value |= (SQL_CA1_POS_UPDATE | SQL_CA1_POS_DELETE
 
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
                        if (ci->drivers.lie)
 
60
                                value |= (SQL_CA1_LOCK_EXCLUSIVE
 
61
                                | SQL_CA1_LOCK_UNLOCK
 
62
                                | SQL_CA1_POSITIONED_UPDATE
 
63
                                | SQL_CA1_POSITIONED_DELETE
 
64
                                | SQL_CA1_SELECT_FOR_UPDATE
 
65
                                );
 
66
                        break;
 
67
                case SQL_KEYSET_CURSOR_ATTRIBUTES2:
 
68
                        len = 4;
 
69
                        value = SQL_CA2_READ_ONLY_CONCURRENCY;
 
70
                        if (ci->updatable_cursors || ci->drivers.lie)
 
71
                                value |= (SQL_CA2_OPT_ROWVER_CONCURRENCY
 
72
                                /*| SQL_CA2_CRC_APPROXIMATE*/
 
73
                                | SQL_CA2_CRC_EXACT
 
74
                                | SQL_CA2_SENSITIVITY_DELETIONS
 
75
                                | SQL_CA2_SENSITIVITY_UPDATES
 
76
                                | SQL_CA2_SENSITIVITY_ADDITIONS
 
77
                                );
 
78
                        if (ci->drivers.lie)
 
79
                                value |= (SQL_CA2_LOCK_CONCURRENCY
 
80
                                | SQL_CA2_OPT_VALUES_CONCURRENCY
 
81
                                | SQL_CA2_MAX_ROWS_SELECT
 
82
                                | SQL_CA2_MAX_ROWS_INSERT
 
83
                                | SQL_CA2_MAX_ROWS_DELETE
 
84
                                | SQL_CA2_MAX_ROWS_UPDATE
 
85
                                | SQL_CA2_MAX_ROWS_CATALOG
 
86
                                | SQL_CA2_MAX_ROWS_AFFECTS_ALL
 
87
                                | SQL_CA2_SIMULATE_NON_UNIQUE
 
88
                                | SQL_CA2_SIMULATE_TRY_UNIQUE
 
89
                                | SQL_CA2_SIMULATE_UNIQUE
 
90
                                );
 
91
                        break;
 
92
 
 
93
                case SQL_STATIC_CURSOR_ATTRIBUTES1:
 
94
                        len = 4;
 
95
                        value = SQL_CA1_NEXT | SQL_CA1_ABSOLUTE
 
96
                                | SQL_CA1_RELATIVE | SQL_CA1_BOOKMARK
 
97
                                | SQL_CA1_LOCK_NO_CHANGE | SQL_CA1_POS_POSITION
 
98
                                | SQL_CA1_POS_REFRESH;
 
99
                        if (ci->updatable_cursors)
 
100
                                value |= (SQL_CA1_POS_UPDATE | SQL_CA1_POS_DELETE
 
101
                                | SQL_CA1_BULK_ADD
 
102
                                | SQL_CA1_BULK_UPDATE_BY_BOOKMARK
 
103
                                | SQL_CA1_BULK_DELETE_BY_BOOKMARK
 
104
                                | SQL_CA1_BULK_FETCH_BY_BOOKMARK
 
105
                                );
 
106
                        break;
 
107
                case SQL_STATIC_CURSOR_ATTRIBUTES2:
 
108
                        len = 4;
 
109
                        value = SQL_CA2_READ_ONLY_CONCURRENCY;
 
110
                        if (ci->updatable_cursors)
 
111
                                value |= (SQL_CA2_OPT_ROWVER_CONCURRENCY
 
112
                                | SQL_CA2_CRC_EXACT
 
113
                                | SQL_CA2_SENSITIVITY_ADDITIONS
 
114
                                | SQL_CA2_SENSITIVITY_DELETIONS
 
115
                                | SQL_CA2_SENSITIVITY_UPDATES
 
116
                                );
 
117
                        break;
 
118
 
 
119
                case SQL_ODBC_INTERFACE_CONFORMANCE:
 
120
                        len = 4;
 
121
                        value = SQL_OIC_CORE;
 
122
                        if (ci->drivers.lie)
 
123
                                value = SQL_OIC_LEVEL2;
 
124
                        break;
 
125
                case SQL_ACTIVE_ENVIRONMENTS:
 
126
                        len = 2;
 
127
                        value = 0;
 
128
                        break;
 
129
                case SQL_AGGREGATE_FUNCTIONS:
 
130
                        len = 4;
 
131
                        value = SQL_AF_ALL;
 
132
                        break;
 
133
                case SQL_ALTER_DOMAIN:
 
134
                        len = 4;
 
135
                        value = 0;
 
136
                        break;
 
137
                case SQL_ASYNC_MODE:
 
138
                        len = 4;
 
139
                        value = SQL_AM_NONE;
 
140
                        break;
 
141
                case SQL_BATCH_ROW_COUNT:
 
142
                        len = 4;
 
143
                        value = SQL_BRC_EXPLICIT;
 
144
                        break;
 
145
                case SQL_BATCH_SUPPORT:
 
146
                        len = 4;
 
147
                        value = SQL_BS_SELECT_EXPLICIT | SQL_BS_ROW_COUNT_EXPLICIT;
 
148
                        break;
 
149
                case SQL_CATALOG_NAME:
 
150
                        len = 0;
 
151
                        if (PG_VERSION_LE(conn, 7.2))
 
152
                                p = "N";
 
153
                        else
 
154
                                p = "Y"; /* hopefully */
 
155
                        break;
 
156
                case SQL_COLLATION_SEQ:
 
157
                        len = 0;
 
158
                        p = "";
 
159
                        break;
 
160
                case SQL_CREATE_ASSERTION:
 
161
                        len = 4;
 
162
                        value = 0;
 
163
                        break;
 
164
                case SQL_CREATE_CHARACTER_SET:
 
165
                        len = 4;
 
166
                        value = 0;
 
167
                        break;
 
168
                case SQL_CREATE_COLLATION:
 
169
                        len = 4;
 
170
                        value = 0;
 
171
                        break;
 
172
                case SQL_CREATE_DOMAIN:
 
173
                        len = 4;
 
174
                        value = 0;
 
175
                        break;
 
176
                case SQL_CREATE_SCHEMA:
 
177
                        len = 4;
 
178
                        if (conn->schema_support)
 
179
                                value = SQL_CS_CREATE_SCHEMA | SQL_CS_AUTHORIZATION;
 
180
                        else
 
181
                                value = 0;
 
182
                        break;
 
183
                case SQL_CREATE_TABLE:
 
184
                        len = 4;
 
185
                        value = SQL_CT_CREATE_TABLE | SQL_CT_COLUMN_CONSTRAINT
 
186
                                | SQL_CT_COLUMN_DEFAULT;
 
187
                        if (PG_VERSION_GE(conn, 6.5)) 
 
188
                                value |= SQL_CT_GLOBAL_TEMPORARY; 
 
189
                        if (PG_VERSION_GE(conn, 7.0)) 
 
190
                                value |= SQL_CT_TABLE_CONSTRAINT
 
191
                                        | SQL_CT_CONSTRAINT_NAME_DEFINITION 
 
192
                                        | SQL_CT_CONSTRAINT_INITIALLY_DEFERRED
 
193
                                        | SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE
 
194
                                        | SQL_CT_CONSTRAINT_DEFERRABLE;
 
195
                        break;
 
196
                case SQL_CREATE_TRANSLATION:
 
197
                        len = 4;
 
198
                        value = 0;
 
199
                        break;
 
200
                case SQL_CREATE_VIEW:
 
201
                        len = 4;
 
202
                        value = SQL_CV_CREATE_VIEW;
 
203
                        break;
 
204
                case SQL_DDL_INDEX:
 
205
                        len = 4;
 
206
                        value = SQL_DI_CREATE_INDEX | SQL_DI_DROP_INDEX;
 
207
                        break;
 
208
                case SQL_DESCRIBE_PARAMETER:
 
209
                        len = 0;
 
210
                        p = "N";
 
211
                        break;
 
212
                case SQL_DROP_ASSERTION:
 
213
                        len = 4;
 
214
                        value = 0;
 
215
                        break;
 
216
                case SQL_DROP_CHARACTER_SET:
 
217
                        len = 4;
 
218
                        value = 0;
 
219
                        break;
 
220
                case SQL_DROP_COLLATION:
 
221
                        len = 4;
 
222
                        value = 0;
 
223
                        break;
 
224
                case SQL_DROP_DOMAIN:
 
225
                        len = 4;
 
226
                        value = 0;
 
227
                        break;
 
228
                case SQL_DROP_SCHEMA:
 
229
                        len = 4;
 
230
                        if (conn->schema_support)
 
231
                                value = SQL_DS_DROP_SCHEMA | SQL_DS_RESTRICT | SQL_DS_CASCADE;
 
232
                        else
 
233
                                value = 0;
 
234
                        break;
 
235
                case SQL_DROP_TABLE:
 
236
                        len = 4;
 
237
                        value = SQL_DT_DROP_TABLE;
 
238
                        if (PG_VERSION_GT(conn, 7.2)) /* hopefully */
 
239
                                value |= (SQL_DT_RESTRICT | SQL_DT_CASCADE);
 
240
                        break;
 
241
                case SQL_DROP_TRANSLATION:
 
242
                        len = 4;
 
243
                        value = 0;
 
244
                        break;
 
245
                case SQL_DROP_VIEW:
 
246
                        len = 4;
 
247
                        value = SQL_DV_DROP_VIEW;
 
248
                        if (PG_VERSION_GT(conn, 7.2)) /* hopefully */
 
249
                                value |= (SQL_DV_RESTRICT | SQL_DV_CASCADE);
 
250
                        break;
 
251
                case SQL_INDEX_KEYWORDS:
 
252
                        len = 4;
 
253
                        value = SQL_IK_NONE;
 
254
                case SQL_INFO_SCHEMA_VIEWS:
 
255
                        len = 4;
 
256
                        value = 0;
 
257
                        break;
 
258
                case SQL_INSERT_STATEMENT:
 
259
                        len = 4;
 
260
                        value = SQL_IS_INSERT_LITERALS | SQL_IS_INSERT_SEARCHED | SQL_IS_SELECT_INTO;
 
261
                        break;
 
262
                case SQL_MAX_IDENTIFIER_LEN:
 
263
                        len = 4;
 
264
                        value = 32;
 
265
                        break;
 
266
                case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
 
267
                        len = 0;
 
268
                        p = "Y";
 
269
                        break;
 
270
                case SQL_PARAM_ARRAY_ROW_COUNTS:
 
271
                        len = 4;
 
272
                        value = SQL_PARC_BATCH;
 
273
                        break;
 
274
                case SQL_PARAM_ARRAY_SELECTS:
 
275
                        len = 4;
 
276
                        value = SQL_PAS_BATCH;
 
277
                        break;
 
278
                case SQL_SQL_CONFORMANCE:
 
279
                        len = 4;
 
280
                        value = SQL_SC_SQL92_ENTRY;
 
281
                        break;
 
282
                case SQL_SQL92_DATETIME_FUNCTIONS:
 
283
                        len = 4;
 
284
                        value = SQL_SDF_CURRENT_DATE | SQL_SDF_CURRENT_TIME | SQL_SDF_CURRENT_TIMESTAMP;
 
285
                        break;
 
286
                case SQL_SQL92_FOREIGN_KEY_DELETE_RULE:
 
287
                        len = 4;
 
288
                        value = SQL_SFKD_CASCADE | SQL_SFKD_NO_ACTION | SQL_SFKD_SET_DEFAULT | SQL_SFKD_SET_NULL;
 
289
                        break;
 
290
                case SQL_SQL92_FOREIGN_KEY_UPDATE_RULE:
 
291
                        len = 4;
 
292
                        value = SQL_SFKU_CASCADE | SQL_SFKU_NO_ACTION | SQL_SFKU_SET_DEFAULT | SQL_SFKU_SET_NULL;
 
293
                        break;
 
294
                case SQL_SQL92_GRANT:
 
295
                        len = 4;
 
296
                        value = SQL_SG_DELETE_TABLE | SQL_SG_INSERT_TABLE | SQL_SG_REFERENCES_TABLE | SQL_SG_SELECT_TABLE | SQL_SG_UPDATE_TABLE;
 
297
                        break;
 
298
                case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS:
 
299
                        len = 4;
 
300
                        value = SQL_SNVF_BIT_LENGTH | SQL_SNVF_CHAR_LENGTH 
 
301
                                | SQL_SNVF_CHARACTER_LENGTH | SQL_SNVF_EXTRACT
 
302
                                | SQL_SNVF_OCTET_LENGTH | SQL_SNVF_POSITION;
 
303
                        break;
 
304
                case SQL_SQL92_PREDICATES:
 
305
                        len = 4;
 
306
                        value = SQL_SP_BETWEEN | SQL_SP_COMPARISON
 
307
                                | SQL_SP_EXISTS | SQL_SP_IN
 
308
                                | SQL_SP_ISNOTNULL | SQL_SP_ISNULL
 
309
                                | SQL_SP_LIKE | SQL_SP_OVERLAPS
 
310
                                | SQL_SP_QUANTIFIED_COMPARISON;
 
311
                        break;
 
312
                case SQL_SQL92_RELATIONAL_JOIN_OPERATORS:
 
313
                        len = 4;
 
314
                        if (PG_VERSION_GE(conn, 7.1))
 
315
                                value = SQL_SRJO_CROSS_JOIN | SQL_SRJO_EXCEPT_JOIN
 
316
                                        | SQL_SRJO_FULL_OUTER_JOIN | SQL_SRJO_INNER_JOIN
 
317
                                        | SQL_SRJO_INTERSECT_JOIN | SQL_SRJO_LEFT_OUTER_JOIN
 
318
                                        | SQL_SRJO_NATURAL_JOIN | SQL_SRJO_RIGHT_OUTER_JOIN
 
319
                                        | SQL_SRJO_UNION_JOIN; 
 
320
                        break;
 
321
                case SQL_SQL92_REVOKE:
 
322
                        len = 4;
 
323
                        value = SQL_SR_DELETE_TABLE | SQL_SR_INSERT_TABLE | SQL_SR_REFERENCES_TABLE | SQL_SR_SELECT_TABLE | SQL_SR_UPDATE_TABLE;
 
324
                        break;
 
325
                case SQL_SQL92_ROW_VALUE_CONSTRUCTOR:
 
326
                        len = 4;
 
327
                        value = SQL_SRVC_VALUE_EXPRESSION | SQL_SRVC_NULL;
 
328
                        break;
 
329
                case SQL_SQL92_STRING_FUNCTIONS:
 
330
                        len = 4;
 
331
                        value = SQL_SSF_CONVERT | SQL_SSF_LOWER
 
332
                                | SQL_SSF_UPPER | SQL_SSF_SUBSTRING
 
333
                                | SQL_SSF_TRANSLATE | SQL_SSF_TRIM_BOTH
 
334
                                | SQL_SSF_TRIM_LEADING | SQL_SSF_TRIM_TRAILING;
 
335
                        break;
 
336
                case SQL_SQL92_VALUE_EXPRESSIONS:
 
337
                        len = 4;
 
338
                        value = SQL_SVE_CASE | SQL_SVE_CAST | SQL_SVE_COALESCE | SQL_SVE_NULLIF;
 
339
                        break;
 
340
                /* The followings aren't implemented yet */
 
341
                case SQL_DATETIME_LITERALS:
 
342
                        len = 4;
 
343
                case SQL_DM_VER:
 
344
                        len = 0;
 
345
                case SQL_DRIVER_HDESC:
 
346
                        len = 4;
 
347
                case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
 
348
                        len = 4;
 
349
                case SQL_STANDARD_CLI_CONFORMANCE:
 
350
                        len = 4;
 
351
                case SQL_XOPEN_CLI_YEAR:
 
352
                        len = 0;
 
353
                default:
 
354
                        /* unrecognized key */
 
355
                        CC_set_error(conn, CONN_NOT_IMPLEMENTED_ERROR, "Unrecognized key passed to SQLGetInfo30.");
 
356
                        CC_log_error(func, "", conn);
 
357
                        return SQL_ERROR;
 
358
        }
 
359
        result = SQL_SUCCESS;
 
360
        mylog("%s: p='%s', len=%d, value=%d, cbMax=%d\n", func, p ? p : "<NULL>", len, value, cbInfoValueMax);
 
361
        if (p)
 
362
        {
 
363
                /* char/binary data */
 
364
                len = strlen(p);
 
365
 
 
366
                if (rgbInfoValue)
 
367
                {
 
368
#ifdef  UNICODE_SUPPORT
 
369
                        if (conn->unicode)
 
370
                        {
 
371
                                len = utf8_to_ucs2(p, len, (SQLWCHAR *) rgbInfoValue, cbInfoValueMax / 2);
 
372
                                len *= 2;
 
373
                        }
 
374
                        else
 
375
#endif /* UNICODE_SUPPORT */
 
376
                        strncpy_null((char *) rgbInfoValue, p, (size_t) cbInfoValueMax);
 
377
 
 
378
                        if (len >= cbInfoValueMax)
 
379
                        {
 
380
                                result = SQL_SUCCESS_WITH_INFO;
 
381
                                CC_set_error(conn, CONN_TRUNCATED, "The buffer was too small for tthe InfoValue.");
 
382
                        }
 
383
                }
 
384
        }
 
385
        else
 
386
        {
 
387
                /* numeric data */
 
388
                if (rgbInfoValue)
 
389
                {
 
390
                        if (len == 2)
 
391
                                *((WORD *) rgbInfoValue) = (WORD) value;
 
392
                        else if (len == 4)
 
393
                                *((DWORD *) rgbInfoValue) = (DWORD) value;
 
394
                }
 
395
        }
 
396
 
 
397
        if (pcbInfoValue)
 
398
                *pcbInfoValue = len;
 
399
        return result;
 
400
}
 
401
#endif /* ODBCVER >= 0x0300 */