/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.sync.repositories.android;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public abstract class CachedSQLiteOpenHelper extends SQLiteOpenHelper {
public CachedSQLiteOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
// Cache these so we don't have to track them across cursors. Call `close`
// when you're done.
private SQLiteDatabase readableDatabase;
private SQLiteDatabase writableDatabase;
synchronized protected SQLiteDatabase getCachedReadableDatabase() {
if (readableDatabase == null) {
if (writableDatabase == null) {
readableDatabase = this.getReadableDatabase();
return readableDatabase;
} else {
return writableDatabase;
}
} else {
return readableDatabase;
}
}
synchronized protected SQLiteDatabase getCachedWritableDatabase() {
if (writableDatabase == null) {
writableDatabase = this.getWritableDatabase();
}
return writableDatabase;
}
synchronized public void close() {
if (readableDatabase != null) {
readableDatabase.close();
readableDatabase = null;
}
if (writableDatabase != null) {
writableDatabase.close();
writableDatabase = null;
}
super.close();
}
// Used for testing.
public boolean isClosed() {
return readableDatabase == null &&
writableDatabase == null;
}
}