Documentation ¶
Overview ¶
Package index provides a generic indexing system on top of the abstract Storage interface.
The following keys & values are populated by receiving blobs and queried for search operations:
Recent Permanodes "recpn|<pgp-keyid>|<reverse-modtime>|<claim-blobref>" == "<permanode-blobref>" where reverse-modtime flips each digit to '9'-<digit> and prepends "rt" (for reverse time) "2011-11-27T01:23:45Z" ==> "rt7988-88-72T98:76:54Z"
signer blobref of ascii public key -> gpg key id "signerkeyid:sha1-ad87ca5c78bd0ce1195c46f7c98e6025abbaf007" = "2931A67C26F5ABDA"
PermanodeOfSignerAttrValue: "signerattrvalue|<keyid>|<URLEscape(attr)>|<URLEscape(value)>|<reverse-claimtime>|<claim-blobref>" == "<permanode>" e.g. "signerattrvalue|2931A67C26F5ABDA|camliRoot|rootval|"+ "rt7988-88-71T98:67:60.999876543Z|sha1-bf115940641f1aae2e007edcf36b3b18c17256d9" => "sha1-7a14cce982aa73ab519e63050f82e2a2adfcf039"
Other: "meta:<blobref>" == "<size>|<mimetype>" "have:<blobref>" == "<size>" (used for enumeration, which doesn't need mime type)
For GetOwnerClaims(permanode, signer): "claim|<permanode-blobref>|<keyid>|<date>|<claim-blobref>" => "<URL:type>|<URL:attr>|<URL:value>"
Index ¶
- Variables
- type BatchMutation
- type BlobSniffer
- func (sn *BlobSniffer) Body() ([]byte, error)
- func (sn *BlobSniffer) IsTruncated() bool
- func (sn *BlobSniffer) MIMEType() string
- func (sn *BlobSniffer) Parse()
- func (sn *BlobSniffer) SchemaBlob() (meta *schema.Blob, ok bool)
- func (sn *BlobSniffer) Size() int64
- func (sn *BlobSniffer) Write(d []byte) (int, error)
- type Index
- func (x *Index) EdgesTo(ref *blobref.BlobRef, opts *search.EdgesToOpts) (edges []*search.Edge, err error)
- func (ix *Index) EnumerateBlobs(dest chan<- blobref.SizedBlobRef, after string, limit int, wait time.Duration) error
- func (x *Index) ExistingFileSchemas(wholeRef *blobref.BlobRef) (schemaRefs []*blobref.BlobRef, err error)
- func (ix *Index) GetBlobHub() blobserver.BlobHub
- func (x *Index) GetBlobMIMEType(blob *blobref.BlobRef) (mime string, size int64, err error)
- func (x *Index) GetFileInfo(fileRef *blobref.BlobRef) (*search.FileInfo, error)
- func (x *Index) GetImageInfo(fileRef *blobref.BlobRef) (*search.ImageInfo, error)
- func (x *Index) GetOwnerClaims(permaNode, owner *blobref.BlobRef) (cl search.ClaimList, err error)
- func (x *Index) GetRecentPermanodes(dest chan *search.Result, owner *blobref.BlobRef, limit int) (err error)
- func (x *Index) PathLookup(signer, base *blobref.BlobRef, suffix string, at time.Time) (*search.Path, error)
- func (x *Index) PathsLookup(signer, base *blobref.BlobRef, suffix string) (paths []*search.Path, err error)
- func (x *Index) PathsOfSignerTarget(signer, target *blobref.BlobRef) (paths []*search.Path, err error)
- func (x *Index) PermanodeOfSignerAttrValue(signer *blobref.BlobRef, attr, val string) (permaNode *blobref.BlobRef, err error)
- func (ix *Index) ReceiveBlob(blobRef *blobref.BlobRef, source io.Reader) (retsb blobref.SizedBlobRef, err error)
- func (x *Index) SearchPermanodesWithAttr(dest chan<- *blobref.BlobRef, request *search.PermanodeByAttrRequest) (err error)
- func (ix *Index) StatBlobs(dest chan<- blobref.SizedBlobRef, blobs []*blobref.BlobRef, wait time.Duration) error
- func (x *Index) Storage() Storage
- type Iterator
- type Mutation
- type Storage
Constants ¶
This section is empty.
Variables ¶
var ErrNotFound = errors.New("index: key not found")
Functions ¶
This section is empty.
Types ¶
type BatchMutation ¶
func NewBatchMutation ¶
func NewBatchMutation() BatchMutation
type BlobSniffer ¶
type BlobSniffer struct {
// contains filtered or unexported fields
}
func NewBlobSniffer ¶
func NewBlobSniffer(ref *blobref.BlobRef) *BlobSniffer
func (*BlobSniffer) Body ¶
func (sn *BlobSniffer) Body() ([]byte, error)
func (*BlobSniffer) IsTruncated ¶
func (sn *BlobSniffer) IsTruncated() bool
func (*BlobSniffer) MIMEType ¶
func (sn *BlobSniffer) MIMEType() string
MIMEType returns the sniffed blob's content-type or the empty string if unknown. If the blob is a Camlistore schema metadata blob, the MIME type will be of the form "application/json; camliType=foo".
func (*BlobSniffer) Parse ¶
func (sn *BlobSniffer) Parse()
func (*BlobSniffer) SchemaBlob ¶
func (sn *BlobSniffer) SchemaBlob() (meta *schema.Blob, ok bool)
func (*BlobSniffer) Size ¶
func (sn *BlobSniffer) Size() int64
type Index ¶
type Index struct { *blobserver.SimpleBlobHubPartitionMap *blobserver.NoImplStorage KeyFetcher blobref.StreamingFetcher // for verifying claims // Used for fetching blobs to find the complete sha1s of file & bytes // schema blobs. BlobSource blobref.StreamingFetcher // contains filtered or unexported fields }
func NewMemoryIndex ¶
func NewMemoryIndex() *Index
NewMemoryIndex returns an Index backed only by memory, for use in tests.
func (*Index) EnumerateBlobs ¶
func (*Index) ExistingFileSchemas ¶
func (*Index) GetBlobHub ¶
func (ix *Index) GetBlobHub() blobserver.BlobHub
func (*Index) GetBlobMIMEType ¶
func (*Index) GetFileInfo ¶
func (*Index) GetImageInfo ¶
func (*Index) GetOwnerClaims ¶
func (*Index) GetRecentPermanodes ¶
func (*Index) PathLookup ¶
func (*Index) PathsLookup ¶
func (*Index) PathsOfSignerTarget ¶
func (*Index) PermanodeOfSignerAttrValue ¶
func (*Index) ReceiveBlob ¶
func (*Index) SearchPermanodesWithAttr ¶
func (x *Index) SearchPermanodesWithAttr(dest chan<- *blobref.BlobRef, request *search.PermanodeByAttrRequest) (err error)
This is just like PermanodeOfSignerAttrValue except we return multiple and dup-suppress. If request.Query is "", it is not used in the prefix search.
type Iterator ¶
type Iterator interface { // Next moves the iterator to the next key/value pair. // It returns false when the iterator is exhausted. Next() bool // Key returns the key of the current key/value pair. // Only valid after a call to Next returns true. Key() string // Value returns the value of the current key/value pair. // Only valid after a call to Next returns true. Value() string // Close closes the iterator and returns any accumulated error. Exhausting // all the key/value pairs in a table is not considered to be an error. // It is valid to call Close multiple times. Other methods should not be // called after the iterator has been closed. Close() error }
Iterator iterates over an index Storage's key/value pairs in key order.
An iterator must be closed after use, but it is not necessary to read an iterator until exhaustion.
An iterator is not necessarily goroutine-safe, but it is safe to use multiple iterators concurrently, with each in a dedicated goroutine.
type Storage ¶
type Storage interface { // Get gets the value for the given key. It returns ErrNotFound if the DB // does not contain the key. Get(key string) (string, error) Set(key, value string) error Delete(key string) error BeginBatch() BatchMutation CommitBatch(b BatchMutation) error // Find returns an iterator positioned before the first key/value pair // whose key is 'greater than or equal to' the given key. There may be no // such pair, in which case the iterator will return false on Next. // // Any error encountered will be implicitly returned via the iterator. An // error-iterator will yield no key/value pairs and closing that iterator // will return that error. Find(key string) Iterator }
Storage is the minimal interface that must be implemented by index storage implementations. (e.g. mysql, postgres, mongo, sqlite, leveldb, dynamo)
func NewMemoryStorage ¶
func NewMemoryStorage() Storage
NewMemoryStorage returns an index Storage implementation that's backed only by memory, for use in tests.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package indextest contains the unit tests for the indexer so they can be re-used for each specific implementation of the index Storage interface.
|
Package indextest contains the unit tests for the indexer so they can be re-used for each specific implementation of the index Storage interface. |
Package mongo implements the Camlistore index storage abstraction on top of MongoDB.
|
Package mongo implements the Camlistore index storage abstraction on top of MongoDB. |
Package mysql implements the Camlistore index storage abstraction on top of MySQL.
|
Package mysql implements the Camlistore index storage abstraction on top of MySQL. |
Package postgres implements the Camlistore index storage abstraction on top of Postgres.
|
Package postgres implements the Camlistore index storage abstraction on top of Postgres. |
Package sqlindex implements the index.Storage interface using an *sql.DB.
|
Package sqlindex implements the index.Storage interface using an *sql.DB. |
Package sqlite implements the Camlistore index storage abstraction using an SQLite database file.
|
Package sqlite implements the Camlistore index storage abstraction using an SQLite database file. |