Documentation
¶
Overview ¶
Package store defines types to implement a store.
Package store defines types to implement a store.
Index ¶
Constants ¶
const ( // Component name for monitoring. Component = "store" // DefaultLimit is the default pagination limit. DefaultLimit = 20 // MaxLimit is the maximum pagination limit. MaxLimit = 200 )
Variables ¶
var ( ErrLinkAlreadyExists = errors.New("link already exists") ErrOutDegreeNotSupported = errors.New("out degree is not supported by the current implementation") ErrUniqueMapEntry = errors.New("unique map entry is set and map already has an initial link") ErrReferencingNotSupported = errors.New("filtering on referencing segments is not supported by the current implementation") ErrBatchFailed = errors.New("cannot add to batch: failures have been detected") )
Common errors that can be used by store implementations.
Functions ¶
This section is empty.
Types ¶
type Adapter ¶
type Adapter interface {
SegmentReader
LinkWriter
EvidenceStore
// Returns arbitrary information about the adapter.
GetInfo(ctx context.Context) (interface{}, error)
// Adds a channel that receives events from the store.
AddStoreEventChannel(chan *Event)
// Creates a new Batch
NewBatch(ctx context.Context) (Batch, error)
}
Adapter is the minimal interface that all stores should implement. Then a store may optionally implement the KeyValueStore interface.
type AdapterConfig ¶ added in v0.3.1
type AdapterConfig interface {
// EnforceUniqueMapEntry prevents multiple "first" links from being added
// to the same map.
// By default maps can have any number of "first" links (links without a
// parent).
// In some cases that doesn't reflect the reality of your process: each map
// should be started with a single link and other links should be children
// of the first link. If that's the case, you need to call this method when
// creating your store adapter.
EnforceUniqueMapEntry() error
}
AdapterConfig lets users configure advanced store adapter settings. Some stores can't offer these advanced features, so you'll have to test if the store you're using supports it by type-casting it to this interface.
type Batch ¶
type Batch interface {
SegmentReader
LinkWriter
// Write definitely writes the content of the Batch
Write(ctx context.Context) error
}
Batch represents a database transaction.
type Event ¶ added in v0.2.0
type Event struct {
EventType EventType
Data interface{}
}
Event is the object stores send to notify of important events.
func NewSavedEvidences ¶ added in v0.2.0
func NewSavedEvidences() *Event
NewSavedEvidences creates a new event to notify evidences were saved.
func NewSavedLinks ¶ added in v0.2.0
func NewSavedLinks(linkArgs ...*chainscript.Link) *Event
NewSavedLinks creates a new event to notify links were saved.
func (*Event) AddSavedEvidence ¶ added in v0.2.0
func (event *Event) AddSavedEvidence(linkHash chainscript.LinkHash, e *chainscript.Evidence)
AddSavedEvidence adds an evidence to the event. It assumes the event is a correctly initialized SavedEvidences event.
func (*Event) AddSavedLinks ¶ added in v0.2.0
func (event *Event) AddSavedLinks(links ...*chainscript.Link)
AddSavedLinks adds links to the event. It assumes the event is a correctly initialized SavedLinks event.
func (*Event) UnmarshalJSON ¶ added in v0.2.0
UnmarshalJSON does custom deserialization to correctly type the Data field.
type EventType ¶ added in v0.2.0
type EventType string
EventType lets you know the kind of event received. A client should ignore events it doesn't care about or doesn't understand.
type EvidenceReader ¶ added in v0.2.0
type EvidenceReader interface {
// Get the evidences for a segment.
// Can return a nil error with an empty evidence slice if
// the segment currently doesn't have evidence.
GetEvidences(ctx context.Context, linkHash chainscript.LinkHash) (types.EvidenceSlice, error)
}
EvidenceReader is the interface for reading segment evidence from a store.
type EvidenceStore ¶ added in v0.2.0
type EvidenceStore interface {
EvidenceReader
EvidenceWriter
}
EvidenceStore is the interface for storing and reading segment evidence.
type EvidenceWriter ¶ added in v0.2.0
type EvidenceWriter interface {
// Add an evidence to a segment.
AddEvidence(ctx context.Context, linkHash chainscript.LinkHash, evidence *chainscript.Evidence) error
}
EvidenceWriter is the interface for adding evidence to a segment in a store.
type KeyValueReader ¶ added in v0.2.0
KeyValueReader is the interface for reading key-value pairs.
type KeyValueStore ¶ added in v0.2.0
type KeyValueStore interface {
KeyValueReader
KeyValueWriter
}
KeyValueStore is the interface for a key-value store. Some stores will implement this interface, but not all.
type KeyValueWriter ¶ added in v0.2.0
type KeyValueWriter interface {
SetValue(ctx context.Context, key []byte, value []byte) error
DeleteValue(ctx context.Context, key []byte) ([]byte, error)
}
KeyValueWriter is the interface for writing key-value pairs.
type LinkWriter ¶ added in v0.2.0
type LinkWriter interface {
// Create the immutable part of a segment.
// The input link is expected to be valid.
// Returns the link hash or an error.
CreateLink(ctx context.Context, link *chainscript.Link) (chainscript.LinkHash, error)
}
LinkWriter is the interface for writing links to a store. Links are immutable and cannot be deleted.
type MapFilter ¶
type MapFilter struct {
Pagination `json:"pagination"`
// Filter to get maps with IDs starting with a given prefix.
Prefix string `json:"prefix" url:"prefix"`
// Filter to get maps with IDs ending with a given suffix.
Suffix string `json:"suffix" url:"suffix"`
// Process name is optional.
Process string `json:"process" url:"process"`
}
MapFilter contains filtering options for segments.
type Pagination ¶
type Pagination struct {
// Index of the first entry.
Offset int `json:"offset" url:"offset"`
// Maximum number of entries.
Limit int `json:"limit" url:"limit"`
}
Pagination contains pagination options.
func (*Pagination) PaginateSegments ¶
func (p *Pagination) PaginateSegments(a *types.PaginatedSegments) *types.PaginatedSegments
PaginateSegments paginate a list of segments.
func (*Pagination) PaginateStrings ¶
func (p *Pagination) PaginateStrings(a []string) []string
PaginateStrings paginates a list of strings.
type SegmentFilter ¶
type SegmentFilter struct {
Pagination `json:"pagination"`
// Map IDs the segments must have.
MapIDs []string `json:"mapIds" url:"mapIds,brackets"`
// Process name the segments must have.
Process string `json:"process" url:"process"`
// Step the segments must have.
Step string `json:"step" url:"step"`
// If true, selects only segments that don't have a parent.
WithoutParent bool `json:"withoutParent" url:"withoutParent"`
// A previous link hash the segments must have.
PrevLinkHash chainscript.LinkHash `json:"prevLinkHash" url:"-"`
// A slice of linkHashes to search Segments.
LinkHashes []chainscript.LinkHash `json:"linkHashes" url:"-"`
// A link that should be referenced by the matching segments.
Referencing chainscript.LinkHash `json:"referencing" url:"-"`
// A slice of tags the segments must all contain.
Tags []string `json:"tags" url:"tags,brackets"`
// Flag to reverse segment ordering.
Reverse bool `json:"reverse" url:"reverse"`
}
SegmentFilter contains filtering options for segments.
func (SegmentFilter) Match ¶ added in v0.2.0
func (filter SegmentFilter) Match(segment *chainscript.Segment) bool
Match checks if segment matches with filter.
func (SegmentFilter) MatchLink ¶ added in v0.2.0
func (filter SegmentFilter) MatchLink(link *chainscript.Link) bool
MatchLink checks if link matches with filter.
type SegmentReader ¶ added in v0.2.0
type SegmentReader interface {
// Get a segment by link hash. Returns nil if no match is found.
// Will return link and evidences (if there are some in that store).
GetSegment(ctx context.Context, linkHash chainscript.LinkHash) (*chainscript.Segment, error)
// Find segments. Returns an empty slice if there are no results.
// Will return links and evidences (if there are some).
FindSegments(ctx context.Context, filter *SegmentFilter) (*types.PaginatedSegments, error)
// Get all the existing map IDs.
GetMapIDs(ctx context.Context, filter *MapFilter) ([]string, error)
}
SegmentReader is the interface for reading Segments from a store.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package storehttp is used to create an HTTP server from a store adapter.
|
Package storehttp is used to create an HTTP server from a store adapter. |
|
Package storetestcases defines test cases to test stores.
|
Package storetestcases defines test cases to test stores. |
|
Package storetesting defines helpers to test stores.
|
Package storetesting defines helpers to test stores. |