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