18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * you may not use this file except in compliance with the License.
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * You may obtain a copy of the License at
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * See the License for the specific language governing permissions and
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * limitations under the License.
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1748ed3267dfffedb65385b0a1f1462fdd46d049bbDavid 'Digit' Turnerpackage android.database.sqlite;
189877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport android.database.CursorWindow;
2034f2974ce7ec7c71beb47b5daf9089d5c8c40c79David 'Digit' Turner
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/**
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * An object created from a SQLiteDatabase that can be closed.
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic abstract class SQLiteClosable {
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private int mReferenceCount = 1;
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private Object mLock = new Object();
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    protected abstract void onAllReferencesReleased();
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    protected void onAllReferencesReleasedFromContainer() {}
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    public void acquireReference() {
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        synchronized(mLock) {
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (mReferenceCount <= 0) {
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                throw new IllegalStateException(
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        "attempt to re-open an already-closed object: " + getObjInfo());
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            mReferenceCount++;
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    public void releaseReference() {
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        synchronized(mLock) {
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            mReferenceCount--;
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (mReferenceCount == 0) {
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                onAllReferencesReleased();
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    public void releaseReferenceFromContainer() {
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        synchronized(mLock) {
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            mReferenceCount--;
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (mReferenceCount == 0) {
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                onAllReferencesReleasedFromContainer();
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private String getObjInfo() {
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        StringBuilder buff = new StringBuilder();
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        buff.append(this.getClass().getName());
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        buff.append(" (");
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (this instanceof SQLiteDatabase) {
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            buff.append("database = ");
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            buff.append(((SQLiteDatabase)this).getPath());
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } else if (this instanceof SQLiteProgram || this instanceof SQLiteStatement ||
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                this instanceof SQLiteQuery) {
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            buff.append("mSql = ");
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            buff.append(((SQLiteProgram)this).mSql);
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } else if (this instanceof CursorWindow) {
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            buff.append("mStartPos = ");
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            buff.append(((CursorWindow)this).getStartPosition());
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        buff.append(") ");
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return buff.toString();
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project