server/session.py
branchstable
changeset 2054 277e8d3b1154
parent 1977 606923dff11b
child 2055 e4283fc56873
equal deleted inserted replaced
2053:fb156d69bfd9 2054:277e8d3b1154
   154     def set_pool(self):
   154     def set_pool(self):
   155         """the session need a pool to execute some queries"""
   155         """the session need a pool to execute some queries"""
   156         if self._closed:
   156         if self._closed:
   157             raise Exception('try to set pool on a closed session')
   157             raise Exception('try to set pool on a closed session')
   158         if self.pool is None:
   158         if self.pool is None:
       
   159             # get pool first to avoid race-condition
   159             self._threaddata.pool = self.repo._get_pool()
   160             self._threaddata.pool = self.repo._get_pool()
   160             try:
   161             try:
   161                 self._threaddata.pool.pool_set(self)
   162                 self._threaddata.pool.pool_set(self)
   162             except:
   163             except:
       
   164                 self._threaddata.pool = None
   163                 self.repo._free_pool(self.pool)
   165                 self.repo._free_pool(self.pool)
   164                 self._threaddata.pool = None
       
   165                 raise
   166                 raise
   166             self._threads_in_transaction.add(threading.currentThread())
   167             self._threads_in_transaction.add(threading.currentThread())
   167         return self._threaddata.pool
   168         return self._threaddata.pool
   168 
   169 
   169     def reset_pool(self):
   170     def reset_pool(self):
   172         # pool may be none if no operation has been done since last commit
   173         # pool may be none if no operation has been done since last commit
   173         # or rollback
   174         # or rollback
   174         if self.pool is not None and self.mode == 'read':
   175         if self.pool is not None and self.mode == 'read':
   175             # even in read mode, we must release the current transaction
   176             # even in read mode, we must release the current transaction
   176             self._threads_in_transaction.remove(threading.currentThread())
   177             self._threads_in_transaction.remove(threading.currentThread())
   177             self.repo._free_pool(self.pool)
       
   178             self.pool.pool_reset(self)
   178             self.pool.pool_reset(self)
   179             self._threaddata.pool = None
   179             self._threaddata.pool = None
       
   180             # free pool once everything is done to avoid race-condition
       
   181             self.repo._free_pool(self.pool)
   180 
   182 
   181     def system_sql(self, sql, args=None):
   183     def system_sql(self, sql, args=None):
   182         """return a sql cursor on the system database"""
   184         """return a sql cursor on the system database"""
   183         if not sql.split(None, 1)[0].upper() == 'SELECT':
   185         if not sql.split(None, 1)[0].upper() == 'SELECT':
   184             self.mode = 'write'
   186             self.mode = 'write'