server/sqlutils.py
branchstable
changeset 7341 c419c2d0d13e
parent 7229 a60522259c2c
child 7904 f41bb38dda7c
child 7906 203d574c8a1d
equal deleted inserted replaced
7340:9303fd71c2ee 7341:c419c2d0d13e
   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         """