diff options
Diffstat (limited to 'src/interfaces/odbc/dlg_specific.c')
-rw-r--r-- | src/interfaces/odbc/dlg_specific.c | 762 |
1 files changed, 762 insertions, 0 deletions
diff --git a/src/interfaces/odbc/dlg_specific.c b/src/interfaces/odbc/dlg_specific.c new file mode 100644 index 00000000000..558fa66926b --- /dev/null +++ b/src/interfaces/odbc/dlg_specific.c @@ -0,0 +1,762 @@ + +/* Module: dlg_specific.c + * + * 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. + * + * Classes: none + * + * API functions: none + * + * Comments: See "notice.txt" for copyright and license information. + * + */ + +#include "dlg_specific.h" + +extern GLOBAL_VALUES globals; + +void +SetDlgStuff(HWND hdlg, ConnInfo *ci) +{ + /* If driver attribute NOT present, then set the datasource name and description */ + if (ci->driver[0] == '\0') { + 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); +} + +void +GetDlgStuff(HWND hdlg, ConnInfo *ci) +{ + 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)); +} + + + +int CALLBACK driver_optionsProc(HWND hdlg, + WORD wMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch (wMsg) { + case WM_INITDIALOG: + + CheckDlgButton(hdlg, DRV_COMMLOG, globals.commlog); + CheckDlgButton(hdlg, DRV_OPTIMIZER, globals.disable_optimizer); + CheckDlgButton(hdlg, DRV_UNIQUEINDEX, globals.unique_index); + CheckDlgButton(hdlg, DRV_READONLY, globals.readonly); + 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; + } + + 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); + + 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); + + SetDlgItemText(hdlg, DRV_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes); + + /* Driver Connection Settings */ + SetDlgItemText(hdlg, DRV_CONNSETTINGS, globals.conn_settings); + + break; + + 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.unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX); + globals.readonly = 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.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_UNIQUEINDEX, DEFAULT_UNIQUEINDEX); + CheckDlgButton(hdlg, DRV_READONLY, DEFAULT_READONLY); + CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, DEFAULT_USEDECLAREFETCH); + + /* 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; + } + + } + + return FALSE; +} + +int CALLBACK ds_optionsProc(HWND hdlg, + WORD wMsg, + WPARAM wParam, + LPARAM lParam) +{ +ConnInfo *ci; +char buf[128]; +// int unknown_sizes; + + 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); + } + + /* Readonly */ + CheckDlgButton(hdlg, DS_READONLY, atoi(ci->readonly)); + + /* Protocol */ + if (strncmp(ci->protocol, PG62, strlen(PG62)) == 0) + CheckDlgButton(hdlg, DS_PG62, 1); + else + CheckDlgButton(hdlg, DS_PG62, 0); + + /* Unknown Data Type sizes -- currently only needed in Driver options. + switch (atoi(ci->unknown_sizes)) { + case UNKNOWNS_AS_DONTKNOW: + CheckDlgButton(hdlg, DS_UNKNOWN_DONTKNOW, 1); + break; + case UNKNOWNS_AS_LONGEST: + CheckDlgButton(hdlg, DS_UNKNOWN_LONGEST, 1); + break; + case UNKNOWNS_AS_MAX: + default: + CheckDlgButton(hdlg, DS_UNKNOWN_MAX, 1); + break; + } + */ + + CheckDlgButton(hdlg, DS_SHOWOIDCOLUMN, atoi(ci->show_oid_column)); + CheckDlgButton(hdlg, DS_FAKEOIDINDEX, atoi(ci->fake_oid_index)); + CheckDlgButton(hdlg, DS_SHOWSYSTEMTABLES, atoi(ci->show_system_tables)); + + EnableWindow(GetDlgItem(hdlg, DS_FAKEOIDINDEX), atoi(ci->show_oid_column)); + + /* Datasource Connection Settings */ + SetDlgItemText(hdlg, DS_CONNSETTINGS, ci->conn_settings); + break; + + + 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; + + + case IDOK: + + ci = (ConnInfo *)GetWindowLong(hdlg, DWL_USER); + mylog("IDOK: got ci = %u\n", ci); + + /* Readonly */ + sprintf(ci->readonly, "%d", IsDlgButtonChecked(hdlg, DS_READONLY)); + + /* Protocol */ + if ( IsDlgButtonChecked(hdlg, DS_PG62)) + strcpy(ci->protocol, PG62); + else + ci->protocol[0] = '\0'; + + + /* Unknown Data Type sizes -- currently only needed in Driver options. + if (IsDlgButtonChecked(hdlg, DS_UNKNOWN_MAX)) + unknown_sizes = UNKNOWNS_AS_MAX; + else if (IsDlgButtonChecked(hdlg, DS_UNKNOWN_DONTKNOW)) + unknown_sizes = UNKNOWNS_AS_DONTKNOW; + else if (IsDlgButtonChecked(hdlg, DS_UNKNOWN_LONGEST)) + unknown_sizes = UNKNOWNS_AS_LONGEST; + else + unknown_sizes = UNKNOWNS_AS_MAX; + + sprintf(ci->unknown_sizes, "%d", unknown_sizes); + */ + + sprintf(ci->show_system_tables, "%d", IsDlgButtonChecked(hdlg, DS_SHOWSYSTEMTABLES)); + + /* OID Options*/ + sprintf(ci->fake_oid_index, "%d", IsDlgButtonChecked(hdlg, DS_FAKEOIDINDEX)); + sprintf(ci->show_oid_column, "%d", IsDlgButtonChecked(hdlg, DS_SHOWOIDCOLUMN)); + + /* Datasource Connection Settings */ + GetDlgItemText(hdlg, DS_CONNSETTINGS, ci->conn_settings, sizeof(ci->conn_settings)); + + + // fall through + + case IDCANCEL: + EndDialog(hdlg, GET_WM_COMMAND_ID(wParam, lParam) == IDOK); + return TRUE; + } + } + + return FALSE; +} + +void +makeConnectString(char *connect_string, ConnInfo *ci) +{ +char got_dsn = (ci->dsn[0] != '\0'); + + sprintf(connect_string, "%s=%s;DATABASE=%s;SERVER=%s;PORT=%s;UID=%s;READONLY=%s;PWD=%s;PROTOCOL=%s;FAKEOIDINDEX=%s;SHOWOIDCOLUMN=%s;SHOWSYSTEMTABLES=%s;CONNSETTINGS=%s", + got_dsn ? "DSN" : "DRIVER", + got_dsn ? ci->dsn : ci->driver, + ci->database, + ci->server, + ci->port, + ci->username, + ci->readonly, + ci->password, + ci->protocol, +// ci->unknown_sizes, -- currently only needed in Driver options. + ci->fake_oid_index, + ci->show_oid_column, + ci->show_system_tables, + ci->conn_settings); +} + +void +copyAttributes(ConnInfo *ci, char *attribute, char *value) +{ + + if(stricmp(attribute, "DSN") == 0) + strcpy(ci->dsn, value); + + else if(stricmp(attribute, "driver") == 0) + strcpy(ci->driver, value); + + else if(stricmp(attribute, INI_DATABASE) == 0) + strcpy(ci->database, value); + + else if(stricmp(attribute, INI_SERVER) == 0 || stricmp(attribute, "server") == 0) + strcpy(ci->server, value); + + else if(stricmp(attribute, INI_USER) == 0 || stricmp(attribute, "uid") == 0) + strcpy(ci->username, value); + + else if(stricmp(attribute, INI_PASSWORD) == 0 || stricmp(attribute, "pwd") == 0) + strcpy(ci->password, value); + + else if(stricmp(attribute, INI_PORT) == 0) + strcpy(ci->port, value); + + else if (stricmp(attribute, INI_READONLY) == 0) + strcpy(ci->readonly, value); + + else if (stricmp(attribute, INI_PROTOCOL) == 0) + strcpy(ci->protocol, value); + + /* + else if (stricmp(attribute, INI_UNKNOWNSIZES) == 0) + strcpy(ci->unknown_sizes, 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); + + else if (stricmp(attribute, INI_SHOWSYSTEMTABLES) == 0) + strcpy(ci->show_system_tables, value); + + else if (stricmp(attribute, INI_CONNSETTINGS) == 0) + strcpy(ci->conn_settings, value); + + + 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->unknown_sizes, + ci->conn_settings); + +} + +void +getDSNdefaults(ConnInfo *ci) +{ + if (ci->port[0] == '\0') + strcpy(ci->port, DEFAULT_PORT); + + if (ci->readonly[0] == '\0') + sprintf(ci->readonly, "%d", globals.readonly); + +/* -- currently only needed in Driver options. + if (ci->unknown_sizes[0] == '\0') + sprintf(ci->unknown_sizes, "%d", globals.unknown_sizes); +*/ + 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); + +} + + +void +getDSNinfo(ConnInfo *ci, char overwrite) +{ +char *DSN = ci->dsn; + + // 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. + if ( DSN[0] == '\0') { + if ( ci->driver[0] != '\0') + return; + else + strcpy(DSN, INI_DSN); + } + + // Proceed with getting info for the given DSN. + + if ( ci->desc[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_KDESC, "", ci->desc, sizeof(ci->desc), ODBC_INI); + + if ( ci->server[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_SERVER, "", ci->server, sizeof(ci->server), ODBC_INI); + + if ( ci->database[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_DATABASE, "", ci->database, sizeof(ci->database), ODBC_INI); + + if ( ci->username[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_USER, "", ci->username, sizeof(ci->username), ODBC_INI); + + if ( ci->password[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_PASSWORD, "", ci->password, sizeof(ci->password), ODBC_INI); + + if ( ci->port[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_PORT, "", ci->port, sizeof(ci->port), ODBC_INI); + + if ( ci->readonly[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_READONLY, "", ci->readonly, sizeof(ci->readonly), ODBC_INI); + + /* -- currently only needed in Driver options. + if ( ci->unknown_sizes[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_UNKNOWNSIZES, "", ci->unknown_sizes, sizeof(ci->unknown_sizes), ODBC_INI); + */ + if ( ci->show_oid_column[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_SHOWOIDCOLUMN, "", ci->show_oid_column, sizeof(ci->show_oid_column), ODBC_INI); + + if ( ci->fake_oid_index[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_FAKEOIDINDEX, "", ci->fake_oid_index, sizeof(ci->fake_oid_index), ODBC_INI); + + if ( ci->show_system_tables[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_SHOWSYSTEMTABLES, "", ci->show_system_tables, sizeof(ci->show_system_tables), ODBC_INI); + + if ( ci->protocol[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_PROTOCOL, "", ci->protocol, sizeof(ci->protocol), ODBC_INI); + + if ( ci->conn_settings[0] == '\0' || overwrite) + SQLGetPrivateProfileString(DSN, INI_CONNSETTINGS, "", ci->conn_settings, sizeof(ci->conn_settings), ODBC_INI); + + 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); + qlog(" readonly='%s',protocol='%s',showoid='%s',fakeoidindex='%s',showsystable='%s'\n", + ci->readonly, + ci->protocol, + ci->show_oid_column, + ci->fake_oid_index, + // ci->unknown_sizes, + ci->show_system_tables); + qlog(" conn_settings='%s'\n", + ci->conn_settings); +} + + +/* This is for datasource based options only */ +void +writeDSNinfo(ConnInfo *ci) +{ +char *DSN = ci->dsn; + + 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->readonly, + ODBC_INI); + + /* -- currently only needed in Driver options. + SQLWritePrivateProfileString(DSN, + INI_UNKNOWNSIZES, + ci->unknown_sizes, + 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_SHOWSYSTEMTABLES, + ci->show_system_tables, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_PROTOCOL, + ci->protocol, + ODBC_INI); + + SQLWritePrivateProfileString(DSN, + INI_CONNSETTINGS, + ci->conn_settings, + ODBC_INI); +} + + +/* This function reads the ODBCINST.INI portion of + the registry and gets any driver defaults. +*/ +void getGlobalDefaults(void) +{ +char temp[128]; + + + // Fetch Count is stored in driver section + SQLGetPrivateProfileString(DBMS_NAME, INI_FETCH, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] ) { + globals.fetch_max = atoi(temp); + /* sanity check if using cursors */ + if (globals.fetch_max <= 0) + globals.fetch_max = FETCH_MAX; + } + + else + globals.fetch_max = FETCH_MAX; + + + // Socket Buffersize is stored in driver section + SQLGetPrivateProfileString(DBMS_NAME, INI_SOCKET, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] ) + globals.socket_buffersize = atoi(temp); + else + globals.socket_buffersize = SOCK_BUFFER_SIZE; + + + // Debug is stored in the driver section + SQLGetPrivateProfileString(DBMS_NAME, INI_DEBUG, "0", + temp, sizeof(temp), ODBCINST_INI); + globals.debug = atoi(temp); + + + // CommLog is stored in the driver section + SQLGetPrivateProfileString(DBMS_NAME, INI_COMMLOG, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.commlog = DEFAULT_COMMLOG; + else + globals.commlog = atoi(temp); + + + // Optimizer is stored in the driver section only + SQLGetPrivateProfileString(DBMS_NAME, INI_OPTIMIZER, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.disable_optimizer = DEFAULT_OPTIMIZER; + else + globals.disable_optimizer = atoi(temp); + + + // Recognize Unique Index is stored in the driver section only + SQLGetPrivateProfileString(DBMS_NAME, INI_UNIQUEINDEX, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.unique_index = DEFAULT_UNIQUEINDEX; + else + globals.unique_index = atoi(temp); + + + // Unknown Sizes is stored in the driver section AND per datasource + SQLGetPrivateProfileString(DBMS_NAME, INI_UNKNOWNSIZES, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.unknown_sizes = DEFAULT_UNKNOWNSIZES; + else + globals.unknown_sizes = atoi(temp); + + + // Readonly is stored in the driver section AND per datasource + SQLGetPrivateProfileString(DBMS_NAME, INI_READONLY, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.readonly = DEFAULT_READONLY; + else + globals.readonly = atoi(temp); + + + // UseDeclareFetch is stored in the driver section only + SQLGetPrivateProfileString(DBMS_NAME, INI_USEDECLAREFETCH, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.use_declarefetch = DEFAULT_USEDECLAREFETCH; + else + globals.use_declarefetch = atoi(temp); + + + // Max Varchar Size + SQLGetPrivateProfileString(DBMS_NAME, INI_MAXVARCHARSIZE, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.max_varchar_size = MAX_VARCHAR_SIZE; + else + globals.max_varchar_size = atoi(temp); + + // Max TextField Size + SQLGetPrivateProfileString(DBMS_NAME, INI_MAXLONGVARCHARSIZE, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.max_longvarchar_size = TEXT_FIELD_SIZE; + else + globals.max_longvarchar_size = atoi(temp); + + // Text As LongVarchar + SQLGetPrivateProfileString(DBMS_NAME, INI_TEXTASLONGVARCHAR, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.text_as_longvarchar = DEFAULT_TEXTASLONGVARCHAR; + else + globals.text_as_longvarchar = atoi(temp); + + // Unknowns As LongVarchar + SQLGetPrivateProfileString(DBMS_NAME, INI_UNKNOWNSASLONGVARCHAR, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.unknowns_as_longvarchar = DEFAULT_UNKNOWNSASLONGVARCHAR; + else + globals.unknowns_as_longvarchar = atoi(temp); + + // Bools As Char + SQLGetPrivateProfileString(DBMS_NAME, INI_BOOLSASCHAR, "", + temp, sizeof(temp), ODBCINST_INI); + if ( temp[0] == '\0') + globals.bools_as_char = DEFAULT_BOOLSASCHAR; + else + globals.bools_as_char = atoi(temp); + + + // Extra System Table prefixes + SQLGetPrivateProfileString(DBMS_NAME, INI_EXTRASYSTABLEPREFIXES, "@@@", + globals.extra_systable_prefixes, sizeof(globals.extra_systable_prefixes), ODBCINST_INI); + if ( ! strcmp(globals.extra_systable_prefixes, "@@@")) { + strcpy(globals.extra_systable_prefixes, DEFAULT_EXTRASYSTABLEPREFIXES); + } + mylog("globals.extra_systable_prefixes = '%s'\n", globals.extra_systable_prefixes); + + + // ConnSettings is stored in the driver section and per datasource for override + SQLGetPrivateProfileString(DBMS_NAME, INI_CONNSETTINGS, "", + globals.conn_settings, sizeof(globals.conn_settings), ODBCINST_INI); + + +} + + +/* This function writes any global parameters (that can be manipulated) + to the ODBCINST.INI portion of the registry +*/ +void updateGlobals(void) +{ +char tmp[128]; + + sprintf(tmp, "%d", globals.fetch_max); + SQLWritePrivateProfileString(DBMS_NAME, + INI_FETCH, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.commlog); + SQLWritePrivateProfileString(DBMS_NAME, + INI_COMMLOG, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.disable_optimizer); + SQLWritePrivateProfileString(DBMS_NAME, + INI_OPTIMIZER, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.unique_index); + SQLWritePrivateProfileString(DBMS_NAME, + INI_UNIQUEINDEX, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.readonly); + SQLWritePrivateProfileString(DBMS_NAME, + INI_READONLY, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.use_declarefetch); + SQLWritePrivateProfileString(DBMS_NAME, + INI_USEDECLAREFETCH, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.unknown_sizes); + SQLWritePrivateProfileString(DBMS_NAME, + INI_UNKNOWNSIZES, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.text_as_longvarchar); + SQLWritePrivateProfileString(DBMS_NAME, + INI_TEXTASLONGVARCHAR, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.unknowns_as_longvarchar); + SQLWritePrivateProfileString(DBMS_NAME, + INI_UNKNOWNSASLONGVARCHAR, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.bools_as_char); + SQLWritePrivateProfileString(DBMS_NAME, + INI_BOOLSASCHAR, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.max_varchar_size); + SQLWritePrivateProfileString(DBMS_NAME, + INI_MAXVARCHARSIZE, tmp, ODBCINST_INI); + + sprintf(tmp, "%d", globals.max_longvarchar_size); + SQLWritePrivateProfileString(DBMS_NAME, + INI_MAXLONGVARCHARSIZE, tmp, ODBCINST_INI); + + SQLWritePrivateProfileString(DBMS_NAME, + INI_EXTRASYSTABLEPREFIXES, globals.extra_systable_prefixes, ODBCINST_INI); + + SQLWritePrivateProfileString(DBMS_NAME, + INI_CONNSETTINGS, globals.conn_settings, ODBCINST_INI); +} |