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