Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(68)

Unified Diff: service/datastore/pls.go

Issue 1525453002: Handle unexpected entity fields gracefully. (Closed) Base URL: https://github.com/luci/gae.git@master
Patch Set: fix nit Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « service/datastore/datastore_test.go ('k') | service/datastore/pls_impl.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: service/datastore/pls.go
diff --git a/service/datastore/pls.go b/service/datastore/pls.go
index d84d32d774980c5d04ada8499da0772bce0c5970..5de9283bcb29c0f873dd7964ace65e73c2847271 100644
--- a/service/datastore/pls.go
+++ b/service/datastore/pls.go
@@ -53,6 +53,46 @@ import (
// Only exported fields allow SetMeta, but all fields of appropriate type
// allow tagged defaults. See Examples.
//
+// `gae:"[-],extra"` -- indicates that any extra, unrecognized or mismatched
+// property types (type in datastore doesn't match your struct's field
+// type) should be loaded into and saved from this field. The precise type
+// of the field must be PropertyMap. This form allows you to control the
+// behavior of reads and writes when your schema changes, or to implement
+// something like ndb.Expando with a mix of structured and unstructured
+// fields.
+//
+// If the `-` is present, then datastore write operations will not put
+// elements of this map into the datastore.
+//
+// If the field is non-exported, then read operations from the datastore
+// will not populate the members of this map, but extra fields or
+// structural differences encountered when reading into this struct will be
+// silently ignored. This is useful if you want to just ignore old fields.
+//
+// If there is a conflict between a field in the struct and a same-named
+// Property in the extra field, the field in the struct takes precedence.
+//
+// Recursive structs are supported, but all extra properties go to the
+// topmost structure's Extra field. This is a bit non-intuitive, but the
+// implementation complexity was deemed not worth it, since that sort of
+// thing is generally only useful on schema changes, which should be
+// transient.
+//
+// Examples:
+// // "black hole": ignore mismatches, ignore on write
+// _ PropertyMap `gae:"-,extra"
+//
+// // "expando": full content is read/written
+// Expando PropertyMap `gae:",extra"
+//
+// // "convert": content is read from datastore, but lost on writes. This
+// // is useful for doing conversions from an old schema to a new one,
+// // since you can retrieve the old data and populate it into new fields,
+// // for example. Probably should be used in conjunction with an
+// // implementation of the PropertyLoadSaver interface so that you can
+// // transparently upconvert to the new schema on load.
+// Convert PropertyMap `gae:"-,extra"
+//
// Example "special" structure. This is supposed to be some sort of datastore
// singleton object.
// struct secretFoo {
« no previous file with comments | « service/datastore/datastore_test.go ('k') | service/datastore/pls_impl.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698