info.c
上传用户:jmzj888
上传日期:2007-01-02
资源大小:220k
文件大小:25k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
  2.    This file is public domain and comes with NO WARRANTY of any kind */
  3. /*
  4. ** INFO.C - This is the ODBC sample driver code for
  5. ** exeting information functions.
  6. */
  7. #include "myodbc.h"
  8. #include <m_ctype.h>
  9. RETCODE SQL_API SQLGetInfo(HDBC hdbc, UWORD fInfoType, PTR rgbInfoValue,
  10.    SWORD cbInfoValueMax, SWORD FAR *pcbInfoValue)
  11. {
  12.   DBC FAR *dbc=(DBC FAR*) hdbc;
  13.   char dummy2[16];
  14.   SWORD dummy;
  15.   DBUG_ENTER("SQLGetInfo");
  16.   DBUG_PRINT("enter",("fInfoType: %d",fInfoType));
  17.   if (!pcbInfoValue)
  18.     pcbInfoValue=&dummy;
  19.   if (!rgbInfoValue)
  20.   { /* This is because of VB5 */
  21.     rgbInfoValue=dummy2;
  22.     cbInfoValueMax=sizeof(dummy2)-1;
  23.   }
  24.   switch (fInfoType) {
  25.   case SQL_MAX_USER_NAME_LEN:
  26. #ifndef _UNIX_
  27.     *(UNALIGNED SWORD FAR *) rgbInfoValue = 16;
  28. #endif /* IS NOT UNIX */
  29. #ifdef _UNIX_
  30.     *(SWORD FAR *) rgbInfoValue = 16;
  31. #endif /* IS UNIX */
  32.     break;
  33.   case SQL_DRIVER_ODBC_VER:
  34.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,SQL_SPEC_STRING,
  35.    cbInfoValueMax)
  36.    - (char*) rgbInfoValue);
  37.     break;
  38.   case SQL_ACTIVE_CONNECTIONS:
  39.   case SQL_ACTIVE_STATEMENTS:
  40.     *((SWORD*) rgbInfoValue)=0; /* No limits */
  41.     break;
  42. #ifdef SQL_ASYNC_MODE
  43.   case SQL_ASYNC_MODE:
  44.     *((SQLUINTEGER*) rgbInfoValue)= SQL_AM_NONE;
  45.     break;
  46. #endif
  47. #ifdef SQL_CREATE_TABLE
  48.   case SQL_CREATE_TABLE:
  49.     *((SQLUINTEGER*) rgbInfoValue)= SQL_CT_CREATE_TABLE | SQL_CT_COLUMN_DEFAULT;
  50.     break;
  51. #endif
  52.   case SQL_DATA_SOURCE_NAME:
  53.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,dbc->dsn,
  54.    cbInfoValueMax)
  55.    - (char*) rgbInfoValue);
  56.     break;
  57.   case SQL_DATABASE_NAME:
  58.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,dbc->database,
  59.    cbInfoValueMax)
  60.    - (char*) rgbInfoValue);
  61.     break;
  62.   case SQL_DRIVER_NAME:
  63.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"myodbc.dll",
  64.    cbInfoValueMax)
  65.    - (char*) rgbInfoValue);
  66.     break;
  67.   case SQL_DRIVER_VER:
  68.   case SQL_DBMS_VER:
  69.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,DRIVER_VERSION,
  70.    cbInfoValueMax)
  71.    - (char*) rgbInfoValue);
  72.     break;
  73.   case SQL_FETCH_DIRECTION:
  74.     *((long*) rgbInfoValue)=SQL_FD_FETCH_NEXT | SQL_FD_FETCH_FIRST |
  75.       SQL_FD_FETCH_LAST | SQL_FD_FETCH_PRIOR | SQL_FD_FETCH_ABSOLUTE |
  76.       SQL_FD_FETCH_RELATIVE;
  77.     if (dbc->flag & FLAG_NO_DEFAULT_CURSOR)
  78.      *((long*) rgbInfoValue)&= ~ (long) SQL_FD_FETCH_PRIOR;
  79.     if (dbc->flag & FLAG_NO_FETCH) /* For testing */
  80.       *((long*) rgbInfoValue)= 0;
  81.     *pcbInfoValue=sizeof(long);
  82.     break;
  83.   case SQL_ODBC_VER:
  84.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,DRIVER_VERSION,
  85.    cbInfoValueMax)
  86.    - (char*) rgbInfoValue);
  87.     *pcbInfoValue=sizeof(SWORD);
  88.     break;
  89.   case SQL_ODBC_SAG_CLI_CONFORMANCE:
  90.     *((SWORD*) rgbInfoValue)=SQL_OSCC_COMPLIANT;
  91.     *pcbInfoValue=sizeof(SWORD);
  92.     break;
  93.   case SQL_SERVER_NAME:
  94.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,dbc->mysql.host_info,
  95.    cbInfoValueMax)
  96.    - (char*) rgbInfoValue);
  97.     break;
  98.   case SQL_SEARCH_PATTERN_ESCAPE:
  99.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"\",cbInfoValueMax)
  100.    - (char*) rgbInfoValue);
  101.     break;
  102.   case SQL_ODBC_SQL_CONFORMANCE:
  103.   case SQL_ODBC_API_CONFORMANCE:
  104.     *((SWORD*) rgbInfoValue)=SQL_OAC_LEVEL1; /* Lie to make things work */
  105.     *pcbInfoValue=sizeof(SWORD);
  106.     break;
  107.   case SQL_DBMS_NAME:
  108.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"MySQL",cbInfoValueMax)
  109.    - (char*) rgbInfoValue);
  110.     break;
  111.   case SQL_ROW_UPDATES:
  112.   case SQL_ACCESSIBLE_PROCEDURES:
  113.   case SQL_PROCEDURES:
  114.   case SQL_EXPRESSIONS_IN_ORDERBY:
  115.   case SQL_NEED_LONG_DATA_LEN:
  116.   case SQL_DATA_SOURCE_READ_ONLY:
  117.   case SQL_ODBC_SQL_OPT_IEF:
  118.   case SQL_LIKE_ESCAPE_CLAUSE:
  119.   case SQL_ORDER_BY_COLUMNS_IN_SELECT:
  120.    *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"N",cbInfoValueMax)
  121.    - (char*) rgbInfoValue);
  122.     break;
  123.   case SQL_OUTER_JOINS:
  124.      if (dbc->mysql.protocol_version == MYSQL_3_21_PROTOCOL)   /* MySQL 3.21 */
  125.        *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,
  126.                                       (dbc->flag & FLAG_OLD_ODBC_PROG) ? "Y" : "F",
  127.                                        cbInfoValueMax)
  128.           - (char*) rgbInfoValue);
  129.      else
  130.       *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"N",cbInfoValueMax)
  131.          - (char*) rgbInfoValue);
  132.      break;
  133. #ifdef SQL_OJ_CAPABILITIES
  134.   case SQL_OJ_CAPABILITIES:
  135.     *((SQLUINTEGER*) rgbInfoValue)= SQL_OJ_LEFT | SQL_OJ_NESTED | SQL_OJ_NOT_ORDERED |
  136.                                     SQL_OJ_INNER | SQL_OJ_ALL_COMPARISON_OPS;
  137.     *pcbInfoValue=sizeof(SQLUINTEGER);
  138.     break;
  139. #endif
  140.   case SQL_COLUMN_ALIAS:
  141.   case SQL_ACCESSIBLE_TABLES:
  142.   case SQL_MULT_RESULT_SETS:
  143.   case SQL_MULTIPLE_ACTIVE_TXN:
  144.   case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
  145.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"Y",cbInfoValueMax)
  146.    - (char*) rgbInfoValue);
  147.     break;
  148. #ifdef SQL_MAX_IDENTIFIER_LEN
  149.   case SQL_MAX_IDENTIFIER_LEN:
  150.     *((SQLUSMALLINT*) rgbInfoValue)=NAME_LEN;
  151.     break;
  152. #endif
  153.   case SQL_CONCAT_NULL_BEHAVIOR:
  154.     *((SWORD*) rgbInfoValue)=SQL_CB_NULL;
  155.     *pcbInfoValue=sizeof(SWORD);
  156.     break;
  157.   case SQL_CURSOR_COMMIT_BEHAVIOR: /* Lie */
  158.   case SQL_CURSOR_ROLLBACK_BEHAVIOR:
  159.     *((SWORD*) rgbInfoValue)=SQL_CB_PRESERVE;
  160.     *pcbInfoValue=sizeof(SWORD);
  161.     break;
  162. #ifdef SQL_CURSOR_SENSITIVITY
  163.   case SQL_CURSOR_SENSITIVITY:
  164.     *((SQLUINTEGER*) rgbInfoValue)=SQL_UNSPECIFIED;
  165.     break
  166. #endif
  167.   case SQL_DEFAULT_TXN_ISOLATION:
  168.     *((long*) rgbInfoValue)= SQL_TXN_READ_UNCOMMITTED;
  169.     *pcbInfoValue=sizeof(long);
  170.     break;
  171. #ifdef SQL_DESCRIBE_PARAMETER
  172.   case SQL_DESCRIBE_PARAMETER:
  173.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"N",cbInfoValueMax)
  174.    - (char*) rgbInfoValue);
  175.     break;
  176. #endif
  177.   case SQL_TXN_ISOLATION_OPTION:
  178.     *((long*) rgbInfoValue)= SQL_TXN_READ_UNCOMMITTED;
  179.     *pcbInfoValue=sizeof(long);
  180.     break;
  181.   case SQL_IDENTIFIER_CASE:
  182.     *((SWORD*) rgbInfoValue)=SQL_IC_MIXED;
  183.     *pcbInfoValue=sizeof(SWORD);
  184.     break;
  185.   case SQL_IDENTIFIER_QUOTE_CHAR:
  186.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue," ",cbInfoValueMax)
  187.    - (char*) rgbInfoValue);
  188.     break;
  189.   case SQL_MAX_COLUMN_NAME_LEN:
  190.    *((SWORD*) rgbInfoValue)=NAME_LEN;
  191.    *pcbInfoValue=sizeof(SWORD);
  192.    break;
  193.   case SQL_MAX_CURSOR_NAME_LEN:
  194.   case SQL_MAX_OWNER_NAME_LEN:
  195.   case SQL_MAX_PROCEDURE_NAME_LEN:
  196.   case SQL_MAX_QUALIFIER_NAME_LEN:
  197.     *((SWORD*) rgbInfoValue)=0;
  198.     break;
  199.   case SQL_MAX_TABLE_NAME_LEN:
  200.     *((SWORD*) rgbInfoValue)=NAME_LEN;
  201.     break;
  202.   case SQL_OWNER_TERM:
  203.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"owner",cbInfoValueMax)
  204.    - (char*) rgbInfoValue);
  205.     break;
  206.   case SQL_PROCEDURE_TERM:
  207.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"procedure",
  208.    cbInfoValueMax) - (char*) rgbInfoValue);
  209.     break;
  210.   case SQL_QUALIFIER_NAME_SEPARATOR: /* what should this be */
  211.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,",",cbInfoValueMax)
  212.    - (char*) rgbInfoValue);
  213.     break;
  214.   case SQL_QUALIFIER_TERM:
  215.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"database",cbInfoValueMax)
  216.    - (char*) rgbInfoValue);
  217.     break;
  218.   case SQL_SCROLL_CONCURRENCY:
  219.   case SQL_SCROLL_OPTIONS:
  220.     *((long*) rgbInfoValue)=0L;
  221.     break;
  222.   case SQL_TABLE_TERM:
  223.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"table",cbInfoValueMax)
  224.    - (char*) rgbInfoValue);
  225.     break;
  226.   case SQL_TXN_CAPABLE:
  227.     *((SWORD*) rgbInfoValue)=SQL_TC_NONE;
  228.     *pcbInfoValue=sizeof(SWORD);
  229.     break;
  230.   case SQL_USER_NAME:
  231.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,"user",cbInfoValueMax)
  232.    - (char*) rgbInfoValue);
  233.     break;
  234.   case SQL_CONVERT_FUNCTIONS:
  235.     *((long*) rgbInfoValue)=0L;
  236.     *pcbInfoValue=sizeof(long);
  237.     break;
  238.   case SQL_SYSTEM_FUNCTIONS:
  239.     *((long*) rgbInfoValue)= SQL_FN_SYS_DBNAME | SQL_FN_SYS_IFNULL | SQL_FN_SYS_USERNAME;
  240.     *pcbInfoValue=sizeof(long);
  241.     break;
  242.   case SQL_NUMERIC_FUNCTIONS:
  243.     *((long*) rgbInfoValue)=SQL_FN_NUM_ABS | SQL_FN_NUM_ACOS |
  244.       SQL_FN_NUM_ASIN | SQL_FN_NUM_ATAN | SQL_FN_NUM_ATAN2 |
  245.       SQL_FN_NUM_CEILING | SQL_FN_NUM_COS | SQL_FN_NUM_COT | SQL_FN_NUM_EXP |
  246.       SQL_FN_NUM_FLOOR | SQL_FN_NUM_LOG | SQL_FN_NUM_MOD | SQL_FN_NUM_SIGN |
  247.       SQL_FN_NUM_SIN | SQL_FN_NUM_SQRT | SQL_FN_NUM_TAN | SQL_FN_NUM_PI |
  248.       SQL_FN_NUM_RAND | SQL_FN_NUM_DEGREES | SQL_FN_NUM_LOG10 |
  249.       SQL_FN_NUM_POWER | SQL_FN_NUM_RADIANS | SQL_FN_NUM_ROUND |
  250.       SQL_FN_NUM_TRUNCATE;
  251.     *pcbInfoValue=sizeof(long);
  252.     break;
  253.   case SQL_STRING_FUNCTIONS:
  254.     *((long*) rgbInfoValue)=SQL_FN_STR_CONCAT | SQL_FN_STR_INSERT |
  255.       SQL_FN_STR_LEFT | SQL_FN_STR_LTRIM | SQL_FN_STR_LENGTH |
  256.       SQL_FN_STR_LOCATE | SQL_FN_STR_LCASE | SQL_FN_STR_REPEAT |
  257.       SQL_FN_STR_REPLACE | SQL_FN_STR_RIGHT | SQL_FN_STR_RTRIM |
  258.       SQL_FN_STR_SUBSTRING | SQL_FN_STR_UCASE | SQL_FN_STR_ASCII |
  259.       SQL_FN_STR_CHAR | SQL_FN_STR_LOCATE_2 | SQL_FN_STR_SOUNDEX |
  260.       SQL_FN_STR_SPACE;
  261.     *pcbInfoValue=sizeof(long);
  262.      break;
  263.   case SQL_TIMEDATE_FUNCTIONS:
  264.     *((long*) rgbInfoValue)= SQL_FN_TD_NOW | SQL_FN_TD_CURDATE |
  265.       SQL_FN_TD_DAYOFMONTH | SQL_FN_TD_DAYOFWEEK | SQL_FN_TD_DAYOFYEAR |
  266.       SQL_FN_TD_MONTH | SQL_FN_TD_QUARTER | SQL_FN_TD_WEEK | SQL_FN_TD_YEAR |
  267.       SQL_FN_TD_CURTIME | SQL_FN_TD_HOUR | SQL_FN_TD_MINUTE |
  268.       SQL_FN_TD_SECOND | SQL_FN_TD_DAYNAME | SQL_FN_TD_MONTHNAME;
  269.     *pcbInfoValue=sizeof(long);
  270.     break;
  271.   case SQL_CONVERT_BIGINT:
  272.   case SQL_CONVERT_BIT:
  273.   case SQL_CONVERT_CHAR:
  274.   case SQL_CONVERT_DATE:
  275.   case SQL_CONVERT_DECIMAL:
  276.   case SQL_CONVERT_DOUBLE:
  277.   case SQL_CONVERT_FLOAT:
  278.   case SQL_CONVERT_INTEGER:
  279.   case SQL_CONVERT_LONGVARCHAR:
  280.   case SQL_CONVERT_NUMERIC:
  281.   case SQL_CONVERT_REAL:
  282.   case SQL_CONVERT_SMALLINT:
  283.   case SQL_CONVERT_TIME:
  284.   case SQL_CONVERT_TIMESTAMP:
  285.   case SQL_CONVERT_TINYINT:
  286.   case SQL_CONVERT_VARCHAR:
  287.      /* lie that we can handle anything */
  288.     *((long*) rgbInfoValue)=SQL_CVT_CHAR | SQL_CVT_NUMERIC | SQL_CVT_DECIMAL |
  289.       SQL_CVT_INTEGER | SQL_CVT_SMALLINT | SQL_CVT_FLOAT | SQL_CVT_REAL |
  290.       SQL_CVT_DOUBLE | SQL_CVT_VARCHAR | SQL_CVT_LONGVARCHAR |
  291.       SQL_CVT_BIT | SQL_CVT_TINYINT | SQL_CVT_BIGINT |
  292.       SQL_CVT_DATE | SQL_CVT_TIME | SQL_CVT_TIMESTAMP;
  293.     *pcbInfoValue=sizeof(long);
  294.     break;
  295.   case SQL_CONVERT_BINARY:
  296.   case SQL_CONVERT_VARBINARY:
  297.   case SQL_CONVERT_LONGVARBINARY:
  298.   case SQL_POSITIONED_STATEMENTS:
  299.   case SQL_LOCK_TYPES:
  300.   case SQL_BOOKMARK_PERSISTENCE:
  301.   case SQL_OWNER_USAGE:
  302.   case SQL_QUALIFIER_USAGE:
  303.   case SQL_SUBQUERIES:
  304.   case SQL_UNION:
  305.   case SQL_TIMEDATE_ADD_INTERVALS:
  306.   case SQL_TIMEDATE_DIFF_INTERVALS:
  307.     *((long*) rgbInfoValue)=0L;
  308.     *pcbInfoValue=sizeof(long);
  309.     break;
  310.   case SQL_QUOTED_IDENTIFIER_CASE:
  311.     *((SQLUSMALLINT*) rgbInfoValue)=SQL_IC_MIXED;
  312.     break;
  313.   case SQL_POS_OPERATIONS:
  314.     *((long*) rgbInfoValue)=SQL_POS_POSITION;
  315.     *pcbInfoValue=sizeof(long);
  316.     break;
  317.   case SQL_ALTER_TABLE:
  318.     *((long*) rgbInfoValue)=SQL_AT_ADD_COLUMN | SQL_AT_DROP_COLUMN;
  319.     *pcbInfoValue=sizeof(long);
  320.     break;
  321.   case SQL_CORRELATION_NAME:
  322.     *((SWORD*) rgbInfoValue)=SQL_CN_DIFFERENT;
  323.     *pcbInfoValue=sizeof(SWORD);
  324.     break;
  325.   case SQL_NON_NULLABLE_COLUMNS:
  326.     *((SWORD*) rgbInfoValue)=SQL_NNC_NON_NULL;
  327.     *pcbInfoValue=sizeof(SWORD);
  328.     break;
  329.   case SQL_NULL_COLLATION:
  330.     *((SWORD*) rgbInfoValue)=SQL_NC_START;
  331.     *pcbInfoValue=sizeof(SWORD);
  332.     break;
  333.   case SQL_MAX_COLUMNS_IN_GROUP_BY:
  334.   case SQL_MAX_COLUMNS_IN_ORDER_BY:
  335.   case SQL_MAX_COLUMNS_IN_SELECT:
  336.   case SQL_MAX_COLUMNS_IN_TABLE:
  337.   case SQL_MAX_ROW_SIZE:
  338.     *((SWORD*) rgbInfoValue)=0;
  339.     *pcbInfoValue=sizeof(SWORD);
  340.     break;
  341.   case SQL_MAX_TABLES_IN_SELECT:
  342.     *((SWORD*) rgbInfoValue)=32;
  343.     *pcbInfoValue=sizeof(SWORD);
  344.     break;
  345.   case SQL_MAX_BINARY_LITERAL_LEN:
  346.   case SQL_MAX_CHAR_LITERAL_LEN:
  347.     *((long*) rgbInfoValue)=0;
  348.     *pcbInfoValue=sizeof(long);
  349.     break;
  350.   case SQL_MAX_COLUMNS_IN_INDEX:
  351.     *((SWORD*) rgbInfoValue)=16;
  352.     *pcbInfoValue=sizeof(SWORD);
  353.     break;
  354.   case SQL_MAX_INDEX_SIZE:
  355.     *((long*) rgbInfoValue)=120;
  356.     *pcbInfoValue=sizeof(long);
  357.     break;
  358. #if (ODBCVER >= 0x0300)
  359.   case SQL_MAX_IDENTIFIER_LENGTH:
  360.     *((long*) rgbInfoValue)=NAME_LEN;
  361.     *pcbInfoValue=sizeof(long);
  362.     break;
  363. #endif
  364.   case SQL_MAX_STATEMENT_LEN:
  365.     *((long*) rgbInfoValue)=net_buffer_length;
  366.     *pcbInfoValue=sizeof(long);
  367.     break;
  368.   case SQL_QUALIFIER_LOCATION:
  369.     *((SWORD*) rgbInfoValue)=SQL_QL_START;
  370.     *pcbInfoValue=sizeof(SWORD);
  371.     break;
  372.   case SQL_GETDATA_EXTENSIONS:
  373.    *((long*) rgbInfoValue)= SQL_GD_ANY_COLUMN | SQL_GD_ANY_ORDER | SQL_GD_BOUND;
  374.     *pcbInfoValue=sizeof(long);
  375.     break;
  376.   case SQL_STATIC_SENSITIVITY:
  377.    // *((long*) rgbInfoValue)=SQL_SS_DELETIONS | SQL_SS_UPDATES;
  378.    *((long*) rgbInfoValue)=0;
  379.     *pcbInfoValue=sizeof(long);
  380.     break;
  381.   case SQL_FILE_USAGE:
  382.     *((SWORD*) rgbInfoValue)=SQL_FILE_NOT_SUPPORTED;
  383.     *pcbInfoValue=sizeof(SWORD);
  384.     break;
  385.   case SQL_GROUP_BY:
  386.     *((SWORD*) rgbInfoValue)=SQL_GB_NO_RELATION;
  387.     *pcbInfoValue=sizeof(SWORD);
  388.     break;
  389.   case SQL_KEYWORDS:
  390.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,
  391.    "UNIQUE,ZEROFILL,UNSIGNED,BIGINT,BLOB,TINYBLOB,MEDIMUMBLOB,LONGBLOB,MEDIUMINT,PROCEDURE,SHOW,LIMIT,DEFAULT,TABLES,REGEXP,RLIKE,KEYS,TINTTEXT,MEDIUMTEXT",
  392.    cbInfoValueMax)
  393.    - (char*) rgbInfoValue);
  394.     break;
  395.   case SQL_SPECIAL_CHARACTERS:
  396.   {
  397.     *pcbInfoValue=(SWORD) (strmake((char*) rgbInfoValue,
  398.    "屈殁溧彗觌栾铎呐涉启鲵