dlg_specific.c 26 KB
Newer Older
1
/* Module:			dlg_specific.c
2
 *
3 4 5 6 7 8
 * Description:		This module contains any specific code for handling
 *					dialog boxes such as driver/datasource options.  Both the
 *					ConfigDSN() and the SQLDriverConnect() functions use
 *					functions in this module.  If you were to add a new option
 *					to any dialog box, you would most likely only have to change
 *					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
 *
 */

Byron Nikolaidis's avatar
Byron Nikolaidis committed
18
#ifdef HAVE_CONFIG_H
19
#include "config.h"
Byron Nikolaidis's avatar
Byron Nikolaidis committed
20 21
#endif

22
#ifndef WIN32
23 24 25 26 27 28 29 30
#include <string.h>
#include "gpps.h"
#define SQLGetPrivateProfileString(a,b,c,d,e,f) GetPrivateProfileString(a,b,c,d,e,f)
#define SQLWritePrivateProfileString(a,b,c,d) WritePrivateProfileString(a,b,c,d)
#ifndef HAVE_STRICMP
#define stricmp(s1,s2)		strcasecmp(s1,s2)
#define strnicmp(s1,s2,n)	strncasecmp(s1,s2,n)
#endif
Byron Nikolaidis's avatar
Byron Nikolaidis committed
31 32
#endif

33
#include "dlg_specific.h"
Byron Nikolaidis's avatar
Byron Nikolaidis committed
34
#include "convert.h"
35

36 37 38 39 40 41 42 43 44 45
#ifndef BOOL
#define BOOL	int
#endif
#ifndef FALSE
#define FALSE	(BOOL)0
#endif
#ifndef TRUE
#define TRUE	(BOOL)1
#endif

46 47
extern GLOBAL_VALUES globals;

48
#ifdef WIN32
49
void
50
SetDlgStuff(HWND hdlg, ConnInfo * ci)
51
{
Bruce Momjian's avatar
Bruce Momjian committed
52

53 54 55 56 57 58
	/*
	 * If driver attribute NOT present, then set the datasource name and
	 * description
	 */
	if (ci->driver[0] == '\0')
	{
59 60 61 62 63 64 65 66 67 68 69
		SetDlgItemText(hdlg, IDC_DSNAME, ci->dsn);
		SetDlgItemText(hdlg, IDC_DESC, ci->desc);
	}

	SetDlgItemText(hdlg, IDC_DATABASE, ci->database);
	SetDlgItemText(hdlg, IDC_SERVER, ci->server);
	SetDlgItemText(hdlg, IDC_USER, ci->username);
	SetDlgItemText(hdlg, IDC_PASSWORD, ci->password);
	SetDlgItemText(hdlg, IDC_PORT, ci->port);
}

70 71
void
GetDlgStuff(HWND hdlg, ConnInfo * ci)
72 73 74 75 76 77 78 79 80 81 82 83
{
	GetDlgItemText(hdlg, IDC_DESC, ci->desc, sizeof(ci->desc));

	GetDlgItemText(hdlg, IDC_DATABASE, ci->database, sizeof(ci->database));
	GetDlgItemText(hdlg, IDC_SERVER, ci->server, sizeof(ci->server));
	GetDlgItemText(hdlg, IDC_USER, ci->username, sizeof(ci->username));
	GetDlgItemText(hdlg, IDC_PASSWORD, ci->password, sizeof(ci->password));
	GetDlgItemText(hdlg, IDC_PORT, ci->port, sizeof(ci->port));
}



84
int			CALLBACK
85 86 87 88
driver_optionsProc(HWND hdlg,
				   WORD wMsg,
				   WPARAM wParam,
				   LPARAM lParam)
89
{
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
	switch (wMsg)
	{
			case WM_INITDIALOG:

			CheckDlgButton(hdlg, DRV_COMMLOG, globals.commlog);
			CheckDlgButton(hdlg, DRV_OPTIMIZER, globals.disable_optimizer);
			CheckDlgButton(hdlg, DRV_KSQO, globals.ksqo);
			CheckDlgButton(hdlg, DRV_UNIQUEINDEX, globals.unique_index);
			CheckDlgButton(hdlg, DRV_READONLY, globals.onlyread);
			CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, globals.use_declarefetch);

			/* Unknown (Default) Data Type sizes */
			switch (globals.unknown_sizes)
			{
				case UNKNOWNS_AS_DONTKNOW:
					CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 1);
					break;
				case UNKNOWNS_AS_LONGEST:
					CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 1);
					break;
				case UNKNOWNS_AS_MAX:
				default:
					CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 1);
					break;
			}
Byron Nikolaidis's avatar
Byron Nikolaidis committed
115

116 117 118
			CheckDlgButton(hdlg, DRV_TEXT_LONGVARCHAR, globals.text_as_longvarchar);
			CheckDlgButton(hdlg, DRV_UNKNOWNS_LONGVARCHAR, globals.unknowns_as_longvarchar);
			CheckDlgButton(hdlg, DRV_BOOLS_CHAR, globals.bools_as_char);
119

120
			CheckDlgButton(hdlg, DRV_PARSE, globals.parse);
121

122
			CheckDlgButton(hdlg, DRV_CANCELASFREESTMT, globals.cancel_as_freestmt);
123

124 125 126
			SetDlgItemInt(hdlg, DRV_CACHE_SIZE, globals.fetch_max, FALSE);
			SetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, globals.max_varchar_size, FALSE);
			SetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, globals.max_longvarchar_size, TRUE);
127

128
			SetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes);
129

130 131
			/* Driver Connection Settings */
			SetDlgItemText(hdlg, DRV_CONNSETTINGS, globals.conn_settings);
132

133
			break;
134

135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
		case WM_COMMAND:
			switch (GET_WM_COMMAND_ID(wParam, lParam))
			{
				case IDOK:

					globals.commlog = IsDlgButtonChecked(hdlg, DRV_COMMLOG);
					globals.disable_optimizer = IsDlgButtonChecked(hdlg, DRV_OPTIMIZER);
					globals.ksqo = IsDlgButtonChecked(hdlg, DRV_KSQO);
					globals.unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX);
					globals.onlyread = IsDlgButtonChecked(hdlg, DRV_READONLY);
					globals.use_declarefetch = IsDlgButtonChecked(hdlg, DRV_USEDECLAREFETCH);

					/* Unknown (Default) Data Type sizes */
					if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_MAX))
						globals.unknown_sizes = UNKNOWNS_AS_MAX;
					else if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_DONTKNOW))
						globals.unknown_sizes = UNKNOWNS_AS_DONTKNOW;
					else if (IsDlgButtonChecked(hdlg, DRV_UNKNOWN_LONGEST))
						globals.unknown_sizes = UNKNOWNS_AS_LONGEST;
					else
						globals.unknown_sizes = UNKNOWNS_AS_MAX;

					globals.text_as_longvarchar = IsDlgButtonChecked(hdlg, DRV_TEXT_LONGVARCHAR);
					globals.unknowns_as_longvarchar = IsDlgButtonChecked(hdlg, DRV_UNKNOWNS_LONGVARCHAR);
					globals.bools_as_char = IsDlgButtonChecked(hdlg, DRV_BOOLS_CHAR);

					globals.parse = IsDlgButtonChecked(hdlg, DRV_PARSE);

					globals.cancel_as_freestmt = IsDlgButtonChecked(hdlg, DRV_CANCELASFREESTMT);

					globals.fetch_max = GetDlgItemInt(hdlg, DRV_CACHE_SIZE, NULL, FALSE);
					globals.max_varchar_size = GetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, NULL, FALSE);
					globals.max_longvarchar_size = GetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, NULL, TRUE);		/* allows for
																												 * SQL_NO_TOTAL */

					GetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes, sizeof(globals.extra_systable_prefixes));

					/* Driver Connection Settings */
					GetDlgItemText(hdlg, DRV_CONNSETTINGS, globals.conn_settings, sizeof(globals.conn_settings));

					updateGlobals();

					/* fall through */

				case IDCANCEL:
					EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK);
					return TRUE;

				case IDDEFAULTS:
					CheckDlgButton(hdlg, DRV_COMMLOG, DEFAULT_COMMLOG);
					CheckDlgButton(hdlg, DRV_OPTIMIZER, DEFAULT_OPTIMIZER);
					CheckDlgButton(hdlg, DRV_KSQO, DEFAULT_KSQO);
					CheckDlgButton(hdlg, DRV_UNIQUEINDEX, DEFAULT_UNIQUEINDEX);
					CheckDlgButton(hdlg, DRV_READONLY, DEFAULT_READONLY);
					CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, DEFAULT_USEDECLAREFETCH);

					CheckDlgButton(hdlg, DRV_PARSE, DEFAULT_PARSE);
					CheckDlgButton(hdlg, DRV_CANCELASFREESTMT, DEFAULT_CANCELASFREESTMT);

					/* Unknown Sizes */
					CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 0);
					CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 0);
					CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 0);
					switch (DEFAULT_UNKNOWNSIZES)
					{
						case UNKNOWNS_AS_DONTKNOW:
							CheckDlgButton(hdlg, DRV_UNKNOWN_DONTKNOW, 1);
							break;
						case UNKNOWNS_AS_LONGEST:
							CheckDlgButton(hdlg, DRV_UNKNOWN_LONGEST, 1);
							break;
						case UNKNOWNS_AS_MAX:
							CheckDlgButton(hdlg, DRV_UNKNOWN_MAX, 1);
							break;
					}

					CheckDlgButton(hdlg, DRV_TEXT_LONGVARCHAR, DEFAULT_TEXTASLONGVARCHAR);
					CheckDlgButton(hdlg, DRV_UNKNOWNS_LONGVARCHAR, DEFAULT_UNKNOWNSASLONGVARCHAR);
					CheckDlgButton(hdlg, DRV_BOOLS_CHAR, DEFAULT_BOOLSASCHAR);

					SetDlgItemInt(hdlg, DRV_CACHE_SIZE, FETCH_MAX, FALSE);
					SetDlgItemInt(hdlg, DRV_VARCHAR_SIZE, MAX_VARCHAR_SIZE, FALSE);
					SetDlgItemInt(hdlg, DRV_LONGVARCHAR_SIZE, TEXT_FIELD_SIZE, TRUE);

					SetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, DEFAULT_EXTRASYSTABLEPREFIXES);

					/* Driver Connection Settings */
					SetDlgItemText(hdlg, DRV_CONNSETTINGS, "");

					break;
225 226 227 228 229 230
			}
	}

	return FALSE;
}

231
int			CALLBACK
232 233 234 235
ds_optionsProc(HWND hdlg,
			   WORD wMsg,
			   WPARAM wParam,
			   LPARAM lParam)
236
{
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
	ConnInfo   *ci;
	char		buf[128];

	switch (wMsg)
	{
		case WM_INITDIALOG:
			ci = (ConnInfo *) lParam;
			SetWindowLong(hdlg, DWL_USER, lParam);		/* save for OK */

			/* Change window caption */
			if (ci->driver[0])
				SetWindowText(hdlg, "Advanced Options (Connection)");
			else
			{
				sprintf(buf, "Advanced Options (%s)", ci->dsn);
				SetWindowText(hdlg, buf);
			}
254

255 256
			/* Readonly */
			CheckDlgButton(hdlg, DS_READONLY, atoi(ci->onlyread));
257

258 259
			/* Protocol */
			CheckDlgButton(hdlg, DS_PG64, 1);
260

261 262


263 264 265 266
			CheckDlgButton(hdlg, DS_SHOWOIDCOLUMN, atoi(ci->show_oid_column));
			CheckDlgButton(hdlg, DS_FAKEOIDINDEX, atoi(ci->fake_oid_index));
			CheckDlgButton(hdlg, DS_ROWVERSIONING, atoi(ci->row_versioning));
			CheckDlgButton(hdlg, DS_SHOWSYSTEMTABLES, atoi(ci->show_system_tables));
267

268
			EnableWindow(GetDlgItem(hdlg, DS_FAKEOIDINDEX), atoi(ci->show_oid_column));
269

270 271 272
			/* Datasource Connection Settings */
			SetDlgItemText(hdlg, DS_CONNSETTINGS, ci->conn_settings);
			break;
273 274


275 276 277 278 279 280 281
		case WM_COMMAND:
			switch (GET_WM_COMMAND_ID(wParam, lParam))
			{
				case DS_SHOWOIDCOLUMN:
					mylog("WM_COMMAND: DS_SHOWOIDCOLUMN\n");
					EnableWindow(GetDlgItem(hdlg, DS_FAKEOIDINDEX), IsDlgButtonChecked(hdlg, DS_SHOWOIDCOLUMN));
					return TRUE;
282 283


284
				case IDOK:
285

286 287
					ci = (ConnInfo *) GetWindowLong(hdlg, DWL_USER);
					mylog("IDOK: got ci = %u\n", ci);
288

289 290
					/* Readonly */
					sprintf(ci->onlyread, "%d", IsDlgButtonChecked(hdlg, DS_READONLY));
291

292 293
					/* Protocol */
					strcpy(ci->protocol, PG64);
294

295
					sprintf(ci->show_system_tables, "%d", IsDlgButtonChecked(hdlg, DS_SHOWSYSTEMTABLES));
296

297
					sprintf(ci->row_versioning, "%d", IsDlgButtonChecked(hdlg, DS_ROWVERSIONING));
Byron Nikolaidis's avatar
Byron Nikolaidis committed
298

299 300 301
					/* OID Options */
					sprintf(ci->fake_oid_index, "%d", IsDlgButtonChecked(hdlg, DS_FAKEOIDINDEX));
					sprintf(ci->show_oid_column, "%d", IsDlgButtonChecked(hdlg, DS_SHOWOIDCOLUMN));
302

303 304
					/* Datasource Connection Settings */
					GetDlgItemText(hdlg, DS_CONNSETTINGS, ci->conn_settings, sizeof(ci->conn_settings));
305 306


307
					/* fall through */
308

309 310 311 312
				case IDCANCEL:
					EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK);
					return TRUE;
			}
313 314 315 316 317
	}

	return FALSE;
}

318
#endif	 /* WIN32 */
Byron Nikolaidis's avatar
Byron Nikolaidis committed
319

320
void
321
makeConnectString(char *connect_string, ConnInfo * ci)
322
{
323 324
	char		got_dsn = (ci->dsn[0] != '\0');
	char		encoded_conn_settings[LARGE_REGISTRY_LEN];
325

326
	/* fundamental info */
Byron Nikolaidis's avatar
Byron Nikolaidis committed
327
	sprintf(connect_string, "%s=%s;DATABASE=%s;SERVER=%s;PORT=%s;UID=%s;PWD=%s",
328 329 330 331 332 333 334
			got_dsn ? "DSN" : "DRIVER",
			got_dsn ? ci->dsn : ci->driver,
			ci->database,
			ci->server,
			ci->port,
			ci->username,
			ci->password);
Byron Nikolaidis's avatar
Byron Nikolaidis committed
335 336 337

	encode(ci->conn_settings, encoded_conn_settings);

338 339 340 341 342 343 344 345 346 347
	/* extra info */
	sprintf(&connect_string[strlen(connect_string)],
			";READONLY=%s;PROTOCOL=%s;FAKEOIDINDEX=%s;SHOWOIDCOLUMN=%s;ROWVERSIONING=%s;SHOWSYSTEMTABLES=%s;CONNSETTINGS=%s",
			ci->onlyread,
			ci->protocol,
			ci->fake_oid_index,
			ci->show_oid_column,
			ci->row_versioning,
			ci->show_system_tables,
			encoded_conn_settings);
348 349 350
}

void
351
copyAttributes(ConnInfo * ci, char *attribute, char *value)
352
{
353
	if (stricmp(attribute, "DSN") == 0)
354 355
		strcpy(ci->dsn, value);

356
	else if (stricmp(attribute, "driver") == 0)
357 358
		strcpy(ci->driver, value);

359
	else if (stricmp(attribute, INI_DATABASE) == 0)
360 361
		strcpy(ci->database, value);

362
	else if (stricmp(attribute, INI_SERVER) == 0 || stricmp(attribute, "server") == 0)
363 364
		strcpy(ci->server, value);

365
	else if (stricmp(attribute, INI_USER) == 0 || stricmp(attribute, "uid") == 0)
366 367
		strcpy(ci->username, value);

368
	else if (stricmp(attribute, INI_PASSWORD) == 0 || stricmp(attribute, "pwd") == 0)
369 370
		strcpy(ci->password, value);

371
	else if (stricmp(attribute, INI_PORT) == 0)
372 373 374
		strcpy(ci->port, value);

	else if (stricmp(attribute, INI_READONLY) == 0)
375
		strcpy(ci->onlyread, value);
376 377 378 379 380 381 382 383 384 385

	else if (stricmp(attribute, INI_PROTOCOL) == 0)
		strcpy(ci->protocol, value);

	else if (stricmp(attribute, INI_SHOWOIDCOLUMN) == 0)
		strcpy(ci->show_oid_column, value);

	else if (stricmp(attribute, INI_FAKEOIDINDEX) == 0)
		strcpy(ci->fake_oid_index, value);

Byron Nikolaidis's avatar
Byron Nikolaidis committed
386 387 388
	else if (stricmp(attribute, INI_ROWVERSIONING) == 0)
		strcpy(ci->row_versioning, value);

389 390 391
	else if (stricmp(attribute, INI_SHOWSYSTEMTABLES) == 0)
		strcpy(ci->show_system_tables, value);

392 393
	else if (stricmp(attribute, INI_CONNSETTINGS) == 0)
	{
Byron Nikolaidis's avatar
Byron Nikolaidis committed
394
		decode(value, ci->conn_settings);
395
		/* strcpy(ci->conn_settings, value); */
Byron Nikolaidis's avatar
Byron Nikolaidis committed
396
	}
397

398
	mylog("copyAttributes: DSN='%s',server='%s',dbase='%s',user='%s',passwd='%s',port='%s',onlyread='%s',protocol='%s', conn_settings='%s')\n", ci->dsn, ci->server, ci->database, ci->username, ci->password, ci->port, ci->onlyread, ci->protocol, ci->conn_settings);
399 400 401
}

void
402
getDSNdefaults(ConnInfo * ci)
403 404 405 406
{
	if (ci->port[0] == '\0')
		strcpy(ci->port, DEFAULT_PORT);

407 408
	if (ci->onlyread[0] == '\0')
		sprintf(ci->onlyread, "%d", globals.onlyread);
409

Byron Nikolaidis's avatar
Byron Nikolaidis committed
410 411 412
	if (ci->protocol[0] == '\0')
		strcpy(ci->protocol, globals.protocol);

413 414 415 416 417 418 419 420 421
	if (ci->fake_oid_index[0] == '\0')
		sprintf(ci->fake_oid_index, "%d", DEFAULT_FAKEOIDINDEX);

	if (ci->show_oid_column[0] == '\0')
		sprintf(ci->show_oid_column, "%d", DEFAULT_SHOWOIDCOLUMN);

	if (ci->show_system_tables[0] == '\0')
		sprintf(ci->show_system_tables, "%d", DEFAULT_SHOWSYSTEMTABLES);

Byron Nikolaidis's avatar
Byron Nikolaidis committed
422 423
	if (ci->row_versioning[0] == '\0')
		sprintf(ci->row_versioning, "%d", DEFAULT_ROWVERSIONING);
424 425 426
}


427 428
void
getDSNinfo(ConnInfo * ci, char overwrite)
429
{
430 431
	char	   *DSN = ci->dsn;
	char		encoded_conn_settings[LARGE_REGISTRY_LEN];
432

433 434
/*	If a driver keyword was present, then dont use a DSN and return. */
/*	If DSN is null and no driver, then use the default datasource. */
435 436 437
	if (DSN[0] == '\0')
	{
		if (ci->driver[0] != '\0')
438 439 440 441 442
			return;
		else
			strcpy(DSN, INI_DSN);
	}

443
	/* brute-force chop off trailing blanks... */
444 445
	while (*(DSN + strlen(DSN) - 1) == ' ')
		*(DSN + strlen(DSN) - 1) = '\0';
446

447
	/* Proceed with getting info for the given DSN. */
448

449
	if (ci->desc[0] == '\0' || overwrite)
450 451
		SQLGetPrivateProfileString(DSN, INI_KDESC, "", ci->desc, sizeof(ci->desc), ODBC_INI);

452
	if (ci->server[0] == '\0' || overwrite)
453 454
		SQLGetPrivateProfileString(DSN, INI_SERVER, "", ci->server, sizeof(ci->server), ODBC_INI);

455 456
	if (ci->database[0] == '\0' || overwrite)
		SQLGetPrivateProfileString(DSN, INI_DATABASE, "", ci->database, sizeof(ci->database), ODBC_INI);
457

458
	if (ci->username[0] == '\0' || overwrite)
459 460
		SQLGetPrivateProfileString(DSN, INI_USER, "", ci->username, sizeof(ci->username), ODBC_INI);

461
	if (ci->password[0] == '\0' || overwrite)
462 463
		SQLGetPrivateProfileString(DSN, INI_PASSWORD, "", ci->password, sizeof(ci->password), ODBC_INI);

464
	if (ci->port[0] == '\0' || overwrite)
465 466
		SQLGetPrivateProfileString(DSN, INI_PORT, "", ci->port, sizeof(ci->port), ODBC_INI);

467
	if (ci->onlyread[0] == '\0' || overwrite)
468
		SQLGetPrivateProfileString(DSN, INI_READONLY, "", ci->onlyread, sizeof(ci->onlyread), ODBC_INI);
469

470
	if (ci->show_oid_column[0] == '\0' || overwrite)
471 472
		SQLGetPrivateProfileString(DSN, INI_SHOWOIDCOLUMN, "", ci->show_oid_column, sizeof(ci->show_oid_column), ODBC_INI);

473
	if (ci->fake_oid_index[0] == '\0' || overwrite)
474 475
		SQLGetPrivateProfileString(DSN, INI_FAKEOIDINDEX, "", ci->fake_oid_index, sizeof(ci->fake_oid_index), ODBC_INI);

476
	if (ci->row_versioning[0] == '\0' || overwrite)
Byron Nikolaidis's avatar
Byron Nikolaidis committed
477 478
		SQLGetPrivateProfileString(DSN, INI_ROWVERSIONING, "", ci->row_versioning, sizeof(ci->row_versioning), ODBC_INI);

479
	if (ci->show_system_tables[0] == '\0' || overwrite)
480 481
		SQLGetPrivateProfileString(DSN, INI_SHOWSYSTEMTABLES, "", ci->show_system_tables, sizeof(ci->show_system_tables), ODBC_INI);

482
	if (ci->protocol[0] == '\0' || overwrite)
483 484
		SQLGetPrivateProfileString(DSN, INI_PROTOCOL, "", ci->protocol, sizeof(ci->protocol), ODBC_INI);

485 486
	if (ci->conn_settings[0] == '\0' || overwrite)
	{
Byron Nikolaidis's avatar
Byron Nikolaidis committed
487 488 489 490
		SQLGetPrivateProfileString(DSN, INI_CONNSETTINGS, "", encoded_conn_settings, sizeof(encoded_conn_settings), ODBC_INI);
		decode(encoded_conn_settings, ci->conn_settings);
	}

491
	if (ci->translation_dll[0] == '\0' || overwrite)
Byron Nikolaidis's avatar
Byron Nikolaidis committed
492 493
		SQLGetPrivateProfileString(DSN, INI_TRANSLATIONDLL, "", ci->translation_dll, sizeof(ci->translation_dll), ODBC_INI);

494
	if (ci->translation_option[0] == '\0' || overwrite)
Byron Nikolaidis's avatar
Byron Nikolaidis committed
495
		SQLGetPrivateProfileString(DSN, INI_TRANSLATIONOPTION, "", ci->translation_option, sizeof(ci->translation_option), ODBC_INI);
496

497

498
	/* Allow override of odbcinst.ini parameters here */
499 500 501
	getGlobalDefaults(DSN, ODBC_INI, TRUE);


502 503 504 505 506 507 508
	qlog("DSN info: DSN='%s',server='%s',port='%s',dbase='%s',user='%s',passwd='%s'\n",
		 DSN,
		 ci->server,
		 ci->port,
		 ci->database,
		 ci->username,
		 ci->password);
509
	qlog("          onlyread='%s',protocol='%s',showoid='%s',fakeoidindex='%s',showsystable='%s'\n",
510 511 512 513 514
		 ci->onlyread,
		 ci->protocol,
		 ci->show_oid_column,
		 ci->fake_oid_index,
		 ci->show_system_tables);
515
	qlog("          conn_settings='%s'\n",
516
		 ci->conn_settings);
Byron Nikolaidis's avatar
Byron Nikolaidis committed
517
	qlog("          translation_dll='%s',translation_option='%s'\n",
518 519
		 ci->translation_dll,
		 ci->translation_option);
520 521 522 523 524
}


/*	This is for datasource based options only */
void
525
writeDSNinfo(ConnInfo * ci)
526
{
527 528
	char	   *DSN = ci->dsn;
	char		encoded_conn_settings[LARGE_REGISTRY_LEN];
529

530
	encode(ci->conn_settings, encoded_conn_settings);
531

532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
	SQLWritePrivateProfileString(DSN,
								 INI_KDESC,
								 ci->desc,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_DATABASE,
								 ci->database,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_SERVER,
								 ci->server,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_PORT,
								 ci->port,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_USER,
								 ci->username,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_PASSWORD,
								 ci->password,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_READONLY,
								 ci->onlyread,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_SHOWOIDCOLUMN,
								 ci->show_oid_column,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_FAKEOIDINDEX,
								 ci->fake_oid_index,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_ROWVERSIONING,
								 ci->row_versioning,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_SHOWSYSTEMTABLES,
								 ci->show_system_tables,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_PROTOCOL,
								 ci->protocol,
								 ODBC_INI);

	SQLWritePrivateProfileString(DSN,
								 INI_CONNSETTINGS,
								 encoded_conn_settings,
								 ODBC_INI);
596 597 598 599 600 601
}


/*	This function reads the ODBCINST.INI portion of
	the registry and gets any driver defaults.
*/
602 603
void
getGlobalDefaults(char *section, char *filename, char override)
604
{
605
	char		temp[256];
606 607


608 609 610 611 612
	/* Fetch Count is stored in driver section */
	SQLGetPrivateProfileString(section, INI_FETCH, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
	{
613
		globals.fetch_max = atoi(temp);
614
		/* sanity check if using cursors */
615 616 617
		if (globals.fetch_max <= 0)
			globals.fetch_max = FETCH_MAX;
	}
618
	else if (!override)
619 620 621
		globals.fetch_max = FETCH_MAX;


622 623 624 625
	/* Socket Buffersize is stored in driver section */
	SQLGetPrivateProfileString(section, INI_SOCKET, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
626
		globals.socket_buffersize = atoi(temp);
627
	else if (!override)
628 629 630
		globals.socket_buffersize = SOCK_BUFFER_SIZE;


631 632 633 634
	/* Debug is stored in the driver section */
	SQLGetPrivateProfileString(section, INI_DEBUG, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
635
		globals.debug = atoi(temp);
636
	else if (!override)
637
		globals.debug = DEFAULT_DEBUG;
638 639


640 641 642 643
	/* CommLog is stored in the driver section */
	SQLGetPrivateProfileString(section, INI_COMMLOG, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
644
		globals.commlog = atoi(temp);
645
	else if (!override)
646
		globals.commlog = DEFAULT_COMMLOG;
647 648


649 650 651 652
	/* Optimizer is stored in the driver section only */
	SQLGetPrivateProfileString(section, INI_OPTIMIZER, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
653
		globals.disable_optimizer = atoi(temp);
654
	else if (!override)
655
		globals.disable_optimizer = DEFAULT_OPTIMIZER;
656

657 658 659 660
	/* KSQO is stored in the driver section only */
	SQLGetPrivateProfileString(section, INI_KSQO, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
661
		globals.ksqo = atoi(temp);
662
	else if (!override)
663
		globals.ksqo = DEFAULT_KSQO;
664

665 666 667 668
	/* Recognize Unique Index is stored in the driver section only */
	SQLGetPrivateProfileString(section, INI_UNIQUEINDEX, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
669
		globals.unique_index = atoi(temp);
670
	else if (!override)
671
		globals.unique_index = DEFAULT_UNIQUEINDEX;
672 673


674 675 676 677
	/* Unknown Sizes is stored in the driver section only */
	SQLGetPrivateProfileString(section, INI_UNKNOWNSIZES, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
678
		globals.unknown_sizes = atoi(temp);
679
	else if (!override)
680
		globals.unknown_sizes = DEFAULT_UNKNOWNSIZES;
681 682


683 684 685 686
	/* Lie about supported functions? */
	SQLGetPrivateProfileString(section, INI_LIE, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
687
		globals.lie = atoi(temp);
688
	else if (!override)
689
		globals.lie = DEFAULT_LIE;
690

691 692 693 694
	/* Parse statements */
	SQLGetPrivateProfileString(section, INI_PARSE, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
Byron Nikolaidis's avatar
Byron Nikolaidis committed
695
		globals.parse = atoi(temp);
696
	else if (!override)
697
		globals.parse = DEFAULT_PARSE;
698

699 700 701 702
	/* SQLCancel calls SQLFreeStmt in Driver Manager */
	SQLGetPrivateProfileString(section, INI_CANCELASFREESTMT, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
703
		globals.cancel_as_freestmt = atoi(temp);
704
	else if (!override)
705 706
		globals.cancel_as_freestmt = DEFAULT_CANCELASFREESTMT;

707 708


709 710 711 712
	/* UseDeclareFetch is stored in the driver section only */
	SQLGetPrivateProfileString(section, INI_USEDECLAREFETCH, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
713
		globals.use_declarefetch = atoi(temp);
714
	else if (!override)
715
		globals.use_declarefetch = DEFAULT_USEDECLAREFETCH;
716 717


718 719 720 721
	/* Max Varchar Size */
	SQLGetPrivateProfileString(section, INI_MAXVARCHARSIZE, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
722
		globals.max_varchar_size = atoi(temp);
723
	else if (!override)
724
		globals.max_varchar_size = MAX_VARCHAR_SIZE;
725

726 727 728 729
	/* Max TextField Size */
	SQLGetPrivateProfileString(section, INI_MAXLONGVARCHARSIZE, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
730
		globals.max_longvarchar_size = atoi(temp);
731
	else if (!override)
732
		globals.max_longvarchar_size = TEXT_FIELD_SIZE;
733

734 735 736 737
	/* Text As LongVarchar	*/
	SQLGetPrivateProfileString(section, INI_TEXTASLONGVARCHAR, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
738
		globals.text_as_longvarchar = atoi(temp);
739
	else if (!override)
740
		globals.text_as_longvarchar = DEFAULT_TEXTASLONGVARCHAR;
741

742 743 744 745
	/* Unknowns As LongVarchar	*/
	SQLGetPrivateProfileString(section, INI_UNKNOWNSASLONGVARCHAR, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
746
		globals.unknowns_as_longvarchar = atoi(temp);
747
	else if (!override)
748
		globals.unknowns_as_longvarchar = DEFAULT_UNKNOWNSASLONGVARCHAR;
749

750 751 752 753
	/* Bools As Char */
	SQLGetPrivateProfileString(section, INI_BOOLSASCHAR, "",
							   temp, sizeof(temp), filename);
	if (temp[0])
754
		globals.bools_as_char = atoi(temp);
755
	else if (!override)
756
		globals.bools_as_char = DEFAULT_BOOLSASCHAR;
757

758 759 760 761 762 763 764 765 766
	/* Extra Systable prefixes */

	/*
	 * Use @@@ to distinguish between blank extra prefixes and no key
	 * entry
	 */
	SQLGetPrivateProfileString(section, INI_EXTRASYSTABLEPREFIXES, "@@@",
							   temp, sizeof(temp), filename);
	if (strcmp(temp, "@@@"))
767
		strcpy(globals.extra_systable_prefixes, temp);
768
	else if (!override)
769
		strcpy(globals.extra_systable_prefixes, DEFAULT_EXTRASYSTABLEPREFIXES);
770

771 772 773
	mylog("globals.extra_systable_prefixes = '%s'\n", globals.extra_systable_prefixes);


774 775 776
	/* Dont allow override of an override! */
	if (!override)
	{
Bruce Momjian's avatar
Bruce Momjian committed
777

778 779 780 781 782 783
		/*
		 * ConnSettings is stored in the driver section and per datasource
		 * for override
		 */
		SQLGetPrivateProfileString(section, INI_CONNSETTINGS, "",
		 globals.conn_settings, sizeof(globals.conn_settings), filename);
784

785 786 787 788
		/* Default state for future DSN's Readonly attribute */
		SQLGetPrivateProfileString(section, INI_READONLY, "",
								   temp, sizeof(temp), filename);
		if (temp[0])
789
			globals.onlyread = atoi(temp);
Byron Nikolaidis's avatar
Byron Nikolaidis committed
790
		else
791
			globals.onlyread = DEFAULT_READONLY;
Byron Nikolaidis's avatar
Byron Nikolaidis committed
792

793 794 795 796 797 798 799 800
		/*
		 * Default state for future DSN's protocol attribute This isn't a
		 * real driver option YET.	This is more intended for
		 * customization from the install.
		 */
		SQLGetPrivateProfileString(section, INI_PROTOCOL, "@@@",
								   temp, sizeof(temp), filename);
		if (strcmp(temp, "@@@"))
Byron Nikolaidis's avatar
Byron Nikolaidis committed
801
			strcpy(globals.protocol, temp);
802
		else
Byron Nikolaidis's avatar
Byron Nikolaidis committed
803
			strcpy(globals.protocol, DEFAULT_PROTOCOL);
804
	}
805 806 807 808
}


/*	This function writes any global parameters (that can be manipulated)
809
	to the ODBCINST.INI portion of the registry
810
*/
811 812
void
updateGlobals(void)
813
{
814
	char		tmp[128];
815 816 817

	sprintf(tmp, "%d", globals.fetch_max);
	SQLWritePrivateProfileString(DBMS_NAME,
818
								 INI_FETCH, tmp, ODBCINST_INI);
819 820 821

	sprintf(tmp, "%d", globals.commlog);
	SQLWritePrivateProfileString(DBMS_NAME,
822
								 INI_COMMLOG, tmp, ODBCINST_INI);
823 824 825

	sprintf(tmp, "%d", globals.disable_optimizer);
	SQLWritePrivateProfileString(DBMS_NAME,
826
								 INI_OPTIMIZER, tmp, ODBCINST_INI);
827

828 829
	sprintf(tmp, "%d", globals.ksqo);
	SQLWritePrivateProfileString(DBMS_NAME,
830
								 INI_KSQO, tmp, ODBCINST_INI);
831

832 833
	sprintf(tmp, "%d", globals.unique_index);
	SQLWritePrivateProfileString(DBMS_NAME,
834
								 INI_UNIQUEINDEX, tmp, ODBCINST_INI);
835

836
	sprintf(tmp, "%d", globals.onlyread);
837
	SQLWritePrivateProfileString(DBMS_NAME,
838
								 INI_READONLY, tmp, ODBCINST_INI);
839 840 841

	sprintf(tmp, "%d", globals.use_declarefetch);
	SQLWritePrivateProfileString(DBMS_NAME,
842
								 INI_USEDECLAREFETCH, tmp, ODBCINST_INI);
843 844 845

	sprintf(tmp, "%d", globals.unknown_sizes);
	SQLWritePrivateProfileString(DBMS_NAME,
846
								 INI_UNKNOWNSIZES, tmp, ODBCINST_INI);
847 848 849

	sprintf(tmp, "%d", globals.text_as_longvarchar);
	SQLWritePrivateProfileString(DBMS_NAME,
850
							   INI_TEXTASLONGVARCHAR, tmp, ODBCINST_INI);
851 852 853

	sprintf(tmp, "%d", globals.unknowns_as_longvarchar);
	SQLWritePrivateProfileString(DBMS_NAME,
854
						   INI_UNKNOWNSASLONGVARCHAR, tmp, ODBCINST_INI);
855 856 857

	sprintf(tmp, "%d", globals.bools_as_char);
	SQLWritePrivateProfileString(DBMS_NAME,
858
								 INI_BOOLSASCHAR, tmp, ODBCINST_INI);
859

Byron Nikolaidis's avatar
Byron Nikolaidis committed
860 861
	sprintf(tmp, "%d", globals.parse);
	SQLWritePrivateProfileString(DBMS_NAME,
862
								 INI_PARSE, tmp, ODBCINST_INI);
Byron Nikolaidis's avatar
Byron Nikolaidis committed
863

864 865
	sprintf(tmp, "%d", globals.cancel_as_freestmt);
	SQLWritePrivateProfileString(DBMS_NAME,
866
								 INI_CANCELASFREESTMT, tmp, ODBCINST_INI);
867

868 869
	sprintf(tmp, "%d", globals.max_varchar_size);
	SQLWritePrivateProfileString(DBMS_NAME,
870
								 INI_MAXVARCHARSIZE, tmp, ODBCINST_INI);
871 872 873

	sprintf(tmp, "%d", globals.max_longvarchar_size);
	SQLWritePrivateProfileString(DBMS_NAME,
874
							  INI_MAXLONGVARCHARSIZE, tmp, ODBCINST_INI);
875 876

	SQLWritePrivateProfileString(DBMS_NAME,
877
								 INI_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes, ODBCINST_INI);
878 879

	SQLWritePrivateProfileString(DBMS_NAME,
880
				  INI_CONNSETTINGS, globals.conn_settings, ODBCINST_INI);
881
}