mirror of https://github.com/perkeep/perkeep.git
156 lines
6.6 KiB
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
|
|
}
|