// 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 }
// WriteHorizonAndSize ?? func (qs *QuadStore) WriteHorizonAndSize(tx *lmdb.Txn) error { buf := new(bytes.Buffer) err := binary.Write(buf, binary.LittleEndian, qs.size) if err != nil { glog.Errorf("Couldn't convert size!") return err } werr := tx.Put(qs.metaDBI, []byte("size"), buf.Bytes(), 0) if werr != nil { glog.Error("Couldn't write size!") return werr } buf.Reset() err = binary.Write(buf, binary.LittleEndian, qs.horizon) if err != nil { glog.Errorf("Couldn't convert horizon!") } werr = tx.Put(qs.metaDBI, []byte("horizon"), buf.Bytes(), 0) if werr != nil { glog.Error("Couldn't write horizon!") return werr } return err }
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 }