diff options
author | Fred Quintana <fredq@google.com> | 2009-05-15 15:10:40 -0700 |
---|---|---|
committer | Fred Quintana <fredq@google.com> | 2009-05-22 14:17:48 -0700 |
commit | 8943737692169f564cd34a9c8d471f3a5d438712 (patch) | |
tree | 7b017cbed472235c15d32e694b1fa18c5446c751 /core/java/android/content/ContentProviderNative.java | |
parent | fc5095f44ba46b57f4ef6179ee4d69ce3a7fe69a (diff) | |
download | frameworks_base-8943737692169f564cd34a9c8d471f3a5d438712.zip frameworks_base-8943737692169f564cd34a9c8d471f3a5d438712.tar.gz frameworks_base-8943737692169f564cd34a9c8d471f3a5d438712.tar.bz2 |
add ipc support to batching
Diffstat (limited to 'core/java/android/content/ContentProviderNative.java')
-rw-r--r-- | core/java/android/content/ContentProviderNative.java | 98 |
1 files changed, 53 insertions, 45 deletions
diff --git a/core/java/android/content/ContentProviderNative.java b/core/java/android/content/ContentProviderNative.java index ac67076..4747726 100644 --- a/core/java/android/content/ContentProviderNative.java +++ b/core/java/android/content/ContentProviderNative.java @@ -154,37 +154,36 @@ abstract public class ContentProviderNative extends Binder implements IContentPr return true; } - case BULK_INSERT_ENTITIES_TRANSACTION: + case INSERT_ENTITIES_TRANSACTION: { data.enforceInterface(IContentProvider.descriptor); Uri uri = Uri.CREATOR.createFromParcel(data); - String className = data.readString(); - Class entityClass = Class.forName(className); - int numEntities = data.readInt(); - Entity[] entities = new Entity[numEntities]; - for (int i = 0; i < numEntities; i++) { - entities[i] = (Entity) data.readParcelable(entityClass.getClassLoader()); - } - Uri[] uris = bulkInsertEntities(uri, entities); + Entity entity = (Entity) data.readParcelable(null); + Uri newUri = insertEntity(uri, entity); reply.writeNoException(); - reply.writeTypedArray(uris, 0); + Uri.writeToParcel(reply, newUri); return true; } - case BULK_UPDATE_ENTITIES_TRANSACTION: + case UPDATE_ENTITIES_TRANSACTION: { data.enforceInterface(IContentProvider.descriptor); Uri uri = Uri.CREATOR.createFromParcel(data); - String className = data.readString(); - Class entityClass = Class.forName(className); - int numEntities = data.readInt(); - Entity[] entities = new Entity[numEntities]; - for (int i = 0; i < numEntities; i++) { - entities[i] = (Entity) data.readParcelable(entityClass.getClassLoader()); - } - int[] counts = bulkUpdateEntities(uri, entities); + Entity entity = (Entity) data.readParcelable(null); + int count = updateEntity(uri, entity); + reply.writeNoException(); + reply.writeInt(count); + return true; + } + + case APPLY_BATCH_TRANSACTION: + { + data.enforceInterface(IContentProvider.descriptor); + final ContentProviderOperation[] operations = + data.createTypedArray(ContentProviderOperation.CREATOR); + final ContentProviderResult[] results = applyBatch(operations); reply.writeNoException(); - reply.writeIntArray(counts); + reply.writeTypedArray(results, 0); return true; } @@ -472,23 +471,18 @@ final class ContentProviderProxy implements IContentProvider return count; } - public Uri[] bulkInsertEntities(Uri uri, Entity[] entities) throws RemoteException { + public ContentProviderResult[] applyBatch(ContentProviderOperation[] operations) + throws RemoteException, OperationApplicationException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IContentProvider.descriptor); - uri.writeToParcel(data, 0); - data.writeString(entities[0].getClass().getName()); - data.writeInt(entities.length); - for (Entity entity : entities) { - data.writeParcelable(entity, 0); - } + data.writeTypedArray(operations, 0); + mRemote.transact(IContentProvider.APPLY_BATCH_TRANSACTION, data, reply, 0); - mRemote.transact(IContentProvider.BULK_INSERT_ENTITIES_TRANSACTION, data, reply, 0); - - DatabaseUtils.readExceptionFromParcel(reply); - Uri[] results = new Uri[entities.length]; - reply.readTypedArray(results, Uri.CREATOR); + DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(reply); + final ContentProviderResult[] results = + reply.createTypedArray(ContentProviderResult.CREATOR); data.recycle(); reply.recycle(); @@ -496,28 +490,42 @@ final class ContentProviderProxy implements IContentProvider return results; } - public int[] bulkUpdateEntities(Uri uri, Entity[] entities) throws RemoteException { + public Uri insertEntity(Uri uri, Entity entity) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); - data.writeInterfaceToken(IContentProvider.descriptor); - uri.writeToParcel(data, 0); - data.writeString(entities[0].getClass().getName()); - data.writeInt(entities.length); - for (Entity entity : entities) { + try { + data.writeInterfaceToken(IContentProvider.descriptor); + uri.writeToParcel(data, 0); data.writeParcelable(entity, 0); + + mRemote.transact(IContentProvider.INSERT_ENTITIES_TRANSACTION, data, reply, 0); + + DatabaseUtils.readExceptionFromParcel(reply); + return Uri.CREATOR.createFromParcel(reply); + } finally { + data.recycle(); + reply.recycle(); } + } - mRemote.transact(IContentProvider.BULK_UPDATE_ENTITIES_TRANSACTION, data, reply, 0); + public int updateEntity(Uri uri, Entity entity) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); - DatabaseUtils.readExceptionFromParcel(reply); - int[] results = new int[entities.length]; - reply.readIntArray(results); + try { + data.writeInterfaceToken(IContentProvider.descriptor); + uri.writeToParcel(data, 0); + data.writeParcelable(entity, 0); - data.recycle(); - reply.recycle(); + mRemote.transact(IContentProvider.UPDATE_ENTITIES_TRANSACTION, data, reply, 0); - return results; + DatabaseUtils.readExceptionFromParcel(reply); + return reply.readInt(); + } finally { + data.recycle(); + reply.recycle(); + } } public int delete(Uri url, String selection, String[] selectionArgs) |