On Fri, 2012-07-13 at 18:59 +0200, Ove Kåven wrote:
On 07/13/2012 02:00 PM, Patrick Ohly wrote:
> I changed the backend API in the 1.2.99.x releases, and it seems that
> this (or attempts to adapt the code) broke the backend. In a nutshell,
> KCalExtendedSource::insertItem() should return an InsertItemResult with
> ITEM_OKAY if it was asked to replace an item and did so. Currently it
> seems to return ITEM_MERGED.
>
> I've probably let down Ove here by not updating the backend code while I
> made the API change :-/

Nah, I was aware you didn't care much about that backend anymore.

I still care, but I can't test it myself and thus rely on your help.

I had 
noticed the change because it wouldn't compile anymore if I didn't 
change it, so I had updated it so that it returned ITEM_MERGED or 
ITEM_OKAY, depending on whether the incoming UID already existed in the 
database or not (i.e., which branch of that "if (oldUID.empty())" is taken).

That matches my theory. It should return ITEM_OKAY unless it does something special:

    /**
     * item added or updated as requested
     */
    ITEM_OKAY,

    /**
     * When a backend is asked to add an item and recognizes
     * that the item matches an already existing item, it may
     * replace that item instead of creating a duplicate. In this
     * case it must return ITEM_REPLACED and set the luid/revision
     * of that updated item.
     *
     * This can happen when such an item was added concurrently to
     * the running sync or, more likely, was reported as new by
     * the backend and the engine failed to find the match because
     * it doesn't know about some special semantic, like iCalendar
     * 2.0 UID).
     *
     * Note that depending on the age of the items, the older data
     * will replace the more recent one when always using item
     * replacement.
     */
    ITEM_REPLACED,

    /**
     * Same as ITEM_REPLACED, except that the backend did some
     * modifications to the data that was sent to it before
     * storing it, like merging it with the existing item. The
     * engine will treat the updated item as modified and send
     * back the update to the peer as soon as possible. In server
     * mode that will be in the same sync session, in a client in
     * the next session (client cannot send changes after having
     * received data from the server).
     */
    ITEM_MERGED,

    /**
     * As before, a match against an existing item was detected.
     * By returning this state and the luid of the matched item
     * (revision not needed) the engine is instructed to do the
     * necessary data comparison and merging itself. Useful when a
     * backend can't do the necessary merging itself.
     */
    ITEM_NEEDS_MERGE

I need to check why ITEM_MERGED doesn't work. Either way, avoiding it should solve the problem.


-- 
Best Regards, Patrick Ohly

The content of this message is my personal opinion only and although
I am an employee of Intel, the statements I make here in no way
represent Intel's position on the issue, nor am I authorized to speak
on behalf of Intel on this matter.