Loading core/java/android/database/CursorWindow.java +18 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { public int mWindowPtr; private int mStartPos; private final String mName; private final CloseGuard mCloseGuard = CloseGuard.get(); Loading Loading @@ -85,6 +86,8 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { private static native boolean nativePutDouble(int windowPtr, double value, int row, int column); private static native boolean nativePutNull(int windowPtr, int row, int column); private static native String nativeGetName(int windowPtr); /** * Creates a new empty cursor window and gives it a name. * <p> Loading @@ -100,6 +103,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { */ public CursorWindow(String name, boolean localWindow) { mStartPos = 0; mName = name; mWindowPtr = nativeCreate(name, sCursorWindowSize, localWindow); if (mWindowPtr == 0) { throw new CursorWindowAllocationException("Cursor window allocation of " + Loading Loading @@ -130,6 +134,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { throw new CursorWindowAllocationException("Cursor window could not be " + "created from binder."); } mName = nativeGetName(mWindowPtr); mCloseGuard.open("close"); } Loading @@ -156,6 +161,14 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { } } /** * Gets the name of this cursor window. * @hide */ public String getName() { return mName; } /** * Closes the cursor window and frees its underlying resources when all other * remaining references have been released. Loading Loading @@ -778,4 +791,9 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { String s = (buff.length() > 980) ? buff.substring(0, 980) : buff.toString(); return "# Open Cursors=" + total + s; } @Override public String toString() { return getName() + " {" + Integer.toHexString(mWindowPtr) + "}"; } } core/java/android/database/sqlite/SQLiteDatabase.java +0 −28 Original line number Diff line number Diff line Loading @@ -306,10 +306,6 @@ public class SQLiteDatabase extends SQLiteClosable { /** Used to find out where this object was created in case it never got closed. */ private final Throwable mStackTrace; // System property that enables logging of slow queries. Specify the threshold in ms. private static final String LOG_SLOW_QUERIES_PROPERTY = "db.log.slow_query_threshold"; private final int mSlowQueryThreshold; /** stores the list of statement ids that need to be finalized by sqlite */ private final ArrayList<Integer> mClosedStatementIds = new ArrayList<Integer>(); Loading Loading @@ -1559,11 +1555,6 @@ public class SQLiteDatabase extends SQLiteClosable { String editTable) { verifyDbIsOpen(); BlockGuard.getThreadPolicy().onReadFromDisk(); long timeStart = 0; if (false || mSlowQueryThreshold != -1) { timeStart = System.currentTimeMillis(); } SQLiteDatabase db = getDbConnection(sql); SQLiteCursorDriver driver = new SQLiteDirectCursorDriver(db, sql, editTable); Loading @@ -1574,24 +1565,6 @@ public class SQLiteDatabase extends SQLiteClosable { cursorFactory != null ? cursorFactory : mFactory, selectionArgs); } finally { if (false || mSlowQueryThreshold != -1) { // Force query execution int count = -1; if (cursor != null) { count = cursor.getCount(); } long duration = System.currentTimeMillis() - timeStart; if (false || duration >= mSlowQueryThreshold) { Log.v(SQLiteCursor.TAG, "query (" + duration + " ms): " + driver.toString() + ", args are " + (selectionArgs != null ? TextUtils.join(",", selectionArgs) : "<null>") + ", count is " + count); } } releaseDbConnection(db); } return cursor; Loading Loading @@ -1967,7 +1940,6 @@ public class SQLiteDatabase extends SQLiteClosable { setMaxSqlCacheSize(DEFAULT_SQL_CACHE_SIZE); mFlags = flags; mPath = path; mSlowQueryThreshold = SystemProperties.getInt(LOG_SLOW_QUERIES_PROPERTY, -1); mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace(); mFactory = factory; mPrograms = new WeakHashMap<SQLiteClosable,Object>(); Loading core/java/android/database/sqlite/SQLiteDebug.java +24 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package android.database.sqlite; import java.util.ArrayList; import android.os.Build; import android.os.SystemProperties; import android.util.Log; /** Loading Loading @@ -64,6 +66,28 @@ public final class SQLiteDebug { public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE = Log.isLoggable("SQLiteLockStackTrace", Log.VERBOSE); /** * True to enable database performance testing instrumentation. * @hide */ public static final boolean DEBUG_LOG_SLOW_QUERIES = Build.IS_DEBUGGABLE; /** * Determines whether a query should be logged. * * Reads the "db.log.slow_query_threshold" system property, which can be changed * by the user at any time. If the value is zero, then all queries will * be considered slow. If the value does not exist, then no queries will * be considered slow. * * This value can be changed dynamically while the system is running. * @hide */ public static final boolean shouldLogSlowQuery(long elapsedTimeMillis) { int slowQueryMillis = SystemProperties.getInt("db.log.slow_query_threshold", -1); return slowQueryMillis >= 0 && elapsedTimeMillis > slowQueryMillis; } /** * Contains statistics about the active pagers in the current process. * Loading core/java/android/database/sqlite/SQLiteQuery.java +19 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.database.sqlite; import android.database.CursorWindow; import android.os.SystemClock; import android.text.TextUtils; import android.util.Log; /** Loading @@ -32,6 +33,7 @@ public class SQLiteQuery extends SQLiteProgram { private static native int nativeFillWindow(int databasePtr, int statementPtr, int windowPtr, int startPos, int offsetParam); private static native int nativeColumnCount(int statementPtr); private static native String nativeColumnName(int statementPtr, int columnIndex); Loading Loading @@ -80,8 +82,24 @@ public class SQLiteQuery extends SQLiteProgram { acquireReference(); try { window.acquireReference(); int startPos = window.getStartPosition(); int numRows = nativeFillWindow(nHandle, nStatement, window.mWindowPtr, window.getStartPosition(), mOffsetIndex); startPos, mOffsetIndex); if (SQLiteDebug.DEBUG_LOG_SLOW_QUERIES) { long elapsed = SystemClock.uptimeMillis() - timeStart; if (SQLiteDebug.shouldLogSlowQuery(elapsed)) { Log.d(TAG, "fillWindow took " + elapsed + " ms: window=\"" + window + "\", startPos=" + startPos + ", offset=" + mOffsetIndex + ", filledRows=" + window.getNumRows() + ", countedRows=" + numRows + ", query=\"" + mSql + "\"" + ", args=[" + (mBindArgs != null ? TextUtils.join(", ", mBindArgs.values()) : "") + "]"); } } mDatabase.logTimeStat(mSql, timeStart); return numRows; } catch (IllegalStateException e){ Loading core/java/android/os/Build.java +7 −0 Original line number Diff line number Diff line Loading @@ -325,6 +325,13 @@ public class Build { public static final String USER = getString("ro.build.user"); public static final String HOST = getString("ro.build.host"); /** * Returns true if we are running a debug build such as "user-debug" or "eng". * @hide */ public static final boolean IS_DEBUGGABLE = SystemProperties.getInt("ro.debuggable", 0) == 1; /** * Returns the version string for the radio firmware. May return * null (if, for instance, the radio is not currently on). Loading Loading
core/java/android/database/CursorWindow.java +18 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { public int mWindowPtr; private int mStartPos; private final String mName; private final CloseGuard mCloseGuard = CloseGuard.get(); Loading Loading @@ -85,6 +86,8 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { private static native boolean nativePutDouble(int windowPtr, double value, int row, int column); private static native boolean nativePutNull(int windowPtr, int row, int column); private static native String nativeGetName(int windowPtr); /** * Creates a new empty cursor window and gives it a name. * <p> Loading @@ -100,6 +103,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { */ public CursorWindow(String name, boolean localWindow) { mStartPos = 0; mName = name; mWindowPtr = nativeCreate(name, sCursorWindowSize, localWindow); if (mWindowPtr == 0) { throw new CursorWindowAllocationException("Cursor window allocation of " + Loading Loading @@ -130,6 +134,7 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { throw new CursorWindowAllocationException("Cursor window could not be " + "created from binder."); } mName = nativeGetName(mWindowPtr); mCloseGuard.open("close"); } Loading @@ -156,6 +161,14 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { } } /** * Gets the name of this cursor window. * @hide */ public String getName() { return mName; } /** * Closes the cursor window and frees its underlying resources when all other * remaining references have been released. Loading Loading @@ -778,4 +791,9 @@ public class CursorWindow extends SQLiteClosable implements Parcelable { String s = (buff.length() > 980) ? buff.substring(0, 980) : buff.toString(); return "# Open Cursors=" + total + s; } @Override public String toString() { return getName() + " {" + Integer.toHexString(mWindowPtr) + "}"; } }
core/java/android/database/sqlite/SQLiteDatabase.java +0 −28 Original line number Diff line number Diff line Loading @@ -306,10 +306,6 @@ public class SQLiteDatabase extends SQLiteClosable { /** Used to find out where this object was created in case it never got closed. */ private final Throwable mStackTrace; // System property that enables logging of slow queries. Specify the threshold in ms. private static final String LOG_SLOW_QUERIES_PROPERTY = "db.log.slow_query_threshold"; private final int mSlowQueryThreshold; /** stores the list of statement ids that need to be finalized by sqlite */ private final ArrayList<Integer> mClosedStatementIds = new ArrayList<Integer>(); Loading Loading @@ -1559,11 +1555,6 @@ public class SQLiteDatabase extends SQLiteClosable { String editTable) { verifyDbIsOpen(); BlockGuard.getThreadPolicy().onReadFromDisk(); long timeStart = 0; if (false || mSlowQueryThreshold != -1) { timeStart = System.currentTimeMillis(); } SQLiteDatabase db = getDbConnection(sql); SQLiteCursorDriver driver = new SQLiteDirectCursorDriver(db, sql, editTable); Loading @@ -1574,24 +1565,6 @@ public class SQLiteDatabase extends SQLiteClosable { cursorFactory != null ? cursorFactory : mFactory, selectionArgs); } finally { if (false || mSlowQueryThreshold != -1) { // Force query execution int count = -1; if (cursor != null) { count = cursor.getCount(); } long duration = System.currentTimeMillis() - timeStart; if (false || duration >= mSlowQueryThreshold) { Log.v(SQLiteCursor.TAG, "query (" + duration + " ms): " + driver.toString() + ", args are " + (selectionArgs != null ? TextUtils.join(",", selectionArgs) : "<null>") + ", count is " + count); } } releaseDbConnection(db); } return cursor; Loading Loading @@ -1967,7 +1940,6 @@ public class SQLiteDatabase extends SQLiteClosable { setMaxSqlCacheSize(DEFAULT_SQL_CACHE_SIZE); mFlags = flags; mPath = path; mSlowQueryThreshold = SystemProperties.getInt(LOG_SLOW_QUERIES_PROPERTY, -1); mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace(); mFactory = factory; mPrograms = new WeakHashMap<SQLiteClosable,Object>(); Loading
core/java/android/database/sqlite/SQLiteDebug.java +24 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,8 @@ package android.database.sqlite; import java.util.ArrayList; import android.os.Build; import android.os.SystemProperties; import android.util.Log; /** Loading Loading @@ -64,6 +66,28 @@ public final class SQLiteDebug { public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE = Log.isLoggable("SQLiteLockStackTrace", Log.VERBOSE); /** * True to enable database performance testing instrumentation. * @hide */ public static final boolean DEBUG_LOG_SLOW_QUERIES = Build.IS_DEBUGGABLE; /** * Determines whether a query should be logged. * * Reads the "db.log.slow_query_threshold" system property, which can be changed * by the user at any time. If the value is zero, then all queries will * be considered slow. If the value does not exist, then no queries will * be considered slow. * * This value can be changed dynamically while the system is running. * @hide */ public static final boolean shouldLogSlowQuery(long elapsedTimeMillis) { int slowQueryMillis = SystemProperties.getInt("db.log.slow_query_threshold", -1); return slowQueryMillis >= 0 && elapsedTimeMillis > slowQueryMillis; } /** * Contains statistics about the active pagers in the current process. * Loading
core/java/android/database/sqlite/SQLiteQuery.java +19 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.database.sqlite; import android.database.CursorWindow; import android.os.SystemClock; import android.text.TextUtils; import android.util.Log; /** Loading @@ -32,6 +33,7 @@ public class SQLiteQuery extends SQLiteProgram { private static native int nativeFillWindow(int databasePtr, int statementPtr, int windowPtr, int startPos, int offsetParam); private static native int nativeColumnCount(int statementPtr); private static native String nativeColumnName(int statementPtr, int columnIndex); Loading Loading @@ -80,8 +82,24 @@ public class SQLiteQuery extends SQLiteProgram { acquireReference(); try { window.acquireReference(); int startPos = window.getStartPosition(); int numRows = nativeFillWindow(nHandle, nStatement, window.mWindowPtr, window.getStartPosition(), mOffsetIndex); startPos, mOffsetIndex); if (SQLiteDebug.DEBUG_LOG_SLOW_QUERIES) { long elapsed = SystemClock.uptimeMillis() - timeStart; if (SQLiteDebug.shouldLogSlowQuery(elapsed)) { Log.d(TAG, "fillWindow took " + elapsed + " ms: window=\"" + window + "\", startPos=" + startPos + ", offset=" + mOffsetIndex + ", filledRows=" + window.getNumRows() + ", countedRows=" + numRows + ", query=\"" + mSql + "\"" + ", args=[" + (mBindArgs != null ? TextUtils.join(", ", mBindArgs.values()) : "") + "]"); } } mDatabase.logTimeStat(mSql, timeStart); return numRows; } catch (IllegalStateException e){ Loading
core/java/android/os/Build.java +7 −0 Original line number Diff line number Diff line Loading @@ -325,6 +325,13 @@ public class Build { public static final String USER = getString("ro.build.user"); public static final String HOST = getString("ro.build.host"); /** * Returns true if we are running a debug build such as "user-debug" or "eng". * @hide */ public static final boolean IS_DEBUGGABLE = SystemProperties.getInt("ro.debuggable", 0) == 1; /** * Returns the version string for the radio firmware. May return * null (if, for instance, the radio is not currently on). Loading