use of com.orientechnologies.orient.core.hook.ORecordHook.RESULT in project orientdb by orientechnologies.
the class OTransactionOptimistic method addRecord.
public void addRecord(final ORecord iRecord, final byte iStatus, final String iClusterName) {
checkTransaction();
if (iStatus != ORecordOperation.LOADED)
changedDocuments.remove(iRecord);
try {
switch(iStatus) {
case ORecordOperation.CREATED:
{
database.checkSecurity(ORule.ResourceGeneric.CLUSTER, ORole.PERMISSION_CREATE, iClusterName);
RESULT res = database.callbackHooks(TYPE.BEFORE_CREATE, iRecord);
if (res == RESULT.RECORD_CHANGED && iRecord instanceof ODocument)
((ODocument) iRecord).validate();
}
break;
case ORecordOperation.LOADED:
/**
* Read hooks already invoked in {@link com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx#executeReadRecord}
*/
break;
case ORecordOperation.UPDATED:
{
database.checkSecurity(ORule.ResourceGeneric.CLUSTER, ORole.PERMISSION_UPDATE, iClusterName);
RESULT res = database.callbackHooks(TYPE.BEFORE_UPDATE, iRecord);
if (res == RESULT.RECORD_CHANGED && iRecord instanceof ODocument)
((ODocument) iRecord).validate();
}
break;
case ORecordOperation.DELETED:
database.checkSecurity(ORule.ResourceGeneric.CLUSTER, ORole.PERMISSION_DELETE, iClusterName);
database.callbackHooks(TYPE.BEFORE_DELETE, iRecord);
break;
}
try {
final ORecordId rid = (ORecordId) iRecord.getIdentity();
if (!rid.isValid()) {
ORecordInternal.onBeforeIdentityChanged(iRecord);
database.assignAndCheckCluster(iRecord, iClusterName);
rid.setClusterPosition(newObjectCounter--);
ORecordInternal.onAfterIdentityChanged(iRecord);
}
ORecordOperation txEntry = getRecordEntry(rid);
if (txEntry == null) {
if (!(rid.isTemporary() && iStatus != ORecordOperation.CREATED)) {
// NEW ENTRY: JUST REGISTER IT
txEntry = new ORecordOperation(iRecord, iStatus);
allEntries.put(rid.copy(), txEntry);
}
} else {
// UPDATE PREVIOUS STATUS
txEntry.record = iRecord;
switch(txEntry.type) {
case ORecordOperation.LOADED:
switch(iStatus) {
case ORecordOperation.UPDATED:
txEntry.type = ORecordOperation.UPDATED;
break;
case ORecordOperation.DELETED:
txEntry.type = ORecordOperation.DELETED;
break;
}
break;
case ORecordOperation.UPDATED:
switch(iStatus) {
case ORecordOperation.DELETED:
txEntry.type = ORecordOperation.DELETED;
break;
}
break;
case ORecordOperation.DELETED:
break;
case ORecordOperation.CREATED:
switch(iStatus) {
case ORecordOperation.DELETED:
allEntries.remove(rid);
// txEntry.type = ORecordOperation.DELETED;
break;
}
break;
}
}
switch(iStatus) {
case ORecordOperation.CREATED:
database.callbackHooks(TYPE.AFTER_CREATE, iRecord);
break;
case ORecordOperation.LOADED:
/**
* Read hooks already invoked in
* {@link com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx#executeReadRecord} .
*/
break;
case ORecordOperation.UPDATED:
database.callbackHooks(TYPE.AFTER_UPDATE, iRecord);
break;
case ORecordOperation.DELETED:
database.callbackHooks(TYPE.AFTER_DELETE, iRecord);
break;
}
// RESET TRACKING
if (iRecord instanceof ODocument && ((ODocument) iRecord).isTrackingChanges()) {
ODocumentInternal.clearTrackData(((ODocument) iRecord));
}
} catch (Exception e) {
switch(iStatus) {
case ORecordOperation.CREATED:
database.callbackHooks(TYPE.CREATE_FAILED, iRecord);
break;
case ORecordOperation.UPDATED:
database.callbackHooks(TYPE.UPDATE_FAILED, iRecord);
break;
case ORecordOperation.DELETED:
database.callbackHooks(TYPE.DELETE_FAILED, iRecord);
break;
}
throw OException.wrapException(new ODatabaseException("Error on saving record " + iRecord.getIdentity()), e);
}
} finally {
switch(iStatus) {
case ORecordOperation.CREATED:
database.callbackHooks(TYPE.FINALIZE_CREATION, iRecord);
break;
case ORecordOperation.UPDATED:
database.callbackHooks(TYPE.FINALIZE_UPDATE, iRecord);
break;
case ORecordOperation.DELETED:
database.callbackHooks(TYPE.FINALIZE_DELETION, iRecord);
break;
}
}
}
Aggregations