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

Unified Diff: service/datastore/pls_impl.go

Issue 1667403003: Add support for uint8, uint16 and uint32 in luci/gae (Closed) Base URL: https://github.com/luci/gae.git@master
Patch Set: Add support for meta fields (e.g. $id) too Created 4 years, 10 months 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/pls.go ('k') | service/datastore/pls_test.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: service/datastore/pls_impl.go
diff --git a/service/datastore/pls_impl.go b/service/datastore/pls_impl.go
index f8db53bc718160f280dfaa6be968a9b8971eb0ee..38fe3a21c13b5c3b68f343d0d8ef747b995ad6eb 100644
--- a/service/datastore/pls_impl.go
+++ b/service/datastore/pls_impl.go
@@ -170,6 +170,13 @@ func loadInner(codec *structCodec, structValue reflect.Value, index int, name st
project = PTInt
overflow = func(x interface{}) bool { return v.OverflowInt(x.(int64)) }
set = func(x interface{}) { v.SetInt(x.(int64)) }
+ case reflect.Uint8, reflect.Uint16, reflect.Uint32:
+ project = PTInt
+ overflow = func(x interface{}) bool {
+ xi := x.(int64)
+ return xi < 0 || v.OverflowUint(uint64(xi))
+ }
+ set = func(x interface{}) { v.SetUint(uint64(x.(int64))) }
case reflect.Bool:
project = PTBool
set = func(x interface{}) { v.SetBool(x.(bool)) }
@@ -384,7 +391,9 @@ func (p *structPLS) SetMeta(key string, val interface{}) bool {
return err == nil
}
- // setting a BoolField
+ val = UpconvertUnderlyingType(val)
+
+ // setting a Toggle
if b, ok := val.(bool); ok {
if b {
val = On
@@ -397,7 +406,26 @@ func (p *structPLS) SetMeta(key string, val interface{}) bool {
f.Set(reflect.Zero(f.Type()))
} else {
value := reflect.ValueOf(val)
- f.Set(value.Convert(f.Type()))
+ switch f.Kind() {
+ case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ intVal := value.Int()
+ if intVal < 0 || f.OverflowInt(intVal) {
dnj 2016/02/05 07:30:31 We don't support negative integers here?
iannucci 2016/02/05 08:22:01 oops, copy pasta error. Fixed and added tests
+ return false
+ }
+ f.SetInt(intVal)
+ case reflect.Uint8, reflect.Uint16, reflect.Uint32:
+ if f.Type() != typeOfToggle {
+ intVal := value.Int()
+ if intVal < 0 || f.OverflowUint(uint64(intVal)) {
+ return false
+ }
+ f.SetUint(uint64(intVal))
+ break
+ }
+ fallthrough
+ default:
+ f.Set(value.Convert(f.Type()))
+ }
}
return true
}
@@ -624,6 +652,15 @@ func convertMeta(val string, t reflect.Type) (interface{}, error) {
return int64(0), nil
}
return strconv.ParseInt(val, 10, 64)
+ case reflect.Uint8, reflect.Uint16, reflect.Uint32:
+ if t == typeOfToggle { // special case this
+ break
+ }
+ if val == "" {
+ return int64(0), nil
+ }
+ ret, err := strconv.ParseUint(val, 10, 32)
+ return int64(ret), err
}
switch t {
case typeOfKey:
« no previous file with comments | « service/datastore/pls.go ('k') | service/datastore/pls_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698