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 */
5
** CONNECT.C - This is the ODBC sample driver code for
6
** allocation and connection.
14
#endif /* IS NOT UNIX */
16
#ifndef CLIENT_NO_SCHEMA /* Temporary fix for 3.21.29 */
17
#define CLIENT_NO_SCHEMA 16
22
// SQLC connection functions.
24
// Allocate an environment (ENV) block.
27
SQLRETURN SQL_API SQLAllocEnv(SQLHENV FAR * phenv)
32
HGLOBAL henv= GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (ENV));
33
if (henv == NULL || (*phenv = (SQLHENV)GlobalLock (henv)) == NULL)
35
GlobalFree (henv); /* Free it if lock fails */
36
*phenv = SQL_NULL_HENV;
41
if (!(*phenv = (SQLHENV) my_malloc(sizeof(ENV),MYF(MY_ZEROFILL))))
43
*phenv = SQL_NULL_HENV;
51
SQLRETURN SQL_API SQLFreeEnv(SQLHENV henv)
54
GlobalUnlock(GlobalHandle((HGLOBAL) henv));
55
GlobalFree(GlobalHandle((HGLOBAL) henv));
57
my_free((char*) henv,MYF(0));
64
// Allocate a DBC block.
66
SQLRETURN SQL_API SQLAllocConnect(SQLHENV henv, SQLHDBC FAR *phdbc)
71
HGLOBAL hdbc = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (DBC));
72
if (!hdbc || (*phdbc = (SQLHDBC)GlobalLock (hdbc)) == SQL_NULL_HDBC)
74
GlobalFree (hdbc); /* Free it if lock fails */
75
*phdbc = SQL_NULL_HENV;
80
if (!(*phdbc = (SQLHDBC) my_malloc(sizeof(DBC),MYF(MY_ZEROFILL))))
82
*phdbc = SQL_NULL_HDBC;
87
dbc=(DBC FAR*) *phdbc;
88
dbc->env= (ENV*) henv;
89
dbc->mysql.net.vio = 0; /* Marker if open */
91
dbc->stmt_options.max_rows= dbc->stmt_options.max_length= 0L;
92
dbc->stmt_options.bind_type=SQL_BIND_BY_COLUMN;
93
dbc->stmt_options.rows_in_set=1;
94
dbc->stmt_options.cursor_type=SQL_CURSOR_FORWARD_ONLY; /* ODBC default */
96
dbc->last_query_time= (time_t) time((time_t*) 0);
97
dbc->txn_isolation=DEFAULT_TXN_ISOLATION;
98
pthread_mutex_init(&dbc->lock,NULL);
103
SQLRETURN SQL_API SQLFreeConnect(SQLHDBC hdbc)
105
DBC FAR *dbc=(DBC FAR*) hdbc;
106
DBUG_ENTER("SQLFreeConnect");
108
my_free(dbc->dsn,MYF(MY_ALLOW_ZERO_PTR));
109
my_free(dbc->database,MYF(MY_ALLOW_ZERO_PTR));
110
my_free(dbc->server,MYF(MY_ALLOW_ZERO_PTR));
111
my_free(dbc->user,MYF(MY_ALLOW_ZERO_PTR));
112
my_free(dbc->password,MYF(MY_ALLOW_ZERO_PTR));
113
pthread_mutex_destroy(&dbc->lock);
116
GlobalUnlock(GlobalHandle((HGLOBAL) hdbc));
117
GlobalFree(GlobalHandle((HGLOBAL) hdbc));
119
my_free((char*) hdbc,MYF(0));
121
DBUG_RETURN(SQL_SUCCESS);
124
/****************************************************************************
125
** check the option flag and generate a connect flag
126
****************************************************************************/
128
ulong get_client_flag(MYSQL *mysql, ulong option_flag,uint connect_timeout,
131
ulong client_flag=CLIENT_ODBC;
132
DBUG_ENTER("get_client_flag");
136
if (option_flag & FLAG_DEBUG && ! _db_on_)
137
mysql_debug("d:t:S:O,c::\\myodbc.log");
139
if (option_flag & (FLAG_FOUND_ROWS | FLAG_SAFE))
140
client_flag|= CLIENT_FOUND_ROWS;
141
if (option_flag & FLAG_NO_SCHEMA)
142
client_flag|= CLIENT_NO_SCHEMA;
143
if (option_flag & (FLAG_BIG_PACKETS | FLAG_SAFE))
144
max_allowed_packet=~0L;
145
if (option_flag & FLAG_COMPRESSED_PROTO)
146
client_flag |= CLIENT_COMPRESS;
147
if (option_flag & FLAG_IGNORE_SPACE)
148
client_flag |= CLIENT_IGNORE_SPACE;
150
if (option_flag & FLAG_NAMED_PIPE)
151
mysql_options(mysql,MYSQL_OPT_NAMED_PIPE,NullS);
153
if (option_flag & FLAG_USE_MYCNF)
154
mysql_options(mysql,MYSQL_READ_DEFAULT_GROUP,"odbc");
155
if (init_stmt && init_stmt[0])
156
mysql_options(mysql,MYSQL_INIT_COMMAND,init_stmt);
158
mysql_options(mysql, MYSQL_OPT_CONNECT_TIMEOUT,(char*) &connect_timeout);
159
DBUG_PRINT("info",("MyODBC Version %s option_flag: %ld client_flag: %ld",
160
DRIVER_VERSION, option_flag, client_flag));
161
DBUG_RETURN(client_flag);
165
/* Simple help functions to copy arguments if given */
167
void copy_if_not_empty(char *to,uint max_length, char *from,int length)
171
if (length == SQL_NTS)
173
strmake(to,from,length);
178
/******************************************************************************
179
* Connect to mysql server
180
******************************************************************************/
182
SQLRETURN SQL_API SQLConnect(SQLHDBC hdbc, SQLCHAR FAR *szDSN,
184
SQLCHAR FAR *szUID, SQLSMALLINT cbUID,
185
SQLCHAR FAR *szAuthStr, SQLSMALLINT cbAuthStr)
187
char host[64],user[64],passwd[64],dsn[NAME_LEN+1],database[NAME_LEN+1],
188
port[10],flag[10],init_stmt[256],*dsn_ptr;
189
char szTRACE[FILENAME_MAX+1] = "";
192
ulong flag_nr,client_flag;
194
DBC FAR *dbc=(DBC FAR*) hdbc;
195
DBUG_ENTER("SQLConnect");
197
if (dbc->mysql.net.vio != 0)
199
DBUG_RETURN(set_dbc_error(dbc,"08002","Connection in use",0));
203
dsn_ptr=fix_str(dsn,szDSN,cbDSN);
205
if (dsn_ptr && !dsn_ptr[0])
207
DBUG_RETURN(set_dbc_error(dbc,"S1090","Invalid DSN specified",0));
210
SQLGetPrivateProfileString(dsn_ptr,"user",
211
"", user, sizeof(user),"ODBC.INI");
212
SQLGetPrivateProfileString(dsn_ptr,"password",
213
"", passwd, sizeof(passwd),"ODBC.INI");
214
SQLGetPrivateProfileString(dsn_ptr,"server",
215
"localhost", host, sizeof(host),"ODBC.INI");
216
SQLGetPrivateProfileString(dsn_ptr,"database",
217
dsn_ptr, database, sizeof(database),"ODBC.INI");
218
SQLGetPrivateProfileString(dsn_ptr,"port",
219
"0", port, sizeof(port),"ODBC.INI");
220
port_nr=(uint) atoi(port);
221
SQLGetPrivateProfileString(dsn_ptr,"option",
222
"0", flag, sizeof(flag),"ODBC.INI");
223
flag_nr=(ulong) atol(flag);
224
SQLGetPrivateProfileString(dsn_ptr,"stmt",
225
"", init_stmt, sizeof(init_stmt),"ODBC.INI");
227
SQLGetPrivateProfileString( dsn_ptr, "TRACE", "", szTRACE, sizeof(szTRACE),
229
if (szTRACE[0] == '0' || szTRACE[0] == 'N' || szTRACE[0] == 'n' ||
230
((szTRACE[0] == 'O' || szTRACE[0] == 'o') &&
231
(szTRACE[1] == 'N' || szTRACE[1] == 'n')))
233
char szTRACEFILE[FILENAME_MAX+1] = "";
234
char szMYODBC_LOG[FILENAME_MAX+20]= "";
235
SQLGetPrivateProfileString( dsn_ptr, "TRACEFILE", "", szTRACEFILE,
236
sizeof(szTRACEFILE), "ODBC.INI" );
239
sprintf(szMYODBC_LOG, "d:t:S:A,%s", szTRACEFILE);
241
DBUG_PUSH(szMYODBC_LOG);
244
client_flag=get_client_flag(&dbc->mysql,flag_nr,(uint) dbc->login_timeout,
247
copy_if_not_empty(passwd,sizeof(passwd), (char FAR*) szAuthStr,cbAuthStr);
248
copy_if_not_empty(user, sizeof(user), (char FAR *) szUID, cbUID);
250
if (!mysql_real_connect(&dbc->mysql,host,user,passwd[0] ? passwd : 0,
252
NullS, (uint) client_flag))
254
set_dbc_error(dbc, "S1000", mysql_error(&dbc->mysql),
255
mysql_errno(&dbc->mysql));
256
translate_error(dbc->sqlstate,"S1000",mysql_errno(&dbc->mysql));
257
DBUG_RETURN(SQL_ERROR);
259
dbc->dsn =dsn_ptr ? my_strdup(dsn_ptr, MYF(MY_WME)) :
260
my_strdup(database,MYF(MY_WME));
261
dbc->database=my_strdup(database,MYF(MY_WME));
262
dbc->server=my_strdup(host,MYF(MY_WME));
263
dbc->user=my_strdup(user,MYF(MY_WME));
264
dbc->password=my_strdup(passwd,MYF(MY_WME));
267
DBUG_RETURN(SQL_SUCCESS);
271
// This function as its "normal" behavior is supposed to bring up a
272
// dialog box if it isn't given enough information via "szConnStrIn". If
273
// it is given enough information, it's supposed to use "szConnStrIn" to
274
// establish a database connection. In either case, it returns a
275
// string to the user that is the string that was eventually used to
276
// establish the connection.
280
static char *my_strtok(char *s1, pchar separator, char **save)
282
reg1 char *rtnval,*end;
289
if (end != NULL && *end != 0)
294
if (*end++ == separator)
299
end--; /* \0 as separator */
310
SQLRETURN SQL_API SQLDriverConnect(SQLHDBC hdbc,SQLHWND hwnd,
311
SQLCHAR FAR *szConnStrIn,
312
SQLSMALLINT cbConnStrIn,
313
SQLCHAR FAR *szConnStrOut,
314
SQLSMALLINT cbConnStrOutMax,
315
SQLSMALLINT FAR *pcbConnStrOut,
316
SQLUSMALLINT fDriverCompletion)
320
bool fPrompt = FALSE,maybe_prompt;
321
DBC FAR *dbc=(DBC FAR*) hdbc;
322
GLOBALHANDLE hglbAttr;
323
LPSETUPDLG lpsetupdlg;
325
DBUG_ENTER("SQLDriverConnect");
326
DBUG_PRINT("enter",("fDriverCompletion: %d",fDriverCompletion));
328
hglbAttr = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(SETUPDLG));
331
lpsetupdlg = (LPSETUPDLG)GlobalLock(hglbAttr);
333
maybe_prompt=(fDriverCompletion == SQL_DRIVER_COMPLETE ||
334
fDriverCompletion == SQL_DRIVER_COMPLETE_REQUIRED);
335
if ((szConnStrIn == NULL) || (!cbConnStrIn) ||
336
((cbConnStrIn == SQL_NTS) && (!szConnStrIn[0])))
338
DBUG_PRINT("info",("No connection arguments"));
344
/* Check connection string for completeness. Prompt if not all params */
345
ParseAttributes(szConnStrIn, lpsetupdlg);
346
set_attributes(lpsetupdlg);
347
flag=(ulong) atol(lpsetupdlg->aAttr[KEY_FLAG].szAttr);
348
if (fDriverCompletion == SQL_DRIVER_PROMPT && ! (flag & FLAG_NO_PROMPT) ||
350
(!lpsetupdlg->aAttr[KEY_SERVER].szAttr[0] ||
351
!lpsetupdlg->aAttr[KEY_USER].szAttr[0])))
353
DBUG_PRINT("info",("flag: %d dsn: '%s' server: '%s' user: '%s'",
355
lpsetupdlg->aAttr[KEY_DSN].szAttr,
356
lpsetupdlg->aAttr[KEY_SERVER].szAttr,
357
lpsetupdlg->aAttr[KEY_USER].szAttr));
364
iRet = DialogBoxParam(s_hModule, MAKEINTRESOURCE(DRIVERCONNECT), hwnd,
365
(DLGPROC) DriverConnectProc,
366
(LONG)(LPSTR) lpsetupdlg);
367
if ((!iRet) || (iRet == -1))
369
GlobalUnlock(hglbAttr);
370
GlobalFree(hglbAttr);
371
DBUG_RETURN(SQL_NO_DATA_FOUND);
376
char *pos,buff[1024];
380
"DSN=",lpsetupdlg->aAttr[KEY_DSN].szAttr,
381
";DATABASE=",lpsetupdlg->aAttr[KEY_DB].szAttr,
382
";SERVER=",lpsetupdlg->aAttr[KEY_SERVER].szAttr,
383
";UID=",lpsetupdlg->aAttr[KEY_USER].szAttr,
384
";PWD=",lpsetupdlg->aAttr[KEY_PASSWORD].szAttr,
385
";PORT=",lpsetupdlg->aAttr[KEY_PORT].szAttr,
386
";OPTION=",lpsetupdlg->aAttr[KEY_FLAG].szAttr,
387
";STMT=",lpsetupdlg->aAttr[KEY_STMT].szAttr,
389
(void) copy_lresult((DBC FAR*) 0,szConnStrOut,cbConnStrOutMax,
390
&length,buff, (pos-buff),0L,0L,&tmp,0);
392
*pcbConnStrOut=(SQLSMALLINT) length;
393
DBUG_PRINT("info",("Connect string out: %s",szConnStrOut));
395
dbc->port=atoi(lpsetupdlg->aAttr[KEY_PORT].szAttr);
396
dbc->flag=(uint) atol(lpsetupdlg->aAttr[KEY_FLAG].szAttr);
397
client_flag=get_client_flag(&dbc->mysql,dbc->flag,(uint) dbc->login_timeout,
398
lpsetupdlg->aAttr[KEY_STMT].szAttr);
400
/* If no DB, use DSN as database name */
401
if (!lpsetupdlg->aAttr[KEY_DB].szAttr[0])
403
strmov(lpsetupdlg->aAttr[KEY_DB].szAttr,
404
lpsetupdlg->aAttr[KEY_DSN].szAttr);
406
if (!mysql_real_connect(&dbc->mysql,lpsetupdlg->aAttr[KEY_SERVER].szAttr,
407
lpsetupdlg->aAttr[KEY_USER].szAttr,
408
(lpsetupdlg->aAttr[KEY_PASSWORD].szAttr[0] ?
409
lpsetupdlg->aAttr[KEY_PASSWORD].szAttr : NullS),
410
lpsetupdlg->aAttr[KEY_DB].szAttr,
411
dbc->port,NullS,(uint) client_flag))
413
if (maybe_prompt && !fPrompt)
416
/* display the error message in the connection dialog in the next
417
connection, so that, user know what is the mistake...
419
strxmov(lpsetupdlg->aAttr[KEY_ERROR].szAttr ,
420
"[MySQL AB][MyODBC] ERROR : ",
421
mysql_error(&dbc->mysql), NullS);
424
set_dbc_error(dbc,"S1000",mysql_error(&dbc->mysql),
425
mysql_errno(&dbc->mysql));
426
GlobalUnlock(hglbAttr);
427
GlobalFree(hglbAttr);
428
DBUG_RETURN(SQL_ERROR);
430
dbc->dsn=my_strdup(lpsetupdlg->aAttr[KEY_DSN].szAttr,MYF(MY_WME));
431
dbc->database=my_strdup(lpsetupdlg->aAttr[KEY_DB].szAttr,MYF(MY_WME));
432
dbc->server=my_strdup(lpsetupdlg->aAttr[KEY_SERVER].szAttr,MYF(MY_WME));
433
dbc->user=my_strdup(lpsetupdlg->aAttr[KEY_USER].szAttr,MYF(MY_WME));
434
dbc->password=my_strdup(lpsetupdlg->aAttr[KEY_PASSWORD].szAttr,MYF(MY_WME));
436
GlobalUnlock(hglbAttr);
437
GlobalFree(hglbAttr);
438
DBUG_RETURN(SQL_SUCCESS);
439
#endif /* IS NOT UNIX */
442
SQLCHAR FAR *connstrin=NULL;
444
char *KEY_SERVER=NULL;
446
char *KEY_PASSWORD=NULL;
448
char *KEY_OPTION=NULL;
450
char *KEY_SOCKET=NULL;
459
char host[64],user[64],passwd[64],dsn[NAME_LEN+1],database[NAME_LEN+1],
460
port[10],flag[10],socket[256],init_stmt[256],option[64];
462
bool fPrompt = FALSE;
463
DBC FAR *dbc=(DBC FAR*) hdbc;
464
DBUG_ENTER("SQLDriverConnect");
465
DBUG_PRINT("enter",("fDriverCompletion: %d",fDriverCompletion));
467
if ((szConnStrIn == NULL) || (!cbConnStrIn) ||
468
((cbConnStrIn == SQL_NTS) && (!szConnStrIn[0])))
473
/* Check connection string for completeness. */
474
/* Prompt if not all params */
476
connstrin=(SQLCHAR FAR *) my_strdup(szConnStrIn,MYF(MY_WME));
478
tok[0]=my_strtok(connstrin,';', &strtok_save);
479
for (i=1 ; i <= 7 ; i++)
480
tok[i]=my_strtok(NULL,';',&strtok_save);
483
for (i=0 ; tok[i] ; i++)
485
if ((tok2 = my_strtok(tok[i], '=', &strtok_save)))
487
if (strcasecmp("DSN", tok2) == 0)
489
if ((tok3 = my_strtok(NULL, 0,&strtok_save)) && tok3[0])
490
KEY_DSN = (char*) my_strdup(tok3, MYF(MY_WME));
498
if (strcasecmp("DB", tok2) == 0 ||
499
strcasecmp("DATABASE", tok2) == 0)
501
if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
502
KEY_DB = (char*) my_strdup(tok3, MYF(MY_WME));
510
if (strcasecmp("UID", tok2) == 0)
512
if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
513
KEY_USER = (char*) my_strdup(tok3, MYF(MY_WME));
521
if (strcasecmp("PWD", tok2) == 0)
523
if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
524
KEY_PASSWORD = (char*) my_strdup(tok3, MYF(MY_WME));
527
x_free(KEY_PASSWORD);
532
if (strcasecmp("SERVER", tok2) == 0)
534
if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
535
KEY_SERVER = (char*) my_strdup(tok3, MYF(MY_WME));
543
if (strcasecmp("PORT", tok2) == 0)
545
if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
546
KEY_PORT = (char*) my_strdup(tok3, MYF(MY_WME));
554
if (strcasecmp("SOCKET", tok2) == 0)
556
if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
557
KEY_SOCKET = (char*) my_strdup(tok3, MYF(MY_WME));
565
if (strcasecmp("OPTION", tok2) == 0)
567
if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
568
KEY_OPTION = (char*) my_strdup(tok3, MYF(MY_WME));
576
if (strcasecmp("STMT", tok2) == 0)
578
if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
579
KEY_STMT = (char*) my_strdup(tok3, MYF(MY_WME));
592
SQLGetPrivateProfileString(KEY_DSN,"server",
593
"localhost", host, sizeof(host),"ODBC.INI");
594
if (!KEY_SERVER) KEY_SERVER = (char*) my_strdup(host, MYF(MY_WME));
596
SQLGetPrivateProfileString(KEY_DSN,"database",
597
KEY_DSN, database, sizeof(database),"ODBC.INI");
598
if (!KEY_DB) KEY_DB = (char*) my_strdup(database, MYF(MY_WME));
600
SQLGetPrivateProfileString(KEY_DSN,"option",
601
"0", option, sizeof(option),"ODBC.INI");
602
if (!KEY_OPTION) KEY_OPTION = (char*) my_strdup(option, MYF(MY_WME));
604
SQLGetPrivateProfileString(KEY_DSN,"port",
605
"3306", port, sizeof(port),"ODBC.INI");
606
if (!KEY_PORT) KEY_PORT = (char*) my_strdup(port, MYF(MY_WME));
608
SQLGetPrivateProfileString(KEY_DSN,"stmt",
609
"", init_stmt, sizeof(init_stmt),"ODBC.INI");
610
if (!KEY_STMT) KEY_STMT = (char*) my_strdup(init_stmt, MYF(MY_WME));
612
SQLGetPrivateProfileString(KEY_DSN,"user",
613
"dummy", user, sizeof(user),"ODBC.INI");
614
if (!KEY_USER) KEY_USER = (char*) my_strdup(user, MYF(MY_WME));
616
SQLGetPrivateProfileString(KEY_DSN,"password",
617
"", passwd, sizeof(passwd),"ODBC.INI");
618
if (!KEY_PASSWORD) KEY_PASSWORD = (char*) my_strdup(passwd, MYF(MY_WME));
620
SQLGetPrivateProfileString(KEY_DSN,"socket",
621
"", socket, sizeof(socket),"ODBC.INI");
622
if (!KEY_SOCKET) KEY_SOCKET = (char*) my_strdup(socket, MYF(MY_WME));
625
if (!KEY_DB && KEY_DSN)
626
KEY_DB = (char*) my_strdup(KEY_DSN, MYF(MY_WME));
629
KEY_SERVER = (char*) my_strdup("localhost", MYF(MY_WME));
632
KEY_PORT = (char*) my_strdup("3306", MYF(MY_WME));
635
KEY_SOCKET = (char*) my_strdup("", MYF(MY_WME));
638
KEY_USER = (char*) my_strdup("dummy", MYF(MY_WME));
641
KEY_PASSWORD = (char*) my_strdup("", MYF(MY_WME));
644
KEY_OPTION = (char*) my_strdup("0", MYF(MY_WME));
647
KEY_STMT = (char*) my_strdup("", MYF(MY_WME));
649
if (fDriverCompletion == SQL_DRIVER_PROMPT ||
650
((fDriverCompletion == SQL_DRIVER_COMPLETE ||
651
fDriverCompletion == SQL_DRIVER_COMPLETE_REQUIRED) &&
657
DBUG_RETURN(set_dbc_error((DBC FAR*) hdbc,"S1000","No DSN entered",0));
663
pos=strxmov(szConnStrOut,
666
";SERVER=",KEY_SERVER,
668
";PWD=",KEY_PASSWORD,
670
";SOCKET=",KEY_SOCKET,
671
";OPTION=",KEY_OPTION,
674
*pcbConnStrOut=(int) (pos-szConnStrOut);
676
dbc->flag=(uint) atol(KEY_OPTION);
677
dbc->port=atoi(KEY_PORT);
678
client_flag=get_client_flag(&dbc->mysql,dbc->flag,(uint) dbc->login_timeout,
681
if (!mysql_real_connect(&dbc->mysql,KEY_SERVER,
683
KEY_PASSWORD[0] ? KEY_PASSWORD : NullS,
686
KEY_SOCKET[0] ? KEY_SOCKET : NullS,
689
set_dbc_error(dbc,"S1000",mysql_error(&dbc->mysql),
690
mysql_errno(&dbc->mysql));
691
DBUG_RETURN(SQL_ERROR);
693
dbc->dsn=my_strdup(KEY_DSN,MYF(MY_WME));
694
dbc->database=my_strdup(KEY_DB,MYF(MY_WME));
695
dbc->server=my_strdup(KEY_SERVER,MYF(MY_WME));
696
dbc->user=my_strdup(KEY_USER,MYF(MY_WME));
697
dbc->password=my_strdup(KEY_PASSWORD,MYF(MY_WME));
703
x_free(KEY_PASSWORD);
710
DBUG_RETURN(SQL_SUCCESS);
715
SQLRETURN SQL_API SQLBrowseConnect(SQLHDBC hdbc,SQLCHAR FAR *szConnStrIn,
716
SQLSMALLINT cbConnStrIn,
717
SQLCHAR FAR *szConnStrOut,
718
SQLSMALLINT cbConnStrOutMax,
719
SQLSMALLINT FAR *pcbConnStrOut)
721
DBUG_ENTER("SQLBrowseConnect");
722
DBUG_RETURN(set_dbc_error((DBC FAR*) hdbc,"IM001",
723
"This doesn't work yet",4000));
727
SQLRETURN SQL_API SQLDisconnect(SQLHDBC hdbc)
729
LIST *list_element,*next_element;
730
DBC FAR *dbc=(DBC FAR*) hdbc;
731
DBUG_ENTER("SQLDisconnect");
733
for (list_element=dbc->statements ; list_element ;
734
list_element=next_element)
736
next_element=list_element->next;
737
my_SQLFreeStmt((SQLHSTMT) list_element->data,SQL_DROP);
739
mysql_close(&dbc->mysql);
740
my_free(dbc->dsn,MYF(0));
741
my_free(dbc->database,MYF(0));
742
my_free(dbc->server,MYF(0));
743
my_free(dbc->user,MYF(0));
744
my_free(dbc->password,MYF(0));
745
dbc->dsn=dbc->database=dbc->server=dbc->user=dbc->password=0;
746
DBUG_RETURN(SQL_SUCCESS);