1 | from BTrees.IOBTree import IOBTree |
---|
2 | from random import randint |
---|
3 | def updateMetadata(self, object, uid): |
---|
4 | """ Given an object and a uid, update the column data for the |
---|
5 | uid with the object data iff the object has changed """ |
---|
6 | data = self.data |
---|
7 | index = self.uids.get(uid, None) |
---|
8 | newDataRecord = self.recordify(object) |
---|
9 | |
---|
10 | if index is None: |
---|
11 | if type(data) is IOBTree: |
---|
12 | # New style, get random id |
---|
13 | |
---|
14 | index=getattr(self, '_v_nextid', 0) |
---|
15 | if index % 4000 == 0: |
---|
16 | index = randint(-2000000000, 2000000000) |
---|
17 | while not data.insert(index, newDataRecord): |
---|
18 | index = randint(-2000000000, 2000000000) |
---|
19 | |
---|
20 | # We want ids to be somewhat random, but there are |
---|
21 | # advantages for having some ids generated |
---|
22 | # sequentially when many catalog updates are done at |
---|
23 | # once, such as when reindexing or bulk indexing. |
---|
24 | # We allocate ids sequentially using a volatile base, |
---|
25 | # so different threads get different bases. This |
---|
26 | # further reduces conflict and reduces churn in |
---|
27 | # here and it result sets when bulk indexing. |
---|
28 | self._v_nextid=index+1 |
---|
29 | else: |
---|
30 | if data: |
---|
31 | # find the next available unique id |
---|
32 | index = data.keys()[-1] + 1 |
---|
33 | else: |
---|
34 | index=0 |
---|
35 | # meta_data is stored as a tuple for efficiency |
---|
36 | data[index] = newDataRecord |
---|
37 | else: |
---|
38 | #if True or data.get(index, 0) != newDataRecord: |
---|
39 | data[index] = newDataRecord |
---|
40 | return index |
---|
41 | from Products.ZCatalog.Catalog import Catalog |
---|
42 | Catalog.updateMetadata = updateMetadata |
---|