dlg_specific.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:26k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /* Module:          dlg_specific.c
  2.  *
  3.  * Description:     This module contains any specific code for handling
  4.  *                  dialog boxes such as driver/datasource options.  Both the
  5.  *                  ConfigDSN() and the SQLDriverConnect() functions use 
  6.  *                  functions in this module.  If you were to add a new option
  7.  *                  to any dialog box, you would most likely only have to change
  8.  *                  things in here rather than in 2 separate places as before.
  9.  *
  10.  * Classes:         none
  11.  *
  12.  * API functions:   none
  13.  *
  14.  * Comments:        See "notice.txt" for copyright and license information.
  15.  *
  16.  */
  17. #ifdef HAVE_CONFIG_H
  18. #include "config.h"
  19. #endif
  20. #ifndef WIN32
  21. #include <string.h>
  22. #include "gpps.h"
  23. #define SQLGetPrivateProfileString(a,b,c,d,e,f) GetPrivateProfileString(a,b,c,d,e,f)
  24. #define SQLWritePrivateProfileString(a,b,c,d) WritePrivateProfileString(a,b,c,d)
  25. #ifndef HAVE_STRICMP
  26. #define stricmp(s1,s2) strcasecmp(s1,s2)
  27. #define strnicmp(s1,s2,n) strncasecmp(s1,s2,n)
  28. #endif
  29. #endif
  30. #include "dlg_specific.h"
  31. #include "convert.h"
  32. #ifndef BOOL
  33. #define BOOL int
  34. #endif
  35. #ifndef FALSE
  36. #define FALSE (BOOL)0
  37. #endif
  38. #ifndef TRUE
  39. #define TRUE (BOOL)1
  40. #endif
  41. extern GLOBAL_VALUES globals;
  42. #ifdef WIN32
  43. void
  44. SetDlgStuff(HWND hdlg, ConnInfo *ci)
  45. {
  46. /* If driver attribute NOT present, then set the datasource name and description */
  47. if (ci->driver[0] == '') {
  48. SetDlgItemText(hdlg, IDC_DSNAME, ci->dsn);
  49. SetDlgItemText(hdlg, IDC_DESC, ci->desc);
  50. }
  51. SetDlgItemText(hdlg, IDC_DATABASE, ci->database);
  52. SetDlgItemText(hdlg, IDC_SERVER, ci->server);
  53. SetDlgItemText(hdlg, IDC_USER, ci->username);
  54. SetDlgItemText(hdlg, IDC_PASSWORD, ci->password);
  55. SetDlgItemText(hdlg, IDC_PORT, ci->port);
  56. }
  57. void 
  58. GetDlgStuff(HWND hdlg, ConnInfo *ci)
  59. {
  60. GetDlgItemText(hdlg, IDC_DESC, ci->desc, sizeof(ci->desc));
  61. GetDlgItemText(hdlg, IDC_DATABASE, ci->database, sizeof(ci->database));
  62. GetDlgItemText(hdlg, IDC_SERVER, ci->server, sizeof(ci->server));
  63. GetDlgItemText(hdlg, IDC_USER, ci->username, sizeof(ci->username));
  64. GetDlgItemText(hdlg, IDC_PASSWORD, ci->password, sizeof(ci->password));
  65. GetDlgItemText(hdlg, IDC_PORT, ci->port, sizeof(ci->port));
  66. }
  67. int CALLBACK driver_optionsProc(HWND   hdlg,
  68.                            WORD   wMsg,
  69.                            WPARAM wParam,
  70.                            LPARAM lParam)
  71. {
  72. switch (wMsg) {
  73. case WM_INITDIALOG:
  74. CheckDlgButton(hdlg, DRV_COMMLOG, globals.commlog);
  75. CheckDlgButton(hdlg, DRV_OPTIMIZER, globals.disable_optimizer);
  76. CheckDlgButton(hdlg, DRV_KSQO, globals.ksqo);
  77. CheckDlgButton(hdlg, DRV_UNIQUEINDEX, globals.unique_index);
  78. CheckDlgButton(hdlg, DRV_READONLY, globals.readonly);
  79. CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, globals.use_declarefetch);
  80. /* Unknown (Default) Data Type sizes */
  81. switch(globals.unknown_sizes) {
  82. case UNKNOWNS_AS_DONTKNOW:
  83. CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 1);
  84. break;
  85. case UNKNOWNS_AS_LONGEST:
  86. CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 1);
  87. break;
  88. case UNKNOWNS_AS_MAX:
  89. default:
  90. CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 1);
  91. break;
  92. }
  93. CheckDlgButton(hdlg, DRV_TEXT_LONGVARCHAR, globals.text_as_longvarchar);
  94. CheckDlgButton(hdlg, DRV_UNKNOWNS_LONGVARCHAR, globals.unknowns_as_longvarchar);
  95. CheckDlgButton(hdlg, DRV_BOOLS_CHAR, globals.bools_as_char);
  96. CheckDlgButton(hdlg, DRV_PARSE, globals.parse);
  97. CheckDlgButton(hdlg, DRV_CANCELASFREESTMT, globals.cancel_as_freestmt);
  98. SetDlgItemInt(hdlg, DRV_CACHE_SIZE, globals.fetch_max, FALSE);
  99. SetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, globals.max_varchar_size, FALSE);
  100. SetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, globals.max_longvarchar_size, TRUE);
  101. SetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes);
  102. /* Driver Connection Settings */
  103. SetDlgItemText(hdlg, DRV_CONNSETTINGS, globals.conn_settings);
  104. break; 
  105. case WM_COMMAND:
  106. switch (GET_WM_COMMAND_ID(wParam, lParam)) {
  107. case IDOK:
  108. globals.commlog = IsDlgButtonChecked(hdlg, DRV_COMMLOG);
  109. globals.disable_optimizer = IsDlgButtonChecked(hdlg, DRV_OPTIMIZER);
  110. globals.ksqo = IsDlgButtonChecked(hdlg, DRV_KSQO);
  111. globals.unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX);
  112. globals.readonly = IsDlgButtonChecked(hdlg, DRV_READONLY);
  113. globals.use_declarefetch = IsDlgButtonChecked(hdlg, DRV_USEDECLAREFETCH);
  114. /* Unknown (Default) Data Type sizes */
  115. if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_MAX))
  116. globals.unknown_sizes = UNKNOWNS_AS_MAX;
  117. else if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_DONTKNOW))
  118. globals.unknown_sizes = UNKNOWNS_AS_DONTKNOW;
  119. else if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_LONGEST))
  120. globals.unknown_sizes = UNKNOWNS_AS_LONGEST;
  121. else
  122. globals.unknown_sizes = UNKNOWNS_AS_MAX;
  123. globals.text_as_longvarchar = IsDlgButtonChecked(hdlg, DRV_TEXT_LONGVARCHAR);
  124. globals.unknowns_as_longvarchar = IsDlgButtonChecked(hdlg, DRV_UNKNOWNS_LONGVARCHAR);
  125. globals.bools_as_char = IsDlgButtonChecked(hdlg, DRV_BOOLS_CHAR);
  126. globals.parse = IsDlgButtonChecked(hdlg, DRV_PARSE);
  127. globals.cancel_as_freestmt = IsDlgButtonChecked(hdlg, DRV_CANCELASFREESTMT);
  128. globals.fetch_max = GetDlgItemInt(hdlg, DRV_CACHE_SIZE, NULL, FALSE);
  129. globals.max_varchar_size = GetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, NULL, FALSE);
  130. globals.max_longvarchar_size= GetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, NULL, TRUE); // allows for SQL_NO_TOTAL
  131. GetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes, sizeof(globals.extra_systable_prefixes));
  132. /* Driver Connection Settings */
  133. GetDlgItemText(hdlg, DRV_CONNSETTINGS, globals.conn_settings, sizeof(globals.conn_settings));
  134. updateGlobals();
  135. // fall through
  136. case IDCANCEL:
  137. EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK);
  138. return TRUE;
  139. case IDDEFAULTS:
  140. CheckDlgButton(hdlg, DRV_COMMLOG, DEFAULT_COMMLOG);
  141. CheckDlgButton(hdlg, DRV_OPTIMIZER, DEFAULT_OPTIMIZER);
  142. CheckDlgButton(hdlg, DRV_KSQO, DEFAULT_KSQO);
  143. CheckDlgButton(hdlg, DRV_UNIQUEINDEX, DEFAULT_UNIQUEINDEX);
  144. CheckDlgButton(hdlg, DRV_READONLY, DEFAULT_READONLY);
  145. CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, DEFAULT_USEDECLAREFETCH);
  146. CheckDlgButton(hdlg, DRV_PARSE, DEFAULT_PARSE);
  147. CheckDlgButton(hdlg, DRV_CANCELASFREESTMT, DEFAULT_CANCELASFREESTMT);
  148. /* Unknown Sizes */
  149. CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 0);
  150. CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 0);
  151. CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 0);
  152. switch(DEFAULT_UNKNOWNSIZES) {
  153. case UNKNOWNS_AS_DONTKNOW:
  154. CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 1);
  155. break;
  156. case UNKNOWNS_AS_LONGEST:
  157. CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 1);
  158. break;
  159. case UNKNOWNS_AS_MAX:
  160. CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 1);
  161. break;
  162. }
  163. CheckDlgButton(hdlg, DRV_TEXT_LONGVARCHAR, DEFAULT_TEXTASLONGVARCHAR);
  164. CheckDlgButton(hdlg, DRV_UNKNOWNS_LONGVARCHAR, DEFAULT_UNKNOWNSASLONGVARCHAR);
  165. CheckDlgButton(hdlg, DRV_BOOLS_CHAR, DEFAULT_BOOLSASCHAR);
  166. SetDlgItemInt(hdlg, DRV_CACHE_SIZE, FETCH_MAX, FALSE);
  167. SetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, MAX_VARCHAR_SIZE, FALSE);
  168. SetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, TEXT_FIELD_SIZE, TRUE);
  169. SetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, DEFAULT_EXTRASYSTABLEPREFIXES);
  170. /* Driver Connection Settings */
  171. SetDlgItemText(hdlg, DRV_CONNSETTINGS, "");
  172. break;
  173. }
  174. }
  175. return FALSE;
  176. }
  177. int CALLBACK ds_optionsProc(HWND   hdlg,
  178.                            WORD   wMsg,
  179.                            WPARAM wParam,
  180.                            LPARAM lParam)
  181. {
  182. ConnInfo *ci;
  183. char buf[128];
  184. switch (wMsg) {
  185. case WM_INITDIALOG:
  186. ci = (ConnInfo *) lParam;
  187. SetWindowLong(hdlg, DWL_USER, lParam); // save for OK
  188. /* Change window caption */
  189. if (ci->driver[0])
  190. SetWindowText(hdlg, "Advanced Options (Connection)");
  191. else {
  192. sprintf(buf, "Advanced Options (%s)", ci->dsn);
  193. SetWindowText(hdlg, buf);
  194. }
  195. /* Readonly */
  196. CheckDlgButton(hdlg, DS_READONLY, atoi(ci->readonly));
  197. /* Protocol */
  198. if (strncmp(ci->protocol, PG62, strlen(PG62)) == 0)
  199. CheckDlgButton(hdlg, DS_PG62, 1);
  200. else if (strncmp(ci->protocol, PG63, strlen(PG63)) == 0)
  201. CheckDlgButton(hdlg, DS_PG63, 1);
  202. else /* latest */
  203. CheckDlgButton(hdlg, DS_PG64, 1);
  204. CheckDlgButton(hdlg, DS_SHOWOIDCOLUMN, atoi(ci->show_oid_column));
  205. CheckDlgButton(hdlg, DS_FAKEOIDINDEX, atoi(ci->fake_oid_index));
  206. CheckDlgButton(hdlg, DS_ROWVERSIONING, atoi(ci->row_versioning));
  207. CheckDlgButton(hdlg, DS_SHOWSYSTEMTABLES, atoi(ci->show_system_tables));
  208. EnableWindow(GetDlgItem(hdlg, DS_FAKEOIDINDEX), atoi(ci->show_oid_column));
  209. /* Datasource Connection Settings */
  210. SetDlgItemText(hdlg, DS_CONNSETTINGS, ci->conn_settings);
  211. break; 
  212. case WM_COMMAND:
  213. switch (GET_WM_COMMAND_ID(wParam, lParam)) {
  214. case DS_SHOWOIDCOLUMN:
  215. mylog("WM_COMMAND: DS_SHOWOIDCOLUMNn");
  216. EnableWindow(GetDlgItem(hdlg, DS_FAKEOIDINDEX), IsDlgButtonChecked(hdlg, DS_SHOWOIDCOLUMN));
  217. return TRUE;
  218. case IDOK: 
  219. ci = (ConnInfo *)GetWindowLong(hdlg, DWL_USER);
  220. mylog("IDOK: got ci = %un", ci);
  221. /* Readonly */
  222. sprintf(ci->readonly, "%d", IsDlgButtonChecked(hdlg, DS_READONLY));
  223. /* Protocol */
  224. if ( IsDlgButtonChecked(hdlg, DS_PG62))
  225. strcpy(ci->protocol, PG62);
  226. else if ( IsDlgButtonChecked(hdlg, DS_PG63))
  227. strcpy(ci->protocol, PG63);
  228. else /* latest */
  229. strcpy(ci->protocol, PG64);
  230. sprintf(ci->show_system_tables, "%d", IsDlgButtonChecked(hdlg, DS_SHOWSYSTEMTABLES));
  231. sprintf(ci->row_versioning, "%d", IsDlgButtonChecked(hdlg, DS_ROWVERSIONING));
  232. /* OID Options*/
  233. sprintf(ci->fake_oid_index, "%d", IsDlgButtonChecked(hdlg, DS_FAKEOIDINDEX));
  234. sprintf(ci->show_oid_column, "%d", IsDlgButtonChecked(hdlg, DS_SHOWOIDCOLUMN));
  235. /* Datasource Connection Settings */
  236. GetDlgItemText(hdlg, DS_CONNSETTINGS, ci->conn_settings, sizeof(ci->conn_settings));
  237. // fall through
  238. case IDCANCEL:
  239. EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK);
  240. return TRUE;
  241. }
  242. }
  243. return FALSE;
  244. }
  245. #endif /* WIN32 */
  246. void
  247. makeConnectString(char *connect_string, ConnInfo *ci)
  248. {
  249. char got_dsn = (ci->dsn[0] != '');
  250. char encoded_conn_settings[LARGE_REGISTRY_LEN];
  251. /* fundamental info */
  252. sprintf(connect_string, "%s=%s;DATABASE=%s;SERVER=%s;PORT=%s;UID=%s;PWD=%s",
  253. got_dsn ? "DSN" : "DRIVER", 
  254. got_dsn ? ci->dsn : ci->driver,
  255. ci->database,
  256. ci->server,
  257. ci->port,
  258. ci->username,
  259. ci->password);
  260. encode(ci->conn_settings, encoded_conn_settings);
  261. /* extra info */
  262. sprintf(&connect_string[strlen(connect_string)], 
  263. ";READONLY=%s;PROTOCOL=%s;FAKEOIDINDEX=%s;SHOWOIDCOLUMN=%s;ROWVERSIONING=%s;SHOWSYSTEMTABLES=%s;CONNSETTINGS=%s", 
  264. ci->readonly,
  265. ci->protocol,
  266. ci->fake_oid_index,
  267. ci->show_oid_column,
  268. ci->row_versioning,
  269. ci->show_system_tables,
  270. encoded_conn_settings);
  271. }
  272. void
  273. copyAttributes(ConnInfo *ci, char *attribute, char *value)
  274. {
  275. if(stricmp(attribute, "DSN") == 0)
  276. strcpy(ci->dsn, value);
  277. else if(stricmp(attribute, "driver") == 0)
  278. strcpy(ci->driver, value);
  279. else if(stricmp(attribute, INI_DATABASE) == 0)
  280. strcpy(ci->database, value);
  281. else if(stricmp(attribute, INI_SERVER) == 0 || stricmp(attribute, "server") == 0)
  282. strcpy(ci->server, value);
  283. else if(stricmp(attribute, INI_USER) == 0 || stricmp(attribute, "uid") == 0)
  284. strcpy(ci->username, value);
  285. else if(stricmp(attribute, INI_PASSWORD) == 0 || stricmp(attribute, "pwd") == 0)
  286. strcpy(ci->password, value);
  287. else if(stricmp(attribute, INI_PORT) == 0)
  288. strcpy(ci->port, value);
  289. else if (stricmp(attribute, INI_READONLY) == 0)
  290. strcpy(ci->readonly, value);
  291. else if (stricmp(attribute, INI_PROTOCOL) == 0)
  292. strcpy(ci->protocol, value);
  293. else if (stricmp(attribute, INI_SHOWOIDCOLUMN) == 0)
  294. strcpy(ci->show_oid_column, value);
  295. else if (stricmp(attribute, INI_FAKEOIDINDEX) == 0)
  296. strcpy(ci->fake_oid_index, value);
  297. else if (stricmp(attribute, INI_ROWVERSIONING) == 0)
  298. strcpy(ci->row_versioning, value);
  299. else if (stricmp(attribute, INI_SHOWSYSTEMTABLES) == 0)
  300. strcpy(ci->show_system_tables, value);
  301. else if (stricmp(attribute, INI_CONNSETTINGS) == 0) {
  302. decode(value, ci->conn_settings);
  303. // strcpy(ci->conn_settings, value);
  304. }
  305. mylog("copyAttributes: DSN='%s',server='%s',dbase='%s',user='%s',passwd='%s',port='%s',readonly='%s',protocol='%s', conn_settings='%s')n", ci->dsn, ci->server,ci->database,ci->username,ci->password,ci->port,ci->readonly,ci->protocol,ci->conn_settings);
  306. }
  307. void
  308. getDSNdefaults(ConnInfo *ci)
  309. {
  310. if (ci->port[0] == '')
  311. strcpy(ci->port, DEFAULT_PORT);
  312. if (ci->readonly[0] == '')
  313. sprintf(ci->readonly, "%d", globals.readonly);
  314. if (ci->protocol[0] == '')
  315. strcpy(ci->protocol, globals.protocol);
  316. if (ci->fake_oid_index[0] == '')
  317. sprintf(ci->fake_oid_index, "%d", DEFAULT_FAKEOIDINDEX);
  318. if (ci->show_oid_column[0] == '')
  319. sprintf(ci->show_oid_column, "%d", DEFAULT_SHOWOIDCOLUMN);
  320. if (ci->show_system_tables[0] == '')
  321. sprintf(ci->show_system_tables, "%d", DEFAULT_SHOWSYSTEMTABLES);
  322. if (ci->row_versioning[0] == '')
  323. sprintf(ci->row_versioning, "%d", DEFAULT_ROWVERSIONING);
  324. }
  325. void 
  326. getDSNinfo(ConnInfo *ci, char overwrite)
  327. {
  328. char *DSN = ci->dsn;
  329. char encoded_conn_settings[LARGE_REGISTRY_LEN];
  330. // If a driver keyword was present, then dont use a DSN and return.
  331. // If DSN is null and no driver, then use the default datasource.
  332. if ( DSN[0] == '') {
  333. if ( ci->driver[0] != '')
  334. return;
  335. else
  336. strcpy(DSN, INI_DSN);
  337. }
  338. // brute-force chop off trailing blanks...
  339. while (*(DSN+strlen(DSN)-1) == ' ') *(DSN+strlen(DSN)-1) = '';
  340. // Proceed with getting info for the given DSN.
  341. if ( ci->desc[0] == '' || overwrite)
  342. SQLGetPrivateProfileString(DSN, INI_KDESC, "", ci->desc, sizeof(ci->desc), ODBC_INI);
  343. if ( ci->server[0] == '' || overwrite)
  344. SQLGetPrivateProfileString(DSN, INI_SERVER, "", ci->server, sizeof(ci->server), ODBC_INI);
  345. if ( ci->database[0] == '' || overwrite)
  346.     SQLGetPrivateProfileString(DSN, INI_DATABASE, "", ci->database, sizeof(ci->database), ODBC_INI);
  347. if ( ci->username[0] == '' || overwrite)
  348. SQLGetPrivateProfileString(DSN, INI_USER, "", ci->username, sizeof(ci->username), ODBC_INI);
  349. if ( ci->password[0] == '' || overwrite)
  350. SQLGetPrivateProfileString(DSN, INI_PASSWORD, "", ci->password, sizeof(ci->password), ODBC_INI);
  351. if ( ci->port[0] == '' || overwrite)
  352. SQLGetPrivateProfileString(DSN, INI_PORT, "", ci->port, sizeof(ci->port), ODBC_INI);
  353. if ( ci->readonly[0] == '' || overwrite)
  354. SQLGetPrivateProfileString(DSN, INI_READONLY, "", ci->readonly, sizeof(ci->readonly), ODBC_INI);
  355. if ( ci->show_oid_column[0] == '' || overwrite)
  356. SQLGetPrivateProfileString(DSN, INI_SHOWOIDCOLUMN, "", ci->show_oid_column, sizeof(ci->show_oid_column), ODBC_INI);
  357. if ( ci->fake_oid_index[0] == '' || overwrite)
  358. SQLGetPrivateProfileString(DSN, INI_FAKEOIDINDEX, "", ci->fake_oid_index, sizeof(ci->fake_oid_index), ODBC_INI);
  359. if ( ci->row_versioning[0] == '' || overwrite)
  360. SQLGetPrivateProfileString(DSN, INI_ROWVERSIONING, "", ci->row_versioning, sizeof(ci->row_versioning), ODBC_INI);
  361. if ( ci->show_system_tables[0] == '' || overwrite)
  362. SQLGetPrivateProfileString(DSN, INI_SHOWSYSTEMTABLES, "", ci->show_system_tables, sizeof(ci->show_system_tables), ODBC_INI);
  363. if ( ci->protocol[0] == '' || overwrite)
  364. SQLGetPrivateProfileString(DSN, INI_PROTOCOL, "", ci->protocol, sizeof(ci->protocol), ODBC_INI);
  365. if ( ci->conn_settings[0] == '' || overwrite) {
  366. SQLGetPrivateProfileString(DSN, INI_CONNSETTINGS, "", encoded_conn_settings, sizeof(encoded_conn_settings), ODBC_INI);
  367. decode(encoded_conn_settings, ci->conn_settings);
  368. }
  369. if ( ci->translation_dll[0] == '' || overwrite)
  370. SQLGetPrivateProfileString(DSN, INI_TRANSLATIONDLL, "", ci->translation_dll, sizeof(ci->translation_dll), ODBC_INI);
  371. if ( ci->translation_option[0] == '' || overwrite)
  372. SQLGetPrivateProfileString(DSN, INI_TRANSLATIONOPTION, "", ci->translation_option, sizeof(ci->translation_option), ODBC_INI);
  373. /* Allow override of odbcinst.ini parameters here */
  374. getGlobalDefaults(DSN, ODBC_INI, TRUE);
  375. qlog("DSN info: DSN='%s',server='%s',port='%s',dbase='%s',user='%s',passwd='%s'n", 
  376. DSN, 
  377. ci->server,
  378. ci->port,
  379. ci->database,
  380. ci->username,
  381. ci->password);
  382. qlog("          readonly='%s',protocol='%s',showoid='%s',fakeoidindex='%s',showsystable='%s'n",
  383. ci->readonly,
  384. ci->protocol,
  385. ci->show_oid_column,
  386. ci->fake_oid_index,
  387. ci->show_system_tables);
  388. qlog("          conn_settings='%s'n",
  389. ci->conn_settings);
  390. qlog("          translation_dll='%s',translation_option='%s'n",
  391. ci->translation_dll,
  392. ci->translation_option);
  393. }
  394. /* This is for datasource based options only */
  395. void
  396. writeDSNinfo(ConnInfo *ci)
  397. {
  398. char *DSN = ci->dsn;
  399. char encoded_conn_settings[LARGE_REGISTRY_LEN];
  400. encode(ci->conn_settings, encoded_conn_settings);
  401. SQLWritePrivateProfileString(DSN,
  402. INI_KDESC,
  403. ci->desc,
  404. ODBC_INI);
  405.                         
  406. SQLWritePrivateProfileString(DSN,
  407. INI_DATABASE,
  408. ci->database,
  409. ODBC_INI);
  410.                         
  411. SQLWritePrivateProfileString(DSN,
  412. INI_SERVER,
  413. ci->server,
  414. ODBC_INI);
  415. SQLWritePrivateProfileString(DSN,
  416. INI_PORT,
  417. ci->port,
  418. ODBC_INI);
  419. SQLWritePrivateProfileString(DSN,
  420. INI_USER,
  421. ci->username,
  422. ODBC_INI);
  423. SQLWritePrivateProfileString(DSN,
  424. INI_PASSWORD,
  425. ci->password,
  426. ODBC_INI);
  427. SQLWritePrivateProfileString(DSN,
  428. INI_READONLY,
  429. ci->readonly,
  430. ODBC_INI);
  431. SQLWritePrivateProfileString(DSN,
  432. INI_SHOWOIDCOLUMN,
  433. ci->show_oid_column,
  434. ODBC_INI);
  435. SQLWritePrivateProfileString(DSN,
  436. INI_FAKEOIDINDEX,
  437. ci->fake_oid_index,
  438. ODBC_INI);
  439. SQLWritePrivateProfileString(DSN,
  440. INI_ROWVERSIONING,
  441. ci->row_versioning,
  442. ODBC_INI);
  443. SQLWritePrivateProfileString(DSN,
  444. INI_SHOWSYSTEMTABLES,
  445. ci->show_system_tables,
  446. ODBC_INI);
  447. SQLWritePrivateProfileString(DSN,
  448. INI_PROTOCOL,
  449. ci->protocol,
  450. ODBC_INI);
  451. SQLWritePrivateProfileString(DSN,
  452. INI_CONNSETTINGS,
  453. encoded_conn_settings,
  454. ODBC_INI);
  455. }
  456. /* This function reads the ODBCINST.INI portion of
  457. the registry and gets any driver defaults.
  458. */
  459. void getGlobalDefaults(char *section, char *filename, char override)
  460. {
  461. char temp[256];
  462. // Fetch Count is stored in driver section
  463.     SQLGetPrivateProfileString(section, INI_FETCH, "",
  464.                             temp, sizeof(temp), filename);
  465. if ( temp[0] ) {
  466. globals.fetch_max = atoi(temp);
  467. /* sanity check if using cursors */
  468. if (globals.fetch_max <= 0)
  469. globals.fetch_max = FETCH_MAX;
  470. }
  471. else if ( ! override)
  472. globals.fetch_max = FETCH_MAX;
  473. // Socket Buffersize is stored in driver section
  474.     SQLGetPrivateProfileString(section, INI_SOCKET, "",
  475.                             temp, sizeof(temp), filename);
  476. if ( temp[0] ) 
  477. globals.socket_buffersize = atoi(temp);
  478. else if ( ! override)
  479. globals.socket_buffersize = SOCK_BUFFER_SIZE;
  480. // Debug is stored in the driver section
  481. SQLGetPrivateProfileString(section, INI_DEBUG, "", 
  482. temp, sizeof(temp), filename);
  483. if ( temp[0] )
  484. globals.debug = atoi(temp);
  485. else if ( ! override)
  486. globals.debug = DEFAULT_DEBUG;
  487. // CommLog is stored in the driver section
  488. SQLGetPrivateProfileString(section, INI_COMMLOG, "", 
  489. temp, sizeof(temp), filename);
  490. if ( temp[0] ) 
  491. globals.commlog = atoi(temp);
  492. else if ( ! override)
  493. globals.commlog = DEFAULT_COMMLOG;
  494. // Optimizer is stored in the driver section only
  495. SQLGetPrivateProfileString(section, INI_OPTIMIZER, "", 
  496. temp, sizeof(temp), filename);
  497. if ( temp[0] ) 
  498. globals.disable_optimizer = atoi(temp);
  499. else if ( ! override)
  500. globals.disable_optimizer = DEFAULT_OPTIMIZER;
  501. // KSQO is stored in the driver section only
  502. SQLGetPrivateProfileString(section, INI_KSQO, "", 
  503. temp, sizeof(temp), filename);
  504. if ( temp[0] ) 
  505. globals.ksqo = atoi(temp);
  506. else if ( ! override)
  507. globals.ksqo = DEFAULT_KSQO;
  508. // Recognize Unique Index is stored in the driver section only
  509. SQLGetPrivateProfileString(section, INI_UNIQUEINDEX, "", 
  510. temp, sizeof(temp), filename);
  511. if ( temp[0] ) 
  512. globals.unique_index = atoi(temp);
  513. else if ( ! override)
  514. globals.unique_index = DEFAULT_UNIQUEINDEX;
  515. // Unknown Sizes is stored in the driver section only
  516. SQLGetPrivateProfileString(section, INI_UNKNOWNSIZES, "", 
  517. temp, sizeof(temp), filename);
  518. if ( temp[0] )
  519. globals.unknown_sizes = atoi(temp);
  520. else if ( ! override)
  521. globals.unknown_sizes = DEFAULT_UNKNOWNSIZES;
  522. // Lie about supported functions?
  523. SQLGetPrivateProfileString(section, INI_LIE, "", 
  524. temp, sizeof(temp), filename);
  525. if ( temp[0] ) 
  526. globals.lie = atoi(temp);
  527. else if ( ! override)
  528. globals.lie = DEFAULT_LIE;
  529. // Parse statements
  530. SQLGetPrivateProfileString(section, INI_PARSE, "", 
  531. temp, sizeof(temp), filename);
  532. if ( temp[0] ) 
  533. globals.parse = atoi(temp);
  534. else if ( ! override)
  535. globals.parse = DEFAULT_PARSE;
  536. // SQLCancel calls SQLFreeStmt in Driver Manager
  537. SQLGetPrivateProfileString(section, INI_CANCELASFREESTMT, "", 
  538. temp, sizeof(temp), filename);
  539. if ( temp[0] ) 
  540. globals.cancel_as_freestmt = atoi(temp);
  541. else if ( ! override)
  542. globals.cancel_as_freestmt = DEFAULT_CANCELASFREESTMT;
  543. // UseDeclareFetch is stored in the driver section only
  544. SQLGetPrivateProfileString(section, INI_USEDECLAREFETCH, "", 
  545. temp, sizeof(temp), filename);
  546. if ( temp[0] ) 
  547. globals.use_declarefetch = atoi(temp);
  548. else if ( ! override)
  549. globals.use_declarefetch = DEFAULT_USEDECLAREFETCH;
  550. // Max Varchar Size
  551. SQLGetPrivateProfileString(section, INI_MAXVARCHARSIZE, "", 
  552. temp, sizeof(temp), filename);
  553. if ( temp[0] ) 
  554. globals.max_varchar_size = atoi(temp);
  555. else if ( ! override)
  556. globals.max_varchar_size = MAX_VARCHAR_SIZE;
  557. // Max TextField Size
  558. SQLGetPrivateProfileString(section, INI_MAXLONGVARCHARSIZE, "", 
  559. temp, sizeof(temp), filename);
  560. if ( temp[0] ) 
  561. globals.max_longvarchar_size = atoi(temp);
  562. else if ( ! override)
  563. globals.max_longvarchar_size = TEXT_FIELD_SIZE;
  564. // Text As LongVarchar 
  565. SQLGetPrivateProfileString(section, INI_TEXTASLONGVARCHAR, "", 
  566. temp, sizeof(temp), filename);
  567. if ( temp[0] ) 
  568. globals.text_as_longvarchar = atoi(temp);
  569. else if ( ! override)
  570. globals.text_as_longvarchar = DEFAULT_TEXTASLONGVARCHAR;
  571. // Unknowns As LongVarchar 
  572. SQLGetPrivateProfileString(section, INI_UNKNOWNSASLONGVARCHAR, "", 
  573. temp, sizeof(temp), filename);
  574. if ( temp[0] ) 
  575. globals.unknowns_as_longvarchar = atoi(temp);
  576. else if ( ! override)
  577. globals.unknowns_as_longvarchar = DEFAULT_UNKNOWNSASLONGVARCHAR;
  578. // Bools As Char
  579. SQLGetPrivateProfileString(section, INI_BOOLSASCHAR, "", 
  580. temp, sizeof(temp), filename);
  581. if ( temp[0] ) 
  582. globals.bools_as_char = atoi(temp);
  583. else if ( ! override)
  584. globals.bools_as_char = DEFAULT_BOOLSASCHAR;
  585. // Extra Systable prefixes
  586. // Use @@@ to distinguish between blank extra prefixes and no key entry
  587. SQLGetPrivateProfileString(section, INI_EXTRASYSTABLEPREFIXES, "@@@", 
  588. temp, sizeof(temp), filename);
  589. if ( strcmp(temp, "@@@" ))
  590. strcpy(globals.extra_systable_prefixes, temp);
  591. else if ( ! override)
  592. strcpy(globals.extra_systable_prefixes, DEFAULT_EXTRASYSTABLEPREFIXES);
  593. mylog("globals.extra_systable_prefixes = '%s'n", globals.extra_systable_prefixes);
  594. // Dont allow override of an override!
  595. if ( ! override) {
  596. // ConnSettings is stored in the driver section and per datasource for override
  597. SQLGetPrivateProfileString(section, INI_CONNSETTINGS, "", 
  598. globals.conn_settings, sizeof(globals.conn_settings), filename);
  599. // Default state for future DSN's Readonly attribute
  600. SQLGetPrivateProfileString(section, INI_READONLY, "", 
  601. temp, sizeof(temp), filename);
  602. if ( temp[0] ) 
  603. globals.readonly = atoi(temp);
  604. else
  605. globals.readonly = DEFAULT_READONLY;
  606. /* Default state for future DSN's protocol attribute
  607. This isn't a real driver option YET.  This is more
  608. intended for customization from the install.
  609. */
  610. SQLGetPrivateProfileString(section, INI_PROTOCOL, "@@@", 
  611. temp, sizeof(temp), filename);
  612. if ( strcmp(temp, "@@@" ))
  613. strcpy(globals.protocol, temp);
  614. else 
  615. strcpy(globals.protocol, DEFAULT_PROTOCOL);
  616. }
  617. }
  618. /* This function writes any global parameters (that can be manipulated)
  619. to the ODBCINST.INI portion of the registry 
  620. */
  621. void updateGlobals(void)
  622. {
  623. char tmp[128];
  624. sprintf(tmp, "%d", globals.fetch_max);
  625. SQLWritePrivateProfileString(DBMS_NAME,
  626. INI_FETCH, tmp, ODBCINST_INI);
  627. sprintf(tmp, "%d", globals.commlog);
  628. SQLWritePrivateProfileString(DBMS_NAME,
  629. INI_COMMLOG, tmp, ODBCINST_INI);
  630. sprintf(tmp, "%d", globals.disable_optimizer);
  631. SQLWritePrivateProfileString(DBMS_NAME,
  632. INI_OPTIMIZER, tmp, ODBCINST_INI);
  633. sprintf(tmp, "%d", globals.ksqo);
  634. SQLWritePrivateProfileString(DBMS_NAME,
  635. INI_KSQO, tmp, ODBCINST_INI);
  636. sprintf(tmp, "%d", globals.unique_index);
  637. SQLWritePrivateProfileString(DBMS_NAME,
  638. INI_UNIQUEINDEX, tmp, ODBCINST_INI);
  639. sprintf(tmp, "%d", globals.readonly);
  640. SQLWritePrivateProfileString(DBMS_NAME,
  641. INI_READONLY, tmp, ODBCINST_INI);
  642. sprintf(tmp, "%d", globals.use_declarefetch);
  643. SQLWritePrivateProfileString(DBMS_NAME,
  644. INI_USEDECLAREFETCH, tmp, ODBCINST_INI);
  645. sprintf(tmp, "%d", globals.unknown_sizes);
  646. SQLWritePrivateProfileString(DBMS_NAME,
  647. INI_UNKNOWNSIZES, tmp, ODBCINST_INI);
  648. sprintf(tmp, "%d", globals.text_as_longvarchar);
  649. SQLWritePrivateProfileString(DBMS_NAME,
  650. INI_TEXTASLONGVARCHAR, tmp, ODBCINST_INI);
  651. sprintf(tmp, "%d", globals.unknowns_as_longvarchar);
  652. SQLWritePrivateProfileString(DBMS_NAME,
  653. INI_UNKNOWNSASLONGVARCHAR, tmp, ODBCINST_INI);
  654. sprintf(tmp, "%d", globals.bools_as_char);
  655. SQLWritePrivateProfileString(DBMS_NAME,
  656. INI_BOOLSASCHAR, tmp, ODBCINST_INI);
  657. sprintf(tmp, "%d", globals.parse);
  658. SQLWritePrivateProfileString(DBMS_NAME,
  659. INI_PARSE, tmp, ODBCINST_INI);
  660. sprintf(tmp, "%d", globals.cancel_as_freestmt);
  661. SQLWritePrivateProfileString(DBMS_NAME,
  662. INI_CANCELASFREESTMT, tmp, ODBCINST_INI);
  663. sprintf(tmp, "%d", globals.max_varchar_size);
  664. SQLWritePrivateProfileString(DBMS_NAME,
  665. INI_MAXVARCHARSIZE, tmp, ODBCINST_INI);
  666. sprintf(tmp, "%d", globals.max_longvarchar_size);
  667. SQLWritePrivateProfileString(DBMS_NAME,
  668. INI_MAXLONGVARCHARSIZE, tmp, ODBCINST_INI);
  669. SQLWritePrivateProfileString(DBMS_NAME,
  670. INI_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes, ODBCINST_INI);
  671. SQLWritePrivateProfileString(DBMS_NAME,
  672. INI_CONNSETTINGS, globals.conn_settings, ODBCINST_INI);
  673. }