home *** CD-ROM | disk | FTP | other *** search
Wrap
/* ** SAMP.RC - This is the resource file for the ODS driver helper DLLs. ** Resources for sample resource DLL. ** ** (C) Copyright 1992-1995 By Microsoft Corp. ** */ #include <windows.h> #include "sql.h" #include "sqlext.h" #include "odbcmsg.h" // ODBC resource defines #include "odbcss.h" #include "odsrc.h" /* All values are set for SQL Server 6.0 as an example */ STRINGTABLE BEGIN /* SQLGetInfo values */ IDS_INFO_OFFSET+SQL_ACTIVE_CONNECTIONS, "0" // Limit not known IDS_INFO_OFFSET+SQL_FETCH_DIRECTION, "1" // SQL_FD_FETCH_NEXT IDS_INFO_OFFSET+SQL_ROW_UPDATES, "N" IDS_INFO_OFFSET+SQL_SERVER_NAME, "select @@SERVERNAME" IDS_INFO_OFFSET+SQL_SEARCH_PATTERN_ESCAPE, "\\" /* Max 5 characters */ IDS_INFO_OFFSET+SQL_ODBC_SQL_CONFORMANCE, "1" // SQL_OSC_CORE IDS_INFO_OFFSET+SQL_DATABASE_NAME, "select DB_NAME()" IDS_INFO_OFFSET+SQL_DBMS_NAME, "sp_server_info 1" IDS_INFO_OFFSET+SQL_DBMS_VER, "sp_server_info 2" IDS_INFO_OFFSET+SQL_ACCESSIBLE_TABLES, "select 'Y'" IDS_INFO_OFFSET+SQL_ACCESSIBLE_PROCEDURES, "Y" IDS_INFO_OFFSET+SQL_PROCEDURES, "Y" IDS_INFO_OFFSET+SQL_CONCAT_NULL_BEHAVIOR, "1" // SQL_CB_NON_NULL IDS_INFO_OFFSET+SQL_CURSOR_COMMIT_BEHAVIOR, "1" // SQL_CB_CLOSE IDS_INFO_OFFSET+SQL_CURSOR_ROLLBACK_BEHAVIOR, "1" // SQL_RB_CLOSE IDS_INFO_OFFSET+SQL_DATA_SOURCE_READ_ONLY, "select 'N'" IDS_INFO_OFFSET+SQL_DEFAULT_TXN_ISOLATION, "select 2" IDS_INFO_OFFSET+SQL_EXPRESSIONS_IN_ORDERBY, "Y" IDS_INFO_OFFSET+SQL_IDENTIFIER_CASE, "4" /* Mixed/Not sensitive */ IDS_INFO_OFFSET+SQL_IDENTIFIER_QUOTE_CHAR, "\042" /* Max 5 characters */ IDS_INFO_OFFSET+SQL_MAX_COLUMN_NAME_LEN, "30" IDS_INFO_OFFSET+SQL_MAX_OWNER_NAME_LEN, "30" IDS_INFO_OFFSET+SQL_MAX_PROCEDURE_NAME_LEN, "36" IDS_INFO_OFFSET+SQL_MAX_QUALIFIER_NAME_LEN, "30" IDS_INFO_OFFSET+SQL_MAX_TABLE_NAME_LEN, "30" IDS_INFO_OFFSET+SQL_MULT_RESULT_SETS, "Y" IDS_INFO_OFFSET+SQL_MULTIPLE_ACTIVE_TXN, "Y" IDS_INFO_OFFSET+SQL_OUTER_JOINS, "Y" IDS_INFO_OFFSET+SQL_QUALIFIER_NAME_SEPARATOR, "." /* Max 5 characters */ IDS_INFO_OFFSET+SQL_SCROLL_CONCURRENCY, "1" // SQL_SCCO_READ_ONLY IDS_INFO_OFFSET+SQL_SCROLL_OPTIONS, "1" // SQL_SO_FORWARD_ONLY IDS_INFO_OFFSET+SQL_TXN_CAPABLE, "2" // SQL_TC_ALL IDS_INFO_OFFSET+SQL_USER_NAME, "select USER_NAME()" IDS_INFO_OFFSET+SQL_CONVERT_FUNCTIONS, "1" IDS_INFO_OFFSET+SQL_NUMERIC_FUNCTIONS, "8388607" /*0x7fffff*/ IDS_INFO_OFFSET+SQL_STRING_FUNCTIONS, "523999" /*0x7fedf*/ IDS_INFO_OFFSET+SQL_SYSTEM_FUNCTIONS, "7" /*0x7*/ IDS_INFO_OFFSET+SQL_TIMEDATE_FUNCTIONS, "131071" /*0x1ffff*/ IDS_INFO_OFFSET+SQL_CONVERT_BIGINT, "0" /*0x0*/ IDS_INFO_OFFSET+SQL_CONVERT_BINARY, "273695" /*0x42d1f*/ IDS_INFO_OFFSET+SQL_CONVERT_BIT, "15743" /*0x3d7f*/ IDS_INFO_OFFSET+SQL_CONVERT_CHAR, "409471" /*0x63f7f*/ IDS_INFO_OFFSET+SQL_CONVERT_DATE, "0" /*0x0*/ IDS_INFO_OFFSET+SQL_CONVERT_DECIMAL, "15743" /*0x3d7f*/ IDS_INFO_OFFSET+SQL_CONVERT_DOUBLE, "0" /*0x0*/ IDS_INFO_OFFSET+SQL_CONVERT_FLOAT, "12671" /*0x317f*/ IDS_INFO_OFFSET+SQL_CONVERT_INTEGER, "15743" /*0x3d7f*/ IDS_INFO_OFFSET+SQL_CONVERT_LONGVARCHAR, "769" /*0x301*/ IDS_INFO_OFFSET+SQL_CONVERT_NUMERIC, "6" /*0x6*/ IDS_INFO_OFFSET+SQL_CONVERT_REAL, "12671" /*0x317f*/ IDS_INFO_OFFSET+SQL_CONVERT_SMALLINT, "15743" /*0x3d7f*/ IDS_INFO_OFFSET+SQL_CONVERT_TIME, "0" /*0x0*/ IDS_INFO_OFFSET+SQL_CONVERT_TIMESTAMP, "134401" /*0x20d01*/ IDS_INFO_OFFSET+SQL_CONVERT_TINYINT, "15743" /*0x3d7f*/ IDS_INFO_OFFSET+SQL_CONVERT_VARBINARY, "273695" /*0x42d1f*/ IDS_INFO_OFFSET+SQL_CONVERT_VARCHAR, "409471" /*0x63f7f*/ IDS_INFO_OFFSET+SQL_CONVERT_LONGVARBINARY, "265216" /*0x40c00*/ IDS_INFO_OFFSET+SQL_TXN_ISOLATION_OPTION, "select 15" //SQL_TXN_READ_UNCOMMITTED | SQL_TXN_READ_COMMITTED | SQL_TXN_REPEATABLE_READ | SQL_TXN_SERIALIZABLE IDS_INFO_OFFSET+SQL_ODBC_SQL_OPT_IEF, "Y" IDS_INFO_OFFSET+SQL_CORRELATION_NAME, "2" /* SQL_CN_ANY */ IDS_INFO_OFFSET+SQL_NON_NULLABLE_COLUMNS, "1" /* SQL_NNC_NON_NULL */ IDS_INFO_OFFSET+SQL_LOCK_TYPES, "0" IDS_INFO_OFFSET+SQL_POS_OPERATIONS, "0" IDS_INFO_OFFSET+SQL_POSITIONED_STATEMENTS, "0" IDS_INFO_OFFSET+SQL_GETDATA_EXTENSIONS, "0" IDS_INFO_OFFSET+SQL_BOOKMARK_PERSISTENCE, "0" IDS_INFO_OFFSET+SQL_STATIC_SENSITIVITY, "0" IDS_INFO_OFFSET+SQL_FILE_USAGE, "0" // SQL_FILE_NOT_SUPPORTED IDS_INFO_OFFSET+SQL_NULL_COLLATION, "1" /* SQL_NC_LOW */ IDS_INFO_OFFSET+SQL_ALTER_TABLE, "1" // SQL_ADD_COLUMN IDS_INFO_OFFSET+SQL_COLUMN_ALIAS, "Y" IDS_INFO_OFFSET+SQL_GROUP_BY, "2" // SQL_GB_GROUP_BY_CONTAINS_SELECT IDS_INFO_OFFSET+SQL_ORDER_BY_COLUMNS_IN_SELECT, "N" IDS_INFO_OFFSET+SQL_OWNER_USAGE, "31"// 0x0000001f IDS_INFO_OFFSET+SQL_QUALIFIER_USAGE, "7" // 0x00000007 IDS_INFO_OFFSET+SQL_QUOTED_IDENTIFIER_CASE, "4" // Mixed/Not sensitive IDS_INFO_OFFSET+SQL_SPECIAL_CHARACTERS, "#$└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷°∙·√ⁿ²■ " IDS_INFO_OFFSET+SQL_SUBQUERIES, "31"// SQL_SQ_COMPARISON|SQL_SQ_EXISTS|SQL_SQ_IN|SQL_SQ_QUANTIFIED|SQL_SQ_CORRELATED_SUBQUERIES IDS_INFO_OFFSET+SQL_UNION, "3" // SQL_U_UNION|SQL_U_UNION_ALL IDS_INFO_OFFSET+SQL_MAX_COLUMNS_IN_GROUP_BY, "16" IDS_INFO_OFFSET+SQL_MAX_COLUMNS_IN_INDEX, "16" IDS_INFO_OFFSET+SQL_MAX_COLUMNS_IN_ORDER_BY, "16" IDS_INFO_OFFSET+SQL_MAX_COLUMNS_IN_SELECT, "4000" IDS_INFO_OFFSET+SQL_MAX_COLUMNS_IN_TABLE, "250" IDS_INFO_OFFSET+SQL_MAX_INDEX_SIZE, "900" IDS_INFO_OFFSET+SQL_MAX_ROW_SIZE_INCLUDES_LONG, "N" IDS_INFO_OFFSET+SQL_MAX_ROW_SIZE, "1962" IDS_INFO_OFFSET+SQL_MAX_STATEMENT_LEN, "0" IDS_INFO_OFFSET+SQL_MAX_TABLES_IN_SELECT, "16" IDS_INFO_OFFSET+SQL_MAX_USER_NAME_LEN, "30" IDS_INFO_OFFSET+SQL_MAX_CHAR_LITERAL_LEN, "0" IDS_INFO_OFFSET+SQL_TIMEDATE_ADD_INTERVALS, "511" // 0x000001ff IDS_INFO_OFFSET+SQL_TIMEDATE_DIFF_INTERVALS, "511" // 0x000001ff IDS_INFO_OFFSET+SQL_NEED_LONG_DATA_LEN, "Y" IDS_INFO_OFFSET+SQL_MAX_BINARY_LITERAL_LEN, "0" IDS_INFO_OFFSET+SQL_LIKE_ESCAPE_CLAUSE, "N" IDS_INFO_OFFSET+SQL_QUALIFIER_LOCATION, "1" // SQL_OL_START IDS_INFO_OFFSET+SQL_OJ_CAPABILITIES_NEW, "127" // SQL_OJ_LEFT | SQL_OJ_RIGHT | SQL_OJ_FULL | SQL_OJ_NESTED | SQL_OJ_NOT_ORDERED | SQL_OJ_INNER | SQL_OJ_ALL_COMPARISON_OPS #if (ODBCVER >= 0x0300) // ODBC 3.0 extensions IDS_INFO_OFFSET+SQL_CONVERT_INTERVAL_YEAR_MONTH,"0" // Intervals not supported IDS_INFO_OFFSET+SQL_CONVERT_INTERVAL_DAY_TIME, "0" // Intervals not supported IDS_INFO_OFFSET+SQL_BATCH_ROW_COUNT, "1" // SQL_BRC_EXPLICIT IDS_INFO_OFFSET+SQL_PARAM_ARRAY_ROW_COUNTS, "0" // SQL_PARC_BATCH IDS_INFO_OFFSET+SQL_LOCATOR_PERSISTENCE, "1" // SQL_LP_HOLDABLE IDS_INFO_OFFSET+SQL_CURSOR_ROW_COUNT, "19" // SQL_CRC_STATIC_EXACT | SQL_CRC_KEYSET_EXACT | SQL_CRC_DYNAMIC_APPROXIMATE IDS_INFO_OFFSET+SQL_INFO_SCHEMA_VIEWS, "0" // Info views not supported IDS_INFO_OFFSET+SQL_LOCATOR_UPDATABILITY, "2" // SQL_LU_ALL IDS_INFO_OFFSET+SQL_LOCATOR_SENSITIVITY, "1" // SQL_LS_DYNAMIC IDS_INFO_OFFSET+SQL_PREDICATE_FIND, "0" // Predicate find not supported IDS_INFO_OFFSET+SQL_BATCH_SUPPORT, "15" // SQL_BS_SELECT_EXPLICIT | SQL_BS_ROW_COUNT_EXPLICIT | SQL_BS_SELECT_PROC | SQL_BS_ROW_COUNT_PROC IDS_INFO_OFFSET+SQL_PARAM_ARRAY_SELECTS, "0" // SQL_PAS_BATCH // XOpen extensions IDS_INFO_OFFSET+SQL_XOPEN_CLI_YEAR, "1995" // IDS_INFO_OFFSET+SQL_CURSOR_SENSITIVITY, "2" // IDS_INFO_OFFSET+SQL_DESCRIBE_PARAMETER, "Y" // IDS_INFO_OFFSET+SQL_CATALOG_NAME, "Y" // IDS_INFO_OFFSET+SQL_COLLATION_SEQ, "select t2.description from syscharsets t1, syscharsets t2, sysconfigures t3 where t1.csid=t2.id and t1.id=t3.value and t3.config=1123" IDS_INFO_OFFSET+SQL_MAX_IDENTIFIER_LEN, "30" // IDS_INFO_OFFSET+SQL_MAX_COLUMNS_IN_FOREIGN_KEY, "16" // IDS_INFO_OFFSET+SQL_MAX_COLUMNS_IN_INSERT, "250" // IDS_INFO_OFFSET+SQL_MAX_COLUMNS_IN_JOIN, "" // IDS_INFO_OFFSET+SQL_MAX_COLUMNS_IN_UPDATE, "250" // IDS_INFO_OFFSET+SQL_MAX_DDL_STATEMENT_SIZE, "0" // IDS_INFO_OFFSET+SQL_MAX_FOREIGN_KEY_SIZE, "1962" // IDS_INFO_OFFSET+SQL_MAX_GROUP_BY_SIZE, "900" // IDS_INFO_OFFSET+SQL_MAX_JOIN_COLUMNS_SIZE, "900" // IDS_INFO_OFFSET+SQL_MAX_ORDER_BY_SIZE, "900" // IDS_INFO_OFFSET+SQL_MAX_PREDICATES, "0" // IDS_INFO_OFFSET+SQL_MAX_SCHEMA_DEFINITION_LEN , "0" // IDS_INFO_OFFSET+SQL_MAX_SUBQUERIES, "15" // IDS_INFO_OFFSET+SQL_MAX_SUBQUERY_NESTING, "15" // IDS_INFO_OFFSET+SQL_MAX_TABLES_IN_CATALOG, "65535" // IDS_INFO_OFFSET+SQL_MAX_UNIQUE_KEY_SIZE, "1962" // IDS_INFO_OFFSET+SQL_ASYNC_MODE, "0" // IDS_INFO_OFFSET+SQL_LOB_LOCATOR, "0" // // IDS_INFO_OFFSET+SQL_ACCESSIBLE_PROCEDURES, "Y" // defined above #endif IDS_AUX_KEYWORDS, "BREAK,BROWSE,BULK,CHECKPOINT,CLUSTERED,COMMITTED,COMPUTE,CONFIRM,CONTROLROW,DATABASE,DBCC,DISK,DUMMY,DUMP,ERRLVL,ERROREXIT,EXIT,FILE,FILLFACTOR,FLOPPY,HOLDLOCK,IDENTITY_INSERT,IDENTITYCOL,IF,KILL,LINENO,LOAD,MIRROREXIT," IDS_AUX_KEYWORDS+1, "NONCLUSTERED,OFF,OFFSETS,ONCE,OVER,PERM,PERMANENT,PLAN,PRINT,PROC,PROCESSEXIT,RAISERROR,READ,READTEXT,RECONFIGURE,REPEATABLE,RETURN,ROWCOUNT,RULE,SAVE,SERIALIZABLE,SETUSER,SHUTDOWN,STATISTICS," IDS_AUX_KEYWORDS+2, "TAPE,TEMP,TEXTSIZE,TRAN,TRIGGER,TRUNCATE,TSEQUEL,UNCOMMITTED,UPDATETEXT,USE,WAITFOR,WHILE,WRITETEXT" IDS_AUX_KEYWORDS+3, "" //Empty string to terminate the keyword list /* String sent to gateway to set corresponding */ /* ODBC transaction isolation level */ /* An empty string means that that level is not supported */ /* Used if IDS_FEATURE_HOLDLOCK_SUPPORT = 'N' */ IDS_ISOLATION_OFFSET+SQL_TXN_READ_UNCOMMITTED, "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" IDS_ISOLATION_OFFSET+SQL_TXN_READ_COMMITTED, "SET TRANSACTION ISOLATION LEVEL READ COMMITTED" IDS_ISOLATION_OFFSET+SQL_TXN_REPEATABLE_READ, "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ" IDS_ISOLATION_OFFSET+SQL_TXN_SERIALIZABLE, "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE" IDS_ISOLATION_OFFSET+SQL_TXN_VERSIONING, "" /* String sent to the gateway to set AUTOCOMMIT ON/OFF */ IDS_AUTOCOMMIT_OFFSET+SQL_AUTOCOMMIT_OFF, "set implicit_transactions on" /* AUTOCOMMIT OFF */ IDS_AUTOCOMMIT_OFFSET+SQL_AUTOCOMMIT_ON, "set implicit_transactions off" /* AUTOCOMMIT ON */ /* String sent to the gateway to explicitly begin a transaction */ /* An empty string requires the IDS_AUTOCOMMIT_OFFSET strings to be set */ IDS_BEGINTRAN, "" /* Start Transaction string MAX 30 char*/ /* String sent to the gateway to set ACCESS MODE */ IDS_ACCESS_MODE_OFFSET+SQL_MODE_READ_ONLY, "" /* Read Only */ IDS_ACCESS_MODE_OFFSET+SQL_MODE_READ_WRITE, "" /* Read Write */ /* String sent to the gateway to set COMMIT/ROLLBACK */ IDS_TRANSACT_OFFSET+SQL_COMMIT, "IF @@TRANCOUNT > 0 COMMIT TRAN" // COMMIT string IDS_TRANSACT_OFFSET+SQL_ROLLBACK, "IF @@TRANCOUNT > 0 ROLLBACK TRAN" // ROLLBACK string IDS_AUX_SETROWCOUNT,"SET ROWCOUNT " IDS_AUX_SETTEXTSIZE,"SET TEXTSIZE " // To have the ODBC canonical procedure invocation passed thru to the // gateway, set the following string to empty (""); IDS_AUX_RPC_TEXT, "EXEC " // Text before canonical procedure invocation IDS_AUX_RPC_SEP, " , " // Separators for canonical procedure invocation // ( -> 1st char; , -> 2nd char; ) -> 3rd char IDS_AUX_USE, "use " IDS_AUX_LANGUAGE, "set language " IDS_LANGUAGE_QUERY, " select 'us_english' union select name from master..syslanguages"; IDS_DATABASE_QUERY, "select name from master..sysdatabases" IDS_DEF_LANGUAGE_QUERY, "select ISNULL(language,'us_english') from master..syslogins where suid=SUSER_ID()" IDS_DEF_DATABASE_QUERY, "select dbname from master..syslogins where suid=SUSER_ID()" IDS_AUX_ECODE_TEMPLATE_DATE,"'yyyymmdd'" IDS_AUX_ECODE_TEMPLATE_TIME,"'hh:mm:ss'" IDS_AUX_ECODE_TEMPLATE_TS, "'yyyymmdd hh:mm:ss.000'" // The following aren't used because EXEC doesn't allow functions as parameters // IDS_AUX_ECODE_PARSE_INFO1,"\003'\002\004\022\003-\002\002\026\003-\002\002\030\003'" // IDS_AUX_ECODE_PARSE_INFO2,"\003'\002\002\022\003:\002\002\025\003:\002\002\030\003'" // IDS_AUX_ECODE_PARSE_INFO3,"\003'\002\004\022\003-\002\002\026\003-\002\002\030\002\002\033\003:\002\002\036\003:\002\002\041\004\041\003.\002\374\044\003'" // IDS_AUX_ECODE_TEMPLATE_DATE,"convert(datetime,'yyyymmdd')" // IDS_AUX_ECODE_TEMPLATE_TIME,"convert(datetime,'hh:mm:ss')" // IDS_AUX_ECODE_TEMPLATE_TS, "convert(datetime,'yyyymmdd hh:mm:ss.000')" /* Used for wsprintf format when converting parameters to SQL_DATE, SQL_TIME or SQL_TIMESTAMP */ IDS_AUX_ECODE_FORMAT_DATE, "'%04d%02u%02u'" IDS_AUX_ECODE_FORMAT_TIME, "'%02u:%02u:%02u'" IDS_AUX_ECODE_FORMAT_TS, "'%04d%02u%02u %02u:%02u:%02u.%03lu'" // The following aren't used because EXEC doesn't allow functions as parameters // IDS_AUX_ECODE_FORMAT_DATE, "convert(datetime,'%04d%02u%02u')" // IDS_AUX_ECODE_FORMAT_TIME, "convert(datetime,'%02u:%02u:%02u')" // IDS_AUX_ECODE_FORMAT_TS, "convert(datetime,'%04d%02u%02u %02u:%02u:%02u.%03lu')" // Used for wsprintf format when converting SQL_C_TIMESTAMP to // SQL_CHAR, SQL_VARCHAR or SQL_LONGVARCHAR // Only adjust the last digit (fraction value) to match the precision // of SQL_TIMESTAMP on the DBMS, since rest of format is ODBC defined. // SQL_TIME and SQL_DATE are also ODBC defined and embedded in driver. IDS_AUX_FORMAT_TS, "%04d-%02u-%02u %02u:%02u:%02u.%03lu" /* Feature support flags. The ODS driver uses these flags to determine */ /* what the capability of the gateway to handle SQL server specific */ /* features. */ IDS_FEATURE_FMTONLY_SUPPORT, "Y" // Gateway supports SET FMTONLY ON/OFF IDS_FEATURE_NOEXEC_SUPPORT, "Y" // Gateway supports SET NOEXEC ON/OFF IDS_FEATURE_HOLDLOCK_SUPPORT, "N" // Gateway supports HOLDLOCK on Select IDS_FEATURE_NOTNULL_DEFAULT, "N" // Gateway assumes NOT NULL on Create Table // IDS_FEATURE_TEXTPTR_SUPPORT values // A - READ/WRITE/UPDATE // B - READ/WRITE // R - READ // W - WRITE // U - UPDATE // N - no text pointer support IDS_FEATURE_TEXTPTR_SUPPORT, "A" // Gateway supports READ, WRITE and UPDATETEXT // IDS_FEATURE_RPC_SUPPORT values // N - RPC's not supported // Y - Single RPC TDS stream supported // B - Batched RPC TDS stream supported IDS_FEATURE_RPC_SUPPORT, "Y" // Gateway supports single RPC invocation IDS_FEATURE_STRIP_SEPARATORS, "Y" // Replace stmt separator w/blank // IDS_FEATURE_TSQL_OJ_SUPPORT values // N - Outer Joins not supported // Y - Gateway supports SQL Server Outer Join Syntax // A - Gateway supports ANSI 92 Outer Join Syntax IDS_FEATURE_TSQL_OJ_SUPPORT, "A" // Gateway supports ANSI 92 Outer Join Syntax IDS_FEATURE_EXEC_THRU_PROC, "Y" // Driver creates SPROC for PREPARE/EXEC IDS_FEATURE_KEEP_PARM_MARKERS, "N" // Driver keeps ? in SQL for NOEXEC ON/OFF IDS_FEATURE_KEEP_AS_ALIAS, "Y" // Driver keeps AS in SELECT stmt IDS_FEATURE_KEEP_ASC_INDEX, "N" // Driver keeps ASC/DESC in CREATE INDEX IDS_FEATURE_SP_CURSOR_SUPPORT, "N" // Gateway doesn't support sp_cursor stored procedures IDS_FEATURE_DECNUM_SUPPORT, "Y" // Gateway supports ODS decimal/numeric types IDS_FEATURE_UDT_ODS_FORMAT, "N" // Gateway doesn't support ODS UDT format IDS_HOSTDBMS, "SQLServer" // Used by driver for special coding cases IDS_GTWYNAME, "SQLServer Sample" // Used by setup for list box selection text #if (ODBCVER >= 0x0300) IDS_SPROC_VERSION, "6.02.139" // Used to check SPROC version #else IDS_SPROC_VERSION, "6.01.139" // Used to check SPROC version #endif IDS_HELP_FILENAME, "ODSSAMP.HLP" // Help file name for this gateway // Initialization string definitions. These SQL strings will be sent // to the gateway after each connection is made. // These strings must have sequential string IDs with no missing entries. // Commands should be batched for performance if gateway supports batchs, // Otherwise, each string is sent separately to the gateway IDS_INITIALIZATION_OFFSET+0, "set textsize 2147483647 set ansi_defaults on set cursor_close_on_commit off set implicit_transactions off" IDS_INITIALIZATION_OFFSET+1, "" /* Empty string at end */ /* Data Type definitions */ /* The data corresponds to the output columns for the SQLGetTypeInfo */ /* function, separated by semi-colons (;) */ /* An empty data value will be treated as NULL */ /* These strings must have sequential string IDs with no missing entries */ /* These must be ordered by the value of ODBC DATA_TYPE, with base types first */ /* Maximum of 50 data types are supported */ #if (ODBCVER >= 0x0300) /*TYPE_NAME;DATA_TYPE;PRECISION;LITERAL_PREFIX;LITERAL_SUFFIX; CREATE_PARAMS;NULLABLE;CASE_SENSITIVE;SEARCHABLE;UNSIGNED_ATTRIBUTE; FIXED_PREC_SCALE;AUTO_INCREMENT;LOCAL_TYPE_NAME;MINIMUM_SCALE; MAXIMUM_SCALE;SQL_DATE_TYPE;SQL_DATETIME_SUB;NUM_PREC_RADIX;USER_TYPE;*/ IDS_DATATYPE_OFFSET+0 "bit;-7;1;;;;0;0;2;;0;;bit;0;0;-7;;;16;" IDS_DATATYPE_OFFSET+1 "tinyint;-6;3;;;;1;0;2;1;0;0;tinyint;0;0;-6;;10;5;" IDS_DATATYPE_OFFSET+2 "tinyint identity;-6;3;;;;0;0;2;1;0;1;tinyint identity;0;0;-6;;10;5;" IDS_DATATYPE_OFFSET+3 "image;-4;2147483647;0x;;;1;0;0;;0;;image;;;-4;;;20;" IDS_DATATYPE_OFFSET+4 "varbinary;-3;255;0x;;max length;1;0;2;;0;;varbinary;;;-3;;;4;" IDS_DATATYPE_OFFSET+5 "binary;-2;255;0x;;max length;1;0;2;;0;;binary;;;-2;;;3;" IDS_DATATYPE_OFFSET+6 "timestamp;-2;8;0x;;;0;0;2;;0;;timestamp;;;-2;;;80;" IDS_DATATYPE_OFFSET+7 "text;-1;2147483647;';';;1;1;1;;0;;text;;;-1;;;19;" IDS_DATATYPE_OFFSET+8 "char;1;255;';';max length;1;1;3;;0;;char;;;1;;;1;" IDS_DATATYPE_OFFSET+9 "numeric;2;28;;;precision,scale;1;0;2;0;0;0;numeric;0;28;2;;10;10;" IDS_DATATYPE_OFFSET+10 "numeric() identity;2;28;;;precision;0;0;2;0;0;1;numeric() identity;0;0;2;;10;10;" IDS_DATATYPE_OFFSET+11 "decimal;3;28;;;precision,scale;1;0;2;0;0;0;decimal;0;28;3;;10;24;" IDS_DATATYPE_OFFSET+12 "money;3;19;$;;;1;0;2;0;1;0;money;4;4;3;;10;11;" IDS_DATATYPE_OFFSET+13 "smallmoney;3;10;$;;;1;0;2;0;1;0;smallmoney;4;4;3;;10;21;" IDS_DATATYPE_OFFSET+14 "decimal() identity;3;28;;;precision;0;0;2;0;0;1;decimal() identity;0;0;3;;10;24;" IDS_DATATYPE_OFFSET+15 "int;4;10;;;;1;0;2;0;0;0;int;0;0;4;;10;7;" IDS_DATATYPE_OFFSET+16 "int identity;4;10;;;;0;0;2;0;0;1;int identity;0;0;4;;10;7;" IDS_DATATYPE_OFFSET+17 "smallint;5;5;;;;1;0;2;0;0;0;smallint;0;0;5;;10;6;" IDS_DATATYPE_OFFSET+18 "smallint identity;5;5;;;;0;0;2;0;0;1;smallint identity;0;0;5;;10;6;" IDS_DATATYPE_OFFSET+19 "float;6;53;;;;1;0;2;0;0;0;float;;;6;;2;8;" IDS_DATATYPE_OFFSET+20 "real;7;24;;;;1;0;2;0;0;0;real;;;7;;2;23;" IDS_DATATYPE_OFFSET+21 "varchar;12;255;';';max length;1;1;3;;0;;varchar;;;12;;;2;" IDS_DATATYPE_OFFSET+22 "sysname;12;30;';';;0;1;3;;0;;sysname;;;12;;;18;" IDS_DATATYPE_OFFSET+23 "datetime;93;3;';';;1;0;3;;0;;datetime;3;3;9;3;;12;" IDS_DATATYPE_OFFSET+24 "smalldatetime;93;0;';';;1;0;3;;0;;smalldatetime;0;0;9;3;;22;" IDS_DATATYPE_OFFSET+25 "" // Empty string at end #else /*TYPE_NAME;DATA_TYPE;PRECISION;LITERAL_PREFIX;LITERAL_SUFFIX; CREATE_PARAMS;NULLABLE;CASE_SENSITIVE;SEARCHABLE;UNSIGNED_ATTRIBUTE; MONEY;AUTO_INCREMENT;LOCAL_TYPE_NAME;MINIMUM_SCALE;MAXIMUM_SCALE;USER_TYPE;*/ IDS_DATATYPE_OFFSET+0 "bit;-7;1;;;;0;0;2;;0;;bit;0;0;16;" IDS_DATATYPE_OFFSET+1 "tinyint;-6;3;;;;1;0;2;1;0;0;tinyint;0;0;5;" IDS_DATATYPE_OFFSET+2 "tinyint identity;-6;3;;;;0;0;2;1;0;1;tinyint identity;0;0;5;" IDS_DATATYPE_OFFSET+3 "image;-4;2147483647;0x;;;1;0;0;;0;;image;;;20;" IDS_DATATYPE_OFFSET+4 "varbinary;-3;255;0x;;max length;1;0;2;;0;;varbinary;;;4;" IDS_DATATYPE_OFFSET+5 "binary;-2;255;0x;;max length;1;0;2;;0;;binary;;;3;" IDS_DATATYPE_OFFSET+6 "timestamp;-2;8;0x;;;0;0;2;;0;;timestamp;;;80;" IDS_DATATYPE_OFFSET+7 "text;-1;2147483647;';';;1;1;1;;0;;text;;;19;" IDS_DATATYPE_OFFSET+8 "char;1;255;';';max length;1;1;3;;0;;char;;;1;" IDS_DATATYPE_OFFSET+9 "numeric;2;28;;;precision,scale;1;0;2;0;0;0;numeric;0;28;10;" IDS_DATATYPE_OFFSET+10 "numeric() identity;2;28;;;precision;0;0;2;0;0;1;numeric() identity;0;0;10;" IDS_DATATYPE_OFFSET+11 "decimal;3;28;;;precision,scale;1;0;2;0;0;0;decimal;0;28;24;" IDS_DATATYPE_OFFSET+12 "money;3;19;$;;;1;0;2;0;1;0;money;4;4;11;" IDS_DATATYPE_OFFSET+13 "smallmoney;3;10;$;;;1;0;2;0;1;0;smallmoney;4;4;21;" IDS_DATATYPE_OFFSET+14 "decimal() identity;3;28;;;precision;0;0;2;0;0;1;decimal() identity;0;0;24;" IDS_DATATYPE_OFFSET+15 "int;4;10;;;;1;0;2;0;0;0;int;0;0;7;" IDS_DATATYPE_OFFSET+16 "int identity;4;10;;;;0;0;2;0;0;1;int identity;0;0;7;" IDS_DATATYPE_OFFSET+17 "smallint;5;5;;;;1;0;2;0;0;0;smallint;0;0;6;" IDS_DATATYPE_OFFSET+18 "smallint identity;5;5;;;;0;0;2;0;0;1;smallint identity;0;0;6;" IDS_DATATYPE_OFFSET+19 "float;6;15;;;;1;0;2;0;0;0;float;;;8;" IDS_DATATYPE_OFFSET+20 "real;7;7;;;;1;0;2;0;0;0;real;;;23;" IDS_DATATYPE_OFFSET+21 "datetime;11;23;';';;1;0;3;;0;;datetime;3;3;12;" IDS_DATATYPE_OFFSET+22 "smalldatetime;11;16;';';;1;0;3;;0;;smalldatetime;0;0;22;" IDS_DATATYPE_OFFSET+23 "varchar;12;255;';';max length;1;1;3;;0;;varchar;;;2;" IDS_DATATYPE_OFFSET+24 "sysname;12;30;';';;0;1;3;;0;;sysname;;;18;" IDS_DATATYPE_OFFSET+25 "" // Empty string at end #endif END // Canonical Date/Time models /* Parsing method: Each token has a type and a copy location in the template. The types are defined by the following octal codes: #define LEX_TK_NULL 000 #define LEX_TK_NAME 001 #define LEX_TK_NUMBER 002 #define LEX_TK_GENCHAR 003 #define LEX_TK_OPT_END 004 The parse starts with a TYPE. If the type is a GENCHAR, the type is followed by the character constant. Next is the location in the template where the field is to be copied if the token is a NUMBER or NAME token. A NAME token will cause the alphabetic month to be inserted rather than the numeric month. An example: // Template: "convert(datetime,'yyyymmdd hh:mm:ss.000')" // ParseInfo: "\003'\002\004\022\003-\002\002\026\003-\002\002\030\002\002\033\003:\002\002\036\003:\002\002\041\004\041\003.\002\374\044\003'\000" "\003' //General Character Token "'" \002\004 //Number Token 4 long (year) \022 //Copy to template at position 18 \003- //General Character Token "-" \002\002 //Number Token 2 long (month) \026 //Copy to template at position 22 \003- //General Character Token "-" \002\002 //Number Token 2 long (day) \030 //Copy to template at position 24 \002\002 //Number Token 2 long (hour) \033 //Copy to template at position 27 \003: //General Character Token ":" \002\002 //Number Token 2 long (minute) \036 //Copy to template at position 30 \003: //General Character Token ":" \002\002 //Number Token 2 long (second) \041 //Copy to template at position 33 \004\041 //Optional End, count is ignored \003. //General Character Token "." \002\374 //Number Token variable length (max 3 digits fraction in template) \044 //Copy to template at position 36 \003'" //General Character Token "'" \000 //End of ParseInfo So, a string containing: { ts '1991-02-03 04:05:06.123' } would become: convert(datetime,'19910203 04:05:06.123') So, a string containing: { ts '1991-02-03 04:05:06' } would become: convert(datetime,'19910203 04:05:06.000') */ // To have the ODBC canonical date/time forms passed thru to the gateway, // set the following 3 resources to empty (""). IDB_AUX_ECODE_PARSE_DATE RCDATA BEGIN "\003'\002\004\001\003-\002\002\005\003-\002\002\007\003'\000" END IDB_AUX_ECODE_PARSE_TIME RCDATA BEGIN "\003'\002\002\001\003:\002\002\004\003:\002\002\007\003'\000" END IDB_AUX_ECODE_PARSE_TS RCDATA BEGIN "\003'\002\004\001\003-\002\002\005\003-\002\002\007\002\002\012\003:\002\002\015\003:\002\002\020\004\022\003.\002\374\023\003'\000" END // IDB_AUX_ECODE_PARSE_FUNC See IDB_AUX_FUN_PINFO // ODBC outer join conversion string // To have the ODBC canonical outer join form passed thru to the gateway, // set the following string to empty (""). // OJ string is referenced by position in SQLCMISC.C. Any changes must be reflected there. IDB_AUX_ECODE_PARSE_OJ RCDATA BEGIN"\004left\001,\005outer\001 \004join\001 \002on\007 WHERE \005where\005 AND(\005right\001,\004 *= \004 =* \005 AND \000" END // IDB_AUX_ECODE_PARSE_CALL Coded in SQLCMISC.C // IDB_AUX_ECODE_PARSE_ESC Coded in SQLCMISC.C // Canonical function models /* Parsing method: An empty string means that the canonical function has no equivalent (or does not work the same) Each token has a type and a copy location in the template. The types are defined by the following octal codes: #define LEX_TK_NULL 000 #define LEX_TK_NAME 001 #define LEX_TK_NUMBER 002 #define LEX_TK_GENCHAR 003 #define LEX_TK_OPT_END 004 #define LEX_TK_ARGUMENT 012 #define LEX_TK_OPT_ARG 013 #define LEX_TK_OPT_GCHR 014 The actions are defined by the following octal codes: #define SEM_ACTION_COPY 001 #define SEM_ACTION_REPLACE 002 #define SEM_ACTION_SKIP 003 #define SEM_ACTION_COPY_OR_DFLT 004 #define SEM_ACTION_CODE 005 #define SEM_ACTION_PASSTHRU 006 The parse starts with a TYPE. If the type is a NAME, the type is followed by a character count, followed by the character constant. If the type is a GENCHAR or OPT_GCHR, the type is followed by the character constant. Next is the action to be taken on the preceding token. If the type is OPT_ARG or OPT_GCHR, the action is followed by a character count followed by the default character constant used if the optional element was missing. An example: "\001\011substring\001\003(\001\012\001\003,\001\012\001\014,\004\001,\013\004\003255\003)\001\000" \001 //Type Name token \011substring //Length and name constant \001 //Action Copy token, copy 'substring' \003( //Type General Character '(' \001 //Action Copy token, copy the '(' \012 //Type Argument token, ie, recurse \001 //Action Copy token, copy the argument \003, //General Character ',' \001 //Action Copy token, copy the ',' \012 //Type Argument token, ie, recurse \001 //Action Copy token, copy the argument \014, //Type Optional General Character \004 //Action Copy or Default, // copy the ',' if exists \001, // else, insert 1 character - ',' \013 //Type Optional Argument \004 //Action Copy or Default, // copy the argument if exists \003255 // else, insert 3 characters, '255' \003) //General Character ')' \001 //Action Copy token, copy the ')' \000 //End of ParseInfo So, a string containing: substring ( 'a', 'b', 3) would become: substring('a','b',3) So, a string containing: substring ( 'a', 'b') would become: substring('a','b',255) To have the driver pass thru the function to the gateway with the ODBC canonical prefix and suffix, simply use the SEM_ACTION_PASSTHRU as the action after the name. Example: IDB_TAN RCDATA BEGIN "\001\003tan\006\000" END would have { fn tan (cola) } passed thru to the gateway unchanged. */ // Conversion functions // Convert also has code in SQLCMISC to deal with its anomolies IDB_CONVERT RCDATA BEGIN "\001\007convert\001\003(\001\012\005\003,\001\012\003\003)\001\000" END // String functions IDB_ASCII RCDATA BEGIN "\001\005ascii\001\003(\001\012\001\003)\001\000" END IDB_CHAR RCDATA BEGIN "\001\004char\001\003(\001\012\001\003)\001\000" END IDB_CONCAT RCDATA BEGIN "\001\006concat\003\003(\001\012\001\003,\002\001+\012\001\003)\001\000" END IDB_DIFFERENCE RCDATA BEGIN "\001\012difference\001\003(\001\012\001\003,\001\012\001\003)\001\000" END IDB_INSERT RCDATA BEGIN "\001\006insert\002\005stuff\003(\001\012\001\003,\001\012\001\003,\001\012\001\003,\001\012\001\003)\001\000" END IDB_LEFT RCDATA BEGIN "\001\004left\002\011substring\003(\001\012\001\003,\002\003,1,\012\001\003)\001\000" END IDB_LTRIM RCDATA BEGIN "\001\005ltrim\001\003(\001\012\001\003)\001\000" END IDB_LENGTH RCDATA BEGIN "\001\006length\002\020datalength(rtrim\003(\001\012\001\003)\002\002))\000" END IDB_LOCATE RCDATA BEGIN "\001\006locate\002\011charindex\003(\001\012\001\003,\001\012\001\003)\001\000" END IDB_LCASE RCDATA BEGIN "\001\005lcase\002\005lower\003(\001\012\001\003)\001\000" END IDB_REPEAT RCDATA BEGIN "\001\006repeat\002\011replicate\003(\001\012\001\003,\001\012\001\003)\001\000" END //IDB_REPLACE RCDATA BEGIN "" END IDB_RIGHT RCDATA BEGIN "\001\005right\001\003(\001\012\001\003,\001\012\001\003)\001\000" END IDB_RTRIM RCDATA BEGIN "\001\005rtrim\001\003(\001\012\001\003)\001\000" END IDB_SOUNDEX RCDATA BEGIN "\001\007soundex\001\003(\001\012\001\003)\001\000" END IDB_SPACE RCDATA BEGIN "\001\005space\001\003(\001\012\001\003)\001\000" END IDB_SUBSTRING RCDATA BEGIN "\001\011substring\001\003(\001\012\001\003,\001\012\001\003,\001\012\001\003)\001\000" END IDB_UCASE RCDATA BEGIN "\001\005ucase\002\005upper\003(\001\012\001\003)\001\000" END // Numeric functions IDB_ABS RCDATA BEGIN "\001\003abs\001\003(\001\012\001\003)\001\000" END IDB_ACOS RCDATA BEGIN "\001\004acos\001\003(\001\012\001\003)\001\000" END IDB_ASIN RCDATA BEGIN "\001\004asin\001\003(\001\012\001\003)\001\000" END IDB_ATAN RCDATA BEGIN "\001\004atan\001\003(\001\012\001\003)\001\000" END IDB_ATAN2 RCDATA BEGIN "\001\005atan2\002\004atn2\003(\001\012\001\003,\001\012\001\003)\001\000" END IDB_CEILING RCDATA BEGIN "\001\007ceiling\001\003(\001\012\001\003)\001\000" END IDB_COS RCDATA BEGIN "\001\003cos\001\003(\001\012\001\003)\001\000" END IDB_COT RCDATA BEGIN "\001\003cot\001\003(\001\012\001\003)\001\000" END IDB_DEGREES RCDATA BEGIN "\001\007degrees\001\003(\001\012\001\003)\001\000" END IDB_EXP RCDATA BEGIN "\001\003exp\001\003(\001\012\001\003)\001\000" END IDB_FLOOR RCDATA BEGIN "\001\005floor\001\003(\001\012\001\003)\001\000" END IDB_LOG RCDATA BEGIN "\001\003log\001\003(\001\012\001\003)\001\000" END IDB_LOG10 RCDATA BEGIN "\001\005log10\001\003(\001\012\001\003)\001\000" END IDB_MOD RCDATA BEGIN "\001\003mod\003\003(\001\012\001\003,\002\001%\012\001\003)\001\000" END IDB_PI RCDATA BEGIN "\001\002pi\001\003(\001\003)\001\000" END IDB_POWER RCDATA BEGIN "\001\005power\001\003(\001\012\001\003,\001\012\001\003)\001\000" END IDB_RADIANS RCDATA BEGIN "\001\007radians\001\003(\001\012\001\003)\001\000" END IDB_RAND RCDATA BEGIN "\001\004rand\001\003(\001\013\001\003)\001\000" END IDB_ROUND RCDATA BEGIN "\001\005round\001\003(\001\012\001\003,\001\012\001\003)\001\000" END IDB_SIGN RCDATA BEGIN "\001\004sign\001\003(\001\012\001\003)\001\000" END IDB_SIN RCDATA BEGIN "\001\003sin\001\003(\001\012\001\003)\001\000" END IDB_SQRT RCDATA BEGIN "\001\004sqrt\001\003(\001\012\001\003)\001\000" END IDB_TAN RCDATA BEGIN "\001\003tan\001\003(\001\012\001\003)\001\000" END //IDB_TRUNCATE RCDATA BEGIN "" END // Time/date functions IDB_NOW RCDATA BEGIN "\001\003now\002\007getdate\003(\001\003)\001\000" END IDB_TIMESTAMPADD RCDATA BEGIN "\001\014timestampadd\002\007dateadd\003(\001\012\005\003,\001\012\001\003,\001\012\001\003)\001\000" END IDB_TIMESTAMPDIFF RCDATA BEGIN "\001\015timestampdiff\002\010datediff\003(\001\012\005\003,\001\012\001\003,\001\012\001\003)\001\000" END IDB_CURDATE RCDATA BEGIN "\001\007curdate\002\036convert(varchar,getdate(),111)\003(\003\003)\003\000" END IDB_DAYOFMONTH RCDATA BEGIN "\001\012dayofmonth\002\014datepart(dd,\003(\003\012\001\003)\001\000" END IDB_DAYOFWEEK RCDATA BEGIN "\001\011dayofweek\002\017(((datepart(dw,\003(\003\012\001\003)\002\026)+@@datefirst-1)%7)+1)\000" END IDB_DAYOFYEAR RCDATA BEGIN "\001\011dayofyear\002\014datepart(dy,\003(\003\012\001\003)\001\000" END IDB_DAYNAME RCDATA BEGIN "\001\007dayname\002\014datename(dw,\003(\003\012\001\003)\001\000" END IDB_MONTH RCDATA BEGIN "\001\005month\002\014datepart(mm,\003(\003\012\001\003)\001\000" END IDB_MONTHNAME RCDATA BEGIN "\001\011monthname\002\014datename(mm,\003(\003\012\001\003)\001\000" END IDB_QUARTER RCDATA BEGIN "\001\007quarter\002\014datepart(qq,\003(\003\012\001\003)\001\000" END IDB_WEEK RCDATA BEGIN "\001\004week\002\014datepart(wk,\003(\003\012\001\003)\001\000" END IDB_YEAR RCDATA BEGIN "\001\004year\002\014datepart(yy,\003(\003\012\001\003)\001\000" END IDB_CURTIME RCDATA BEGIN "\001\007curtime\002\034convert(varchar,getdate(),8)\003(\003\003)\003\000" END IDB_HOUR RCDATA BEGIN "\001\004hour\002\014datepart(hh,\003(\003\012\001\003)\001\000" END IDB_MINUTE RCDATA BEGIN "\001\006minute\002\014datepart(mi,\003(\003\012\001\003)\001\000" END IDB_SECOND RCDATA BEGIN "\001\006second\002\014datepart(ss,\003(\003\012\001\003)\001\000" END // System functions IDB_USER RCDATA BEGIN "\001\004user\002\011USER_NAME\003(\001\003)\001\000" END IDB_DATABASE RCDATA BEGIN "\001\010database\002\007DB_NAME\003(\001\003)\001\000" END IDB_IFNULL RCDATA BEGIN "\001\006ifnull\002\006isnull\003(\001\012\001\003,\001\012\001\003)\001\000" END #include "local.rc" /* Version Info ** */ #include <odbcver.h> #ifdef WIN32 #define VER_FILENAME_STR "ODSSMP32.DLL\0" #define VER_NAME_STR "ODSSMP32\0" #else // WIN32 #define VER_FILENAME_STR "ODSSAMP.DLL\0" #define VER_NAME_STR "ODSSAMP\0" #endif // WIN32 VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION PRODUCTVERSION VER_PRODUCTVERSION FILEFLAGSMASK VER_FILEFLAGSMASK FILEFLAGS VER_FILEFLAGS FILEOS VER_FILEOS FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK LANGUAGE_ANSI BEGIN VALUE "CompanyName", VER_COMPANYNAME_STR VALUE "FileDescription", VER_FILEDESC_STR VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", VER_NAME_STR VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR VALUE "LegalTrademarks", VER_LEGALTRADEMARKS_STR VALUE "OriginalFilename", VER_FILENAME_STR VALUE "ProductName", VER_PRODUCTNAME_STR VALUE "ProductVersion", VER_PRODUCTVERSION_STR END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", LANGUAGE_TRANS END END