![]() |
Quadcap Embeddable Database |
00001 package com.quadcap.sql.lock; 00002 00003 /* Copyright 1999 - 2003 Quadcap Software. All rights reserved. 00004 * 00005 * This software is distributed under the Quadcap Free Software License. 00006 * This software may be used or modified for any purpose, personal or 00007 * commercial. Open Source redistributions are permitted. Commercial 00008 * redistribution of larger works derived from, or works which bundle 00009 * this software requires a "Commercial Redistribution License"; see 00010 * http://www.quadcap.com/purchase. 00011 * 00012 * Redistributions qualify as "Open Source" under one of the following terms: 00013 * 00014 * Redistributions are made at no charge beyond the reasonable cost of 00015 * materials and delivery. 00016 * 00017 * Redistributions are accompanied by a copy of the Source Code or by an 00018 * irrevocable offer to provide a copy of the Source Code for up to three 00019 * years at the cost of materials and delivery. Such redistributions 00020 * must allow further use, modification, and redistribution of the Source 00021 * Code under substantially the same terms as this license. 00022 * 00023 * Redistributions of source code must retain the copyright notices as they 00024 * appear in each source code file, these license terms, and the 00025 * disclaimer/limitation of liability set forth as paragraph 6 below. 00026 * 00027 * Redistributions in binary form must reproduce this Copyright Notice, 00028 * these license terms, and the disclaimer/limitation of liability set 00029 * forth as paragraph 6 below, in the documentation and/or other materials 00030 * provided with the distribution. 00031 * 00032 * The Software is provided on an "AS IS" basis. No warranty is 00033 * provided that the Software is free of defects, or fit for a 00034 * particular purpose. 00035 * 00036 * Limitation of Liability. Quadcap Software shall not be liable 00037 * for any damages suffered by the Licensee or any third party resulting 00038 * from use of the Software. 00039 */ 00040 00041 import com.quadcap.util.Debug; 00042 00043 /** 00044 * 00045 * 00046 * @author Stan Bailes 00047 */ 00048 class HeldLock extends PooledObject { 00049 Lock lock; 00050 Transaction trans; 00051 int mode; 00052 int waitMode; 00053 00054 protected HeldLock() {} 00055 00056 public void init(Transaction trans, Lock lock, int mode) { 00057 this.trans = trans; 00058 this.lock = lock; 00059 this.mode = mode; 00060 this.waitMode = mode; 00061 } 00062 00063 final void setWaitMode(int mode) { this.waitMode = mode; } 00064 final int getWaitMode() { return waitMode; } 00065 final Transaction getTransaction() { return trans; } 00066 00067 public final PooledObject create() { return new HeldLock(); } 00068 00069 static int compare(HeldLock a, HeldLock b) { 00070 if (a == null) throw new RuntimeException("a is null"); 00071 if (b == null) throw new RuntimeException("b is null"); 00072 if (!a.live) throw new RuntimeException("a not live: " + a); 00073 if (!b.live) throw new RuntimeException("b not live: " + b); 00074 if (a.trans == null) throw new RuntimeException("a.trans is null"); 00075 if (b.trans == null) throw new RuntimeException("b.trans is null"); 00076 if (!a.trans.live) throw new RuntimeException("a trans not live: " + a); 00077 if (!b.trans.live) throw new RuntimeException("b trans not live: " + b); 00078 if (a.trans.getTransactionId() 00079 < b.trans.getTransactionId()) 00080 return -1; 00081 if (a.trans.getTransactionId() 00082 > b.trans.getTransactionId()) 00083 return 1; 00084 if (a.lock == null) { 00085 return (b.lock == null) ? 0 : -1; 00086 } 00087 if (b.lock == null) return 1; 00088 if (a.lock.hashCode() < b.lock.hashCode()) return -1; 00089 if (a.lock.hashCode() > b.lock.hashCode()) return 1; 00090 if (a.mode < b.mode) return -1; 00091 if (a.mode > b.mode) return 1; 00092 if (a.waitMode < b.waitMode) return -1; 00093 if (a.waitMode > b.waitMode) return 1; 00094 return 0; 00095 } 00096 00097 public String toString() { 00098 // StringBuffer sb = new StringBuffer("HeldLock"); 00099 // sb.append(super.toString()); 00100 // sb.append(String.valueOf(trans)).append(", "); 00101 // sb.append(lock).append(", "); 00102 // sb.append(LockMode.toString(mode)).append(" (W "); 00103 // sb.append(LockMode.toString(waitMode)).append(")"); 00104 // return sb.toString(); 00105 if (lock == null) { 00106 return "HeldLock{}"; 00107 } else { 00108 return "HeldLock{" + lock.getName() + "," + 00109 trans + "," + LockMode.toString(mode) + "}"; 00110 } 00111 } 00112 } 00113