4
* $Id: hstmt.c 2613 1999-06-01 15:32:12Z VZ $
6
* Query statement object management functions
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.
46
DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
47
STMT_t FAR *pstmt = NULL;
48
HPROC hproc = SQL_NULL_HPROC;
49
RETCODE retcode = SQL_SUCCESS;
51
#if (ODBCVER >= 0x0300)
52
if (hdbc == SQL_NULL_HDBC || pdbc->type != SQL_HANDLE_DBC)
54
if (hdbc == SQL_NULL_HDBC)
57
return SQL_INVALID_HANDLE;
62
PUSHSQLERR (pdbc->herr, en_S1009);
70
case en_dbc_connected:
74
case en_dbc_allocated:
76
PUSHSQLERR (pdbc->herr, en_08003);
77
*phstmt = SQL_NULL_HSTMT;
81
return SQL_INVALID_HANDLE;
84
pstmt = (STMT_t FAR *) MEM_ALLOC (sizeof (STMT_t));
88
PUSHSQLERR (pdbc->herr, en_S1001);
89
*phstmt = SQL_NULL_HSTMT;
94
#if (ODBCVER >= 0x0300)
95
pstmt->type = SQL_HANDLE_STMT;
98
/* initiate the object */
99
pstmt->herr = SQL_NULL_HERR;
101
pstmt->state = en_stmt_allocated;
102
pstmt->cursor_state = en_stmt_cursor_no;
103
pstmt->prep_state = 0;
104
pstmt->asyn_on = en_NullProc;
105
pstmt->need_on = en_NullProc;
107
/* call driver's function */
109
#if (ODBCVER >= 0x0300)
110
hproc = _iodbcdm_getproc (hdbc, en_AllocHandle);
114
CALL_DRIVER (pstmt->hdbc, hdbc, retcode, hproc, en_AllocHandle,
115
(SQL_HANDLE_STMT, pdbc->dhdbc, &(pstmt->dhstmt)))
121
hproc = _iodbcdm_getproc (hdbc, en_AllocStmt);
123
if (hproc == SQL_NULL_HPROC)
125
PUSHSQLERR (pstmt->herr, en_IM001);
126
*phstmt = SQL_NULL_HSTMT;
132
CALL_DRIVER (hdbc, retcode, hproc, en_AllocStmt,
133
(pdbc->dhdbc, &(pstmt->dhstmt)))
136
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
138
*phstmt = SQL_NULL_HSTMT;
144
/* insert into list */
145
pstmt->next = pdbc->hstmt;
148
*phstmt = (HSTMT) pstmt;
150
/* state transition */
151
pdbc->state = en_dbc_hstmt;
158
_iodbcdm_dropstmt (HSTMT hstmt)
160
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
164
if (hstmt == SQL_NULL_HSTMT)
166
return SQL_INVALID_HANDLE;
169
pdbc = (DBC_t FAR *) (pstmt->hdbc);
171
for (tpstmt = (STMT_t FAR *) pdbc->hstmt;
173
tpstmt = tpstmt->next)
177
pdbc->hstmt = (HSTMT) pstmt->next;
181
if (tpstmt->next == pstmt)
183
tpstmt->next = pstmt->next;
190
return SQL_INVALID_HANDLE;
193
_iodbcdm_freesqlerrlist (pstmt->herr);
205
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
209
HPROC hproc = SQL_NULL_HPROC;
212
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
214
return SQL_INVALID_HANDLE;
217
pdbc = (DBC_t FAR *) (pstmt->hdbc);
225
case SQL_RESET_PARAMS:
229
PUSHSQLERR (pstmt->herr, en_S1092);
234
if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
236
PUSHSQLERR (pstmt->herr, en_S1010);
241
hproc = SQL_NULL_HPROC;
243
#if (ODBCVER >= 0x0300)
244
if (fOption == SQL_DROP)
246
hproc = _iodbcdm_getproc (pstmt->hdbc, en_FreeHandle);
250
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_FreeHandle,
251
(SQL_HANDLE_STMT, pstmt->dhstmt))
256
if (hproc == SQL_NULL_HPROC)
258
hproc = _iodbcdm_getproc (pstmt->hdbc, en_FreeStmt);
260
if (hproc == SQL_NULL_HPROC)
262
PUSHSQLERR (pstmt->herr, en_IM001);
267
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_FreeStmt,
268
(pstmt->dhstmt, fOption))
271
if (retcode != SQL_SUCCESS
272
&& retcode != SQL_SUCCESS_WITH_INFO)
277
/* state transition */
281
/* delet this object (ignore return) */
282
_iodbcdm_dropstmt (hstmt);
286
pstmt->cursor_state = en_stmt_cursor_no;
287
/* This means cursor name set by
288
* SQLSetCursorName() call will also
292
switch (pstmt->state)
294
case en_stmt_allocated:
295
case en_stmt_prepared:
298
case en_stmt_executed:
299
case en_stmt_cursoropen:
300
case en_stmt_fetched:
301
case en_stmt_xfetched:
302
if (pstmt->prep_state)
320
case SQL_RESET_PARAMS:
335
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
337
int sqlstat = en_00000;
340
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
342
return SQL_INVALID_HANDLE;
346
if ( /* fOption < SQL_STMT_OPT_MIN || */
347
fOption > SQL_STMT_OPT_MAX)
349
PUSHSQLERR (pstmt->herr, en_S1092);
354
if (fOption == SQL_CONCURRENCY
355
|| fOption == SQL_CURSOR_TYPE
356
|| fOption == SQL_SIMULATE_CURSOR
357
|| fOption == SQL_USE_BOOKMARKS)
359
if (pstmt->asyn_on != en_NullProc)
361
if (pstmt->prep_state)
368
switch (pstmt->state)
370
case en_stmt_prepared:
374
case en_stmt_executed:
375
case en_stmt_cursoropen:
376
case en_stmt_fetched:
377
case en_stmt_xfetched:
381
case en_stmt_needdata:
382
case en_stmt_mustput:
384
if (pstmt->prep_state)
397
if (pstmt->asyn_on != en_NullProc)
399
if (!pstmt->prep_state)
406
if (pstmt->state >= en_stmt_needdata)
413
if (sqlstat != en_00000)
415
PUSHSQLERR (pstmt->herr, sqlstat);
420
hproc = _iodbcdm_getproc (pstmt->hdbc, en_SetStmtOption);
422
if (hproc == SQL_NULL_HPROC)
424
PUSHSQLERR (pstmt->herr, en_IM001);
429
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SetStmtOption,
430
(pstmt->dhstmt, fOption, vParam))
442
STMT_t FAR *pstmt = (STMT_t *) hstmt;
444
int sqlstat = en_00000;
447
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
449
return SQL_INVALID_HANDLE;
453
if ( /* fOption < SQL_STMT_OPT_MIN || */
454
fOption > SQL_STMT_OPT_MAX)
456
PUSHSQLERR (pstmt->herr, en_S1092);
462
if (pstmt->state >= en_stmt_needdata
463
|| pstmt->asyn_on != en_NullProc)
469
switch (pstmt->state)
471
case en_stmt_allocated:
472
case en_stmt_prepared:
473
case en_stmt_executed:
474
case en_stmt_cursoropen:
475
if (fOption == SQL_ROW_NUMBER || fOption == SQL_GET_BOOKMARK)
486
if (sqlstat != en_00000)
488
PUSHSQLERR (pstmt->herr, sqlstat);
493
hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetStmtOption);
495
if (hproc == SQL_NULL_HPROC)
497
PUSHSQLERR (pstmt->herr, en_IM001);
501
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_GetStmtOption,
502
(pstmt->dhstmt, fOption, pvParam))
509
SQLCancel (HSTMT hstmt)
511
STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
515
if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
517
return SQL_INVALID_HANDLE;
524
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Cancel);
526
if (hproc == SQL_NULL_HPROC)
528
PUSHSQLERR (pstmt->herr, en_IM001);
533
CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Cancel,
536
/* state transition */
537
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
542
switch (pstmt->state)
544
case en_stmt_allocated:
545
case en_stmt_prepared:
548
case en_stmt_executed:
549
if (pstmt->prep_state)
551
pstmt->state = en_stmt_prepared;
555
pstmt->state = en_stmt_allocated;
559
case en_stmt_cursoropen:
560
case en_stmt_fetched:
561
case en_stmt_xfetched:
562
if (pstmt->prep_state)
564
pstmt->state = en_stmt_prepared;
568
pstmt->state = en_stmt_allocated;
572
case en_stmt_needdata:
573
case en_stmt_mustput:
575
switch (pstmt->need_on)
578
pstmt->state = en_stmt_allocated;
582
pstmt->state = en_stmt_prepared;
586
pstmt->state = en_stmt_xfetched;
592
pstmt->need_on = en_NullProc;