docs: def fetchone(self):
          """ fetch a single row. a lock object is used to assure that a single 
  	 record will be fetched and all housekeeping done properly in a 
  	 multithreaded environment.
           as getting a block is currently synchronous, this also protects 
  	 against multiple block requests (but does not protect against 
  	 explicit calls to to _fetchBlock())
          """
          self._cursorLock.acquire()
  
          # if there are available records in current block, 
  	# return one and advance counter
          if self._currentBlock is not None and self._currentRecordNum < len(self._currentBlock):
             x = self._currentRecordNum
             self._currentRecordNum += 1
             self._cursorLock.release()
             return self._currentBlock[x]
  
          # if no standby block is waiting, fetch a block
          if self._standbyBlock is None:
             # TODO - make sure exceptions due to problems in getting the block 
  	   # of records from the server are handled properly
             self._fetchBlock()
  
          # if we still do not have a standby block (or it is empty), 
  	# return None - no more data is available
          if self._standbyBlock is None or len(self._standbyBlock)==0:
             self._cursorLock.release()
             return None
  
          #  move the standby to current
          self._currentBlock = self._standbyBlock 
          self._standbyBlock = None
          self._currentRecordNum = 1
  
          # return the first record
          self._cursorLock.release()
          return self._currentBlock[0]