func (f binaryRecordFormatV0) readSingleValue(r *rw.ReadSeeker, valueType orient.OType, doc *orient.Document) (value interface{}, err error) { defer func() { if r := recover(); r != nil { if ic, ok := r.(*runtime.TypeAssertionError); ok { err = fmt.Errorf("writeSingleValue(%v): %v", valueType, ic) } else { panic(r) } } }() switch valueType { case orient.INTEGER: value = int32(r.ReadVarint()) case orient.LONG: value = int64(r.ReadVarint()) case orient.SHORT: value = int16(r.ReadVarint()) case orient.STRING: value = f.readString(r) case orient.DOUBLE: value = r.ReadDouble() case orient.FLOAT: value = r.ReadFloat() case orient.BYTE: value = f.readByte(r) case orient.BOOLEAN: value = f.readByte(r) == 1 case orient.DATETIME: longTime := r.ReadVarint() value = time.Unix(longTime/1000, (longTime%1000)*1e6) case orient.DATE: // long savedTime = OVarIntSerializer.readAsLong(bytes) * MILLISEC_PER_DAY; // int offset = ODateHelper.getDatabaseTimeZone().getOffset(savedTime); // value = new Date(savedTime - offset); savedTime := r.ReadVarint() * millisecPerDay t := time.Unix(savedTime/1000, (savedTime%1000)*1e6) //.UTC().Local() // _, offset := t.Zone() // value = t.Add(-time.Duration(offset) * time.Second) value = t case orient.EMBEDDED: doc2 := orient.NewEmptyDocument() if err = f.Deserialize(doc2, r); err != nil { return nil, err } value = doc2 // if (((ODocument) value).containsField(ODocumentSerializable.CLASS_NAME)) { // String className = ((ODocument) value).field(ODocumentSerializable.CLASS_NAME); // try { // Class<?> clazz = Class.forName(className); // ODocumentSerializable newValue = (ODocumentSerializable) clazz.newInstance(); // newValue.fromDocument((ODocument) value); // value = newValue; // } catch (Exception e) { // throw new RuntimeException(e); // } // } else // ODocumentInternal.addOwner((ODocument) value, document); case orient.EMBEDDEDSET, orient.EMBEDDEDLIST: value, err = f.readEmbeddedCollection(r, doc) case orient.LINKSET, orient.LINKLIST: value = f.readLinkCollection(r) case orient.BINARY: value = f.readBinary(r) case orient.LINK: value = f.readOptimizedLink(r) case orient.LINKMAP: value, err = f.readLinkMap(r, doc) case orient.EMBEDDEDMAP: value, err = f.readEmbeddedMap(r, doc) case orient.DECIMAL: value = f.readDecimal(r) case orient.LINKBAG: bag := orient.NewRidBag() if err = bag.FromStream(r); err != nil { return nil, err } bag.SetOwner(doc) value = bag case orient.TRANSIENT: case orient.ANY: case orient.CUSTOM: // TODO: implement via Register global function panic("CUSTOM type is not supported for now") // try { // String className = readString(bytes); // Class<?> clazz = Class.forName(className); // OSerializableStream stream = (OSerializableStream) clazz.newInstance(); // stream.fromStream(readBinary(bytes)); // if (stream instanceof OSerializableWrapper) // value = ((OSerializableWrapper) stream).getSerializable(); // else // value = stream; // } catch (Exception e) { // throw new RuntimeException(e); // } } if err == nil { err = r.Err() } return }