77 # |
76 # |
78 #def restore(self): |
77 #def restore(self): |
79 # """reinstall previous stdout and stderr and return intercepted stdout |
78 # """reinstall previous stdout and stderr and return intercepted stdout |
80 # """ |
79 # """ |
81 # raise NotImplementedError() |
80 # raise NotImplementedError() |
82 |
|
83 class remotebatch(peer.batcher): |
|
84 '''batches the queued calls; uses as few roundtrips as possible''' |
|
85 def __init__(self, remote): |
|
86 '''remote must support _submitbatch(encbatch) and |
|
87 _submitone(op, encargs)''' |
|
88 peer.batcher.__init__(self) |
|
89 self.remote = remote |
|
90 def submit(self): |
|
91 req, rsp = [], [] |
|
92 for name, args, opts, resref in self.calls: |
|
93 mtd = getattr(self.remote, name) |
|
94 batchablefn = getattr(mtd, 'batchable', None) |
|
95 if batchablefn is not None: |
|
96 batchable = batchablefn(mtd.im_self, *args, **opts) |
|
97 encargsorres, encresref = next(batchable) |
|
98 assert encresref |
|
99 req.append((name, encargsorres,)) |
|
100 rsp.append((batchable, encresref, resref,)) |
|
101 else: |
|
102 if req: |
|
103 self._submitreq(req, rsp) |
|
104 req, rsp = [], [] |
|
105 resref.set(mtd(*args, **opts)) |
|
106 if req: |
|
107 self._submitreq(req, rsp) |
|
108 def _submitreq(self, req, rsp): |
|
109 encresults = self.remote._submitbatch(req) |
|
110 for encres, r in zip(encresults, rsp): |
|
111 batchable, encresref, resref = r |
|
112 encresref.set(encres) |
|
113 resref.set(next(batchable)) |
|
114 |
81 |
115 class remoteiterbatcher(peer.iterbatcher): |
82 class remoteiterbatcher(peer.iterbatcher): |
116 def __init__(self, remote): |
83 def __init__(self, remote): |
117 super(remoteiterbatcher, self).__init__() |
84 super(remoteiterbatcher, self).__init__() |
118 self._remote = remote |
85 self._remote = remote |
251 Methods commonly call wire protocol commands of the same name. |
218 Methods commonly call wire protocol commands of the same name. |
252 |
219 |
253 See also httppeer.py and sshpeer.py for protocol-specific |
220 See also httppeer.py and sshpeer.py for protocol-specific |
254 implementations of this interface. |
221 implementations of this interface. |
255 """ |
222 """ |
256 def batch(self): |
|
257 if self.capable('batch'): |
|
258 return remotebatch(self) |
|
259 else: |
|
260 return peer.localbatch(self) |
|
261 def _submitbatch(self, req): |
223 def _submitbatch(self, req): |
262 """run batch request <req> on the server |
224 """run batch request <req> on the server |
263 |
225 |
264 Returns an iterator of the raw responses from the server. |
226 Returns an iterator of the raw responses from the server. |
265 """ |
227 """ |