1/**************************************************
2 * SQLConfigDataSource
3 *
4 * Determine the DriverSetup file name and then try to pass
5 * the work along to its ConfigDSN().
6 *
7 **************************************************
8 * This code was created by Peter Harvey @ CodeByDesign.
9 * Released under LGPL 28.JAN.99
10 *
11 * Contributions from...
12 * -----------------------------------------------
13 * Peter Harvey - pharvey@codebydesign.com
14 **************************************************/
15#include <config.h>
16#include <odbcinstext.h>
17
18static BOOL SQLConfigDataSourceWide( HWND hWnd,
19 WORD nRequest,
20 LPCSTR pszDriver, /* USER FRIENDLY NAME (not file name) */
21 LPCSTR pszAttributes,
22 LPCWSTR pszDriverW,
23 LPCWSTR pszAttributesW )
24{
25 BOOL (*pFunc)( HWND, WORD, LPCSTR, LPCSTR );
26 BOOL (*pFuncW)( HWND, WORD, LPCWSTR, LPCWSTR );
27 BOOL nReturn;
28 void *hDLL = FALSE;
29 HINI hIni;
30 char szDriverSetup[INI_MAX_PROPERTY_VALUE+1];
31 char szIniName[ ODBC_FILENAME_MAX * 2 + 3 ];
32 char b1[ ODBC_FILENAME_MAX + 1 ], b2[ ODBC_FILENAME_MAX + 1 ];
33
34 /* SANITY CHECKS */
35 if ( pszDriver == NULL || pszAttributes == NULL )
36 {
37 inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" );
38 return FALSE;
39 }
40
41 if ( pszDriver[0] == '\0' )
42 {
43 inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" );
44 return FALSE;
45 }
46 switch ( nRequest )
47 {
48 case ODBC_ADD_DSN:
49 case ODBC_CONFIG_DSN:
50 case ODBC_REMOVE_DSN:
51 case ODBC_ADD_SYS_DSN:
52 case ODBC_CONFIG_SYS_DSN:
53 case ODBC_REMOVE_SYS_DSN:
54 case ODBC_REMOVE_DEFAULT_DSN:
55 break;
56 default:
57 inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_REQUEST_TYPE, "" );
58 return FALSE;
59 }
60
61#ifdef VMS
62 sprintf( szIniName, "%s:%s", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ) );
63#else
64 sprintf( szIniName, "%s/%s", odbcinst_system_file_path( b1 ), odbcinst_system_file_name( b2 ) );
65#endif
66
67 /* OK */
68#ifdef __OS2__
69 if ( iniOpen( &hIni, szIniName, "#;", '[', ']', '=', TRUE, 1L ) != INI_SUCCESS )
70#else
71 if ( iniOpen( &hIni, szIniName, "#;", '[', ']', '=', TRUE ) != INI_SUCCESS )
72#endif
73 {
74 inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" );
75 return FALSE;
76 }
77
78 /*
79 * initialize libtool
80 */
81
82 lt_dlinit();
83
84#ifdef PLATFORM64
85 if ( iniPropertySeek( hIni, (char *)pszDriver, "Setup64", "" ) == INI_SUCCESS ||
86 iniPropertySeek( hIni, (char *)pszDriver, "Setup", "" ) == INI_SUCCESS )
87#else
88 if ( iniPropertySeek( hIni, (char *)pszDriver, "Setup", "" ) == INI_SUCCESS )
89#endif
90 {
91 iniValue( hIni, szDriverSetup );
92
93 iniClose( hIni );
94
95 if ( szDriverSetup[ 0 ] == '\0' )
96 {
97 char szError[ 512 ];
98 sprintf( szError, "Could not find Setup property for (%.400s) in system information", pszDriver );
99 inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, szError );
100 __set_config_mode( ODBC_BOTH_DSN );
101 return FALSE;
102 }
103
104 nReturn = FALSE;
105 if ( (hDLL = lt_dlopen( szDriverSetup )) )
106 {
107 pFunc = (BOOL (*)(HWND, WORD, LPCSTR, LPCSTR )) lt_dlsym( hDLL, "ConfigDSN" );
108 pFuncW = (BOOL (*)(HWND, WORD, LPCWSTR, LPCWSTR )) lt_dlsym( hDLL, "ConfigDSNW" );
109 if ( pFunc )
110 {
111 /*
112 * set the mode
113 */
114 switch ( nRequest )
115 {
116 case ODBC_ADD_DSN:
117 case ODBC_CONFIG_DSN:
118 case ODBC_REMOVE_DSN:
119 case ODBC_REMOVE_DEFAULT_DSN:
120 __set_config_mode( ODBC_USER_DSN );
121 break;
122
123 case ODBC_ADD_SYS_DSN:
124 __set_config_mode( ODBC_SYSTEM_DSN );
125 nRequest = ODBC_ADD_DSN;
126 break;
127
128 case ODBC_CONFIG_SYS_DSN:
129 __set_config_mode( ODBC_SYSTEM_DSN );
130 nRequest = ODBC_CONFIG_DSN;
131 break;
132
133 case ODBC_REMOVE_SYS_DSN:
134 __set_config_mode( ODBC_SYSTEM_DSN );
135 nRequest = ODBC_REMOVE_DSN;
136 break;
137 }
138 nReturn = pFunc( hWnd, nRequest, pszDriver, pszAttributes );
139 }
140 else if ( pFuncW )
141 {
142 /*
143 * set the mode
144 */
145 switch ( nRequest )
146 {
147 case ODBC_ADD_DSN:
148 case ODBC_CONFIG_DSN:
149 case ODBC_REMOVE_DSN:
150 case ODBC_REMOVE_DEFAULT_DSN:
151 __set_config_mode( ODBC_USER_DSN );
152 break;
153
154 case ODBC_ADD_SYS_DSN:
155 __set_config_mode( ODBC_SYSTEM_DSN );
156 nRequest = ODBC_ADD_DSN;
157 break;
158
159 case ODBC_CONFIG_SYS_DSN:
160 __set_config_mode( ODBC_SYSTEM_DSN );
161 nRequest = ODBC_CONFIG_DSN;
162 break;
163
164 case ODBC_REMOVE_SYS_DSN:
165 __set_config_mode( ODBC_SYSTEM_DSN );
166 nRequest = ODBC_REMOVE_DSN;
167 break;
168 }
169 nReturn = pFuncW( hWnd, nRequest, pszDriverW, pszAttributesW );
170 }
171 else
172 {
173 inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" );
174 }
175 }
176 else
177 inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" );
178
179 __set_config_mode( ODBC_BOTH_DSN );
180 return nReturn;
181
182 }
183
184 inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" );
185 iniClose( hIni );
186
187 __set_config_mode( ODBC_BOTH_DSN );
188
189 return FALSE;
190}
191
192BOOL INSTAPI SQLConfigDataSourceW (HWND hwndParent,
193 WORD fRequest,
194 LPCWSTR lpszDriver,
195 LPCWSTR lpszAttributes)
196{
197 char *drv, *attr;
198 BOOL ret;
199
200 inst_logClear();
201
202 drv = _single_string_alloc_and_copy( lpszDriver );
203 attr = _multi_string_alloc_and_copy( lpszAttributes );
204
205 ret = SQLConfigDataSourceWide( hwndParent, fRequest, drv, attr, lpszDriver, lpszAttributes );
206
207 free( drv );
208 free( attr );
209
210 return ret;
211}
212
213BOOL INSTAPI SQLConfigDataSource (HWND hwndParent,
214 WORD fRequest,
215 LPCSTR lpszDriver,
216 LPCSTR lpszAttributes)
217{
218 SQLWCHAR *drv, *attr;
219 BOOL ret;
220
221 inst_logClear();
222
223 drv = _single_string_alloc_and_expand( lpszDriver );
224 attr = _multi_string_alloc_and_expand( lpszAttributes );
225
226 ret = SQLConfigDataSourceWide( hwndParent, fRequest, lpszDriver, lpszAttributes, drv, attr );
227
228 free( drv );
229 free( attr );
230
231 return ret;
232}
233