19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.database.sqlite; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1903bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brownimport java.io.Closeable; 2003bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 229ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick * An object created from a SQLiteDatabase that can be closed. 2303bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * 2403bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * This class implements a primitive reference counting scheme for database objects. 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2603bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brownpublic abstract class SQLiteClosable implements Closeable { 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mReferenceCount = 1; 289ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick 2903bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown /** 3003bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * Called when the last reference to the object was released by 3103bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * a call to {@link #releaseReference()} or {@link #close()}. 3203bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown */ 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected abstract void onAllReferencesReleased(); 349ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick 3503bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown /** 3603bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * Called when the last reference to the object was released by 3703bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * a call to {@link #releaseReferenceFromContainer()}. 3803bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * 3903bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * @deprecated Do not use. 4003bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown */ 4103bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown @Deprecated 4203bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown protected void onAllReferencesReleasedFromContainer() { 4303bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown onAllReferencesReleased(); 4403bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown } 4503bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown 4603bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown /** 4703bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * Acquires a reference to the object. 4803bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * 4903bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * @throws IllegalStateException if the last reference to the object has already 5003bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * been released. 5103bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquireReference() { 5302fc2b01a3fa1cdd0240087726259cca1b4df910Vasu Nori synchronized(this) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mReferenceCount <= 0) { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException( 56e5360fbf3efe85427f7e7f59afe7bbeddb4949acJeff Brown "attempt to re-open an already-closed object: " + this); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 58d3fe30134edbe17094a5b9ef21aa6662de451001Vasu Nori mReferenceCount++; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick 6203bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown /** 6303bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * Releases a reference to the object, closing the object if the last reference 6403bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * was released. 6503bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * 6603bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * @see #onAllReferencesReleased() 6703bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void releaseReference() { 6936c4cec85346a11e136b0f95baae2a8fe1db59f2Vasu Nori boolean refCountIsZero = false; 7002fc2b01a3fa1cdd0240087726259cca1b4df910Vasu Nori synchronized(this) { 7136c4cec85346a11e136b0f95baae2a8fe1db59f2Vasu Nori refCountIsZero = --mReferenceCount == 0; 7236c4cec85346a11e136b0f95baae2a8fe1db59f2Vasu Nori } 7336c4cec85346a11e136b0f95baae2a8fe1db59f2Vasu Nori if (refCountIsZero) { 7436c4cec85346a11e136b0f95baae2a8fe1db59f2Vasu Nori onAllReferencesReleased(); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick 7803bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown /** 7903bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * Releases a reference to the object that was owned by the container of the object, 8003bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * closing the object if the last reference was released. 8103bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * 8203bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * @see #onAllReferencesReleasedFromContainer() 8303bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * @deprecated Do not use. 8403bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown */ 8503bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown @Deprecated 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void releaseReferenceFromContainer() { 8736c4cec85346a11e136b0f95baae2a8fe1db59f2Vasu Nori boolean refCountIsZero = false; 8802fc2b01a3fa1cdd0240087726259cca1b4df910Vasu Nori synchronized(this) { 8936c4cec85346a11e136b0f95baae2a8fe1db59f2Vasu Nori refCountIsZero = --mReferenceCount == 0; 9036c4cec85346a11e136b0f95baae2a8fe1db59f2Vasu Nori } 9136c4cec85346a11e136b0f95baae2a8fe1db59f2Vasu Nori if (refCountIsZero) { 9236c4cec85346a11e136b0f95baae2a8fe1db59f2Vasu Nori onAllReferencesReleasedFromContainer(); 939ffdfa0c238fce3b85741d7f6828fd484cd8f195Brad Fitzpatrick } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9503bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown 9603bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown /** 9703bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * Releases a reference to the object, closing the object if the last reference 9803bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * was released. 9903bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * 10003bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * Calling this method is equivalent to calling {@link #releaseReference}. 10103bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * 10203bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * @see #releaseReference() 10303bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown * @see #onAllReferencesReleased() 10403bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown */ 10503bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown public void close() { 10603bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown releaseReference(); 10703bd302aebbb77f4f95789a269c8a5463ac5a840Jeff Brown } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 109