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

Side by Side Diff: service/datastore/serialize/serialize.go

Issue 1550903002: impl/memory: Fix time serialization encoding. (Closed) Base URL: https://github.com/luci/gae@master
Patch Set: Created 4 years, 11 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 unified diff | Download patch
OLDNEW
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 serialize 5 package serialize
6 6
7 import ( 7 import (
8 "bytes" 8 "bytes"
9 "errors" 9 "errors"
10 "fmt" 10 "fmt"
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 182
183 gp.Lng, _, e = cmpbin.ReadFloat64(buf) 183 gp.Lng, _, e = cmpbin.ReadFloat64(buf)
184 panicIf(e) 184 panicIf(e)
185 185
186 if !gp.Valid() { 186 if !gp.Valid() {
187 err = fmt.Errorf("helper: decoded invalid GeoPoint: %v", gp) 187 err = fmt.Errorf("helper: decoded invalid GeoPoint: %v", gp)
188 } 188 }
189 return 189 return
190 } 190 }
191 191
192 // timeToInt converts a time value to an integer value. See WriteTime for more
193 // details.
194 func timeToInt(t time.Time) int64 {
195 t = t.Round(time.Microsecond)
196 return t.Unix()*1e6 + int64(t.Nanosecond()/1e3)
197 }
198
192 // WriteTime writes a time.Time in a byte-sortable way. 199 // WriteTime writes a time.Time in a byte-sortable way.
193 // 200 //
194 // This method truncates the time to microseconds and drops the timezone, 201 // This method truncates the time to microseconds and drops the timezone,
195 // because that's the (undocumented) way that the appengine SDK does it. 202 // because that's the (undocumented) way that the appengine SDK does it.
196 func WriteTime(buf Buffer, t time.Time) error { 203 func WriteTime(buf Buffer, t time.Time) error {
197 name, off := t.Zone() 204 name, off := t.Zone()
198 if name != "UTC" || off != 0 { 205 if name != "UTC" || off != 0 {
199 panic(fmt.Errorf("helper: UTC OR DEATH: %s", t)) 206 panic(fmt.Errorf("helper: UTC OR DEATH: %s", t))
200 } 207 }
201 » _, err := cmpbin.WriteInt(buf, t.Unix()*1e6+int64(t.Nanosecond()/1e3)) 208 » _, err := cmpbin.WriteInt(buf, timeToInt(t))
202 return err 209 return err
203 } 210 }
204 211
205 // ReadTime reads a time.Time from the buffer. 212 // ReadTime reads a time.Time from the buffer.
206 func ReadTime(buf Buffer) (time.Time, error) { 213 func ReadTime(buf Buffer) (time.Time, error) {
207 v, _, err := cmpbin.ReadInt(buf) 214 v, _, err := cmpbin.ReadInt(buf)
208 if err != nil { 215 if err != nil {
209 return time.Time{}, err 216 return time.Time{}, err
210 } 217 }
211 t := time.Unix(v/1e6, (v%1e6)*1e3) 218 t := time.Unix(v/1e6, (v%1e6)*1e3)
212 if t.IsZero() { 219 if t.IsZero() {
213 return time.Time{}, nil 220 return time.Time{}, nil
214 } 221 }
215 return t.UTC(), nil 222 return t.UTC(), nil
216 } 223 }
217 224
218 // WriteProperty writes a Property to the buffer. `context` behaves the same 225 // WriteProperty writes a Property to the buffer. `context` behaves the same
219 // way that it does for WriteKey, but only has an effect if `p` contains a 226 // way that it does for WriteKey, but only has an effect if `p` contains a
220 // Key as its Value. 227 // Key as its Value.
221 func WriteProperty(buf Buffer, context KeyContext, p ds.Property) (err error) { 228 func WriteProperty(buf Buffer, context KeyContext, p ds.Property) (err error) {
222 defer recoverTo(&err) 229 defer recoverTo(&err)
223 » typb := byte(p.Type()) 230
231 » effectiveType := p.Type()
232 » switch effectiveType {
233 » case ds.PTTime:
dnj 2015/12/29 16:48:09 I made this a switch statement in case there were
234 » » effectiveType = ds.PTInt
235 » }
236 » typb := byte(effectiveType)
iannucci 2015/12/29 18:29:20 This change is not good; it will call property map
237
224 if p.IndexSetting() != ds.NoIndex { 238 if p.IndexSetting() != ds.NoIndex {
225 typb |= 0x80 239 typb |= 0x80
226 } 240 }
227 panicIf(buf.WriteByte(typb)) 241 panicIf(buf.WriteByte(typb))
228 switch p.Type() { 242 switch p.Type() {
229 case ds.PTNull: 243 case ds.PTNull:
230 case ds.PTBool: 244 case ds.PTBool:
231 b := p.Value().(bool) 245 b := p.Value().(bool)
232 if b { 246 if b {
233 err = buf.WriteByte(1) 247 err = buf.WriteByte(1)
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 } 607 }
594 } 608 }
595 609
596 func recoverTo(err *error) { 610 func recoverTo(err *error) {
597 if r := recover(); r != nil { 611 if r := recover(); r != nil {
598 if rerr := r.(parseError); rerr != nil { 612 if rerr := r.(parseError); rerr != nil {
599 *err = error(rerr) 613 *err = error(rerr)
600 } 614 }
601 } 615 }
602 } 616 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698