@@ -20,6 +20,7 @@ typedef struct {
20
20
OCIStmt * * data ;
21
21
udt_Connection * connection ;
22
22
PyObject * cursors ;
23
+ int createCursors ;
23
24
} udt_CursorVar ;
24
25
25
26
@@ -30,6 +31,7 @@ static int CursorVar_Initialize(udt_CursorVar*, udt_Cursor*);
30
31
static void CursorVar_Finalize (udt_CursorVar * );
31
32
static int CursorVar_SetValue (udt_CursorVar * , unsigned , PyObject * );
32
33
static PyObject * CursorVar_GetValue (udt_CursorVar * , unsigned );
34
+ static int CursorVar_PreFetch (udt_CursorVar * );
33
35
34
36
35
37
//-----------------------------------------------------------------------------
@@ -69,7 +71,7 @@ static udt_VariableType vt_Cursor = {
69
71
(PreDefineProc ) NULL ,
70
72
(PostDefineProc ) NULL ,
71
73
(PostBindProc ) NULL ,
72
- (PreFetchProc ) NULL ,
74
+ (PreFetchProc ) CursorVar_PreFetch ,
73
75
(IsNullProc ) NULL ,
74
76
(SetValueProc ) CursorVar_SetValue ,
75
77
(GetValueProc ) CursorVar_GetValue ,
@@ -99,6 +101,7 @@ static int CursorVar_Initialize(
99
101
Py_INCREF (cursor -> connection );
100
102
var -> connection = cursor -> connection ;
101
103
var -> cursors = PyList_New (var -> allocatedElements );
104
+ var -> createCursors = 0 ;
102
105
if (!var -> cursors )
103
106
return -1 ;
104
107
for (i = 0 ; i < var -> allocatedElements ; i ++ ) {
@@ -127,8 +130,8 @@ static int CursorVar_Initialize(
127
130
static void CursorVar_Finalize (
128
131
udt_CursorVar * var ) // variable to free
129
132
{
130
- Py_DECREF (var -> connection );
131
- Py_XDECREF (var -> cursors );
133
+ Py_CLEAR (var -> connection );
134
+ Py_CLEAR (var -> cursors );
132
135
}
133
136
134
137
@@ -181,3 +184,41 @@ static PyObject *CursorVar_GetValue(
181
184
return cursor ;
182
185
}
183
186
187
+
188
+ //-----------------------------------------------------------------------------
189
+ // CursorVar_PreFetch()
190
+ // Clear cursors and create new ones in preparation for next fetch.
191
+ //-----------------------------------------------------------------------------
192
+ static int CursorVar_PreFetch (
193
+ udt_CursorVar * var ) // variable to free
194
+ {
195
+ udt_Cursor * tempCursor ;
196
+ ub4 i ;
197
+
198
+ // do not clear cursors the first time (already created by initialize)
199
+ if (!var -> createCursors ) {
200
+ var -> createCursors = 1 ;
201
+ return 0 ;
202
+ }
203
+
204
+ // clear original cursors and create new ones
205
+ for (i = 0 ; i < var -> allocatedElements ; i ++ ) {
206
+
207
+ // clear original cursor, if applicable
208
+ Py_CLEAR (PyList_GET_ITEM (var -> cursors , i ));
209
+ var -> data [i ] = NULL ;
210
+
211
+ // create new cursor
212
+ tempCursor = (udt_Cursor * ) Connection_NewCursor (var -> connection , NULL ,
213
+ NULL );
214
+ if (!tempCursor )
215
+ return -1 ;
216
+ PyList_SET_ITEM (var -> cursors , i , (PyObject * ) tempCursor );
217
+ if (Cursor_AllocateHandle (tempCursor ) < 0 )
218
+ return -1 ;
219
+ var -> data [i ] = tempCursor -> handle ;
220
+ }
221
+
222
+ return 0 ;
223
+ }
224
+
0 commit comments