OCILIB (C Driver for Oracle) 3.9.1
|
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.1 2011-07-08 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 }