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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB
  2.    This file is public domain and comes with NO WARRANTY of any kind */
  3. /*
  4. ** CONNECT.C - This is the ODBC sample driver code for
  5. ** allocation and connection.
  6. */
  7. #include "myodbc.h"
  8. #ifndef _UNIX_
  9. #include <odbcinst.h>
  10. #include "dialogs.h"
  11. #endif /* IS NOT UNIX */
  12. #ifndef CLIENT_NO_SCHEMA /* Temporary fix for 3.21.29 */
  13. #define CLIENT_NO_SCHEMA      16
  14. #endif
  15. //      CONNECT.C
  16. //
  17. //      SQLC connection functions.
  18. //      -       -       -       -       -       -       -       -       -
  19. //      Allocate an environment (ENV) block.
  20. RETCODE SQL_API SQLAllocEnv(HENV FAR * phenv)
  21. {
  22.   myodbc_init();
  23. #ifndef _UNIX_
  24.   {
  25.     HGLOBAL henv= GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (ENV));
  26.     if (henv == NULL || (*phenv = (HENV)GlobalLock (henv)) == NULL)
  27.     {
  28.       GlobalFree (henv); /* Free it if lock fails */
  29.       *phenv = SQL_NULL_HENV;
  30.       return SQL_ERROR;
  31.     }
  32.   }
  33. #else
  34.   if (!(*phenv = (HENV) my_malloc(sizeof(ENV),MYF(MY_ZEROFILL))))
  35.   {
  36.     *phenv = SQL_NULL_HENV;
  37.     return SQL_ERROR;
  38.   }
  39. #endif /* IS UNIX */
  40.   return SQL_SUCCESS;
  41. }
  42. RETCODE SQL_API SQLFreeEnv(HENV henv)
  43. {
  44. #ifndef _UNIX_
  45.   GlobalUnlock(GlobalHandle((HGLOBAL) henv));
  46.   GlobalFree(GlobalHandle((HGLOBAL) henv));
  47. #else
  48.   my_free(henv,MYF(0));
  49. #endif /* IS UNIX */
  50.   return SQL_SUCCESS;
  51. }
  52. //      -       -       -       -       -       -       -       -       -
  53. //      Allocate a DBC block.
  54. RETCODE SQL_API SQLAllocConnect(HENV henv, HDBC FAR *phdbc)
  55. {
  56.   DBC FAR *dbc;
  57. #ifndef _UNIX_
  58.   {
  59.     HGLOBAL hdbc = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (DBC));
  60.     if (!hdbc || (*phdbc = (HDBC)GlobalLock (hdbc)) == SQL_NULL_HDBC)
  61.     {
  62.       GlobalFree (hdbc); /* Free it if lock fails */
  63.       *phdbc = SQL_NULL_HENV;
  64.       return SQL_ERROR;
  65.     }
  66.   }
  67. #else /* IS UNIX */
  68.   if (!(*phdbc = (HDBC) my_malloc(sizeof(DBC),MYF(MY_ZEROFILL))))
  69.   {
  70.     *phdbc = SQL_NULL_HDBC;
  71.     return SQL_ERROR;
  72.   }
  73. #endif
  74.   dbc=(DBC FAR*) *phdbc;
  75.   dbc->env=henv;
  76.   dbc->mysql.net.fd = -1; /* Marker if open */
  77.   dbc->flag=0;
  78.   dbc->stmt_options.max_rows= dbc->stmt_options.max_length= 0L;
  79.   dbc->stmt_options.bind_type=SQL_BIND_BY_COLUMN;
  80.   dbc->stmt_options.rows_in_set=1;
  81.   dbc->stmt_options.cursor_type=SQL_CURSOR_FORWARD_ONLY;  /* ODBC default */
  82.   dbc->login_timeout=0;
  83.   return SQL_SUCCESS;
  84. }
  85. RETCODE SQL_API SQLFreeConnect(HDBC hdbc)
  86. {
  87.   DBC FAR *dbc=(DBC FAR*) hdbc;
  88.   my_free(dbc->dsn,MYF(MY_ALLOW_ZERO_PTR));
  89.   my_free(dbc->database,MYF(MY_ALLOW_ZERO_PTR));
  90.   my_free(dbc->server,MYF(MY_ALLOW_ZERO_PTR));
  91.   my_free(dbc->user,MYF(MY_ALLOW_ZERO_PTR));
  92.   my_free(dbc->password,MYF(MY_ALLOW_ZERO_PTR));
  93. #ifndef _UNIX_
  94.   GlobalUnlock(GlobalHandle((HGLOBAL) hdbc));
  95.   GlobalFree(GlobalHandle((HGLOBAL) hdbc));
  96. #else  /* IS UNIX */
  97.   my_free(hdbc,MYF(0));
  98. #endif
  99.   return SQL_SUCCESS;
  100. }
  101. /******************************************************************************
  102. * Connect to mysql server
  103. ******************************************************************************/
  104. RETCODE SQL_API SQLConnect(HDBC hdbc, UCHAR FAR *szDSN, SWORD   cbDSN,
  105.    UCHAR FAR *szUID, SWORD cbUID, UCHAR FAR *szAuthStr,
  106.    SWORD cbAuthStr)
  107. {
  108.   char host[64],user[64],passwd[64],dsn[NAME_LEN+1],database[NAME_LEN+1],
  109.        port[10],flag[10];
  110.   uint port_nr=0,flag_nr=0,client_flag=0;
  111.   DBC FAR *dbc=(DBC FAR*) hdbc;
  112.   DBUG_ENTER("SQLConnect");
  113.   if (dbc->mysql.net.fd >= 0)
  114.   {
  115.     DBUG_RETURN(set_error(hdbc,"08002","Connection in use",0));
  116.   }
  117.   dbc->sqlstate[0]=0;
  118. #ifndef _UNIX_
  119.   SQLGetPrivateProfileString(fix_str(dsn,szDSN,cbDSN),"server",
  120.      "localhost", host, sizeof(host),"ODBC.INI");
  121.   SQLGetPrivateProfileString(dsn,"database",
  122.      dsn, database, sizeof(database),"ODBC.INI");
  123.   SQLGetPrivateProfileString(dsn,"port",
  124.      "0", port, sizeof(port),"ODBC.INI");
  125.   port_nr=(uint) atoi(port);
  126.   SQLGetPrivateProfileString(dsn,"flag",
  127.      "0", flag, sizeof(flag),"ODBC.INI");
  128.   flag_nr=(uint) atoi(flag);
  129. #else
  130.   strmov(database,szDSN);
  131.   {
  132.     char *cp;
  133.     strmov(host, (cp = getenv("MYSQL_HOST")) ? cp : "localhost");
  134.   }
  135. #endif /* IS UNIX */
  136.   if (flag_nr & FLAG_FOUND_ROWS)
  137.     client_flag=CLIENT_FOUND_ROWS;
  138.   if (flag_nr & FLAG_NO_SCHEMA)
  139.     client_flag|=CLIENT_NO_SCHEMA;
  140.   if (flag_nr & FLAG_DEBUG)
  141.     mysql_debug("d:t:S:O,c::\myodbc.log");
  142.   DBUG_PRINT("info",("MyODBC Version %s  Options: %d",DRIVER_VERSION,flag_nr));
  143.   if (flag_nr & FLAG_BIG_PACKETS)
  144.     max_allowed_packet=~0L;
  145. #if MYSQL_VERSION_ID >= 32200
  146.   if (!mysql_real_connect(&dbc->mysql,host,fix_str(user,(char FAR *) szUID,
  147.    cbUID),
  148.   fix_str(passwd,(char FAR*) szAuthStr,cbAuthStr),
  149.   database, port_nr,
  150.   NullS, client_flag))
  151.   {
  152.     strmov(dbc->sqlstate,"S1000");
  153.     DBUG_RETURN(SQL_ERROR);
  154.   }
  155. #else
  156.   if (!mysql_real_connect(&dbc->mysql,host,fix_str(user,(char FAR *) szUID,
  157.    cbUID),
  158.   fix_str(passwd,(char FAR*) szAuthStr,cbAuthStr),
  159.   port_nr, NullS, client_flag))
  160.   {
  161.     strmov(dbc->sqlstate,"S1000");
  162.     DBUG_RETURN(SQL_ERROR);
  163.   }
  164.   if (mysql_select_db(&dbc->mysql,database))
  165.   {
  166.     strmov(dbc->sqlstate,"08004");
  167.     mysql_close(&dbc->mysql);
  168.     DBUG_RETURN(SQL_ERROR);
  169.   }
  170. #endif
  171.   dbc->dsn=my_strdup(database,MYF(MY_WME));
  172.   dbc->database=my_strdup(database,MYF(MY_WME));
  173.   dbc->server=my_strdup(host,MYF(MY_WME));
  174.   dbc->user=my_strdup(user,MYF(MY_WME));
  175.   dbc->password=my_strdup(passwd,MYF(MY_WME));
  176.   dbc->port=port_nr;
  177.   dbc->flag=flag_nr;
  178.   DBUG_RETURN(SQL_SUCCESS);
  179. }
  180. // This function as its "normal" behavior is supposed to bring up a
  181. // dialog box if it isn't given enough information via "szConnStrIn".  If
  182. // it is given enough information, it's supposed to use "szConnStrIn" to
  183. // establish a database connection.  In either case, it returns a
  184. // string to the user that is the string that was eventually used to
  185. // establish the connection.
  186. #ifdef _UNIX_ /* By Tsurng-Chen Chern */
  187. char *my_strtok(char *s1, char *s2)
  188. {
  189.    char *start;
  190.    static char *p;
  191.    p = (s1 ? s1 : p + 1);
  192.    if ((!p) || (!*p))
  193.       return(NULL);
  194.    start = p;
  195.    while ((*p) && (!strchr(s2, *p)))
  196.       p++;
  197.    *p = 0;
  198.    return(start);
  199. }
  200. #endif
  201. RETCODE SQL_API SQLDriverConnect(HDBC hdbc,HWND hwnd,UCHAR FAR *szConnStrIn,
  202.  SWORD cbConnStrIn,UCHAR FAR *szConnStrOut,
  203.  SWORD cbConnStrOutMax,
  204.  SWORD FAR *pcbConnStrOut,
  205.  UWORD fDriverCompletion)
  206. {
  207. #ifndef _UNIX_
  208.   short   iRet;
  209.   BOOL    fPrompt = FALSE,maybe_prompt;
  210.   DBC FAR *dbc=(DBC FAR*) hdbc;
  211.   GLOBALHANDLE hglbAttr;
  212.   LPSETUPDLG lpsetupdlg;
  213.   uint client_flag=0;
  214.   DBUG_ENTER("SQLDriverConnect");
  215.   DBUG_PRINT("enter",("fDriverCompletion: %d",fDriverCompletion));
  216.   hglbAttr = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(SETUPDLG));
  217.   if (!hglbAttr)
  218.     DBUG_RETURN(FALSE);
  219.   lpsetupdlg = (LPSETUPDLG)GlobalLock(hglbAttr);
  220.   maybe_prompt=(fDriverCompletion == SQL_DRIVER_COMPLETE ||
  221. fDriverCompletion == SQL_DRIVER_COMPLETE_REQUIRED);
  222.   if ((szConnStrIn == NULL) || (!cbConnStrIn) ||
  223.       ((cbConnStrIn == SQL_NTS) && (!szConnStrIn[0])))
  224.     fPrompt = TRUE;
  225.   else
  226.   {
  227.     int flag;
  228.     /* Check connection string for completeness. Prompt if not all params */
  229.     ParseAttributes(szConnStrIn, lpsetupdlg);
  230.     set_attributes(lpsetupdlg);
  231.     flag=atoi(lpsetupdlg->aAttr[KEY_FLAG].szAttr);
  232.     if (fDriverCompletion == SQL_DRIVER_PROMPT && ! (flag & FLAG_NO_PROMPT) ||
  233. (maybe_prompt &&
  234.  (!lpsetupdlg->aAttr[KEY_DSN].szAttr[0] ||
  235.   !lpsetupdlg->aAttr[KEY_SERVER].szAttr[0] ||
  236.   !lpsetupdlg->aAttr[KEY_USER].szAttr[0])))
  237.       fPrompt = TRUE;
  238.   }
  239. retry:
  240.   if (fPrompt)
  241.   {
  242.     iRet = DialogBoxParam(s_hModule, MAKEINTRESOURCE(DRIVERCONNECT), hwnd,
  243.           DriverConnectProc,
  244.           (LONG)(LPSTR) lpsetupdlg);
  245.     if ((!iRet) || (iRet == -1))
  246.     {
  247.       GlobalUnlock(hglbAttr);
  248.       GlobalFree(hglbAttr);
  249.       DBUG_RETURN(SQL_NO_DATA_FOUND);
  250.     }
  251.   }
  252.   if (szConnStrOut)
  253.   {
  254.     char *pos,buff[1024];
  255.     long length;
  256.     ulong tmp= ~0L;
  257.     pos=strxmov(buff,
  258. "DSN=",lpsetupdlg->aAttr[KEY_DSN].szAttr,
  259. ";DB=",lpsetupdlg->aAttr[KEY_DB].szAttr,
  260. ";SERVER=",lpsetupdlg->aAttr[KEY_SERVER].szAttr,
  261. ";UID=",lpsetupdlg->aAttr[KEY_USER].szAttr,
  262. ";PWD=",lpsetupdlg->aAttr[KEY_PASSWORD].szAttr,
  263. ";PORT=",lpsetupdlg->aAttr[KEY_PORT].szAttr,
  264. ";FLAG=",lpsetupdlg->aAttr[KEY_FLAG].szAttr,
  265. ";",NullS);
  266.     (void) copy_lresult((DBC FAR*) 0,szConnStrOut,cbConnStrOutMax,
  267.                         &length,buff,(uint) (pos-buff),0L,0L,&tmp);
  268.     if (pcbConnStrOut)
  269.       *pcbConnStrOut=(SWORD) length;
  270.     DBUG_PRINT("info",("Connect string out: %s",szConnStrOut));
  271.   }
  272.   dbc->port=atoi(lpsetupdlg->aAttr[KEY_PORT].szAttr);
  273.   dbc->flag=atoi(lpsetupdlg->aAttr[KEY_FLAG].szAttr);
  274.   if (dbc->flag & FLAG_FOUND_ROWS)
  275.     client_flag=CLIENT_FOUND_ROWS;
  276.    if (dbc->flag & FLAG_NO_SCHEMA)
  277. client_flag|=CLIENT_NO_SCHEMA;
  278.   if (dbc->flag & FLAG_DEBUG)
  279.     mysql_debug("d:t:S:O,c::\myodbc.log");
  280.   DBUG_PRINT("info",("MyODBC Version %s  Options: %d",DRIVER_VERSION,
  281.      dbc->flag));
  282.   if (dbc->flag & FLAG_BIG_PACKETS)
  283.     max_allowed_packet=~0L;
  284.   /* If no DB, use DSN as database name */
  285.   if (!lpsetupdlg->aAttr[KEY_DB].szAttr[0])
  286.   {
  287.     strmov(lpsetupdlg->aAttr[KEY_DB].szAttr,
  288.    lpsetupdlg->aAttr[KEY_DSN].szAttr);
  289.   }
  290.   if (!mysql_real_connect(&dbc->mysql,lpsetupdlg->aAttr[KEY_SERVER].szAttr,
  291.   lpsetupdlg->aAttr[KEY_USER].szAttr,
  292.   lpsetupdlg->aAttr[KEY_PASSWORD].szAttr,
  293.   lpsetupdlg->aAttr[KEY_DB].szAttr,
  294.   dbc->port,NullS,client_flag))
  295.   {
  296.     if (maybe_prompt && !fPrompt)
  297.     {
  298.       fPrompt=TRUE;
  299.       goto retry;
  300.     }
  301.     strmov(dbc->sqlstate,"S1000");
  302.     GlobalUnlock(hglbAttr);
  303.     GlobalFree(hglbAttr);
  304.     DBUG_RETURN(SQL_ERROR);
  305.   }
  306.   dbc->dsn=my_strdup(lpsetupdlg->aAttr[KEY_DSN].szAttr,MYF(MY_WME));
  307.   dbc->database=my_strdup(lpsetupdlg->aAttr[KEY_DB].szAttr,MYF(MY_WME));
  308.   dbc->server=my_strdup(lpsetupdlg->aAttr[KEY_SERVER].szAttr,MYF(MY_WME));
  309.   dbc->user=my_strdup(lpsetupdlg->aAttr[KEY_USER].szAttr,MYF(MY_WME));
  310.   dbc->password=my_strdup(lpsetupdlg->aAttr[KEY_PASSWORD].szAttr,MYF(MY_WME));
  311.   GlobalUnlock(hglbAttr);
  312.   GlobalFree(hglbAttr);
  313.   DBUG_RETURN(SQL_SUCCESS);
  314. #endif /* IS NOT UNIX */
  315. #ifdef _UNIX_
  316.   UCHAR FAR *connstrin=NULL;
  317.   char *KEY_DSN=NULL;
  318.   char *KEY_SERVER=NULL;
  319.   char *KEY_USER=NULL;
  320.   char *KEY_PASSWORD=NULL;
  321.   char *KEY_PORT=NULL;
  322.   char *KEY_OPTION=NULL;
  323.   char *KEY_DB=NULL;
  324.   char *KEY_SOCKET=NULL;
  325.   char *tok[9];
  326.   char *tok2=NULL;
  327.   char *tok3=NULL;
  328.   int i;
  329.   uint client_flag=0;
  330.   BOOL    fPrompt = FALSE;
  331.   DBC FAR *dbc=(DBC FAR*) hdbc;
  332.   DBUG_ENTER("SQLDriverConnect");
  333.   DBUG_PRINT("enter",("fDriverCompletion: %d",fDriverCompletion));
  334.   if ((szConnStrIn == NULL) || (!cbConnStrIn) ||
  335.       ((cbConnStrIn == SQL_NTS) && (!szConnStrIn[0])))
  336.     fPrompt = TRUE;
  337.   else
  338.   {
  339.     /* Check connection string for completeness. */
  340.     /* Prompt if not all params  */
  341.     connstrin=(UCHAR FAR *) my_strdup(szConnStrIn,MYF(MY_WME));
  342.     tok[0]=my_strtok(connstrin,";");
  343.     for (i=1 ; i <= 7 ; i++)
  344.       tok[i]=my_strtok(NULL,";");
  345.     tok[i]=NULL;
  346.     for (i=0 ; tok[i] ; i++)
  347.     {
  348.       if (tok2 = my_strtok(tok[i], "="))
  349.       {
  350. if (strcmp("DSN", tok2) == 0)
  351. {
  352.   if ((tok3 = my_strtok(NULL, "")) && tok3[0])
  353.     KEY_DSN = (char*) my_strdup(tok3, MYF(MY_WME));
  354.   else
  355.   {
  356.     x_free(KEY_DSN);
  357.     KEY_DSN = NULL;
  358.   }
  359. }
  360. if (strcmp("DB", tok2) == 0)
  361. {
  362.   if ((tok3 = my_strtok(NULL, "")) && tok3[0])
  363.     KEY_DB = (char*) my_strdup(tok3, MYF(MY_WME));
  364.   else
  365.   {
  366.     x_free(KEY_DB);
  367.     KEY_DB = NULL;
  368.   }
  369. }
  370. if (strcmp("UID", tok2) == 0)
  371. {
  372.   if ((tok3 = my_strtok(NULL, "")) && tok3[0])
  373.     KEY_USER = (char*) my_strdup(tok3, MYF(MY_WME));
  374.   else
  375.   {
  376.     x_free(KEY_USER);
  377.     KEY_USER = NULL;
  378.   }
  379. }
  380. if (strcmp("PWD", tok2) == 0)
  381. {
  382.   if ((tok3 = my_strtok(NULL, "")) && tok3[0])
  383.     KEY_PASSWORD = (char*) my_strdup(tok3, MYF(MY_WME));
  384.   else
  385.   {
  386.     x_free(KEY_PASSWORD);
  387.     KEY_PASSWORD = NULL;
  388.   }
  389. }
  390. if (strcmp("SERVER", tok2) == 0)
  391. {
  392.   if ((tok3 = my_strtok(NULL, "")) && tok3[0])
  393.     KEY_SERVER = (char*) my_strdup(tok3, MYF(MY_WME));
  394.   else
  395.   {
  396.     x_free(KEY_SERVER);
  397.     KEY_SERVER = NULL;
  398.   }
  399. }
  400. if (strcmp("PORT", tok2) == 0)
  401. {
  402.   if ((tok3 = my_strtok(NULL, "")) && tok3[0])
  403.     KEY_PORT = (char*) my_strdup(tok3, MYF(MY_WME));
  404.   else
  405.   {
  406.     x_free(KEY_PORT);
  407.     KEY_PORT = NULL;
  408.   }
  409. }
  410. if (strcmp("SOCKET", tok2) == 0)
  411. {
  412.   if ((tok3 = my_strtok(NULL, "")) && tok3[0])
  413.     KEY_SOCKET = (char*) my_strdup(tok3, MYF(MY_WME));
  414.   else
  415.   {
  416.     x_free(KEY_SOCKET);
  417.     KEY_PORT = NULL;
  418.   }
  419. }
  420. if (strcmp("OPTION", tok2) == 0)
  421. {
  422.   if ((tok3 = my_strtok(NULL, "")) && tok3[0])
  423.     KEY_OPTION = (char*) my_strdup(tok3, MYF(MY_WME));
  424.   else
  425.   {
  426.     x_free(KEY_OPTION);
  427.     KEY_PORT = NULL;
  428.   }
  429. }
  430.       }
  431.     }
  432.     if (!KEY_DB && KEY_DSN)
  433.       KEY_DB = (char*) my_strdup(KEY_DSN, MYF(MY_WME));
  434.     if (!KEY_SERVER)
  435.       KEY_SERVER = (char*) my_strdup("localhost", MYF(MY_WME));
  436.     if (!KEY_PORT)
  437.       KEY_PORT = (char*) my_strdup("3306", MYF(MY_WME));
  438.     if (!KEY_SOCKET)
  439.       KEY_SOCKET = (char*) my_strdup("", MYF(MY_WME));
  440.     if (!KEY_USER)
  441.       KEY_USER = (char*) my_strdup("dummy", MYF(MY_WME));
  442.     if (!KEY_PASSWORD)
  443.       KEY_PASSWORD = (char*) my_strdup("", MYF(MY_WME));
  444.     if (!KEY_OPTION)
  445.       KEY_OPTION = (char*) my_strdup("0", MYF(MY_WME));
  446.     if (fDriverCompletion == SQL_DRIVER_PROMPT ||
  447. ((fDriverCompletion == SQL_DRIVER_COMPLETE ||
  448.   fDriverCompletion == SQL_DRIVER_COMPLETE_REQUIRED) &&
  449.  (!KEY_DSN)))
  450.       fPrompt = TRUE;
  451.   }
  452.   if (fPrompt)
  453.   {
  454.     DBUG_RETURN(set_error((DBC FAR*) hdbc,"S1000","No DSN entered",0));
  455.   }
  456.   if (szConnStrOut)
  457.   {
  458.     UCHAR FAR  *pos;
  459.     pos=strxmov(szConnStrOut,
  460. "DSN=",KEY_DSN,
  461. ";DB=",KEY_DB,
  462.                 ";SERVER=",KEY_SERVER,
  463.                 ";UID=",KEY_USER,
  464.                 ";PWD=",KEY_PASSWORD,
  465.                 ";PORT=",KEY_PORT,
  466.                 ";SOCKET=",KEY_SOCKET,
  467.                 ";OPTION=",KEY_OPTION,
  468. ";",NullS);
  469.     *pcbConnStrOut=(int) (pos-szConnStrOut);
  470.   }
  471.   dbc->flag=atoi(KEY_OPTION);
  472.   dbc->port=atoi(KEY_PORT);
  473.   if (dbc->flag & FLAG_FOUND_ROWS)
  474.     client_flag=CLIENT_FOUND_ROWS;
  475.   if (dbc->flag & FLAG_NO_SCHEMA)
  476. client_flag|=CLIENT_NO_SCHEMA;
  477.   if (dbc->flag & FLAG_DEBUG)
  478.     mysql_debug("d:t:S:O,/tmp/myodbc.log");
  479.   DBUG_PRINT("info",("MyODBC Version %s  Options: %d",DRIVER_VERSION,
  480.      dbc->flag));
  481.   if (dbc->flag & FLAG_BIG_PACKETS)
  482.     max_allowed_packet=~0L;
  483. #if MYSQL_VERSION_ID >= 32200
  484.   if (!mysql_real_connect(&dbc->mysql,KEY_SERVER,
  485.   KEY_USER,
  486.   KEY_PASSWORD,
  487.                           KEY_DB,
  488.                           dbc->port,
  489.   KEY_SOCKET[0] ? KEY_SOCKET : NullS,
  490.   client_flag))
  491.   {
  492.     strmov(dbc->sqlstate,"S1000");
  493.     DBUG_RETURN(SQL_ERROR);
  494.   }
  495. #else
  496.   if (!mysql_real_connect(&dbc->mysql,KEY_SERVER,
  497.   KEY_USER,
  498.   KEY_PASSWORD,
  499.                           dbc->port,
  500.   KEY_SOCKET[0] ? KEY_SOCKET : NullS,
  501.   client_flag))
  502.   {
  503.     strmov(dbc->sqlstate,"S1000");
  504.     DBUG_RETURN(SQL_ERROR);
  505.   }
  506.   if (mysql_select_db(&dbc->mysql,KEY_DB))
  507.   {
  508.     strmov(dbc->sqlstate,"08004");
  509.     mysql_close(&dbc->mysql);
  510.     DBUG_RETURN(SQL_ERROR);
  511.   }
  512. #endif
  513.   dbc->dsn=my_strdup(KEY_DSN,MYF(MY_WME));
  514.   dbc->database=my_strdup(KEY_DB,MYF(MY_WME));
  515.   dbc->server=my_strdup(KEY_SERVER,MYF(MY_WME));
  516.   dbc->user=my_strdup(KEY_USER,MYF(MY_WME));
  517.   dbc->password=my_strdup(KEY_PASSWORD,MYF(MY_WME));
  518.   x_free(KEY_DSN);
  519.   x_free(KEY_DB);
  520.   x_free(KEY_SERVER);
  521.   x_free(KEY_USER);
  522.   x_free(KEY_PASSWORD);
  523.   x_free(KEY_PORT);
  524.   x_free(KEY_SOCKET);
  525.   x_free(KEY_OPTION);
  526.   x_free(connstrin);
  527.   DBUG_RETURN(SQL_SUCCESS);
  528. #endif /* IS UNIX */
  529. }
  530. RETCODE SQL_API SQLBrowseConnect(HDBC hdbc,UCHAR FAR *szConnStrIn,
  531.  SWORD cbConnStrIn,
  532.  UCHAR FAR *szConnStrOut,SWORD cbConnStrOutMax,
  533.  SWORD FAR *pcbConnStrOut)
  534. {
  535.   DBUG_ENTER("SQLBrowseConnect");
  536.   DBUG_RETURN(set_error((DBC FAR*) hdbc,"IM001","This doesn't work yet",4000));
  537. }
  538. RETCODE SQL_API SQLDisconnect(HDBC hdbc)
  539. {
  540.   LIST *list_element,*next_element;
  541.   DBC FAR *dbc=(DBC FAR*) hdbc;
  542.   for (list_element=dbc->statements ; list_element ;
  543.        list_element=next_element)
  544.   {
  545.     next_element=list_element->next;
  546.     SQLFreeStmt((STMT FAR*) list_element->data,SQL_DROP);
  547.   }
  548.   mysql_close(&dbc->mysql);
  549.   return SQL_SUCCESS;
  550. }