4
* $Id: execute.c 2613 1999-06-01 15:32:12Z VZ $
8
* The iODBC driver manager.
10
* Copyright (C) 1995 by Ke Jin <kejin@empress.com>
12
* This library is free software; you can redistribute it and/or
13
* modify it under the terms of the GNU Library General Public
14
* License as published by the Free Software Foundation; either
15
* version 2 of the License, or (at your option) any later version.
17
* This library is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20
* Library General Public License for more details.
22
* You should have received a copy of the GNU Library General Public
23
* License along with this library; if not, write to the Free
24
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
42
do_cursoropen (STMT_t FAR * pstmt)
47
pstmt->state = en_stmt_executed;
49
retcode = SQLNumResultCols (pstmt, &ncol);
51
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
55
pstmt->state = en_stmt_cursoropen;
56
pstmt->cursor_state = en_stmt_cursor_opened;
60
pstmt->state = en_stmt_executed;
61
pstmt->cursor_state = en_stmt_cursor_no;
68
SQLExecute (HSTMT hstmt)
70
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
71
HPROC hproc = SQL_NULL_HPROC;
74
int sqlstat = en_00000;
76
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
78
return SQL_INVALID_HANDLE;
82
if (pstmt->asyn_on == en_NullProc)
86
case en_stmt_allocated:
90
case en_stmt_executed:
91
if (!pstmt->prep_state)
97
case en_stmt_cursoropen:
98
if (!pstmt->prep_state)
104
case en_stmt_fetched:
105
case en_stmt_xfetched:
106
if (!pstmt->prep_state)
116
case en_stmt_needdata:
117
case en_stmt_mustput:
126
else if (pstmt->asyn_on != en_Execute)
131
if (sqlstat == en_00000)
133
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Execute);
135
if (hproc == SQL_NULL_HPROC)
141
if (sqlstat != en_00000)
143
PUSHSQLERR (pstmt->herr, sqlstat);
148
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Execute,
151
/* stmt state transition */
152
if (pstmt->asyn_on == en_Execute)
157
case SQL_SUCCESS_WITH_INFO:
160
pstmt->asyn_on = en_NullProc;
163
case SQL_STILL_EXECUTING:
169
switch (pstmt->state)
171
case en_stmt_prepared:
175
case SQL_SUCCESS_WITH_INFO:
176
do_cursoropen (hstmt);
180
pstmt->state = en_stmt_needdata;
181
pstmt->need_on = en_Execute;
184
case SQL_STILL_EXECUTING:
185
pstmt->asyn_on = en_Execute;
193
case en_stmt_executed:
197
pstmt->state = en_stmt_allocated;
198
pstmt->cursor_state = en_stmt_cursor_no;
199
pstmt->prep_state = 0;
203
pstmt->state = en_stmt_needdata;
204
pstmt->need_on = en_Execute;
207
case SQL_STILL_EXECUTING:
208
pstmt->asyn_on = en_Execute;
227
UCHAR FAR * szSqlStr,
230
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
231
HPROC hproc = SQL_NULL_HPROC;
233
int sqlstat = en_00000;
234
RETCODE retcode = SQL_SUCCESS;
236
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
238
return SQL_INVALID_HANDLE;
241
/* check arguments */
242
if (szSqlStr == NULL)
246
else if (cbSqlStr < 0 && cbSqlStr != SQL_NTS)
251
if (sqlstat != en_00000)
253
PUSHSQLERR (pstmt->herr, sqlstat);
259
if (pstmt->asyn_on == en_NullProc)
261
switch (pstmt->state)
263
case en_stmt_fetched:
264
case en_stmt_xfetched:
268
case en_stmt_needdata:
269
case en_stmt_mustput:
278
else if (pstmt->asyn_on != en_ExecDirect)
283
if (sqlstat != en_00000)
285
PUSHSQLERR (pstmt->herr, sqlstat);
290
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ExecDirect);
292
if (hproc == SQL_NULL_HPROC)
294
PUSHSQLERR (pstmt->herr, en_IM001);
299
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ExecDirect,
300
(pstmt->dhstmt, szSqlStr, cbSqlStr))
302
/* stmt state transition */
303
if (pstmt->asyn_on == en_ExecDirect)
308
case SQL_SUCCESS_WITH_INFO:
311
pstmt->asyn_on = en_NullProc;
314
case SQL_STILL_EXECUTING:
320
if (pstmt->state <= en_stmt_executed)
325
case SQL_SUCCESS_WITH_INFO:
326
do_cursoropen (hstmt);
330
pstmt->state = en_stmt_needdata;
331
pstmt->need_on = en_ExecDirect;
334
case SQL_STILL_EXECUTING:
335
pstmt->asyn_on = en_ExecDirect;
339
pstmt->state = en_stmt_allocated;
340
pstmt->cursor_state = en_stmt_cursor_no;
341
pstmt->prep_state = 0;
359
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
363
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
365
return SQL_INVALID_HANDLE;
368
/* check argument value */
369
if (rgbValue == NULL &&
370
(cbValue != SQL_DEFAULT_PARAM && cbValue != SQL_NULL_DATA))
372
PUSHSQLERR (pstmt->herr, en_S1009);
378
if (pstmt->asyn_on == en_NullProc)
380
if (pstmt->state <= en_stmt_xfetched)
382
PUSHSQLERR (pstmt->herr, en_S1010);
387
else if (pstmt->asyn_on != en_PutData)
389
PUSHSQLERR (pstmt->herr, en_S1010);
395
hproc = _iodbcdm_getproc (pstmt->hdbc, en_PutData);
397
if (hproc == SQL_NULL_HPROC)
399
PUSHSQLERR (pstmt->herr, en_IM001);
404
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_PutData,
405
(pstmt->dhstmt, rgbValue, cbValue))
407
/* state transition */
408
if (pstmt->asyn_on == en_PutData)
413
case SQL_SUCCESS_WITH_INFO:
415
pstmt->asyn_on = en_NullProc;
418
case SQL_STILL_EXECUTING:
424
/* must in mustput or canput states */
428
case SQL_SUCCESS_WITH_INFO:
429
pstmt->state = en_stmt_canput;
433
switch (pstmt->need_on)
436
pstmt->state = en_stmt_allocated;
437
pstmt->need_on = en_NullProc;
441
if (pstmt->prep_state)
443
pstmt->state = en_stmt_prepared;
444
pstmt->need_on = en_NullProc;
449
/* Is this possible ???? */
450
pstmt->state = en_stmt_xfetched;
458
case SQL_STILL_EXECUTING:
459
pstmt->asyn_on = en_PutData;
475
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
479
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
481
return SQL_INVALID_HANDLE;
487
if (pstmt->asyn_on == en_NullProc)
489
if (pstmt->state <= en_stmt_xfetched)
491
PUSHSQLERR (pstmt->herr, en_S1010);
496
else if (pstmt->asyn_on != en_ParamData)
498
PUSHSQLERR (pstmt->herr, en_S1010);
504
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ParamData);
506
if (hproc == SQL_NULL_HPROC)
508
PUSHSQLERR (pstmt->herr, en_IM001);
513
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ParamData,
514
(pstmt->dhstmt, prgbValue))
516
/* state transition */
517
if (pstmt->asyn_on == en_ParamData)
522
case SQL_SUCCESS_WITH_INFO:
524
pstmt->asyn_on = en_NullProc;
527
case SQL_STILL_EXECUTING:
533
if (pstmt->state < en_stmt_needdata)
541
switch (pstmt->need_on)
544
pstmt->state = en_stmt_allocated;
548
pstmt->state = en_stmt_prepared;
552
pstmt->state = en_stmt_xfetched;
554
= en_stmt_cursor_xfetched;
560
pstmt->need_on = en_NullProc;
564
case SQL_SUCCESS_WITH_INFO:
565
switch (pstmt->state)
567
case en_stmt_needdata:
568
pstmt->state = en_stmt_mustput;
572
switch (pstmt->need_on)
578
= en_stmt_cursor_xfetched;
583
do_cursoropen (hstmt);
594
pstmt->need_on = en_NullProc;
598
pstmt->state = en_stmt_mustput;
614
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
618
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
620
return SQL_INVALID_HANDLE;
626
if (pstmt->asyn_on == en_NullProc)
628
switch (pstmt->state)
630
case en_stmt_allocated:
631
case en_stmt_needdata:
632
case en_stmt_mustput:
634
PUSHSQLERR (pstmt->herr, en_S1010);
641
else if (pstmt->asyn_on != en_NumParams)
643
PUSHSQLERR (pstmt->herr, en_S1010);
649
hproc = _iodbcdm_getproc (pstmt->hdbc, en_NumParams);
651
if (hproc == SQL_NULL_HPROC)
653
PUSHSQLERR (pstmt->herr, en_IM001);
658
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_NumParams,
659
(pstmt->dhstmt, pcpar))
661
/* state transition */
662
if (pstmt->asyn_on == en_NumParams)
667
case SQL_SUCCESS_WITH_INFO:
676
if (retcode == SQL_STILL_EXECUTING)
678
pstmt->asyn_on = en_NumParams;
689
SWORD FAR * pfSqlType,
690
UDWORD FAR * pcbColDef,
691
SWORD FAR * pibScale,
692
SWORD FAR * pfNullable)
694
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
698
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
700
return SQL_INVALID_HANDLE;
706
PUSHSQLERR (pstmt->herr, en_S1093);
712
if (pstmt->asyn_on == en_NullProc)
714
switch (pstmt->state)
716
case en_stmt_allocated:
717
case en_stmt_needdata:
718
case en_stmt_mustput:
720
PUSHSQLERR (pstmt->herr, en_S1010);
727
else if (pstmt->asyn_on != en_DescribeParam)
729
PUSHSQLERR (pstmt->herr, en_S1010);
735
hproc = _iodbcdm_getproc (pstmt->hdbc, en_DescribeParam);
737
if (hproc == SQL_NULL_HPROC)
739
PUSHSQLERR (pstmt->herr, en_IM001);
744
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_DescribeParam,
745
(pstmt->dhstmt, ipar, pfSqlType, pcbColDef, pibScale, pfNullable))
747
/* state transition */
748
if (pstmt->asyn_on == en_DescribeParam)
753
case SQL_SUCCESS_WITH_INFO:
762
if (retcode == SQL_STILL_EXECUTING)
764
pstmt->asyn_on = en_DescribeParam;