// KeyToLocalIDs parses a key under a DataContext and returns instance, version and client ids. func DataKeyToLocalIDs(k Key) (dvid.InstanceID, dvid.VersionID, dvid.ClientID, error) { if k[0] != dataKeyPrefix { return 0, 0, 0, fmt.Errorf("Cannot extract local IDs from a non-DataContext key") } instanceID := dvid.InstanceIDFromBytes(k[1 : 1+dvid.InstanceIDSize]) start := len(k) - dvid.VersionIDSize - dvid.ClientIDSize - 1 versionID := dvid.VersionIDFromBytes(k[start : start+dvid.VersionIDSize]) start += dvid.VersionIDSize clientID := dvid.ClientIDFromBytes(k[start : start+dvid.ClientIDSize]) return instanceID, versionID, clientID, nil }
// InstanceFromKey returns an InstanceID from a full key. Any DataContext is sufficient as receiver. func (ctx *DataContext) InstanceFromKey(key Key) (dvid.InstanceID, error) { if key == nil { return 0, fmt.Errorf("Cannot extract DataContext instance from nil key") } if key[0] != dataKeyPrefix { return 0, fmt.Errorf("Cannot extract DataContext version from different key type") } if len(key) < 5 { return 0, fmt.Errorf("Cannot get instance from Key %v less than 5 bytes", key) } return dvid.InstanceIDFromBytes(key[1 : 1+dvid.InstanceIDSize]), nil }
// Load the next ids to be used for RepoID, VersionID, and InstanceID. func (m *repoManager) loadNewIDs() error { var ctx storage.MetadataContext value, err := m.store.Get(ctx, storage.NewTKey(newIDsKey, nil)) if err != nil { return err } if len(value) != dvid.RepoIDSize+dvid.VersionIDSize+dvid.InstanceIDSize { return fmt.Errorf("Bad value returned for new ids. Length %d bytes!", len(value)) } pos := 0 m.repoID = dvid.RepoIDFromBytes(value[pos : pos+dvid.RepoIDSize]) pos += dvid.RepoIDSize m.versionID = dvid.VersionIDFromBytes(value[pos : pos+dvid.VersionIDSize]) pos += dvid.VersionIDSize m.instanceID = dvid.InstanceIDFromBytes(value[pos : pos+dvid.InstanceIDSize]) return nil }