Search in sources :

Example 1 with RESULT

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;
        }
    }
}
Also used : ORecordOperation(com.orientechnologies.orient.core.db.record.ORecordOperation) ODatabaseException(com.orientechnologies.orient.core.exception.ODatabaseException) RESULT(com.orientechnologies.orient.core.hook.ORecordHook.RESULT) ORecordId(com.orientechnologies.orient.core.id.ORecordId) OException(com.orientechnologies.common.exception.OException) OStorageException(com.orientechnologies.orient.core.exception.OStorageException) ORecordNotFoundException(com.orientechnologies.orient.core.exception.ORecordNotFoundException) OTransactionException(com.orientechnologies.orient.core.exception.OTransactionException) ODatabaseException(com.orientechnologies.orient.core.exception.ODatabaseException) ODocument(com.orientechnologies.orient.core.record.impl.ODocument)

Aggregations

OException (com.orientechnologies.common.exception.OException)1 ORecordOperation (com.orientechnologies.orient.core.db.record.ORecordOperation)1 ODatabaseException (com.orientechnologies.orient.core.exception.ODatabaseException)1 ORecordNotFoundException (com.orientechnologies.orient.core.exception.ORecordNotFoundException)1 OStorageException (com.orientechnologies.orient.core.exception.OStorageException)1 OTransactionException (com.orientechnologies.orient.core.exception.OTransactionException)1 RESULT (com.orientechnologies.orient.core.hook.ORecordHook.RESULT)1 ORecordId (com.orientechnologies.orient.core.id.ORecordId)1 ODocument (com.orientechnologies.orient.core.record.impl.ODocument)1