@Override public void onStartup() { if (INSTANCE == null) INSTANCE = new ORecordSaveThreadLocal(); }
public static ORecord getLast() { return INSTANCE.get(); }
public static void removeLast() { INSTANCE.set(null); } }
/** * Returns a record containing the original in-conflict changes. */ private ODocument getChangeRecord(final ORecordId rid, final byte[] content) { // check the 'record-save' cache as it's likely already there ODocument record = (ODocument) ORecordSaveThreadLocal.getLast(); if (record == null || !rid.equals(record.getIdentity())) { record = new ODocument(rid).fromStream(content); } return record; }
@Override public byte[] onUpdate(OStorage storage, byte iRecordType, final ORecordId rid, final int iRecordVersion, final byte[] iRecordContent, final AtomicInteger iDatabaseVersion) { if (iRecordType == ODocument.RECORD_TYPE) { // No need lock, is already inside a lock. Use database to read temporary objects too OStorageOperationResult<ORawBuffer> res = storage.readRecord(rid, null, false, false, null); final ODocument storedRecord = new ODocument(rid).fromStream(res.getResult().getBuffer()); ODocument newRecord = (ODocument) ORecordSaveThreadLocal.getLast(); if (newRecord == null || !newRecord.getIdentity().equals(rid)) newRecord = new ODocument(rid).fromStream(iRecordContent); storedRecord.merge(newRecord, true, true); iDatabaseVersion.set(Math.max(iDatabaseVersion.get(), iRecordVersion) + 1); return storedRecord.toStream(); } else // NO DOCUMENT, CANNOT MERGE SO RELY TO THE VERSION CHECK checkVersions(rid, iRecordVersion, iDatabaseVersion.get()); return null; }
public static void setLast(final ORecord document) { INSTANCE.set(document); }