~ubuntu-branches/ubuntu/precise/myodbc/precise

« back to all changes in this revision

Viewing changes to connect.c

  • Committer: Bazaar Package Importer
  • Author(s): Steve Langasek
  • Date: 2004-02-15 14:59:29 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040215145929-wx1o3eobuhmmr2ft
Tags: 3.51.06-1
* New upstream release (closes: #149461).
* Add French debconf translations, thanks to Clément Stenac
  <zorglub@via.ecp.fr> (closes: #232839).

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
/*
5
 
** CONNECT.C - This is the ODBC sample driver code for
6
 
** allocation and connection.
7
 
*/
8
 
 
9
 
#include "myodbc.h"
10
 
 
11
 
#ifndef _UNIX_
12
 
#include <odbcinst.h>
13
 
#include "dialogs.h"
14
 
#endif /* IS NOT UNIX */
15
 
 
16
 
#ifndef CLIENT_NO_SCHEMA                        /* Temporary fix for 3.21.29 */
17
 
#define CLIENT_NO_SCHEMA      16
18
 
#endif
19
 
 
20
 
//      CONNECT.C
21
 
//
22
 
//      SQLC connection functions.
23
 
//      -       -       -       -       -       -       -       -       -
24
 
//      Allocate an environment (ENV) block.
25
 
 
26
 
 
27
 
SQLRETURN SQL_API SQLAllocEnv(SQLHENV FAR * phenv)
28
 
{
29
 
  myodbc_init();
30
 
#ifndef _UNIX_
31
 
  {
32
 
    HGLOBAL henv= GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (ENV));
33
 
    if (henv == NULL || (*phenv = (SQLHENV)GlobalLock (henv)) == NULL)
34
 
    {
35
 
      GlobalFree (henv);                        /* Free it if lock fails */
36
 
      *phenv = SQL_NULL_HENV;
37
 
      return SQL_ERROR;
38
 
    }
39
 
  }
40
 
#else
41
 
  if (!(*phenv = (SQLHENV) my_malloc(sizeof(ENV),MYF(MY_ZEROFILL))))
42
 
  {
43
 
    *phenv = SQL_NULL_HENV;
44
 
    return SQL_ERROR;
45
 
  }
46
 
#endif /* IS UNIX */
47
 
  return SQL_SUCCESS;
48
 
}
49
 
 
50
 
 
51
 
SQLRETURN SQL_API SQLFreeEnv(SQLHENV henv)
52
 
{
53
 
#ifndef _UNIX_
54
 
  GlobalUnlock(GlobalHandle((HGLOBAL) henv));
55
 
  GlobalFree(GlobalHandle((HGLOBAL) henv));
56
 
#else
57
 
  my_free((char*) henv,MYF(0));
58
 
#endif /* IS UNIX */
59
 
  return SQL_SUCCESS;
60
 
}
61
 
 
62
 
 
63
 
//      -       -       -       -       -       -       -       -       -
64
 
//      Allocate a DBC block.
65
 
 
66
 
SQLRETURN SQL_API SQLAllocConnect(SQLHENV henv, SQLHDBC FAR *phdbc)
67
 
{
68
 
  DBC FAR *dbc;
69
 
#ifndef _UNIX_
70
 
  {
71
 
    HGLOBAL hdbc = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (DBC));
72
 
    if (!hdbc || (*phdbc = (SQLHDBC)GlobalLock (hdbc)) == SQL_NULL_HDBC)
73
 
    {
74
 
      GlobalFree (hdbc);        /* Free it if lock fails */
75
 
      *phdbc = SQL_NULL_HENV;
76
 
      return SQL_ERROR;
77
 
    }
78
 
  }
79
 
#else /* IS UNIX */
80
 
  if (!(*phdbc = (SQLHDBC) my_malloc(sizeof(DBC),MYF(MY_ZEROFILL))))
81
 
  {
82
 
    *phdbc = SQL_NULL_HDBC;
83
 
    return SQL_ERROR;
84
 
  }
85
 
#endif
86
 
 
87
 
  dbc=(DBC FAR*) *phdbc;
88
 
  dbc->env= (ENV*) henv;
89
 
  dbc->mysql.net.vio = 0;                       /* Marker if open */
90
 
  dbc->flag=0;
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 */
95
 
  dbc->login_timeout=0;
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);
99
 
  return SQL_SUCCESS;
100
 
}
101
 
 
102
 
 
103
 
SQLRETURN SQL_API SQLFreeConnect(SQLHDBC hdbc)
104
 
{
105
 
  DBC FAR *dbc=(DBC FAR*) hdbc;
106
 
  DBUG_ENTER("SQLFreeConnect");
107
 
 
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);
114
 
 
115
 
#ifndef _UNIX_
116
 
  GlobalUnlock(GlobalHandle((HGLOBAL) hdbc));
117
 
  GlobalFree(GlobalHandle((HGLOBAL) hdbc));
118
 
#else  /* IS UNIX */
119
 
  my_free((char*) hdbc,MYF(0));
120
 
#endif
121
 
  DBUG_RETURN(SQL_SUCCESS);
122
 
}
123
 
 
124
 
/****************************************************************************
125
 
** check the option flag and generate a connect flag
126
 
****************************************************************************/
127
 
 
128
 
ulong get_client_flag(MYSQL *mysql, ulong option_flag,uint connect_timeout,
129
 
                      char *init_stmt)
130
 
{
131
 
  ulong client_flag=CLIENT_ODBC;
132
 
  DBUG_ENTER("get_client_flag");
133
 
 
134
 
  mysql_init(mysql);
135
 
 #ifndef DBUG_OFF
136
 
  if (option_flag & FLAG_DEBUG && ! _db_on_)
137
 
    mysql_debug("d:t:S:O,c::\\myodbc.log");
138
 
#endif
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;
149
 
#ifdef __WIN__
150
 
  if (option_flag & FLAG_NAMED_PIPE)
151
 
    mysql_options(mysql,MYSQL_OPT_NAMED_PIPE,NullS);
152
 
#endif
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);
157
 
  if (connect_timeout)
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);
162
 
}
163
 
 
164
 
 
165
 
/* Simple help functions to copy arguments if given */
166
 
 
167
 
void copy_if_not_empty(char *to,uint max_length, char *from,int length)
168
 
{
169
 
  if (from)
170
 
  {
171
 
    if (length == SQL_NTS)
172
 
      length=max_length-1;
173
 
    strmake(to,from,length);
174
 
  }
175
 
}
176
 
 
177
 
 
178
 
/******************************************************************************
179
 
*       Connect to mysql server
180
 
******************************************************************************/
181
 
 
182
 
SQLRETURN SQL_API SQLConnect(SQLHDBC hdbc, SQLCHAR FAR *szDSN,
183
 
                             SQLSMALLINT   cbDSN,
184
 
                             SQLCHAR FAR *szUID, SQLSMALLINT cbUID,
185
 
                             SQLCHAR FAR *szAuthStr, SQLSMALLINT cbAuthStr)
186
 
{
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]  = "";
190
 
 
191
 
  uint port_nr=0;
192
 
  ulong flag_nr,client_flag;
193
 
 
194
 
  DBC FAR *dbc=(DBC FAR*) hdbc;
195
 
  DBUG_ENTER("SQLConnect");
196
 
 
197
 
  if (dbc->mysql.net.vio != 0)
198
 
  {
199
 
    DBUG_RETURN(set_dbc_error(dbc,"08002","Connection in use",0));
200
 
  }
201
 
  dbc->sqlstate[0]=0;
202
 
 
203
 
  dsn_ptr=fix_str(dsn,szDSN,cbDSN);
204
 
 
205
 
  if (dsn_ptr && !dsn_ptr[0])
206
 
  {
207
 
    DBUG_RETURN(set_dbc_error(dbc,"S1090","Invalid DSN specified",0));
208
 
  }
209
 
 
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");
226
 
 
227
 
  SQLGetPrivateProfileString( dsn_ptr, "TRACE", "", szTRACE, sizeof(szTRACE),
228
 
                              "ODBC.INI" );
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')))
232
 
  {
233
 
    char  szTRACEFILE[FILENAME_MAX+1] = "";
234
 
    char  szMYODBC_LOG[FILENAME_MAX+20]= "";
235
 
    SQLGetPrivateProfileString( dsn_ptr, "TRACEFILE", "", szTRACEFILE,
236
 
                                sizeof(szTRACEFILE), "ODBC.INI" );
237
 
    if (*szTRACEFILE)
238
 
    {
239
 
      sprintf(szMYODBC_LOG, "d:t:S:A,%s", szTRACEFILE);
240
 
      DBUG_POP();
241
 
      DBUG_PUSH(szMYODBC_LOG);
242
 
    }
243
 
  }
244
 
  client_flag=get_client_flag(&dbc->mysql,flag_nr,(uint) dbc->login_timeout,
245
 
                              init_stmt);
246
 
 
247
 
  copy_if_not_empty(passwd,sizeof(passwd), (char FAR*) szAuthStr,cbAuthStr);
248
 
  copy_if_not_empty(user, sizeof(user), (char FAR *) szUID, cbUID);
249
 
 
250
 
  if (!mysql_real_connect(&dbc->mysql,host,user,passwd[0] ? passwd : 0,
251
 
                          database, port_nr,
252
 
                          NullS, (uint) client_flag))
253
 
 {
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);
258
 
 }
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));
265
 
 dbc->port=port_nr;
266
 
 dbc->flag=flag_nr;
267
 
 DBUG_RETURN(SQL_SUCCESS);
268
 
}
269
 
 
270
 
 
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.
277
 
 
278
 
#ifdef _UNIX_
279
 
 
280
 
static char *my_strtok(char *s1, pchar separator, char **save)
281
 
{
282
 
  reg1 char *rtnval,*end;
283
 
 
284
 
  rtnval = NULL;
285
 
  if (s1 != NULL)
286
 
    end = s1;
287
 
  else
288
 
    end= *save;
289
 
  if (end != NULL && *end != 0)
290
 
  {
291
 
    rtnval=end;
292
 
    do
293
 
    {
294
 
      if (*end++ == separator)
295
 
      {
296
 
        if (separator)
297
 
          end[-1]=0;
298
 
        else
299
 
          end--;                        /* \0 as separator */
300
 
        break;
301
 
      }
302
 
    } while (*end != 0);
303
 
    *save=end;
304
 
  }
305
 
  return (rtnval);
306
 
}
307
 
#endif
308
 
 
309
 
 
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)
317
 
{
318
 
#ifndef _UNIX_
319
 
  short   iRet;
320
 
  bool    fPrompt = FALSE,maybe_prompt;
321
 
  DBC FAR *dbc=(DBC FAR*) hdbc;
322
 
  GLOBALHANDLE hglbAttr;
323
 
  LPSETUPDLG lpsetupdlg;
324
 
  ulong client_flag;
325
 
  DBUG_ENTER("SQLDriverConnect");
326
 
  DBUG_PRINT("enter",("fDriverCompletion: %d",fDriverCompletion));
327
 
 
328
 
  hglbAttr = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(SETUPDLG));
329
 
  if (!hglbAttr)
330
 
    DBUG_RETURN(FALSE);
331
 
  lpsetupdlg = (LPSETUPDLG)GlobalLock(hglbAttr);
332
 
 
333
 
  maybe_prompt=(fDriverCompletion == SQL_DRIVER_COMPLETE ||
334
 
                fDriverCompletion == SQL_DRIVER_COMPLETE_REQUIRED);
335
 
  if ((szConnStrIn == NULL) || (!cbConnStrIn) ||
336
 
      ((cbConnStrIn == SQL_NTS) && (!szConnStrIn[0])))
337
 
  {
338
 
    DBUG_PRINT("info",("No connection arguments"));
339
 
    fPrompt = TRUE;
340
 
  }
341
 
  else
342
 
  {
343
 
    ulong flag;
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) ||
349
 
        (maybe_prompt &&
350
 
         (!lpsetupdlg->aAttr[KEY_SERVER].szAttr[0] ||
351
 
          !lpsetupdlg->aAttr[KEY_USER].szAttr[0])))
352
 
    {
353
 
      DBUG_PRINT("info",("flag: %d  dsn:  '%s'  server: '%s'  user: '%s'",
354
 
                         flag,
355
 
                         lpsetupdlg->aAttr[KEY_DSN].szAttr,
356
 
                         lpsetupdlg->aAttr[KEY_SERVER].szAttr,
357
 
                         lpsetupdlg->aAttr[KEY_USER].szAttr));
358
 
      fPrompt = TRUE;
359
 
    }
360
 
  }
361
 
retry:
362
 
  if (fPrompt)
363
 
  {             
364
 
    iRet = DialogBoxParam(s_hModule, MAKEINTRESOURCE(DRIVERCONNECT), hwnd,
365
 
                          (DLGPROC) DriverConnectProc,
366
 
                          (LONG)(LPSTR) lpsetupdlg);
367
 
    if ((!iRet) || (iRet == -1))
368
 
    {
369
 
      GlobalUnlock(hglbAttr);
370
 
      GlobalFree(hglbAttr);
371
 
      DBUG_RETURN(SQL_NO_DATA_FOUND);
372
 
    }
373
 
  }
374
 
  if (szConnStrOut)
375
 
  {
376
 
    char *pos,buff[1024];
377
 
    long length;
378
 
    ulong tmp= ~0L;
379
 
    pos=strxmov(buff,
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,
388
 
                ";",NullS);
389
 
    (void) copy_lresult((DBC FAR*) 0,szConnStrOut,cbConnStrOutMax,
390
 
                        &length,buff, (pos-buff),0L,0L,&tmp,0);
391
 
    if (pcbConnStrOut)
392
 
      *pcbConnStrOut=(SQLSMALLINT) length;
393
 
    DBUG_PRINT("info",("Connect string out: %s",szConnStrOut));
394
 
  }
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);
399
 
 
400
 
  /* If no DB, use DSN as database name */
401
 
  if (!lpsetupdlg->aAttr[KEY_DB].szAttr[0])
402
 
  {
403
 
    strmov(lpsetupdlg->aAttr[KEY_DB].szAttr,
404
 
           lpsetupdlg->aAttr[KEY_DSN].szAttr);
405
 
  }
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))
412
 
  {
413
 
    if (maybe_prompt && !fPrompt)
414
 
    {
415
 
      fPrompt=TRUE;
416
 
      /* display the error message in the connection dialog in the next 
417
 
         connection, so that, user know what is the mistake...
418
 
      */
419
 
      strxmov(lpsetupdlg->aAttr[KEY_ERROR].szAttr , 
420
 
              "[MySQL AB][MyODBC] ERROR : ",
421
 
              mysql_error(&dbc->mysql), NullS);
422
 
      goto retry;
423
 
    }
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);
429
 
  }
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));
435
 
 
436
 
  GlobalUnlock(hglbAttr);
437
 
  GlobalFree(hglbAttr);
438
 
  DBUG_RETURN(SQL_SUCCESS);
439
 
#endif /* IS NOT UNIX */
440
 
 
441
 
#ifdef _UNIX_
442
 
  SQLCHAR FAR *connstrin=NULL;
443
 
  char *KEY_DSN=NULL;
444
 
  char *KEY_SERVER=NULL;
445
 
  char *KEY_USER=NULL;
446
 
  char *KEY_PASSWORD=NULL;
447
 
  char *KEY_PORT=NULL;
448
 
  char *KEY_OPTION=NULL;
449
 
  char *KEY_DB=NULL;
450
 
  char *KEY_SOCKET=NULL;
451
 
  char *KEY_STMT=0;
452
 
 
453
 
  char *tok[9];
454
 
  char *tok2=NULL;
455
 
  char *tok3=NULL;
456
 
  int i;
457
 
  uint client_flag=0;
458
 
 
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];
461
 
 
462
 
  bool    fPrompt = FALSE;
463
 
  DBC FAR *dbc=(DBC FAR*) hdbc;
464
 
  DBUG_ENTER("SQLDriverConnect");
465
 
  DBUG_PRINT("enter",("fDriverCompletion: %d",fDriverCompletion));
466
 
 
467
 
  if ((szConnStrIn == NULL) || (!cbConnStrIn) ||
468
 
      ((cbConnStrIn == SQL_NTS) && (!szConnStrIn[0])))
469
 
    fPrompt = TRUE;
470
 
  else
471
 
  {
472
 
    char *strtok_save;
473
 
    /* Check connection string for completeness. */
474
 
    /* Prompt if not all params                  */
475
 
 
476
 
    connstrin=(SQLCHAR FAR *) my_strdup(szConnStrIn,MYF(MY_WME));
477
 
 
478
 
    tok[0]=my_strtok(connstrin,';', &strtok_save);
479
 
    for (i=1 ; i <= 7 ; i++)
480
 
      tok[i]=my_strtok(NULL,';',&strtok_save);
481
 
    tok[i]=NULL;
482
 
 
483
 
    for (i=0 ; tok[i] ; i++)
484
 
    {
485
 
      if ((tok2 = my_strtok(tok[i], '=', &strtok_save)))
486
 
      {
487
 
        if (strcasecmp("DSN", tok2) == 0)
488
 
        {
489
 
          if ((tok3 = my_strtok(NULL, 0,&strtok_save)) && tok3[0])
490
 
            KEY_DSN = (char*) my_strdup(tok3, MYF(MY_WME));
491
 
          else
492
 
          {
493
 
            x_free(KEY_DSN);
494
 
            KEY_DSN = NULL;
495
 
          }
496
 
        }
497
 
 
498
 
        if (strcasecmp("DB", tok2) == 0 ||
499
 
            strcasecmp("DATABASE", tok2) == 0)
500
 
        {
501
 
          if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
502
 
            KEY_DB = (char*) my_strdup(tok3, MYF(MY_WME));
503
 
          else
504
 
          {
505
 
            x_free(KEY_DB);
506
 
            KEY_DB = NULL;
507
 
          }
508
 
        }
509
 
 
510
 
        if (strcasecmp("UID", tok2) == 0)
511
 
        {
512
 
          if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
513
 
            KEY_USER = (char*) my_strdup(tok3, MYF(MY_WME));
514
 
          else
515
 
          {
516
 
            x_free(KEY_USER);
517
 
            KEY_USER = NULL;
518
 
          }
519
 
        }
520
 
 
521
 
        if (strcasecmp("PWD", tok2) == 0)
522
 
        {
523
 
          if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
524
 
            KEY_PASSWORD = (char*) my_strdup(tok3, MYF(MY_WME));
525
 
          else
526
 
          {
527
 
            x_free(KEY_PASSWORD);
528
 
            KEY_PASSWORD = NULL;
529
 
          }
530
 
        }
531
 
 
532
 
        if (strcasecmp("SERVER", tok2) == 0)
533
 
        {
534
 
          if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
535
 
            KEY_SERVER = (char*) my_strdup(tok3, MYF(MY_WME));
536
 
          else
537
 
          {
538
 
            x_free(KEY_SERVER);
539
 
            KEY_SERVER = NULL;
540
 
          }
541
 
        }
542
 
 
543
 
        if (strcasecmp("PORT", tok2) == 0)
544
 
        {
545
 
          if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
546
 
            KEY_PORT = (char*) my_strdup(tok3, MYF(MY_WME));
547
 
          else
548
 
          {
549
 
            x_free(KEY_PORT);
550
 
            KEY_PORT = NULL;
551
 
          }
552
 
        }
553
 
 
554
 
        if (strcasecmp("SOCKET", tok2) == 0)
555
 
        {
556
 
          if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
557
 
            KEY_SOCKET = (char*) my_strdup(tok3, MYF(MY_WME));
558
 
          else
559
 
          {
560
 
            x_free(KEY_SOCKET);
561
 
            KEY_PORT = NULL;
562
 
          }
563
 
        }
564
 
 
565
 
        if (strcasecmp("OPTION", tok2) == 0)
566
 
        {
567
 
          if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
568
 
            KEY_OPTION = (char*) my_strdup(tok3, MYF(MY_WME));
569
 
          else
570
 
          {
571
 
            x_free(KEY_OPTION);
572
 
            KEY_PORT = NULL;
573
 
          }
574
 
        }
575
 
 
576
 
        if (strcasecmp("STMT", tok2) == 0)
577
 
        {
578
 
          if ((tok3 = my_strtok(NULL, 0, &strtok_save)) && tok3[0])
579
 
            KEY_STMT = (char*) my_strdup(tok3, MYF(MY_WME));
580
 
          else
581
 
          {
582
 
            x_free(KEY_STMT);
583
 
            KEY_STMT = NULL;
584
 
          }
585
 
        }
586
 
 
587
 
      }
588
 
    }
589
 
 
590
 
  if (KEY_DSN)
591
 
  {
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));
595
 
 
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));
599
 
 
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));
603
 
 
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));
607
 
 
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));
611
 
 
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));
615
 
 
616
 
    SQLGetPrivateProfileString(KEY_DSN,"password",
617
 
                               "", passwd, sizeof(passwd),"ODBC.INI");
618
 
    if (!KEY_PASSWORD) KEY_PASSWORD = (char*) my_strdup(passwd, MYF(MY_WME));
619
 
 
620
 
    SQLGetPrivateProfileString(KEY_DSN,"socket",
621
 
                               "", socket, sizeof(socket),"ODBC.INI");
622
 
    if (!KEY_SOCKET) KEY_SOCKET = (char*) my_strdup(socket, MYF(MY_WME));
623
 
  }
624
 
 
625
 
    if (!KEY_DB && KEY_DSN)
626
 
      KEY_DB = (char*) my_strdup(KEY_DSN, MYF(MY_WME));
627
 
 
628
 
    if (!KEY_SERVER)
629
 
      KEY_SERVER = (char*) my_strdup("localhost", MYF(MY_WME));
630
 
 
631
 
    if (!KEY_PORT)
632
 
      KEY_PORT = (char*) my_strdup("3306", MYF(MY_WME));
633
 
 
634
 
    if (!KEY_SOCKET)
635
 
      KEY_SOCKET = (char*) my_strdup("", MYF(MY_WME));
636
 
 
637
 
    if (!KEY_USER)
638
 
      KEY_USER = (char*) my_strdup("dummy", MYF(MY_WME));
639
 
 
640
 
    if (!KEY_PASSWORD)
641
 
      KEY_PASSWORD = (char*) my_strdup("", MYF(MY_WME));
642
 
 
643
 
    if (!KEY_OPTION)
644
 
      KEY_OPTION = (char*) my_strdup("0", MYF(MY_WME));
645
 
 
646
 
    if (!KEY_STMT)
647
 
      KEY_STMT = (char*) my_strdup("", MYF(MY_WME));
648
 
 
649
 
    if (fDriverCompletion == SQL_DRIVER_PROMPT ||
650
 
        ((fDriverCompletion == SQL_DRIVER_COMPLETE ||
651
 
          fDriverCompletion == SQL_DRIVER_COMPLETE_REQUIRED) &&
652
 
         (!KEY_DSN)))
653
 
      fPrompt = TRUE;
654
 
  }
655
 
  if (fPrompt)
656
 
  {
657
 
    DBUG_RETURN(set_dbc_error((DBC FAR*) hdbc,"S1000","No DSN entered",0));
658
 
  }
659
 
 
660
 
  if (szConnStrOut)
661
 
  {
662
 
    SQLCHAR FAR  *pos;
663
 
    pos=strxmov(szConnStrOut,
664
 
                "DSN=",KEY_DSN,
665
 
                ";DB=",KEY_DB,
666
 
                ";SERVER=",KEY_SERVER,
667
 
                ";UID=",KEY_USER,
668
 
                ";PWD=",KEY_PASSWORD,
669
 
                ";PORT=",KEY_PORT,
670
 
                ";SOCKET=",KEY_SOCKET,
671
 
                ";OPTION=",KEY_OPTION,
672
 
                ";STMT=",KEY_STMT,
673
 
                ";",NullS);
674
 
    *pcbConnStrOut=(int) (pos-szConnStrOut);
675
 
  }
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,
679
 
                              KEY_STMT);
680
 
 
681
 
  if (!mysql_real_connect(&dbc->mysql,KEY_SERVER,
682
 
                          KEY_USER,
683
 
                          KEY_PASSWORD[0] ? KEY_PASSWORD : NullS,
684
 
                          KEY_DB,
685
 
                          dbc->port,
686
 
                          KEY_SOCKET[0] ? KEY_SOCKET : NullS,
687
 
                          (uint) client_flag))
688
 
  {
689
 
    set_dbc_error(dbc,"S1000",mysql_error(&dbc->mysql),
690
 
                  mysql_errno(&dbc->mysql));
691
 
    DBUG_RETURN(SQL_ERROR);
692
 
  }
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));
698
 
 
699
 
  x_free(KEY_DSN);
700
 
  x_free(KEY_DB);
701
 
  x_free(KEY_SERVER);
702
 
  x_free(KEY_USER);
703
 
  x_free(KEY_PASSWORD);
704
 
  x_free(KEY_PORT);
705
 
  x_free(KEY_SOCKET);
706
 
  x_free(KEY_OPTION);
707
 
  x_free(KEY_STMT);
708
 
  x_free(connstrin);
709
 
 
710
 
  DBUG_RETURN(SQL_SUCCESS);
711
 
#endif /* IS UNIX */
712
 
}
713
 
 
714
 
 
715
 
SQLRETURN SQL_API SQLBrowseConnect(SQLHDBC hdbc,SQLCHAR FAR *szConnStrIn,
716
 
                                   SQLSMALLINT cbConnStrIn,
717
 
                                   SQLCHAR FAR *szConnStrOut,
718
 
                                   SQLSMALLINT cbConnStrOutMax,
719
 
                                   SQLSMALLINT FAR *pcbConnStrOut)
720
 
{
721
 
  DBUG_ENTER("SQLBrowseConnect");
722
 
  DBUG_RETURN(set_dbc_error((DBC FAR*) hdbc,"IM001",
723
 
                            "This doesn't work yet",4000));
724
 
}
725
 
 
726
 
 
727
 
SQLRETURN SQL_API SQLDisconnect(SQLHDBC hdbc)
728
 
{
729
 
  LIST *list_element,*next_element;
730
 
  DBC FAR *dbc=(DBC FAR*) hdbc;
731
 
  DBUG_ENTER("SQLDisconnect");
732
 
 
733
 
  for (list_element=dbc->statements ; list_element ;
734
 
       list_element=next_element)
735
 
  {
736
 
    next_element=list_element->next;
737
 
    my_SQLFreeStmt((SQLHSTMT) list_element->data,SQL_DROP);
738
 
  }
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);
747
 
}