⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connect.c

📁 MySQL的ODBC接口程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB
   This file is public domain and comes with NO WARRANTY of any kind */

/*
** CONNECT.C - This is the ODBC sample driver code for
** allocation and connection.
*/

#include "myodbc.h"

#ifndef _UNIX_
#include <odbcinst.h>
#include "dialogs.h"
#endif /* IS NOT UNIX */

#ifndef CLIENT_NO_SCHEMA			/* Temporary fix for 3.21.29 */
#define CLIENT_NO_SCHEMA      16
#endif

//      CONNECT.C
//
//      SQLC connection functions.
//      -       -       -       -       -       -       -       -       -
//      Allocate an environment (ENV) block.


RETCODE SQL_API SQLAllocEnv(HENV FAR * phenv)
{
  myodbc_init();
#ifndef _UNIX_
  {
    HGLOBAL henv= GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (ENV));
    if (henv == NULL || (*phenv = (HENV)GlobalLock (henv)) == NULL)
    {
      GlobalFree (henv);			/* Free it if lock fails */
      *phenv = SQL_NULL_HENV;
      return SQL_ERROR;
    }
  }
#else
  if (!(*phenv = (HENV) my_malloc(sizeof(ENV),MYF(MY_ZEROFILL))))
  {
    *phenv = SQL_NULL_HENV;
    return SQL_ERROR;
  }
#endif /* IS UNIX */
  return SQL_SUCCESS;
}


RETCODE SQL_API SQLFreeEnv(HENV henv)
{
#ifndef _UNIX_
  GlobalUnlock(GlobalHandle((HGLOBAL) henv));
  GlobalFree(GlobalHandle((HGLOBAL) henv));
#else
  my_free(henv,MYF(0));
#endif /* IS UNIX */
  return SQL_SUCCESS;
}


//      -       -       -       -       -       -       -       -       -
//      Allocate a DBC block.

RETCODE SQL_API SQLAllocConnect(HENV henv, HDBC FAR *phdbc)
{
  DBC FAR *dbc;
#ifndef _UNIX_
  {
    HGLOBAL hdbc = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (DBC));
    if (!hdbc || (*phdbc = (HDBC)GlobalLock (hdbc)) == SQL_NULL_HDBC)
    {
      GlobalFree (hdbc);	/* Free it if lock fails */
      *phdbc = SQL_NULL_HENV;
      return SQL_ERROR;
    }
  }
#else /* IS UNIX */
  if (!(*phdbc = (HDBC) my_malloc(sizeof(DBC),MYF(MY_ZEROFILL))))
  {
    *phdbc = SQL_NULL_HDBC;
    return SQL_ERROR;
  }
#endif

  dbc=(DBC FAR*) *phdbc;
  dbc->env=henv;
  dbc->mysql.net.fd = -1;			/* Marker if open */
  dbc->flag=0;
  dbc->stmt_options.max_rows= dbc->stmt_options.max_length= 0L;
  dbc->stmt_options.bind_type=SQL_BIND_BY_COLUMN;
  dbc->stmt_options.rows_in_set=1;
  dbc->stmt_options.cursor_type=SQL_CURSOR_FORWARD_ONLY;  /* ODBC default */
  dbc->login_timeout=0;
  return SQL_SUCCESS;
}


RETCODE SQL_API SQLFreeConnect(HDBC hdbc)
{
  DBC FAR *dbc=(DBC FAR*) hdbc;
  my_free(dbc->dsn,MYF(MY_ALLOW_ZERO_PTR));
  my_free(dbc->database,MYF(MY_ALLOW_ZERO_PTR));
  my_free(dbc->server,MYF(MY_ALLOW_ZERO_PTR));
  my_free(dbc->user,MYF(MY_ALLOW_ZERO_PTR));
  my_free(dbc->password,MYF(MY_ALLOW_ZERO_PTR));

#ifndef _UNIX_
  GlobalUnlock(GlobalHandle((HGLOBAL) hdbc));
  GlobalFree(GlobalHandle((HGLOBAL) hdbc));
#else  /* IS UNIX */
  my_free(hdbc,MYF(0));
#endif
  return SQL_SUCCESS;
}

/******************************************************************************
*	Connect to mysql server
******************************************************************************/

RETCODE SQL_API SQLConnect(HDBC hdbc, UCHAR FAR *szDSN, SWORD   cbDSN,
			   UCHAR FAR *szUID, SWORD cbUID, UCHAR FAR *szAuthStr,
			   SWORD cbAuthStr)
{
  char host[64],user[64],passwd[64],dsn[NAME_LEN+1],database[NAME_LEN+1],
       port[10],flag[10];
  uint port_nr=0,flag_nr=0,client_flag=0;
  DBC FAR *dbc=(DBC FAR*) hdbc;
  DBUG_ENTER("SQLConnect");

  if (dbc->mysql.net.fd >= 0)
  {
    DBUG_RETURN(set_error(hdbc,"08002","Connection in use",0));
  }
  dbc->sqlstate[0]=0;
#ifndef _UNIX_
  SQLGetPrivateProfileString(fix_str(dsn,szDSN,cbDSN),"server",
			     "localhost", host, sizeof(host),"ODBC.INI");
  SQLGetPrivateProfileString(dsn,"database",
			     dsn, database, sizeof(database),"ODBC.INI");
  SQLGetPrivateProfileString(dsn,"port",
			     "0", port, sizeof(port),"ODBC.INI");
  port_nr=(uint) atoi(port);
  SQLGetPrivateProfileString(dsn,"flag",
			     "0", flag, sizeof(flag),"ODBC.INI");
  flag_nr=(uint) atoi(flag);
#else
  strmov(database,szDSN);
  {
    char *cp;
    strmov(host, (cp = getenv("MYSQL_HOST")) ? cp : "localhost");
  }
#endif /* IS UNIX */

  if (flag_nr & FLAG_FOUND_ROWS)
    client_flag=CLIENT_FOUND_ROWS;
  if (flag_nr & FLAG_NO_SCHEMA)
    client_flag|=CLIENT_NO_SCHEMA;
  if (flag_nr & FLAG_DEBUG)
    mysql_debug("d:t:S:O,c::\\myodbc.log");
  DBUG_PRINT("info",("MyODBC Version %s  Options: %d",DRIVER_VERSION,flag_nr));
  if (flag_nr & FLAG_BIG_PACKETS)
    max_allowed_packet=~0L;
#if MYSQL_VERSION_ID >= 32200
  if (!mysql_real_connect(&dbc->mysql,host,fix_str(user,(char FAR *) szUID,
						   cbUID),
			  fix_str(passwd,(char FAR*) szAuthStr,cbAuthStr),
			  database, port_nr,
			  NullS, client_flag))
  {
    strmov(dbc->sqlstate,"S1000");
    DBUG_RETURN(SQL_ERROR);
  }
#else
  if (!mysql_real_connect(&dbc->mysql,host,fix_str(user,(char FAR *) szUID,
						   cbUID),
			  fix_str(passwd,(char FAR*) szAuthStr,cbAuthStr),
			  port_nr, NullS, client_flag))
  {
    strmov(dbc->sqlstate,"S1000");
    DBUG_RETURN(SQL_ERROR);
  }
  if (mysql_select_db(&dbc->mysql,database))
  {
    strmov(dbc->sqlstate,"08004");
    mysql_close(&dbc->mysql);
    DBUG_RETURN(SQL_ERROR);
  }
#endif
  dbc->dsn=my_strdup(database,MYF(MY_WME));
  dbc->database=my_strdup(database,MYF(MY_WME));
  dbc->server=my_strdup(host,MYF(MY_WME));
  dbc->user=my_strdup(user,MYF(MY_WME));
  dbc->password=my_strdup(passwd,MYF(MY_WME));
  dbc->port=port_nr;
  dbc->flag=flag_nr;
  DBUG_RETURN(SQL_SUCCESS);
}


//	This function as its "normal" behavior is supposed to bring up a
//	dialog box if it isn't given enough information via "szConnStrIn".  If
//	it is given enough information, it's supposed to use "szConnStrIn" to
//	establish a database connection.  In either case, it returns a
//	string to the user that is the string that was eventually used to
//	establish the connection.

#ifdef _UNIX_					/* By Tsurng-Chen Chern */
char *my_strtok(char *s1, char *s2)
{
   char *start;
   static char *p;

   p = (s1 ? s1 : p + 1);
   if ((!p) || (!*p))
      return(NULL);

   start = p;
   while ((*p) && (!strchr(s2, *p)))
      p++;
   *p = 0;
   return(start);
}
#endif


RETCODE SQL_API SQLDriverConnect(HDBC hdbc,HWND hwnd,UCHAR FAR *szConnStrIn,
				 SWORD cbConnStrIn,UCHAR FAR *szConnStrOut,
				 SWORD cbConnStrOutMax,
				 SWORD FAR *pcbConnStrOut,
				 UWORD fDriverCompletion)
{
#ifndef _UNIX_

  short   iRet;
  BOOL    fPrompt = FALSE,maybe_prompt;
  DBC FAR *dbc=(DBC FAR*) hdbc;
  GLOBALHANDLE hglbAttr;
  LPSETUPDLG lpsetupdlg;
  uint client_flag=0;
  DBUG_ENTER("SQLDriverConnect");
  DBUG_PRINT("enter",("fDriverCompletion: %d",fDriverCompletion));

  hglbAttr = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(SETUPDLG));
  if (!hglbAttr)
    DBUG_RETURN(FALSE);
  lpsetupdlg = (LPSETUPDLG)GlobalLock(hglbAttr);

  maybe_prompt=(fDriverCompletion == SQL_DRIVER_COMPLETE ||
		fDriverCompletion == SQL_DRIVER_COMPLETE_REQUIRED);
  if ((szConnStrIn == NULL) || (!cbConnStrIn) ||
      ((cbConnStrIn == SQL_NTS) && (!szConnStrIn[0])))
    fPrompt = TRUE;
  else
  {
    int flag;
    /* Check connection string for completeness. Prompt if not all params */
    ParseAttributes(szConnStrIn, lpsetupdlg);
    set_attributes(lpsetupdlg);
    flag=atoi(lpsetupdlg->aAttr[KEY_FLAG].szAttr);
    if (fDriverCompletion == SQL_DRIVER_PROMPT && ! (flag & FLAG_NO_PROMPT) ||
	(maybe_prompt &&
	 (!lpsetupdlg->aAttr[KEY_DSN].szAttr[0] ||
	  !lpsetupdlg->aAttr[KEY_SERVER].szAttr[0] ||
	  !lpsetupdlg->aAttr[KEY_USER].szAttr[0])))
      fPrompt = TRUE;
  }
retry:
  if (fPrompt)
  {
    iRet = DialogBoxParam(s_hModule, MAKEINTRESOURCE(DRIVERCONNECT), hwnd,
		          DriverConnectProc,
		          (LONG)(LPSTR) lpsetupdlg);
    if ((!iRet) || (iRet == -1))
    {
      GlobalUnlock(hglbAttr);
      GlobalFree(hglbAttr);
      DBUG_RETURN(SQL_NO_DATA_FOUND);
    }
  }
  if (szConnStrOut)
  {
    char *pos,buff[1024];
    long length;
    ulong tmp= ~0L;
    pos=strxmov(buff,
		"DSN=",lpsetupdlg->aAttr[KEY_DSN].szAttr,
		";DB=",lpsetupdlg->aAttr[KEY_DB].szAttr,
		";SERVER=",lpsetupdlg->aAttr[KEY_SERVER].szAttr,
		";UID=",lpsetupdlg->aAttr[KEY_USER].szAttr,
		";PWD=",lpsetupdlg->aAttr[KEY_PASSWORD].szAttr,
		";PORT=",lpsetupdlg->aAttr[KEY_PORT].szAttr,
		";FLAG=",lpsetupdlg->aAttr[KEY_FLAG].szAttr,
		";",NullS);
    (void) copy_lresult((DBC FAR*) 0,szConnStrOut,cbConnStrOutMax,
                        &length,buff,(uint) (pos-buff),0L,0L,&tmp);
    if (pcbConnStrOut)
      *pcbConnStrOut=(SWORD) length;
    DBUG_PRINT("info",("Connect string out: %s",szConnStrOut));
  }
  dbc->port=atoi(lpsetupdlg->aAttr[KEY_PORT].szAttr);
  dbc->flag=atoi(lpsetupdlg->aAttr[KEY_FLAG].szAttr);
  if (dbc->flag & FLAG_FOUND_ROWS)
    client_flag=CLIENT_FOUND_ROWS;
   if (dbc->flag & FLAG_NO_SCHEMA)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -