perkeep/pkg/index/interface.go

156 lines
6.6 KiB
Go

package index
import (
"context"
"sync"
"time"
"perkeep.org/pkg/blob"
"perkeep.org/pkg/types/camtypes"
)
type Interface interface {
sync.Locker
RLock()
RUnlock()
// os.ErrNotExist should be returned if the blob isn't known
GetBlobMeta(context.Context, blob.Ref) (camtypes.BlobMeta, error)
// Should return os.ErrNotExist if not found.
GetFileInfo(ctx context.Context, fileRef blob.Ref) (camtypes.FileInfo, error)
// Should return os.ErrNotExist if not found.
GetImageInfo(ctx context.Context, fileRef blob.Ref) (camtypes.ImageInfo, error)
// Should return os.ErrNotExist if not found.
GetMediaTags(ctx context.Context, fileRef blob.Ref) (map[string]string, error)
// GetFileLocation returns the location info (currently Exif) of the fileRef.
// Should return os.ErrNotExist if fileRef is not found,
// is not a file, or it has no location info.
GetFileLocation(ctx context.Context, fileRef blob.Ref) (camtypes.Location, error)
// KeyId returns the GPG keyid (e.g. "2931A67C26F5ABDA)
// given the blobref of its ASCII-armored blobref.
// The error is ErrNotFound if not found.
KeyId(context.Context, blob.Ref) (string, error)
// AppendClaims appends to dst claims on the given permanode.
// The signerFilter - a GPG key ID (e.g. "2931A67C26F5ABDA) -
// and attrFilter are both optional. If non-zero,
// they filter the return items to only claims made by the given signer
// or claims about the given attribute, respectively.
// Deleted claims are never returned.
// The items may be appended in any order.
//
// TODO: this should take a context and a callback func
// instead of a dst, then it can append to a channel instead,
// and the context lets it be interrupted. The callback should
// take the context too, so the channel send's select can read
// from the Done channel.
AppendClaims(ctx context.Context, dst []camtypes.Claim, permaNode blob.Ref,
signerFilter string,
attrFilter string) ([]camtypes.Claim, error)
// TODO(bradfitz): methods below this line are slated for a redesign
// to work efficiently for the new in-memory index.
// dest must be closed, even when returning an error.
// limit <= 0 means unlimited.
GetRecentPermanodes(ctx context.Context, dest chan<- camtypes.RecentPermanode,
owner blob.Ref,
limit int,
before time.Time) error
// SearchPermanodes finds permanodes matching the provided
// request and sends unique permanode blobrefs to dest.
// In particular, if request.FuzzyMatch is true, a fulltext
// search is performed (if supported by the attribute(s))
// instead of an exact match search.
// If request.Query is blank, the permanodes which have
// request.Attribute as an attribute (regardless of its value)
// are searched.
// Additionally, if request.Attribute is blank, all attributes
// are searched (as fulltext), otherwise the search is
// restricted to the named attribute.
//
// dest is always closed, regardless of the error return value.
SearchPermanodesWithAttr(ctx context.Context, dest chan<- blob.Ref,
request *camtypes.PermanodeByAttrRequest) error
// ExistingFileSchemas returns 0 or more blobrefs of "bytes"
// (TODO(bradfitz): or file?) schema blobs that represent the
// bytes of a file given in bytesRef. The file schema blobs
// returned are not guaranteed to reference chunks that still
// exist on the blobservers, though. It's purely a hint for
// clients to avoid uploads if possible. Before re-using any
// returned blobref they should be checked.
//
// Use case: a user drag & drops a large file onto their
// browser to upload. (imagine that "large" means anything
// larger than a blobserver's max blob size) JavaScript can
// first SHA-1 the large file locally, then send the
// wholeFileRef to this call and see if they'd previously
// uploaded the same file in the past. If so, the upload
// can be avoided if at least one of the returned schemaRefs
// can be validated (with a validating HEAD request) to still
// all exist on the blob server.
ExistingFileSchemas(wholeFileRef ...blob.Ref) (schemaRefs WholeRefToFile, err error)
// GetDirMembers sends on dest the children of the static
// directory dirRef. It returns os.ErrNotExist if dirRef
// is nil.
// dest must be closed, even when returning an error.
// limit <= 0 means unlimited.
GetDirMembers(ctx context.Context, dirRef blob.Ref, dest chan<- blob.Ref, limit int) error
// Given an owner key, a camliType 'claim', 'attribute' name,
// and specific 'value', find the most recent permanode that has
// a corresponding 'set-attribute' claim attached.
// Returns os.ErrNotExist if none is found.
// Only attributes white-listed by IsIndexedAttribute are valid.
// TODO(bradfitz): ErrNotExist here is a weird error message ("file" not found). change.
// TODO(bradfitz): use keyId instead of signer?
PermanodeOfSignerAttrValue(ctx context.Context, signer blob.Ref, attr, val string) (blob.Ref, error)
// PathsOfSignerTarget queries the index about "camliPath:"
// URL-dispatch attributes.
//
// It returns a list of all the path claims that have been signed
// by the provided signer and point at the given target.
//
// This is used when editing a permanode, to figure work up
// the name resolution tree backwards ultimately to a
// camliRoot permanode (which should know its base URL), and
// then the complete URL(s) of a target can be found.
PathsOfSignerTarget(ctx context.Context, signer, target blob.Ref) ([]*camtypes.Path, error)
// All Path claims for (signer, base, suffix)
PathsLookup(ctx context.Context, signer, base blob.Ref, suffix string) ([]*camtypes.Path, error)
// Most recent Path claim for (signer, base, suffix) as of
// provided time 'at', or most recent if 'at' is nil.
PathLookup(ctx context.Context, signer, base blob.Ref, suffix string, at time.Time) (*camtypes.Path, error)
// EdgesTo finds references to the provided ref.
//
// For instance, if ref is a permanode, it might find the parent permanodes
// that have ref as a member.
// Or, if ref is a static file, it might find static directories which contain
// that file.
// This is a way to go "up" or "back" in a hierarchy.
//
// opts may be nil to accept the defaults.
EdgesTo(ref blob.Ref, opts *camtypes.EdgesToOpts) ([]*camtypes.Edge, error)
// EnumerateBlobMeta calls fn for each blob known to the
// indexer (which may be a subset of all total blobs, since
// the indexer is typically configured to not see non-metadata
// blobs). The blobs may be sent in any order. If the context
// finishes, the return error is ctx.Err().
// If the provided function returns false, iteration ends with a nil
// return value.
EnumerateBlobMeta(context.Context, func(camtypes.BlobMeta) bool) error
}