OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package datastore | 5 package datastore |
6 | 6 |
7 import ( | 7 import ( |
8 "bytes" | 8 "bytes" |
9 "errors" | 9 "errors" |
10 "fmt" | 10 "fmt" |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 val = blobstore.Key(s) | 285 val = blobstore.Key(s) |
286 default: | 286 default: |
287 err = fmt.Errorf("read: unknown type! %v", typb) | 287 err = fmt.Errorf("read: unknown type! %v", typb) |
288 } | 288 } |
289 if err == nil { | 289 if err == nil { |
290 err = p.SetValue(val, is) | 290 err = p.SetValue(val, is) |
291 } | 291 } |
292 return | 292 return |
293 } | 293 } |
294 | 294 |
295 // Write writes an entire PropertyMap to the buffer. `context` | 295 // Write writes an entire PropertyMap to the buffer. `context` behaves the same |
296 // behaves the same way that it does for WriteKey. If | 296 // way that it does for WriteKey. If WritePropertyMapDeterministic is true, then |
297 // WritePropertyMapDeterministic is true, then the rows will be sorted by | 297 // the rows will be sorted by property name before they're serialized to buf |
298 // property name before they're serialized to buf (mostly useful for testing, | 298 // (mostly useful for testing, but also potentially useful if you need to make |
299 // but also potentially useful if you need to make a hash of the property data). | 299 // a hash of the property data). |
| 300 // |
| 301 // Write skips metadata keys. |
300 func (pm PropertyMap) Write(buf Buffer, context KeyContext) (err error) { | 302 func (pm PropertyMap) Write(buf Buffer, context KeyContext) (err error) { |
301 defer recoverTo(&err) | 303 defer recoverTo(&err) |
302 rows := make(sort.StringSlice, 0, len(pm)) | 304 rows := make(sort.StringSlice, 0, len(pm)) |
303 tmpBuf := &bytes.Buffer{} | 305 tmpBuf := &bytes.Buffer{} |
304 for name, vals := range pm { | 306 for name, vals := range pm { |
| 307 if isMetaKey(name) { |
| 308 continue |
| 309 } |
305 tmpBuf.Reset() | 310 tmpBuf.Reset() |
306 _, e := cmpbin.WriteString(tmpBuf, name) | 311 _, e := cmpbin.WriteString(tmpBuf, name) |
307 panicIf(e) | 312 panicIf(e) |
308 _, e = cmpbin.WriteUint(tmpBuf, uint64(len(vals))) | 313 _, e = cmpbin.WriteUint(tmpBuf, uint64(len(vals))) |
309 panicIf(e) | 314 panicIf(e) |
310 for _, p := range vals { | 315 for _, p := range vals { |
311 panicIf(p.Write(tmpBuf, context)) | 316 panicIf(p.Write(tmpBuf, context)) |
312 } | 317 } |
313 rows = append(rows, tmpBuf.String()) | 318 rows = append(rows, tmpBuf.String()) |
314 } | 319 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 } | 373 } |
369 } | 374 } |
370 | 375 |
371 func recoverTo(err *error) { | 376 func recoverTo(err *error) { |
372 if r := recover(); r != nil { | 377 if r := recover(); r != nil { |
373 if rerr := r.(parseError); rerr != nil { | 378 if rerr := r.(parseError); rerr != nil { |
374 *err = error(rerr) | 379 *err = error(rerr) |
375 } | 380 } |
376 } | 381 } |
377 } | 382 } |
OLD | NEW |