Hi Frank,
thanks for your response.
Regarding your first answer:
Even if I set the default type of the batch feed to "insert" and
assign each entry to operation type "update", the <batch:operation/>
elements are missing. I this still correct?!?
Regarding the second post...
This is the code that creates the batch entries:
List<ContactEntry> entriesToUpdate = new List<ContactEntry>
();
// update each resulting entry
for (int i = 0; i < createdEntries.Count; i++)
{
if (createdEntries[i].BatchData.Status.Code == 201) //
created
{
createdEntries[i].Title.Text += "updated";
createdEntries[i].BatchData = new
GDataBatchEntryData("update" + i.ToString(),
GDataBatchOperationType.update);
entriesToUpdate.Add((ContactEntry)createdEntries
[i]);
}
}
And this is the code (in another function) which creates the batch
feed request using the entries created above (variable
"contactEntries"):
// create contacts URI:
if (bShared)
uriString = "http://www.google.com/m8/feeds/contacts/"
+ userMail.Host + "/full";
else
uriString = "http://www.google.com/m8/feeds/contacts/"
+ userMail.Address + "/full";
Uri feedUri = new Uri(uriString);
ContactsQuery query = new ContactsQuery();
query.Uri = feedUri;
ContactsFeed contactsFeed = contactsService.Query(query);
AtomEntryCollection returnedEntries = new
AtomEntryCollection(contactsFeed);
if (contactsFeed.Batch != null)
{
int i = 0;
while (i < contactEntries.Count)
{
//Login(userMail.Address, password);
ContactsFeed batchFeed = new ContactsFeed
(contactsFeed.Batch, contactsService);
batchFeed.BatchData = new GDataBatchFeedData();
batchFeed.BatchData.Type = batchOperationType;
int j = 0;
while ( (j < limitEntriesBatchOperation) && (i <
contactEntries.Count) )
{
ContactEntry ce = contactEntries[i];
if (ce.BatchData == null)
{
if (batchOperationType ==
GDataBatchOperationType.delete)
{
ContactEntry ceNew = new ContactEntry
();
ceNew.Id = new AtomId
(ce.Id.AbsoluteUri);
ceNew.EditUri = ce.EditUri;
ceNew.BatchData = new
GDataBatchEntryData(i.ToString(), GDataBatchOperationType.delete);
ce = ceNew;
}
else
{
ce.BatchData = new GDataBatchEntryData
(i.ToString(), batchOperationType);
}
}
batchFeed.Entries.Add(ce);
//if ( (ce.Id != null) && (ce.Id.Uri != null)
&& (ce.BatchData == null) )
// //ce.BatchData = new GDataBatchEntryData
(ce.Id.Uri.Content, batchOperationType);
// //ce.BatchData = new GDataBatchEntryData
(i.ToString(), batchOperationType);
i++;
j++;
}
bool bSuccess = false;
int nTries = 0;
while ((!bSuccess) && (nTries < 10))
{
try
{
AtomFeed resultFeed = contactsService.Batch
(batchFeed, new Uri(contactsFeed.Batch));
bSuccess = true;
foreach (AtomEntry entry in
resultFeed.Entries)
{
returnedEntries.Add(entry);
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine
(ex.Message);
nTries++;
System.Threading.Thread.Sleep(2000);
}
}
}
}
Just a side note:
For the delete operation I had to create new entries with only Id,
EditUri and BatchData properties set. Otherwise it did not work for
me.
With this code I get the batch update request that I sent in my first
post...
Is something wrong with the code?
Regards
Matthias
On 27 Jan., 15:46, Frank Mantek <[email protected]> wrote:
> Ok, a correction on my side. I misread your original post. The server
> is complaining about a missing "entry id", not a missing batch id.
>
> Now, while that message could be clearer, it pinpointed the problem.
> In the update feed you are sending, the entries you are updating are
> contained inside a <source> tag?
>
> Why is that? How did you create that update feed?
>
> Regards
>
> Frank Mantek
> Google
>
> On Jan 27, 1:43 pm, Frank Mantek <[email protected]> wrote:
>
>
>
> > regarding the different operations..
>
> > from the spec:
>
> > An operations feed contains a list of entries to insert, update,
> > delete, or query. Each operation is defined by a <batch:operation
> > type="insert|update|delete|query"/> element.
>
> > This element may be a direct child of a <feed> element, a direct child
> > of any of the entries in the feed, or both. When included in an entry,
> > it specifies the operation to execute for that specific entry. When
> > included in the feed, this element specifies the default operation to
> > execute on any entries that do not have a <batch:operation/> element.
>
> > So that the update feed contains a batch:operation only on the feed
> > level is quiet alright.
>
> > For the operation id:
>
> > GData entry results are not necessarily returned in the same order as
> > the request. You can track an operation through its lifetime using an
> > identifier.
>
> > For update, delete, and query operations, you can use the id of the
> > entry itself to track the operation.
>
> > For insert operations, since no ID yet exists, you can pass in an
> > operation identifier. This identifier can be used to link the result
> > entries to the request entries. The operation identifier is passed in
> > the <batch:id> element.
>
> > So, to me it looks like that update feed is just fine on the wire. Why
> > your insert feed has the operation several times (on the feed and
> > entry level) i don't know, if you specify this explictly, the client
> > lib will not try to be smart and "fold" that together...
>
> > So, in principle, just by looking at what you deemed suspicious, this
> > looks fine.
>
> > Someone from the contacts support team needs to look at this. This
> > looks like a server side problem, the contacts server should not
> > require a batch id for updates (or, we need to fix the documenation).
> > Beside that, if your code actually sets the BatchData.Id element (and
> > it is probably doing this for inserts somewhere else), the .NET client
> > should send the id. I am looking at the batch unitiest in gbase.cs in
> > the unittest directory, and that one is setting the ID explictly for
> > everything (the .net lib is not magically creating ids).
>
> > Frank Mantek
> > Google
> > On Jan 27, 2009, at 12:50 PM, Matthias wrote:
>
> > > Hi,
>
> > > I am actually working on a C# application for managing shared contacts
> > > using the .NET Client Library.
> > > This application shall use batch feeds.
> > > The batch feed works fine for inserting and also deleting contacts.
> > > However I have a problem with updating contact entries. When I try to
> > > update a couple of entries, I get back a collection with only one
> > > entry, which has a batch data status code 400 and an error message
> > > "Missing entry Id".
>
> > > I debugged the problem down to the source code of the client library
> > > and checked the raw requests that are sent. These requests seemt to
> > > look quite different for inserts and updates, so I am wondering if I
> > > found a bug in the library. Could anyone please give a comment, so
> > > that I can raise an issue if necessary? Thanks!
>
> > > Here is the batch request for inserting 3 contact entries (which works
> > > fine):
>
> > > <?xml version="1.0" encoding="utf-8"?>
> > > <feed xmlns="http://www.w3.org/2005/Atom" xmlns:batch="http://
> > > schemas.google.com/gdata/batch" xmlns:gd="http://schemas.google.com/g/
> > > 2005">
> > > <batch:operation type="insert" />
> > > <entry>
> > > <gd:email address="[email protected]" primary="true" rel="http://
> > > schemas.google.com/g/2005#work" />
> > > <batch:id>insert0</batch:id>
> > > <batch:operation type="insert" />
> > > <title type="text">Test User 0</title>
> > > <category term="http://schemas.google.com/contact/2008#contact"
> > > scheme="http://schemas.google.com/g/2005#kind" />
> > > </entry>
> > > <entry>
> > > <gd:email address="[email protected]" primary="true" rel="http://
> > > schemas.google.com/g/2005#work" />
> > > <batch:id>insert1</batch:id>
> > > <batch:operation type="insert" />
> > > <title type="text">Test User 1</title>
> > > <category term="http://schemas.google.com/contact/2008#contact"
> > > scheme="http://schemas.google.com/g/2005#kind" />
> > > </entry>
> > > <entry>
> > > <gd:email address="[email protected]" primary="true" rel="http://
> > > schemas.google.com/g/2005#work" />
> > > <batch:id>insert2</batch:id>
> > > <batch:operation type="insert" />
> > > <title type="text">Test User 2</title>
> > > <category term="http://schemas.google.com/contact/2008#contact"
> > > scheme="http://schemas.google.com/g/2005#kind" />
> > > </entry>
> > > </feed>
>
> > > And here is the batch feed for updating the newly created contact
> > > entries (which fails):
> > > <?xml version="1.0" encoding="utf-8"?>
> > > <feed xmlns="http://www.w3.org/2005/Atom" xmlns:batch="http://
> > > schemas.google.com/gdata/batch" xmlns:gd="http://schemas.google.com/g/
> > > 2005">
> > > <batch:operation type="update" />
> > > <entry>
> > > <gd:email address="[email protected]" primary="true" rel="http://
> > > schemas.google.com/g/2005#work" />
> > > <title type="text">Test User 0updated</title>
> > > <link href="http://www.google.com/m8/feeds/photos/media/induit.de/
> > > 6438a1ca8a831b6d/1B2M2Y8AsgTpgAmY7PhCfg" rel="http://
> > > schemas.google.com/contacts/2008/rel#edit-photo" type="image/*" />
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/full/
> > > 6438a1ca8a831b6d" rel="self" type="application/atom+xml" />
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/full/
> > > 6438a1ca8a831b6d/1233055640422000" rel="edit" type="application/atom
> > > +xml" />
> > > <category term="http://schemas.google.com/contact/2008#contact"
> > > scheme="http://schemas.google.com/g/2005#kind" />
> > > <content type="text" />
> > > <source>
> > > <id>http://www.google.com/m8/feeds/contacts/induit.de/full</id>
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/
> > > full" rel="http://schemas.google.com/g/2005#feed" type="application/
> > > atom+xml" />
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/
> > > full" rel="http://schemas.google.com/g/2005#post" type="application/
> > > atom+xml" />
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/
> > > full/batch" rel="http://schemas.google.com/g/2005#batch"
> > > type="application/atom+xml" />
> > > <title type="text">Batch Feed</title>
> > > <updated>2009-01-27T12:27:20+01:00</updated>
> > > </source>
> > > <updated>2009-01-27T12:27:20+01:00</updated>
> > > </entry>
> > > <entry>
> > > <gd:email address="[email protected]" primary="true" rel="http://
> > > schemas.google.com/g/2005#work" />
> > > <title type="text">Test User 1updated</title>
> > > <link href="http://www.google.com/m8/feeds/photos/media/induit.de/
> > > 565ab6a28f1faf82/1B2M2Y8AsgTpgAmY7PhCfg" rel="http://
> > > schemas.google.com/contacts/2008/rel#edit-photo" type="image/*" />
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/full/
> > > 565ab6a28f1faf82" rel="self" type="application/atom+xml" />
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/full/
> > > 565ab6a28f1faf82/1233055640533000" rel="edit" type="application/atom
> > > +xml" />
> > > <category term="http://schemas.google.com/contact/2008#contact"
> > > scheme="http://schemas.google.com/g/2005#kind" />
> > > <content type="text" />
> > > <source>
> > > <id>http://www.google.com/m8/feeds/contacts/induit.de/full</id>
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/
> > > full" rel="http://schemas.google.com/g/2005#feed" type="application/
> > > atom+xml" />
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/
> > > full" rel="http://schemas.google.com/g/2005#post" type="application/
> > > atom+xml" />
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/
> > > full/batch" rel="http://schemas.google.com/g/2005#batch"
> > > type="application/atom+xml" />
> > > <title type="text">Batch Feed</title>
> > > <updated>2009-01-27T12:27:20+01:00</updated>
> > > </source>
> > > <updated>2009-01-27T12:27:20+01:00</updated>
> > > </entry>
> > > <entry>
> > > <gd:email address="[email protected]" primary="true" rel="http://
> > > schemas.google.com/g/2005#work" />
> > > <title type="text">Test User 2updated</title>
> > > <link href="http://www.google.com/m8/feeds/photos/media/induit.de/
> > > 52cba980a0d385b/1B2M2Y8AsgTpgAmY7PhCfg" rel="http://
> > > schemas.google.com/
> > > contacts/2008/rel#edit-photo" type="image/*" />
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/full/
> > > 52cba980a0d385b" rel="self" type="application/atom+xml" />
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/full/
> > > 52cba980a0d385b/1233055640674000" rel="edit" type="application/atom
> > > +xml" />
> > > <category term="http://schemas.google.com/contact/2008#contact"
> > > scheme="http://schemas.google.com/g/2005#kind" />
> > > <content type="text" />
> > > <source>
> > > <id>http://www.google.com/m8/feeds/contacts/induit.de/full</id>
> > > <link href="http://www.google.com/m8/feeds/contacts/induit.de/
> > > full"
>
> ...
>
> Erfahren Sie mehr »- Zitierten Text ausblenden -
>
> - Zitierten Text anzeigen -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Google Contacts API" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/google-contacts-api?hl=en
-~----------~----~----~----~------~----~------~--~---