Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ package at.bitfire.ical4android
import android.content.ContentValues
import android.net.Uri
import android.provider.CalendarContract.Attendees
import at.bitfire.synctools.BatchOperation
import net.fortuna.ical4j.model.Parameter
import net.fortuna.ical4j.model.parameter.CuType
import net.fortuna.ical4j.model.parameter.Role
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import android.provider.CalendarContract.Events
import at.bitfire.ical4android.AndroidCalendar
import at.bitfire.ical4android.AndroidEvent
import at.bitfire.ical4android.AndroidEventFactory
import at.bitfire.ical4android.BatchOperation
import at.bitfire.ical4android.Event
import at.bitfire.synctools.BatchOperation
import java.util.UUID

class TestEvent: AndroidEvent {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
package at.bitfire.vcard4android.contactrow

import android.net.Uri
import at.bitfire.vcard4android.BatchOperation
import at.bitfire.synctools.BatchOperation
import at.bitfire.vcard4android.Contact
import org.junit.Assert.assertEquals
import org.junit.Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import android.provider.CalendarContract.ExtendedProperties
import android.provider.CalendarContract.Reminders
import android.util.Patterns
import androidx.annotation.CallSuper
import at.bitfire.ical4android.BatchOperation.CpoBuilder
import at.bitfire.ical4android.util.AndroidTimeUtils
import at.bitfire.ical4android.util.DateUtils
import at.bitfire.ical4android.util.MiscUtils.asSyncAdapter
Expand All @@ -34,6 +33,8 @@ import at.bitfire.ical4android.util.TimeApiExtensions.toLocalDate
import at.bitfire.ical4android.util.TimeApiExtensions.toLocalTime
import at.bitfire.ical4android.util.TimeApiExtensions.toRfc5545Duration
import at.bitfire.ical4android.util.TimeApiExtensions.toZonedDateTime
import at.bitfire.synctools.BatchOperation
import at.bitfire.synctools.BatchOperation.CpoBuilder
import at.bitfire.synctools.LocalStorageException
import net.fortuna.ical4j.model.Date
import net.fortuna.ical4j.model.DateList
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ package at.bitfire.ical4android
import android.content.ContentValues
import android.provider.CalendarContract
import android.provider.CalendarContract.Attendees
import at.bitfire.synctools.BatchOperation
import net.fortuna.ical4j.model.Parameter
import net.fortuna.ical4j.model.parameter.CuType
import net.fortuna.ical4j.model.parameter.Email
Expand Down
3 changes: 2 additions & 1 deletion lib/src/main/kotlin/at/bitfire/ical4android/DmfsTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ import android.content.ContentValues
import android.net.Uri
import android.os.RemoteException
import androidx.annotation.CallSuper
import at.bitfire.ical4android.BatchOperation.CpoBuilder
import at.bitfire.ical4android.util.AndroidTimeUtils
import at.bitfire.ical4android.util.DateUtils
import at.bitfire.ical4android.util.MiscUtils.toValues
import at.bitfire.synctools.BatchOperation
import at.bitfire.synctools.BatchOperation.CpoBuilder
import at.bitfire.synctools.LocalStorageException
import net.fortuna.ical4j.model.Date
import net.fortuna.ical4j.model.DateTime
Expand Down
2 changes: 2 additions & 0 deletions lib/src/main/kotlin/at/bitfire/ical4android/DmfsTaskList.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ import android.content.ContentUris
import android.content.ContentValues
import android.net.Uri
import androidx.annotation.CallSuper
import at.bitfire.ical4android.DmfsTaskList.Companion.find
import at.bitfire.ical4android.util.MiscUtils.asSyncAdapter
import at.bitfire.ical4android.util.MiscUtils.toValues
import at.bitfire.synctools.BatchOperation
import at.bitfire.synctools.LocalStorageException
import org.dmfs.tasks.contract.TaskContract
import org.dmfs.tasks.contract.TaskContract.Property.Relation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import android.net.Uri
import android.os.ParcelFileDescriptor
import android.util.Base64
import at.bitfire.ical4android.util.MiscUtils.toValues
import at.bitfire.synctools.BatchOperation
import at.techbee.jtx.JtxContract
import at.techbee.jtx.JtxContract.JtxICalObject.TZ_ALLDAY
import at.techbee.jtx.JtxContract.asSyncAdapter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package at.bitfire.ical4android
package at.bitfire.synctools

import android.content.ContentProviderClient
import android.content.ContentProviderOperation
Expand All @@ -14,7 +14,6 @@ import android.content.OperationApplicationException
import android.net.Uri
import android.os.RemoteException
import android.os.TransactionTooLargeException
import at.bitfire.synctools.LocalStorageException
import java.util.LinkedList
import java.util.logging.Level
import java.util.logging.Logger
Expand All @@ -26,9 +25,20 @@ class BatchOperation(

companion object {

/** Maximum number of operations per yield point in task providers that are based on SQLiteContentProvider. */
/**
* Maximum number of operations per yield point in task providers that are based on SQLiteContentProvider.
*/
const val TASKS_OPERATIONS_PER_YIELD_POINT = 499

/**
* Maximum number of operations per yield point in contacts provider.
*
* See https://android.googlesource.com/platform/packages/providers/ContactsProvider.git/+/refs/heads/android11-release/src/com/android/providers/contacts/AbstractContactsProvider.java#70
*
* Some operations may count more than one operation, so use a safe value of 450 instead of 500.
*/
const val CONTACTS_OPERATIONS_PER_YIELD_POINT = 450

}

private val logger = Logger.getLogger(javaClass.name)
Expand All @@ -44,6 +54,11 @@ class BatchOperation(
return this
}

fun enqueueAll(operations: Iterable<CpoBuilder>) {
for (operation in operations)
enqueue(operation)
}

/**
* Commits all operations from [queue] and then empties the queue.
*
Expand Down Expand Up @@ -107,6 +122,7 @@ class BatchOperation(

try {
val ops = toCPO(start, end)
logger.fine("Running ${ops.size} operations ($start .. ${end - 1})")
val partResults = providerClient.applyBatch(ops)

val n = end - start
Expand Down Expand Up @@ -149,8 +165,7 @@ class BatchOperation(
val originalIdx = backref.originalIndex
if (originalIdx < start) {
// back reference is outside of the current batch, get result from previous execution ...
val resultUri = results[originalIdx]?.uri
?: throw LocalStorageException("Referenced operation didn't produce a valid result")
val resultUri = results[originalIdx]?.uri ?: throw LocalStorageException("Referenced operation didn't produce a valid result")
val resultId = ContentUris.parseId(resultUri)
// ... and use result directly instead of using a back reference
cpoBuilder .removeValueBackReference(backrefKey)
Expand All @@ -160,7 +175,7 @@ class BatchOperation(
backref.setIndex(originalIdx - start)
}

// Set a possible yield point every MAX_OPERATIONS_PER_YIELD_POINT operations for SQLiteContentProvider
// Set a possible yield point every maxOperationsPerYieldPoint operations for SQLiteContentProvider
currentIdx += 1
if (maxOperationsPerYieldPoint != null && currentIdx.mod(maxOperationsPerYieldPoint) == 0)
cpoBuilder.withYieldAllowed()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import android.provider.ContactsContract
import android.provider.ContactsContract.RawContacts
import android.provider.ContactsContract.RawContacts.Data
import androidx.annotation.CallSuper
import at.bitfire.synctools.BatchOperation
import at.bitfire.synctools.LocalStorageException
import at.bitfire.vcard4android.contactrow.ContactProcessor
import at.bitfire.vcard4android.contactrow.PhotoBuilder
Expand Down Expand Up @@ -116,7 +117,7 @@ open class AndroidContact(

fun add(): Uri {
val provider = addressBook.provider!!
val batch = BatchOperation(provider)
val batch = BatchOperation(provider, BatchOperation.CONTACTS_OPERATIONS_PER_YIELD_POINT)

val builder = BatchOperation.CpoBuilder.newInsert(addressBook.syncAdapterURI(RawContacts.CONTENT_URI))
buildContact(builder, false)
Expand All @@ -140,7 +141,7 @@ open class AndroidContact(
setContact(data)

val provider = addressBook.provider!!
val batch = BatchOperation(provider)
val batch = BatchOperation(provider, BatchOperation.CONTACTS_OPERATIONS_PER_YIELD_POINT)
val uri = rawContactSyncURI()
val builder = BatchOperation.CpoBuilder.newUpdate(uri)
buildContact(builder, true)
Expand Down
Loading