code: def _handle_upsert(self, parts, unwritten_lobs=()):
          
          self.description = None
          self._received_last_resultset_part = True  # set to 'True' so that cursor.fetch*() returns just empty list
  
          for part in parts:
              if part.kind == part_kinds.ROWSAFFECTED:
                  self.rowcount = part.values[0]
              elif part.kind in (part_kinds.TRANSACTIONFLAGS, part_kinds.STATEMENTCONTEXT, part_kinds.PARAMETERMETADATA):
                  pass
              elif part.kind == part_kinds.WRITELOBREPLY:
                  # This part occurrs after lobs have been submitted not at all or only partially during an insert.
                  # In this case the parameter part of the Request message contains a list called 'unwritten_lobs'
                  # with LobBuffer instances.
                  # Those instances are in the same order as 'locator_ids' received in the reply message. These IDs
                  # are then used to deliver the missing LOB data to the server via WRITE_LOB_REQUESTs.
                  for lob_buffer, lob_locator_id in izip(unwritten_lobs, part.locator_ids):
                      # store locator_id in every lob buffer instance for later reference:
                      lob_buffer.locator_id = lob_locator_id
                  self._perform_lob_write_requests(unwritten_lobs)
              else:
                  raise InterfaceError("Prepared insert statement response, unexpected part kind %d." % part.kind)
          self._executed = True
docs: Handle reply messages from INSERT or UPDATE statements