func (dl directoryLayer) checkVersion(rtr fdb.ReadTransaction, tr *fdb.Transaction) error { version := rtr.Get(dl.rootNode.Sub([]byte("version"))).MustGet() if version == nil { if tr != nil { dl.initializeDirectory(*tr) } return nil } var versions []int32 buf := bytes.NewBuffer(version) for i := 0; i < 3; i++ { var v int32 err := binary.Read(buf, binary.LittleEndian, &v) if err != nil { return errors.New("cannot determine directory version present in database") } versions = append(versions, v) } if versions[0] > _MAJORVERSION { return fmt.Errorf("cannot load directory with version %d.%d.%d using directory layer %d.%d.%d", versions[0], versions[1], versions[2], _MAJORVERSION, _MINORVERSION, _MICROVERSION) } if versions[1] > _MINORVERSION && tr != nil /* aka write access allowed */ { return fmt.Errorf("directory with version %d.%d.%d is read-only when opened using directory layer %d.%d.%d", versions[0], versions[1], versions[2], _MAJORVERSION, _MINORVERSION, _MICROVERSION) } return nil }
func (n *node) layer(rtr fdb.ReadTransaction) fdb.FutureByteSlice { if n._layer == nil { fv := rtr.Get(n.subspace.Sub([]byte("layer"))) n._layer = fv } return n._layer }
func (dl directoryLayer) find(rtr fdb.ReadTransaction, path []string) *node { n := &node{dl.rootNode, []string{}, path, nil} for i := range path { n = &node{dl.nodeWithPrefix(rtr.Get(n.subspace.Sub(_SUBDIRS, path[i])).MustGet()), path[:i+1], path, nil} if !n.exists() || bytes.Compare(n.layer(rtr).MustGet(), []byte("partition")) == 0 { return n } } return n }