1 /*********************************************************************
2  *
3  * unixODBC Cursor Library
4  *
5  * Created by Nick Gorham
6  * (nick@lurcher.org).
7  *
8  * copyright (c) 1999 Nick Gorham
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23  *
24  **********************************************************************
25  *
26  * $Id: SQLGetInfo.c,v 1.2 2009/02/18 17:59:17 lurcher Exp $
27  *
28  * $Log: SQLGetInfo.c,v $
29  * Revision 1.2  2009/02/18 17:59:17  lurcher
30  * Shift to using config.h, the compile lines were making it hard to spot warnings
31  *
32  * Revision 1.1.1.1  2001/10/17 16:40:15  lurcher
33  *
34  * First upload to SourceForge
35  *
36  * Revision 1.1.1.1  2000/09/04 16:42:52  nick
37  * Imported Sources
38  *
39  * Revision 1.1  1999/09/19 22:22:50  ngorham
40  *
41  *
42  * Added first cursor library work, read only at the moment and only works
43  * with selects with no where clause
44  *
45  *
46  **********************************************************************/
47 
48 #include <config.h>
49 #include "cursorlibrary.h"
50 
CLGetInfo(SQLHDBC connection_handle,SQLUSMALLINT info_type,SQLPOINTER info_value,SQLSMALLINT buffer_length,SQLSMALLINT * string_length)51 SQLRETURN CLGetInfo( SQLHDBC connection_handle,
52            SQLUSMALLINT info_type,
53            SQLPOINTER info_value,
54            SQLSMALLINT buffer_length,
55            SQLSMALLINT *string_length )
56 {
57     CLHDBC cl_connection = (CLHDBC) connection_handle;
58     int do_it_here = 1;
59     SQLUINTEGER value;
60     SQLRETURN ret;
61     char *cval = NULL;
62 
63     switch( info_type )
64     {
65       case SQL_BOOKMARK_PERSISTENCE:
66         value = 0;
67         break;
68 
69       case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:
70         value = 0;
71         break;
72 
73       case SQL_DYNAMIC_CURSOR_ATTRIBUTES2:
74         value = 0;
75         break;
76 
77       case SQL_FETCH_DIRECTION:
78         value = SQL_FD_FETCH_ABSOLUTE |
79                     SQL_FD_FETCH_FIRST |
80                     SQL_FD_FETCH_LAST |
81                     SQL_FD_FETCH_NEXT |
82                     SQL_FD_FETCH_PRIOR |
83                     SQL_FD_FETCH_RELATIVE |
84                     SQL_FD_FETCH_BOOKMARK;
85         break;
86 
87       case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:
88         value = SQL_CA1_NEXT |
89                     SQL_CA1_ABSOLUTE |
90                     SQL_CA1_RELATIVE |
91                     SQL_CA1_LOCK_NO_CHANGE |
92                     SQL_CA1_POS_POSITION |
93                     SQL_CA1_POSITIONED_DELETE |
94                     SQL_CA1_POSITIONED_UPDATE |
95                     SQL_CA1_SELECT_FOR_UPDATE;
96         break;
97 
98       case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:
99         value = SQL_CA2_READ_ONLY_CONCURRENCY |
100                     SQL_CA2_OPT_VALUES_CONCURRENCY |
101                     SQL_CA2_SENSITIVITY_UPDATES;
102         break;
103 
104       case SQL_KEYSET_CURSOR_ATTRIBUTES1:
105         value = 0;
106         break;
107 
108       case SQL_KEYSET_CURSOR_ATTRIBUTES2:
109         value = 0;
110         break;
111 
112       case SQL_LOCK_TYPES:
113         value = SQL_LCK_NO_CHANGE;
114         break;
115 
116       case SQL_STATIC_CURSOR_ATTRIBUTES1:
117         value = SQL_CA1_NEXT |
118                     SQL_CA1_ABSOLUTE |
119                     SQL_CA1_RELATIVE |
120                     SQL_CA1_BOOKMARK |
121                     SQL_CA1_LOCK_NO_CHANGE |
122                     SQL_CA1_POS_POSITION |
123                     SQL_CA1_POSITIONED_DELETE |
124                     SQL_CA1_POSITIONED_UPDATE |
125                     SQL_CA1_SELECT_FOR_UPDATE;
126         break;
127 
128       case SQL_STATIC_CURSOR_ATTRIBUTES2:
129         value = SQL_CA2_READ_ONLY_CONCURRENCY |
130                     SQL_CA2_OPT_VALUES_CONCURRENCY |
131                     SQL_CA2_SENSITIVITY_UPDATES;
132 
133         break;
134 
135       case SQL_POS_OPERATIONS:
136         value = SQL_POS_POSITION;
137         break;
138 
139       case SQL_POSITIONED_STATEMENTS:
140         value = SQL_PS_POSITIONED_DELETE |
141                     SQL_PS_POSITIONED_UPDATE |
142                     SQL_PS_SELECT_FOR_UPDATE;
143         break;
144 
145       case SQL_ROW_UPDATES:
146         cval = "Y";
147         break;
148 
149       case SQL_SCROLL_CONCURRENCY:
150         value = SQL_SCCO_READ_ONLY |
151                     SQL_SCCO_OPT_VALUES;
152         break;
153 
154       case SQL_SCROLL_OPTIONS:
155         value = SQL_SO_FORWARD_ONLY |
156                     SQL_SO_STATIC;
157         break;
158 
159       case SQL_STATIC_SENSITIVITY:
160         value = SQL_SS_UPDATES;
161         break;
162 
163       default:
164         do_it_here = 0;
165         break;
166     }
167 
168     if ( do_it_here )
169     {
170         if ( cval )
171         {
172             if ( buffer_length > 2 && info_value )
173             {
174                 strcpy( info_value, cval );
175                 ret = SQL_SUCCESS;
176             }
177             else
178             {
179                 ret = SQL_SUCCESS_WITH_INFO;
180             }
181             if ( string_length )
182             {
183                 *string_length = 1;
184             }
185         }
186         else
187         {
188             *((SQLINTEGER*)info_value) = value;
189             ret = SQL_SUCCESS;
190         }
191     }
192     else
193     {
194         ret = SQLGETINFO( cl_connection,
195                cl_connection -> driver_dbc,
196                info_type,
197                info_value,
198                buffer_length,
199                string_length );
200 
201         if ( SQL_SUCCEEDED( ret ))
202         {
203             if ( info_type == SQL_GETDATA_EXTENSIONS && info_value )
204             {
205                 *((SQLINTEGER*)info_value) |= SQL_GD_BLOCK;
206             }
207         }
208     }
209 
210     return ret;
211 }
212