freetds AT lists.ibiblio.org
Subject: FreeTDS Development Group
List archive
Re: [freetds] Unicode: Need for a DSN parameter to define thecharset
- From: Sebastien FLAESCH <sf AT 4js.com>
- To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
- Subject: Re: [freetds] Unicode: Need for a DSN parameter to define thecharset
- Date: Wed, 16 Jan 2008 09:49:07 +0100
New version of patch proposal, case insensitive for yes, no, on, off, true,
false config params.
Seb
James K. Lowden wrote:
Sebastien FLAESCH wrote:
Should we extend the tds_config_boolean() function to use strcasecmp()
for all possible string values (yes, no, true, false, on, off)?
Yes. And thank you for taking the time to do it right.
Best,
--jkl
_______________________________________________
FreeTDS mailing list
FreeTDS AT lists.ibiblio.org
http://lists.ibiblio.org/mailman/listinfo/freetds
Index: include/tds.h =================================================================== RCS file: /cvsroot/freetds/freetds/include/tds.h,v retrieving revision 1.284 diff -c -r1.284 tds.h *** include/tds.h 27 Dec 2007 13:45:22 -0000 1.284 --- include/tds.h 16 Jan 2008 08:48:55 -0000 *************** *** 1387,1392 **** --- 1387,1393 ---- typedef void (*TDSCONFPARSE) (const char *option, const char *value, void *param); int tds_read_conf_section(FILE * in, const char *section, TDSCONFPARSE tds_conf_parse, void *parse_param); int tds_read_conf_file(TDSCONNECTION * connection, const char *server); + void tds_parse_conf_section(const char *option, const char *value, void *param); TDSCONNECTION *tds_read_config_info(TDSSOCKET * tds, TDSLOGIN * login, TDSLOCALE * locale); void tds_fix_connection(TDSCONNECTION * connection); void tds_config_verstr(const char *tdsver, TDSCONNECTION * connection); Index: src/odbc/connectparams.c =================================================================== RCS file: /cvsroot/freetds/freetds/src/odbc/connectparams.c,v retrieving revision 1.72 diff -c -r1.72 connectparams.c *** src/odbc/connectparams.c 1 Jul 2007 10:10:52 -0000 1.72 --- src/odbc/connectparams.c 16 Jan 2008 08:48:56 -0000 *************** *** 39,44 **** --- 39,60 ---- TDS_RCSID(var, "$Id: connectparams.c,v 1.72 2007/07/01 10:10:52 freddy77 Exp $"); + static const char *odbc_param_Servername = "Servername"; + static const char *odbc_param_Address = "Address"; + static const char *odbc_param_Server = "Server"; + static const char *odbc_param_Port = "Port"; + static const char *odbc_param_Instance = "Instance"; + static const char *odbc_param_TDS_Version = "TDS_Version"; + static const char *odbc_param_Language = "Language"; + static const char *odbc_param_Database = "Database"; + static const char *odbc_param_TextSize = "TextSize"; + static const char *odbc_param_PacketSize = "PacketSize"; + static const char *odbc_param_ClientCharset = "ClientCharset"; + static const char *odbc_param_DumpFile = "DumpFile"; + static const char *odbc_param_DumpFileAppend = "DumpFileAppend"; + static const char *odbc_param_DebugFlags = "DebugFlags"; + static const char *odbc_param_Encryption = "Encryption"; + #if !HAVE_SQLGETPRIVATEPROFILESTRING /* *************** *** 114,119 **** --- 130,142 ---- return 1; } + static int + myGetPrivateProfileString(const char *DSN, const char *key, char *buf) + { + buf[0] = '\0'; + return SQLGetPrivateProfileString(DSN, key, "", buf, FILENAME_MAX, "odbc.ini"); + } + /** * Read connection information from given DSN * @param DSN DSN name *************** *** 128,135 **** int address_specified = 0; /* use old servername */ ! tmp[0] = '\0'; ! if (SQLGetPrivateProfileString(DSN, "Servername", "", tmp, FILENAME_MAX, "odbc.ini") > 0) { freetds_conf_less = 0; tds_dstr_copy(&connection->server_name, tmp); tds_read_conf_file(connection, tmp); --- 151,157 ---- int address_specified = 0; /* use old servername */ ! if (myGetPrivateProfileString(DSN, odbc_param_Servername, tmp) > 0) { freetds_conf_less = 0; tds_dstr_copy(&connection->server_name, tmp); tds_read_conf_file(connection, tmp); *************** *** 137,152 **** /* search for server (compatible with ms one) */ if (freetds_conf_less) { ! tmp[0] = '\0'; ! if (SQLGetPrivateProfileString(DSN, "Address", "", tmp, FILENAME_MAX, "odbc.ini") > 0) { address_specified = 1; /* TODO parse like MS */ tds_lookup_host(tmp, tmp); tds_dstr_copy(&connection->ip_addr, tmp); } ! ! tmp[0] = '\0'; ! if (SQLGetPrivateProfileString(DSN, "Server", "", tmp, FILENAME_MAX, "odbc.ini") > 0) { tds_dstr_copy(&connection->server_name, tmp); if (!address_specified) { if (!parse_server(tmp, connection)) --- 159,171 ---- /* search for server (compatible with ms one) */ if (freetds_conf_less) { ! if (myGetPrivateProfileString(DSN, odbc_param_Address, tmp) > 0) { address_specified = 1; /* TODO parse like MS */ tds_lookup_host(tmp, tmp); tds_dstr_copy(&connection->ip_addr, tmp); } ! if (myGetPrivateProfileString(DSN, odbc_param_Server, tmp) > 0) { tds_dstr_copy(&connection->server_name, tmp); if (!address_specified) { if (!parse_server(tmp, connection)) *************** *** 155,189 **** } } ! tmp[0] = '\0'; ! if (SQLGetPrivateProfileString(DSN, "Port", "", tmp, FILENAME_MAX, "odbc.ini") > 0) { connection->port = atoi(tmp); - } ! tmp[0] = '\0'; ! if (SQLGetPrivateProfileString(DSN, "TDS_Version", "", tmp, FILENAME_MAX, "odbc.ini") > 0) { tds_config_verstr(tmp, connection); - } ! tmp[0] = '\0'; ! if (SQLGetPrivateProfileString(DSN, "Language", "", tmp, FILENAME_MAX, "odbc.ini") > 0) { tds_dstr_copy(&connection->language, tmp); - } - tmp[0] = '\0'; if (tds_dstr_isempty(&connection->database) ! && SQLGetPrivateProfileString(DSN, "Database", "", tmp, FILENAME_MAX, "odbc.ini") > 0) tds_dstr_copy(&connection->database, tmp); ! tmp[0] = '\0'; ! if (SQLGetPrivateProfileString(DSN, "TextSize", "", tmp, FILENAME_MAX, "odbc.ini") > 0) { ! connection->text_size = atoi(tmp); ! } ! tmp[0] = '\0'; ! if (SQLGetPrivateProfileString(DSN, "PacketSize", "", tmp, FILENAME_MAX, "odbc.ini") > 0) { ! connection->block_size = atoi(tmp); ! } return 1; } --- 174,215 ---- } } ! if (myGetPrivateProfileString(DSN, odbc_param_Port, tmp) > 0) connection->port = atoi(tmp); ! if (myGetPrivateProfileString(DSN, odbc_param_Instance, tmp) > 0) ! tds_dstr_copy(&connection->instance_name, tmp); ! ! if (myGetPrivateProfileString(DSN, odbc_param_TDS_Version, tmp) > 0) tds_config_verstr(tmp, connection); ! if (myGetPrivateProfileString(DSN, odbc_param_Language, tmp) > 0) tds_dstr_copy(&connection->language, tmp); if (tds_dstr_isempty(&connection->database) ! && myGetPrivateProfileString(DSN, odbc_param_Database, tmp) > 0) tds_dstr_copy(&connection->database, tmp); ! if (myGetPrivateProfileString(DSN, odbc_param_TextSize, tmp) > 0) ! tds_parse_conf_section(TDS_STR_TEXTSZ, tmp, connection); ! if (myGetPrivateProfileString(DSN, odbc_param_PacketSize, tmp) > 0) ! tds_parse_conf_section(TDS_STR_BLKSZ, tmp, connection); ! ! if (myGetPrivateProfileString(DSN, odbc_param_ClientCharset, tmp) > 0) ! tds_parse_conf_section(TDS_STR_CLCHARSET, tmp, connection); ! ! if (myGetPrivateProfileString(DSN, odbc_param_DumpFile, tmp) > 0) ! tds_parse_conf_section(TDS_STR_DUMPFILE, tmp, connection); ! ! if (myGetPrivateProfileString(DSN, odbc_param_DumpFileAppend, tmp) > 0) ! tds_parse_conf_section(TDS_STR_APPENDMODE, tmp, connection); ! ! if (myGetPrivateProfileString(DSN, odbc_param_DebugFlags, tmp) > 0) ! tds_parse_conf_section(TDS_STR_DEBUGFLAGS, tmp, connection); ! ! if (myGetPrivateProfileString(DSN, odbc_param_Encryption, tmp) > 0) ! tds_parse_conf_section(TDS_STR_ENCRYPTION, tmp, connection); return 1; } *************** *** 279,294 **** } else if (strcasecmp(option, "WSID") == 0) { dest_s = &connection->client_host_name; } else if (strcasecmp(option, "LANGUAGE") == 0) { ! dest_s = &connection->language; ! } else if (strcasecmp(option, "Port") == 0) { ! connection->port = atoi(tds_dstr_cstr(&value)); ! } else if (strcasecmp(option, "TDS_Version") == 0) { ! tds_config_verstr(tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, "TextSize") == 0) { ! connection->text_size = atoi(tds_dstr_cstr(&value)); ! } else if (strcasecmp(option, "PacketSize") == 0) { ! connection->block_size = atoi(tds_dstr_cstr(&value)); ! /* TODO "Address" field */ } /* copy to destination */ --- 305,332 ---- } else if (strcasecmp(option, "WSID") == 0) { dest_s = &connection->client_host_name; } else if (strcasecmp(option, "LANGUAGE") == 0) { ! tds_parse_conf_section(TDS_STR_LANGUAGE, tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, odbc_param_Port) == 0) { ! tds_parse_conf_section(TDS_STR_PORT, tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, odbc_param_Instance) == 0) { ! tds_parse_conf_section(TDS_STR_INSTANCE, tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, odbc_param_TDS_Version) == 0) { ! tds_parse_conf_section(TDS_STR_VERSION, tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, odbc_param_TextSize) == 0) { ! tds_parse_conf_section(TDS_STR_TEXTSZ, tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, odbc_param_PacketSize) == 0) { ! tds_parse_conf_section(TDS_STR_BLKSZ, tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, odbc_param_ClientCharset) == 0) { ! tds_parse_conf_section(TDS_STR_CLCHARSET, tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, odbc_param_DumpFile) == 0) { ! tds_parse_conf_section(TDS_STR_DUMPFILE, tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, odbc_param_DumpFileAppend) == 0) { ! tds_parse_conf_section(TDS_STR_APPENDMODE, tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, odbc_param_DebugFlags) == 0) { ! tds_parse_conf_section(TDS_STR_DEBUGFLAGS, tds_dstr_cstr(&value), connection); ! } else if (strcasecmp(option, odbc_param_Encryption) == 0) { ! tds_parse_conf_section(TDS_STR_ENCRYPTION, tds_dstr_cstr(&value), connection); ! /* TODO odbc_param_Address field */ } /* copy to destination */ *************** *** 487,492 **** --- 525,543 ---- NULL }; + static const char *const aEncryption[] = { + TDS_STR_ENCRYPTION_OFF, + TDS_STR_ENCRYPTION_REQUEST, + TDS_STR_ENCRYPTION_REQUIRE, + NULL + }; + + static const char *const aBoolean[] = { + "Yes", + "No", + NULL + }; + /* static const char *aAuth[] = { "Server", *************** *** 496,624 **** }; */ ! int ! ODBCINSTGetProperties(HODBCINSTPROPERTY hLastProperty) { hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); hLastProperty = hLastProperty->pNext; memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT; ! tds_strlcpy(hLastProperty->szName, "Servername", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("Name of FreeTDS connection to connect to.\n" ! "This server name refer to entry in freetds.conf file, not real server name.\n" ! "This property cannot be used with Server property."); ! ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT; ! tds_strlcpy(hLastProperty->szName, "Server", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("Name of server to connect to.\n" ! "This should be the name of real server.\n" ! "This property cannot be used with Servername property."); ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT; ! tds_strlcpy(hLastProperty->szName, "Address", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("The hostname or ip address of the server."); ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT; ! tds_strlcpy(hLastProperty->szName, "Port", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "1433", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("TCP/IP Port to connect to."); ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT; ! tds_strlcpy(hLastProperty->szName, "Database", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("Default database."); ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_LISTBOX; ! hLastProperty->aPromptData = malloc(sizeof(aTDSver)); ! memcpy(hLastProperty->aPromptData, aTDSver, sizeof(aTDSver)); ! tds_strlcpy(hLastProperty->szName, "TDS_Version", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "4.2", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("The TDS protocol version.\n" ! " 4.2 MSSQL 6.5 or Sybase < 10.x\n" ! " 5.0 Sybase >= 10.x\n" " 7.0 MSSQL 7 or MSSQL 2000\n" " 8.0 MSSQL 2000"); ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_COMBOBOX; ! hLastProperty->aPromptData = malloc(sizeof(aLanguage)); ! memcpy(hLastProperty->aPromptData, aLanguage, sizeof(aLanguage)); ! tds_strlcpy(hLastProperty->szName, "Language", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "us_english", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("The default language setting."); ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_HIDDEN; ! tds_strlcpy(hLastProperty->szName, "TextSize", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("Text datatype limit."); /* ??? in odbc.ini ??? */ /* ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT; ! tds_strlcpy(hLastProperty->szName, "UID", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("User ID (Beware of security issues)."); ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT; ! tds_strlcpy(hLastProperty->szName, "PWD", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("Password (Beware of security issues)."); */ /* ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_LISTBOX; ! hLastProperty->aPromptData = malloc(sizeof(aAuth)); ! memcpy(hLastProperty->aPromptData, aAuth, sizeof(aAuth)); ! tds_strlcpy(hLastProperty->szName, "Authentication", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "Server", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("The server authentication mechanism."); */ ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT; ! tds_strlcpy(hLastProperty->szName, "Domain", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("The default domain to use when using Domain Authentication."); ! hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); ! hLastProperty = hLastProperty->pNext; ! memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT; ! tds_strlcpy(hLastProperty->szName, "PacketSize", INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, "", INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup("Size of network packets."); return 1; } --- 547,678 ---- }; */ ! static HODBCINSTPROPERTY ! addProperty(HODBCINSTPROPERTY hLastProperty) { hLastProperty->pNext = (HODBCINSTPROPERTY) malloc(sizeof(ODBCINSTPROPERTY)); hLastProperty = hLastProperty->pNext; memset(hLastProperty, 0, sizeof(ODBCINSTPROPERTY)); ! return hLastProperty; ! } ! static HODBCINSTPROPERTY ! definePropertyString(HODBCINSTPROPERTY hLastProperty, const char *name, const char *value, const char *comment) ! { ! hLastProperty = addProperty(hLastProperty); hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_TEXTEDIT; ! tds_strlcpy(hLastProperty->szName, name, INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, value, INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup(comment); ! return hLastProperty; ! } ! static HODBCINSTPROPERTY ! definePropertyBoolean(HODBCINSTPROPERTY hLastProperty, const char *name, const char *value, const char *comment) ! { ! hLastProperty = addProperty(hLastProperty); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_LISTBOX; ! hLastProperty->aPromptData = malloc(sizeof(aBoolean)); ! memcpy(hLastProperty->aPromptData, aBoolean, sizeof(aBoolean)); ! tds_strlcpy(hLastProperty->szName, name, INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, value, INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup(comment); ! return hLastProperty; ! } ! static HODBCINSTPROPERTY ! definePropertyHidden(HODBCINSTPROPERTY hLastProperty, const char *name, const char *value, const char *comment) ! { ! hLastProperty = addProperty(hLastProperty); ! hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_HIDDEN; ! tds_strlcpy(hLastProperty->szName, name, INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, value, INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup(comment); ! return hLastProperty; ! } ! static HODBCINSTPROPERTY ! definePropertyList(HODBCINSTPROPERTY hLastProperty, const char *name, const char *value, void *list, int size, const char *comment) ! { ! hLastProperty = addProperty(hLastProperty); hLastProperty->nPromptType = ODBCINST_PROMPTTYPE_LISTBOX; ! hLastProperty->aPromptData = malloc(size); ! memcpy(hLastProperty->aPromptData, list, size); ! tds_strlcpy(hLastProperty->szName, name, INI_MAX_PROPERTY_NAME); ! tds_strlcpy(hLastProperty->szValue, value, INI_MAX_PROPERTY_VALUE); ! hLastProperty->pszHelp = (char *) strdup(comment); ! return hLastProperty; ! } ! int ! ODBCINSTGetProperties(HODBCINSTPROPERTY hLastProperty) ! { ! hLastProperty = definePropertyString(hLastProperty, odbc_param_Servername, "", ! "Name of FreeTDS connection to connect to.\n" ! "This server name refer to entry in freetds.conf file, not real server name.\n" ! "This property cannot be used with Server property."); ! ! hLastProperty = definePropertyString(hLastProperty, odbc_param_Server, "", ! "Name of server to connect to.\n" ! "This should be the name of real server.\n" ! "This property cannot be used with Servername property."); ! ! hLastProperty = definePropertyString(hLastProperty, odbc_param_Address, "", ! "The hostname or ip address of the server."); ! ! hLastProperty = definePropertyString(hLastProperty, odbc_param_Port, "1433", ! "TCP/IP Port to connect to."); ! ! hLastProperty = definePropertyString(hLastProperty, odbc_param_Database, "", ! "Default database."); ! ! hLastProperty = definePropertyList(hLastProperty, odbc_param_TDS_Version, "4.2", (void*) aTDSver, sizeof(aTDSver), ! "The TDS protocol version.\n" ! " 4.2 MSSQL 6.5 or Sybase < 10.x\n" ! " 5.0 Sybase >= 10.x\n" ! " 7.0 MSSQL 7 or MSSQL 2000\n" ! " 8.0 MSSQL 2000"); ! hLastProperty = definePropertyList(hLastProperty, odbc_param_Language, "us_english", (void*) aLanguage, sizeof(aLanguage), ! "The default language setting."); ! ! hLastProperty = definePropertyHidden(hLastProperty, odbc_param_TextSize, "", ! "Text datatype limit."); /* ??? in odbc.ini ??? */ /* ! hLastProperty = definePropertyString(hLastProperty, odbc_param_UID, "", ! "User ID (Beware of security issues)."); ! hLastProperty = definePropertyString(hLastProperty, odbc_param_PWD, "", ! "Password (Beware of security issues)."); */ /* ! hLastProperty = definePropertyList(hLastProperty, odbc_param_Authentication, "Server", aAuth, sizeof(aAuth), ! "The server authentication mechanism."); ! ! hLastProperty = definePropertyString(hLastProperty, odbc_param_Domain, "", ! "The default domain to use when using Domain Authentication."); */ ! hLastProperty = definePropertyString(hLastProperty, odbc_param_PacketSize, "", ! "Size of network packets."); ! hLastProperty = definePropertyString(hLastProperty, odbc_param_ClientCharset, "", ! "The client character set name to convert application characters to UCS-2 in TDS 7.0 and higher."); ! ! hLastProperty = definePropertyString(hLastProperty, odbc_param_DumpFile, "", ! "Specifies the location of a tds dump file and turns on logging."); ! ! hLastProperty = definePropertyBoolean(hLastProperty, odbc_param_DumpFileAppend, "", ! "Appends dump file instead of overwriting it. Useful for debugging when many processes are active."); ! ! hLastProperty = definePropertyString(hLastProperty, odbc_param_DebugFlags, "", ! "Sets granularity of logging. A set of bit that specify levels and informations. See table below for bit specification."); ! ! hLastProperty = definePropertyList(hLastProperty, odbc_param_Encryption, TDS_STR_ENCRYPTION_OFF, aEncryption, sizeof(aEncryption), ! "The encryption method."); return 1; } Index: src/tds/config.c =================================================================== RCS file: /cvsroot/freetds/freetds/src/tds/config.c,v retrieving revision 1.132 diff -c -r1.132 config.c *** src/tds/config.c 23 Dec 2007 21:12:02 -0000 1.132 --- src/tds/config.c 16 Jan 2008 08:48:56 -0000 *************** *** 84,90 **** static void tds_config_env_tdsport(TDSCONNECTION * connection); static void tds_config_env_tdshost(TDSCONNECTION * connection); static int tds_read_conf_sections(FILE * in, const char *server, TDSCONNECTION * connection); - static void tds_parse_conf_section(const char *option, const char *value, void *param); static void tds_read_interfaces(const char *server, TDSCONNECTION * connection); static int tds_config_boolean(const char *value); static int parse_server_name_for_port(TDSCONNECTION * connection, TDSLOGIN * login); --- 84,89 ---- *************** *** 349,361 **** return tds_read_conf_section(in, server, tds_parse_conf_section, connection); } static int tds_config_boolean(const char *value) { ! if (!strcmp(value, "yes") || !strcmp(value, "on") || !strcmp(value, "true") || !strcmp(value, "1")) ! return 1; ! if (!strcmp(value, "no") || !strcmp(value, "off") || !strcmp(value, "false") || !strcmp(value, "0")) ! return 0; tdsdump_log(TDS_DBG_INFO1, "UNRECOGNIZED boolean value: '%s'. Treating as 'no'.\n", value); return 0; } --- 348,374 ---- return tds_read_conf_section(in, server, tds_parse_conf_section, connection); } + static struct { + char *value; + unsigned char to_return; + } boolean_values[] = { + { "yes", 1 }, + { "no", 0 }, + { "on", 1 }, + { "off", 0 }, + { "true", 1 }, + { "false", 0 }, + { NULL, 0 } + }; static int tds_config_boolean(const char *value) { ! int p; ! ! for (p = 0; boolean_values[p].value; p++) { ! if (!strcasecmp(value, boolean_values[p].value)) ! return boolean_values[p].to_return; ! } tdsdump_log(TDS_DBG_INFO1, "UNRECOGNIZED boolean value: '%s'. Treating as 'no'.\n", value); return 0; } *************** *** 471,477 **** #undef option } ! static void tds_parse_conf_section(const char *option, const char *value, void *param) { TDSCONNECTION *connection = (TDSCONNECTION *) param; --- 484,491 ---- #undef option } ! /* Also used to scan ODBC.INI entries */ ! void tds_parse_conf_section(const char *option, const char *value, void *param) { TDSCONNECTION *connection = (TDSCONNECTION *) param;
-
Re: [freetds] Unicode: Need for a DSN parameter to define the charset
, (continued)
- Re: [freetds] Unicode: Need for a DSN parameter to define the charset, Sebastien FLAESCH, 01/12/2008
-
Re: [freetds] Unicode: Need for a DSN parameter to define the charset,
Sebastien FLAESCH, 01/15/2008
-
Re: [freetds] Unicode: Need for a DSN parameter to define thecharset,
ZIGLIO, Frediano, VF-IT, 01/15/2008
-
Re: [freetds] Unicode: Need for a DSN parameter to define thecharset,
Sebastien FLAESCH, 01/15/2008
-
Re: [freetds] Unicode: Need for a DSN parameter to define thecharset,
ZIGLIO, Frediano, VF-IT, 01/15/2008
-
Re: [freetds] Unicode: Need for a DSN parameter to define thecharset,
Sebastien FLAESCH, 01/15/2008
- Re: [freetds] Unicode: Need for a DSN parameter to define thecharset, Sebastien FLAESCH, 01/15/2008
- Re: [freetds] Unicode: Need for a DSN parameter to define thecharset, James K. Lowden, 01/15/2008
- Re: [freetds] Unicode: Need for a DSN parameter to define thecharset, Sebastien FLAESCH, 01/15/2008
- Re: [freetds] Unicode: Need for a DSN parameter to define thecharset, James K. Lowden, 01/16/2008
- Re: [freetds] Unicode: Need for a DSN parameter to define thecharset, Sebastien FLAESCH, 01/16/2008
- Re: [freetds] Unicode: Need for a DSN parameter to define thecharset, ZIGLIO, Frediano, VF-IT, 01/18/2008
- Re: [freetds] Unicode: Need for a DSN parameter to define thecharset, Sebastien FLAESCH, 01/18/2008
-
Re: [freetds] Unicode: Need for a DSN parameter to define thecharset,
Sebastien FLAESCH, 01/15/2008
-
Re: [freetds] Unicode: Need for a DSN parameter to define thecharset,
ZIGLIO, Frediano, VF-IT, 01/15/2008
-
Re: [freetds] Unicode: Need for a DSN parameter to define thecharset,
Sebastien FLAESCH, 01/15/2008
-
Re: [freetds] Unicode: Need for a DSN parameter to define thecharset,
ZIGLIO, Frediano, VF-IT, 01/15/2008
Archive powered by MHonArc 2.6.24.