Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c4516a7b authored by Fred Quintana's avatar Fred Quintana
Browse files

add a transaction monitor

parent b80f6983
Loading
Loading
Loading
Loading
+128 −0
Original line number Diff line number Diff line
@@ -47876,6 +47876,19 @@
 visibility="public"
>
</method>
<method name="beginTransactionWithListener"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="transactionListener" type="android.database.sqlite.SQLiteTransactionListener">
</parameter>
</method>
<method name="close"
 return="void"
 abstract="false"
@@ -49507,6 +49520,47 @@
>
</method>
</class>
<interface name="SQLiteTransactionListener"
 abstract="true"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<method name="onBegin"
 return="void"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="onCommit"
 return="void"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="onRollback"
 return="void"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
</interface>
</package>
<package name="android.gesture"
>
@@ -115090,6 +115144,46 @@
<exception name="RemoteException" type="android.os.RemoteException">
</exception>
</method>
<method name="getWithUri"
 return="android.util.Pair&lt;android.net.Uri, byte[]&gt;"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="provider" type="android.content.ContentProviderClient">
</parameter>
<parameter name="uri" type="android.net.Uri">
</parameter>
<parameter name="account" type="android.accounts.Account">
</parameter>
<exception name="RemoteException" type="android.os.RemoteException">
</exception>
</method>
<method name="insert"
 return="android.net.Uri"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="provider" type="android.content.ContentProviderClient">
</parameter>
<parameter name="uri" type="android.net.Uri">
</parameter>
<parameter name="account" type="android.accounts.Account">
</parameter>
<parameter name="data" type="byte[]">
</parameter>
<exception name="RemoteException" type="android.os.RemoteException">
</exception>
</method>
<method name="newSetOperation"
 return="android.content.ContentProviderOperation"
 abstract="false"
@@ -115107,6 +115201,21 @@
<parameter name="data" type="byte[]">
</parameter>
</method>
<method name="newUpdateOperation"
 return="android.content.ContentProviderOperation"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="uri" type="android.net.Uri">
</parameter>
<parameter name="data" type="byte[]">
</parameter>
</method>
<method name="set"
 return="void"
 abstract="false"
@@ -115128,6 +115237,25 @@
<exception name="RemoteException" type="android.os.RemoteException">
</exception>
</method>
<method name="update"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="provider" type="android.content.ContentProviderClient">
</parameter>
<parameter name="uri" type="android.net.Uri">
</parameter>
<parameter name="data" type="byte[]">
</parameter>
<exception name="RemoteException" type="android.os.RemoteException">
</exception>
</method>
</class>
<class name="UserDictionary"
 extends="java.lang.Object"
+58 −1
Original line number Diff line number Diff line
@@ -175,6 +175,11 @@ public class SQLiteDatabase extends SQLiteClosable {
     */
    private boolean mTransactionIsSuccessful;

    /**
     * Valid during the life of a transaction.
     */
    private SQLiteTransactionListener mTransactionListener;

    /** Synchronize on this when accessing the database */
    private final ReentrantLock mLock = new ReentrantLock(true);

@@ -394,6 +399,31 @@ public class SQLiteDatabase extends SQLiteClosable {
     * </pre>
     */
    public void beginTransaction() {
        beginTransactionWithListener(null /* transactionStatusCallback */);
    }

    /**
     * Begins a transaction. Transactions can be nested. When the outer transaction is ended all of
     * the work done in that transaction and all of the nested transactions will be committed or
     * rolled back. The changes will be rolled back if any transaction is ended without being
     * marked as clean (by calling setTransactionSuccessful). Otherwise they will be committed.
     *
     * <p>Here is the standard idiom for transactions:
     *
     * <pre>
     *   db.beginTransactionWithListener(listener);
     *   try {
     *     ...
     *     db.setTransactionSuccessful();
     *   } finally {
     *     db.endTransaction();
     *   }
     * </pre>
     * @param transactionListener listener that should be notified when the transaction begins,
     * commits, or is rolled back, either explicitly or by a call to
     * {@link #yieldIfContendedSafely}.
     */
    public void beginTransactionWithListener(SQLiteTransactionListener transactionListener) {
        lockForced();
        boolean ok = false;
        try {
@@ -413,8 +443,17 @@ public class SQLiteDatabase extends SQLiteClosable {
            // This thread didn't already have the lock, so begin a database
            // transaction now.
            execSQL("BEGIN EXCLUSIVE;");
            mTransactionListener = transactionListener;
            mTransactionIsSuccessful = true;
            mInnerTransactionIsSuccessful = false;
            if (transactionListener != null) {
                try {
                    transactionListener.onBegin();
                } catch (RuntimeException e) {
                    execSQL("ROLLBACK;");
                    throw e;
                }
            }
            ok = true;
        } finally {
            if (!ok) {
@@ -442,11 +481,27 @@ public class SQLiteDatabase extends SQLiteClosable {
            if (mLock.getHoldCount() != 1) {
                return;
            }
            RuntimeException savedException = null;
            if (mTransactionListener != null) {
                try {
                    if (mTransactionIsSuccessful) {
                        mTransactionListener.onCommit();
                    } else {
                        mTransactionListener.onRollback();
                    }
                } catch (RuntimeException e) {
                    savedException = e;
                    mTransactionIsSuccessful = false;
                }
            }
            if (mTransactionIsSuccessful) {
                execSQL("COMMIT;");
            } else {
                try {
                    execSQL("ROLLBACK;");
                    if (savedException != null) {
                        throw savedException;
                    }
                } catch (SQLException e) {
                    if (Config.LOGD) {
                        Log.d(TAG, "exception during rollback, maybe the DB previously "
@@ -455,6 +510,7 @@ public class SQLiteDatabase extends SQLiteClosable {
                }
            }
        } finally {
            mTransactionListener = null;
            unlockForced();
            if (Config.LOGV) {
                Log.v(TAG, "unlocked " + Thread.currentThread()
@@ -561,6 +617,7 @@ public class SQLiteDatabase extends SQLiteClosable {
            return false;
        }
        setTransactionSuccessful();
        SQLiteTransactionListener transactionListener = mTransactionListener;
        endTransaction();
        if (checkFullyYielded) {
            if (this.isDbLockedByCurrentThread()) {
@@ -586,7 +643,7 @@ public class SQLiteDatabase extends SQLiteClosable {
                }
            }
        }
        beginTransaction();
        beginTransactionWithListener(transactionListener);
        return true;
    }

+9 −4
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package android.database.sqlite;

import android.util.Config;
import android.util.Log;

/**
 * Provides debugging info about all SQLite databases running in the current process.
@@ -27,23 +28,27 @@ public final class SQLiteDebug {
    /**
     * Controls the printing of SQL statements as they are executed.
     */
    public static final boolean DEBUG_SQL_STATEMENTS = Config.LOGV;
    public static final boolean DEBUG_SQL_STATEMENTS =
            Log.isLoggable("SQLiteStatements", Log.VERBOSE);

    /**
     * Controls the stack trace reporting of active cursors being
     * finalized.
     */
    public static final boolean DEBUG_ACTIVE_CURSOR_FINALIZATION = Config.LOGV;
    public static final boolean DEBUG_ACTIVE_CURSOR_FINALIZATION =
            Log.isLoggable("SQLiteCursorClosing", Log.VERBOSE);

    /**
     * Controls the tracking of time spent holding the database lock. 
     */
    public static final boolean DEBUG_LOCK_TIME_TRACKING = false;
    public static final boolean DEBUG_LOCK_TIME_TRACKING =
            Log.isLoggable("SQLiteLockTime", Log.VERBOSE);

    /**
     * Controls the printing of stack traces when tracking the time spent holding the database lock. 
     */
    public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE = false;
    public static final boolean DEBUG_LOCK_TIME_TRACKING_STACK_TRACE =
            Log.isLoggable("SQLiteLockStackTrace", Log.VERBOSE);

    /**
     * Contains statistics about the active pagers in the current process.
+21 −0
Original line number Diff line number Diff line
package android.database.sqlite;

/**
 * A listener for transaction events.
 */
public interface SQLiteTransactionListener {
    /**
     * Called immediately after the transaction begins.
     */
    void onBegin();

    /**
     * Called immediately before commiting the transaction.
     */
    void onCommit();

    /**
     * Called if the transaction is about to be rolled back.
     */
    void onRollback();
}
+9 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Pair;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
@@ -71,6 +72,14 @@ public final class ContactsContract {
            return SyncStateContract.Helpers.get(provider, CONTENT_URI, account);
        }

        /**
         * @see android.provider.SyncStateContract.Helpers#get
         */
        public static Pair<Uri, byte[]> getWithUri(ContentProviderClient provider, Account account)
                throws RemoteException {
            return SyncStateContract.Helpers.getWithUri(provider, CONTENT_URI, account);
        }

        /**
         * @see android.provider.SyncStateContract.Helpers#set
         */
Loading