OCILIB (C Driver for Oracle) 3.9.2
D:/Perso/dev/ocilib/ocilib/src/iterator.c
00001 /*
00002     +-----------------------------------------------------------------------------------------+
00003     |                                                                                         |
00004     |                               OCILIB - C Driver for Oracle                              |
00005     |                                                                                         |
00006     |                                (C Wrapper for Oracle OCI)                               |
00007     |                                                                                         |
00008     |                              Website : http://www.ocilib.net                            |
00009     |                                                                                         |
00010     |             Copyright (c) 2007-2011 Vincent ROGIER <vince.rogier@ocilib.net>            |
00011     |                                                                                         |
00012     +-----------------------------------------------------------------------------------------+
00013     |                                                                                         |
00014     |             This library is free software; you can redistribute it and/or               |
00015     |             modify it under the terms of the GNU Lesser General Public                  |
00016     |             License as published by the Free Software Foundation; either                |
00017     |             version 2 of the License, or (at your option) any later version.            |
00018     |                                                                                         |
00019     |             This library is distributed in the hope that it will be useful,             |
00020     |             but WITHOUT ANY WARRANTY; without even the implied warranty of              |
00021     |             MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU           |
00022     |             Lesser General Public License for more details.                             |
00023     |                                                                                         |
00024     |             You should have received a copy of the GNU Lesser General Public            |
00025     |             License along with this library; if not, write to the Free                  |
00026     |             Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.          |
00027     |                                                                                         |
00028     +-----------------------------------------------------------------------------------------+
00029 */
00030 
00031 /* --------------------------------------------------------------------------------------------- *
00032  * $Id: iterator.c, v 3.9.2 2011-07-13 00:00 Vincent Rogier $
00033  * --------------------------------------------------------------------------------------------- */
00034 
00035 #include "ocilib_internal.h"
00036 
00037 /* ********************************************************************************************* *
00038  *                            PUBLIC FUNCTIONS
00039  * ********************************************************************************************* */
00040 
00041 /* --------------------------------------------------------------------------------------------- *
00042  * OCI_IterCreate
00043  * --------------------------------------------------------------------------------------------- */
00044 
00045 OCI_Iter * OCI_API OCI_IterCreate
00046 (
00047     OCI_Coll *coll
00048 )
00049 {
00050     boolean res    = TRUE;
00051     OCI_Iter *iter = NULL;
00052 
00053     OCI_CHECK_INITIALIZED(NULL);
00054 
00055     OCI_CHECK_PTR(OCI_IPC_COLLECTION, coll, NULL);
00056 
00057     /* allocate iterator structure */
00058 
00059     iter = (OCI_Iter *) OCI_MemAlloc(OCI_IPC_ITERATOR, sizeof(*iter), (size_t) 1, TRUE);
00060 
00061     if (iter != NULL)
00062     {
00063         iter->coll = coll;
00064         iter->eoc  = FALSE;
00065         iter->boc  = TRUE;
00066 
00067         /* create iterator */
00068 
00069         OCI_CALL2
00070         (
00071             res, iter->coll->con,
00072 
00073             OCIIterCreate(iter->coll->con->env, iter->coll->con->err, coll->handle, &iter->handle)
00074         )
00075 
00076         /* create data element accessor */
00077 
00078         if (res == TRUE)
00079         {
00080             iter->elem = OCI_ElemInit(coll->con, &iter->elem, NULL, (OCIInd *) NULL, coll->typinf);
00081 
00082             res = (iter->elem != NULL);
00083         }
00084     }
00085     else
00086     {
00087         res = FALSE;
00088     }
00089 
00090     /* check for success */
00091 
00092     if (res == FALSE)
00093     {
00094         OCI_IterFree(iter);
00095         iter = NULL;
00096     }
00097 
00098     OCI_RESULT(res);
00099 
00100     return iter;
00101 }
00102 
00103 /* --------------------------------------------------------------------------------------------- *
00104  * OCI_IterFree
00105  * --------------------------------------------------------------------------------------------- */
00106 
00107 boolean OCI_API OCI_IterFree
00108 (
00109     OCI_Iter *iter
00110 )
00111 {
00112     boolean res = TRUE;
00113 
00114     OCI_CHECK_PTR(OCI_IPC_ITERATOR, iter, FALSE);
00115 
00116     /* close iterator handle */
00117 
00118     if (iter->handle != NULL)
00119     {
00120         OCI_CALL2
00121         (
00122             res, iter->coll->con,
00123 
00124             OCIIterDelete(iter->coll->con->env, iter->coll->con->err, &iter->handle)
00125         )
00126     }
00127 
00128     /* free data element accessor */
00129 
00130     if (iter->elem != NULL)
00131     {
00132         iter->elem->hstate = OCI_OBJECT_FETCHED_DIRTY;
00133         OCI_ElemFree(iter->elem);
00134         iter->elem = NULL;
00135     }
00136 
00137     /* free iterator structure */
00138 
00139     OCI_FREE(iter);
00140 
00141     OCI_RESULT(res);
00142 
00143     return res;
00144 }
00145 
00146 /* --------------------------------------------------------------------------------------------- *
00147  * OCI_IterGetNext
00148  * --------------------------------------------------------------------------------------------- */
00149 
00150 OCI_Elem * OCI_API OCI_IterGetNext
00151 (
00152     OCI_Iter *iter
00153 )
00154 {
00155     boolean res    = TRUE;
00156     OCI_Elem *elem = NULL;
00157     void * data    = NULL;
00158     void *p_ind    = NULL;
00159 
00160     OCI_CHECK_PTR(OCI_IPC_ITERATOR, iter, NULL);
00161 
00162     OCI_CHECK(iter->eoc == TRUE, NULL);
00163 
00164     OCI_CALL2
00165     (
00166         res, iter->coll->con,
00167 
00168         OCIIterNext(iter->coll->con->env, iter->coll->con->err, iter->handle,
00169                     &data, (dvoid **) &p_ind, &iter->eoc)
00170     )
00171 
00172     if ((res == TRUE) && (iter->eoc == FALSE))
00173     {
00174         elem = OCI_ElemInit(iter->coll->con, &iter->elem, data, p_ind, iter->coll->typinf);
00175     }
00176 
00177     OCI_RESULT(elem != NULL);
00178 
00179     return elem;
00180 }
00181 
00182 /* --------------------------------------------------------------------------------------------- *
00183  * OCI_IterGetPrev
00184  * --------------------------------------------------------------------------------------------- */
00185 
00186 OCI_Elem * OCI_API OCI_IterGetPrev
00187 (
00188     OCI_Iter *iter
00189 )
00190 {
00191     boolean res    = TRUE;
00192     OCI_Elem *elem = NULL;
00193     void * data    = NULL;
00194     void *p_ind    = NULL;
00195 
00196     OCI_CHECK_PTR(OCI_IPC_ITERATOR, iter, NULL);
00197 
00198     OCI_CHECK(iter->boc == TRUE, NULL);
00199 
00200     OCI_CALL2
00201     (
00202         res, iter->coll->con,
00203 
00204         OCIIterPrev(iter->coll->con->env, iter->coll->con->err, iter->handle,
00205                     &data, (dvoid **) &p_ind, &iter->boc)
00206     )
00207 
00208     if ((res == TRUE) && (iter->boc == FALSE))
00209     {
00210         elem = OCI_ElemInit(iter->coll->con, &iter->elem, data, p_ind, iter->coll->typinf);
00211     }
00212 
00213     OCI_RESULT(elem != NULL);
00214 
00215     return elem;
00216 
00217 }