@Override public int deserialize(byte[] stream, int offset) { final long fileId = OLongSerializer.INSTANCE.deserializeLiteral(stream, offset); offset += OLongSerializer.LONG_SIZE; final long pageIndex = OLongSerializer.INSTANCE.deserializeLiteral(stream, offset); offset += OLongSerializer.LONG_SIZE; final int pageOffset = OIntegerSerializer.INSTANCE.deserializeLiteral(stream, offset); offset += OIntegerSerializer.INT_SIZE; // Cached bag size. Not used after 1.7.5 offset += OIntegerSerializer.INT_SIZE; if (fileId == -1) collectionPointer = null; else collectionPointer = new OBonsaiCollectionPointer(fileId, new OBonsaiBucketPointer(pageIndex, pageOffset)); this.size = -1; changes.putAll(ChangeSerializationHelper.INSTANCE.deserializeChanges(stream, offset)); return offset; }
public Map<OIdentifiable, Change> deserializeChanges(final byte[] stream, int offset) { final int count = OIntegerSerializer.INSTANCE.deserializeLiteral(stream, offset); offset += OIntegerSerializer.INT_SIZE; final HashMap<OIdentifiable, Change> res = new HashMap<OIdentifiable, Change>(); for (int i = 0; i < count; i++) { ORecordId rid = OLinkSerializer.INSTANCE.deserialize(stream, offset); offset += OLinkSerializer.RID_SIZE; Change change = ChangeSerializationHelper.INSTANCE.deserializeChange(stream, offset); offset += Change.SIZE; final OIdentifiable identifiable; if (rid.isTemporary() && rid.getRecord() != null) identifiable = rid.getRecord(); else identifiable = rid; res.put(identifiable, change); } return res; }
@Override public int serialize(byte[] stream, int offset, UUID ownerUuid) { for (Map.Entry<OIdentifiable, OModifiableInteger> entry : newEntries.entrySet()) { OIdentifiable identifiable = entry.getKey(); assert identifiable instanceof ORecord; Change c = changes.get(identifiable); final int delta = entry.getValue().intValue(); if (c == null) changes.put(identifiable, new DiffChange(delta)); else c.applyDiff(delta); } newEntries.clear(); final ORecordSerializationContext context; boolean remoteMode = ODatabaseRecordThreadLocal.INSTANCE.get().getStorage() instanceof OStorageProxy; if (remoteMode) { context = null; } else context = ORecordSerializationContext.getContext(); // make sure that we really save underlying record. if (collectionPointer == null) { if (context != null) { final int clusterId = getHighLevelDocClusterId(); assert clusterId > -1; collectionPointer = ODatabaseRecordThreadLocal.INSTANCE .get() .getSbTreeCollectionManager() .createSBTree(clusterId, ownerUuid); } } OBonsaiCollectionPointer collectionPointer; if (this.collectionPointer != null) collectionPointer = this.collectionPointer; else { collectionPointer = OBonsaiCollectionPointer.INVALID; } OLongSerializer.INSTANCE.serializeLiteral(collectionPointer.getFileId(), stream, offset); offset += OLongSerializer.LONG_SIZE; OBonsaiBucketPointer rootPointer = collectionPointer.getRootPointer(); OLongSerializer.INSTANCE.serializeLiteral(rootPointer.getPageIndex(), stream, offset); offset += OLongSerializer.LONG_SIZE; OIntegerSerializer.INSTANCE.serializeLiteral(rootPointer.getPageOffset(), stream, offset); offset += OIntegerSerializer.INT_SIZE; // Keep this section for binary compatibility with versions older then 1.7.5 OIntegerSerializer.INSTANCE.serializeLiteral(size, stream, offset); offset += OIntegerSerializer.INT_SIZE; if (context == null) { ChangeSerializationHelper.INSTANCE.serializeChanges( changes, OLinkSerializer.INSTANCE, stream, offset); } else { context.push(new ORidBagUpdateSerializationOperation(changes, collectionPointer)); // 0-length serialized list of changes OIntegerSerializer.INSTANCE.serializeLiteral(0, stream, offset); offset += OIntegerSerializer.INT_SIZE; } return offset; }
private int getChangesSerializedSize() { Set<OIdentifiable> changedIds = new HashSet<OIdentifiable>(changes.keySet()); changedIds.addAll(newEntries.keySet()); return ChangeSerializationHelper.INSTANCE.getChangesSerializedSize(changedIds.size()); }