| """ |
| BitBake 'remotedata' module |
| |
| Provides support for using a datastore from the bitbake client |
| """ |
| |
| # Copyright (C) 2016 Intel Corporation |
| # |
| # SPDX-License-Identifier: GPL-2.0-only |
| # |
| |
| import bb.data |
| |
| class RemoteDatastores: |
| """Used on the server side to manage references to server-side datastores""" |
| def __init__(self, cooker): |
| self.cooker = cooker |
| self.datastores = {} |
| self.locked = [] |
| self.datastores[0] = self.cooker.data |
| self.nextindex = 1 |
| |
| def __len__(self): |
| return len(self.datastores) |
| |
| def __getitem__(self, key): |
| # Cooker could have changed its datastore from under us |
| self.datastores[0] = self.cooker.data |
| return self.datastores[key] |
| |
| def items(self): |
| return self.datastores.items() |
| |
| def store(self, d, locked=False): |
| """ |
| Put a datastore into the collection. If locked=True then the datastore |
| is understood to be managed externally and cannot be released by calling |
| release(). |
| """ |
| idx = self.nextindex |
| self.datastores[idx] = d |
| if locked: |
| self.locked.append(idx) |
| self.nextindex += 1 |
| return idx |
| |
| def check_store(self, d, locked=False): |
| """ |
| Put a datastore into the collection if it's not already in there; |
| in either case return the index |
| """ |
| for key, val in self.datastores.items(): |
| if val is d: |
| idx = key |
| break |
| else: |
| idx = self.store(d, locked) |
| return idx |
| |
| def release(self, idx): |
| """Discard a datastore in the collection""" |
| if idx in self.locked: |
| raise Exception('Tried to release locked datastore %d' % idx) |
| del self.datastores[idx] |
| |