/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.stetho.inspector.database;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import com.facebook.stetho.inspector.database.SQLiteDatabaseCompat.SQLiteOpenOptions;
import java.io.File;
/**
* Opens the requested database using
* {@link SQLiteDatabase#openDatabase(String, SQLiteDatabase.CursorFactory, int)} directly.
*
* <p>It is intended that this class be subclassed to enable/disable features via
* {@link #determineOpenOptions(File)}</p>
*/
public class DefaultDatabaseConnectionProvider implements DatabaseConnectionProvider {
public DefaultDatabaseConnectionProvider() {
}
@Override
public SQLiteDatabase openDatabase(File databaseFile) throws SQLiteException {
return performOpen(
databaseFile,
determineOpenOptions(databaseFile));
}
/**
* Subclassing this function is intended to provide custom open behaviour on a per-file basis.
*/
protected @SQLiteOpenOptions int determineOpenOptions(File databaseFile) {
@SQLiteOpenOptions int flags = 0;
// Try to guess if we should be using write-ahead logging. If this heuristic fails
// developers are expected to subclass this provider and explicitly assert the connection.
File walFile = new File(databaseFile.getParent(), databaseFile.getName() + "-wal");
if (walFile.exists()) {
flags |= SQLiteDatabaseCompat.ENABLE_WRITE_AHEAD_LOGGING;
}
return flags;
}
/**
* Perform the open per the options provided in {@link #determineOpenOptions(File)}.
* Subclassing is supported however this typically indicates a missing feature of some kind
* in {@link SQLiteDatabaseCompat} that should be patched in Stetho itself.
*/
protected SQLiteDatabase performOpen(File databaseFile, @SQLiteOpenOptions int options) {
int flags = SQLiteDatabase.OPEN_READWRITE;
SQLiteDatabaseCompat compatInstance = SQLiteDatabaseCompat.getInstance();
flags |= compatInstance.provideOpenFlags(options);
SQLiteDatabase db = SQLiteDatabase.openDatabase(
databaseFile.getAbsolutePath(),
null /* cursorFactory */,
flags);
compatInstance.enableFeatures(options, db);
return db;
}
}