202 return query_args |
202 return query_args |
203 |
203 |
204 def process_result(self, cursor, column_callbacks=None, session=None): |
204 def process_result(self, cursor, column_callbacks=None, session=None): |
205 """return a list of CubicWeb compliant values from data in the given cursor |
205 """return a list of CubicWeb compliant values from data in the given cursor |
206 """ |
206 """ |
|
207 return list(self.iter_process_result(cursor, column_callbacks, session)) |
|
208 |
|
209 def iter_process_result(self, cursor, column_callbacks=None, session=None): |
|
210 """return a iterator on tuples of CubicWeb compliant values from data |
|
211 in the given cursor |
|
212 """ |
207 # use two different implementations to avoid paying the price of |
213 # use two different implementations to avoid paying the price of |
208 # callback lookup for each *cell* in results when there is nothing to |
214 # callback lookup for each *cell* in results when there is nothing to |
209 # lookup |
215 # lookup |
210 if not column_callbacks: |
216 if not column_callbacks: |
211 return self._process_result(cursor) |
217 return self._process_result(cursor) |
217 descr = cursor.description |
223 descr = cursor.description |
218 encoding = self._dbencoding |
224 encoding = self._dbencoding |
219 process_value = self._process_value |
225 process_value = self._process_value |
220 binary = Binary |
226 binary = Binary |
221 # /end |
227 # /end |
222 results = cursor.fetchall() |
228 cursor.arraysize = 100 |
223 for i, line in enumerate(results): |
229 while True: |
224 result = [] |
230 results = cursor.fetchmany() |
225 for col, value in enumerate(line): |
231 if not results: |
226 if value is None: |
232 break |
227 result.append(value) |
233 for line in results: |
228 continue |
234 result = [] |
229 result.append(process_value(value, descr[col], encoding, binary)) |
235 for col, value in enumerate(line): |
230 results[i] = result |
236 if value is None: |
231 return results |
237 result.append(value) |
|
238 continue |
|
239 result.append(process_value(value, descr[col], encoding, binary)) |
|
240 yield result |
232 |
241 |
233 def _cb_process_result(self, cursor, column_callbacks, session): |
242 def _cb_process_result(self, cursor, column_callbacks, session): |
234 # begin bind to locals for optimization |
243 # begin bind to locals for optimization |
235 descr = cursor.description |
244 descr = cursor.description |
236 encoding = self._dbencoding |
245 encoding = self._dbencoding |
237 process_value = self._process_value |
246 process_value = self._process_value |
238 binary = Binary |
247 binary = Binary |
239 # /end |
248 # /end |
240 results = cursor.fetchall() |
249 cursor.arraysize = 100 |
241 for i, line in enumerate(results): |
250 while True: |
242 result = [] |
251 results = cursor.fetchmany() |
243 for col, value in enumerate(line): |
252 if not results: |
244 if value is None: |
253 break |
|
254 for line in results: |
|
255 result = [] |
|
256 for col, value in enumerate(line): |
|
257 if value is None: |
|
258 result.append(value) |
|
259 continue |
|
260 cbstack = column_callbacks.get(col, None) |
|
261 if cbstack is None: |
|
262 value = process_value(value, descr[col], encoding, binary) |
|
263 else: |
|
264 for cb in cbstack: |
|
265 value = cb(self, session, value) |
245 result.append(value) |
266 result.append(value) |
246 continue |
267 yield result |
247 cbstack = column_callbacks.get(col, None) |
|
248 if cbstack is None: |
|
249 value = process_value(value, descr[col], encoding, binary) |
|
250 else: |
|
251 for cb in cbstack: |
|
252 value = cb(self, session, value) |
|
253 result.append(value) |
|
254 results[i] = result |
|
255 return results |
|
256 |
268 |
257 def preprocess_entity(self, entity): |
269 def preprocess_entity(self, entity): |
258 """return a dictionary to use as extra argument to cursor.execute |
270 """return a dictionary to use as extra argument to cursor.execute |
259 to insert/update an entity into a SQL database |
271 to insert/update an entity into a SQL database |
260 """ |
272 """ |