// UpdateValueKeyBy ?? func (qs *QuadStore) UpdateValueKeyBy(name string, amount int64, tx *lmdb.Txn) error { value := proto.NodeData{ Name: name, Size_: amount, } key := qs.createValueKeyFor(name) data, err := tx.Get(qs.nodeDBI, key) if err == nil { // Node exists in the database -- unmarshal and update. var oldvalue proto.NodeData err := oldvalue.Unmarshal(data) if err != nil { glog.Errorf("Error: couldn't reconstruct value: %v", err) return err } oldvalue.Size_ += amount value = oldvalue } // Are we deleting something? if value.Size_ <= 0 { value.Size_ = 0 } // Repackage and rewrite. bytes, err := value.Marshal() if err != nil { glog.Errorf("Couldn't write to buffer for value %s: %s", name, err) return err } err = tx.Put(qs.nodeDBI, key, bytes, 0) return err }
func (qs *QuadStore) getInt64ForMetaKey(tx *lmdb.Txn, key string, empty int64) (int64, error) { var out int64 data, err := tx.Get(qs.metaDBI, []byte(key)) if lmdb.IsNotFound(err) { return empty, nil } if err != nil { return 0, err } buf := bytes.NewBuffer(data) err = binary.Read(buf, binary.LittleEndian, &out) if err != nil { return 0, err } return out, nil }
func (qs *QuadStore) buildQuadWriteLMDB(tx *lmdb.Txn, q quad.Quad, id int64, isAdd bool) error { var entry proto.HistoryEntry dbi := qs.dbis[spoDB] data, err := tx.Get(dbi, qs.createKeyFor(spo, q)) if err == nil { // We got something. err := entry.Unmarshal(data) if err != nil { return err } } if isAdd && len(entry.History)%2 == 1 { glog.Errorf("attempt to add existing quad %v: %#v", entry, q) return graph.ErrQuadExists } if !isAdd && len(entry.History)%2 == 0 { glog.Errorf("attempt to delete non-existent quad %v: %#v", entry, q) return graph.ErrQuadNotExist } entry.History = append(entry.History, uint64(id)) bytes, err := entry.Marshal() if err != nil { glog.Errorf("Couldn't write to buffer for entry %#v: %s", entry, err) return err } for _, index := range [][4]quad.Direction{spo, osp, pos, cps} { if index == cps && q.Get(quad.Label) == "" { continue } dbi = qs.dbis[dbFor(index)] err = tx.Put(dbi, qs.createKeyFor(index, q), bytes, 0) if err != nil { return err } } return nil }