func (f binaryRecordFormatV0) writeSingleValue(w *rw.Writer, off int, o interface{}, tp, linkedType orient.OType) (err error) { defer func() { if r := recover(); r != nil { if ic, ok := r.(*runtime.TypeAssertionError); ok { err = fmt.Errorf("writeSingleValue(%T -> %v): %v", o, tp, ic) } else { panic(r) } } }() switch tp { case orient.BYTE: w.WriteByte(toByte(o)) case orient.BOOLEAN: w.WriteBool(toBool(o)) case orient.SHORT: w.WriteVarint(int64(toInt16(o))) case orient.INTEGER: w.WriteVarint(int64(toInt32(o))) case orient.LONG: w.WriteVarint(int64(toInt64(o))) case orient.STRING: f.writeString(w, toString(o)) case orient.FLOAT: w.WriteFloat(o.(float32)) case orient.DOUBLE: w.WriteDouble(o.(float64)) case orient.DATETIME: // unix time in milliseconds if t, ok := o.(int64); ok { w.WriteVarint(t) } else { t := o.(time.Time) it := t.Unix()*1000 + int64(t.Nanosecond())/1e6 w.WriteVarint(it) } case orient.DATE: if t, ok := o.(int64); ok { w.WriteVarint(t) } else { t := o.(time.Time) it := t.Unix()*1000 + int64(t.Nanosecond())/1e6 var offset int64 // TODO: int offset = ODateHelper.getDatabaseTimeZone().getOffset(dateValue) w.WriteVarint((it + offset) / millisecPerDay) } case orient.EMBEDDED: var edoc *orient.Document switch d := o.(type) { case orient.Document: edoc = &d case *orient.Document: edoc = d case orient.DocumentSerializable: edoc, err = o.(orient.DocumentSerializable).ToDocument() if err != nil { return } edoc.SetField(documentSerializableClassName, edoc.ClassName()) // TODO: pass empty value as nil? default: edoc = orient.NewEmptyDocument() if err = edoc.From(o); err != nil { return err } // TODO: set classname of struct? } err = f.Serialize(edoc, w, off, false) case orient.EMBEDDEDSET, orient.EMBEDDEDLIST: err = f.writeEmbeddedCollection(w, off, o, linkedType) case orient.DECIMAL: f.writeDecimal(w, o) case orient.BINARY: _, err = f.writeBinary(w, o.([]byte)) case orient.LINKSET, orient.LINKLIST: err = f.writeLinkCollection(w, o) case orient.LINK: _, err = f.writeOptimizedLink(w, o.(orient.OIdentifiable)) case orient.LINKMAP: err = f.writeLinkMap(w, o) case orient.EMBEDDEDMAP: err = f.writeEmbeddedMap(w, off, o) case orient.LINKBAG: err = o.(*orient.RidBag).ToStream(w) case orient.CUSTOM: val := o.(orient.CustomSerializable) f.writeString(w, val.GetClassName()) err = val.ToStream(w) case orient.TRANSIENT, orient.ANY: default: panic(fmt.Errorf("unknown type: %v", tp)) } if err == nil { err = w.Err() } return }
func (binaryRecordFormatV0) writeOType(w *rw.Writer, tp orient.OType) int { w.WriteByte(byte(tp)) return rw.SizeByte }