/*-
 * See the file LICENSE for redistribution information.
 *
 * Copyright (c) 2002, 2013 Oracle and/or its affiliates.  All rights reserved.
 *
 * $Id$
 */

package com.sleepycat.db;

import com.sleepycat.db.internal.DbConstants;

/** Deadlock detection modes. */
public final class LockDetectMode {
    /**
    Turn off deadlock detection.
    */
    public static final LockDetectMode NONE =
        new LockDetectMode("NONE", 0);

    /**
    Use whatever lock policy was specified when the database environment
    was created.  If no lock policy has yet been specified, set the lock
    policy to DB_LOCK_RANDOM.
    */
    public static final LockDetectMode DEFAULT =
        new LockDetectMode("DEFAULT", DbConstants.DB_LOCK_DEFAULT);

    /**
    Reject lock requests which have timed out.  No other deadlock detection
    is performed.
    */
    public static final LockDetectMode EXPIRE =
        new LockDetectMode("EXPIRE", DbConstants.DB_LOCK_EXPIRE);

    /**
    Reject the lock request for the locker ID with the most locks.
    */
    public static final LockDetectMode MAXLOCKS =
        new LockDetectMode("MAXLOCKS", DbConstants.DB_LOCK_MAXLOCKS);

    /**
    Reject the lock request for the locker ID with the most write locks.
    */
    public static final LockDetectMode MAXWRITE =
        new LockDetectMode("MAXWRITE", DbConstants.DB_LOCK_MAXWRITE);

    /**
    Reject the lock request for the locker ID with the fewest locks.
    */
    public static final LockDetectMode MINLOCKS =
        new LockDetectMode("MINLOCKS", DbConstants.DB_LOCK_MINLOCKS);

    /**
    Reject the lock request for the locker ID with the fewest write locks.
    */
    public static final LockDetectMode MINWRITE =
        new LockDetectMode("MINWRITE", DbConstants.DB_LOCK_MINWRITE);

    /**
    Reject the lock request for the locker ID with the oldest lock.
    */
    public static final LockDetectMode OLDEST =
        new LockDetectMode("OLDEST", DbConstants.DB_LOCK_OLDEST);

    /**
    Reject the lock request for a random locker ID.
    */
    public static final LockDetectMode RANDOM =
        new LockDetectMode("RANDOM", DbConstants.DB_LOCK_RANDOM);

    /**
    Reject the lock request for the locker ID with the youngest lock.
    */
    public static final LockDetectMode YOUNGEST =
        new LockDetectMode("YOUNGEST", DbConstants.DB_LOCK_YOUNGEST);

    /* package */
    static LockDetectMode fromFlag(int flag) {
        switch (flag) {
        case 0:
            return NONE;
        case DbConstants.DB_LOCK_DEFAULT:
            return DEFAULT;
        case DbConstants.DB_LOCK_EXPIRE:
            return EXPIRE;
        case DbConstants.DB_LOCK_MAXLOCKS:
            return MAXLOCKS;
        case DbConstants.DB_LOCK_MAXWRITE:
            return MAXWRITE;
        case DbConstants.DB_LOCK_MINLOCKS:
            return MINLOCKS;
        case DbConstants.DB_LOCK_MINWRITE:
            return MINWRITE;
        case DbConstants.DB_LOCK_OLDEST:
            return OLDEST;
        case DbConstants.DB_LOCK_RANDOM:
            return RANDOM;
        case DbConstants.DB_LOCK_YOUNGEST:
            return YOUNGEST;
        default:
            throw new IllegalArgumentException(
                "Unknown lock detect mode: " + flag);
        }
    }

    private String modeName;
    private int flag;

    private LockDetectMode(final String modeName, final int flag) {
        this.modeName = modeName;
        this.flag = flag;
    }

    /* package */
    int getFlag() {
        return flag;
    }

    /** {@inheritDoc} */
    public String toString() {
        return "LockDetectMode." + modeName;
    }
}
