Documentation
¶
Index ¶
- Constants
- Variables
- func RegisterStoreType(storeType string, ctor StoreConstructor)
- func RootIndexID(userID string, accessLevel model.AccessLevel) string
- type AssetRecordVisitor
- type AssetState
- type Client
- type EncryptionMode
- type Index
- type LockerState
- type Option
- type Options
- type Properties
- type RecordState
- type RecordVisitor
- type RootIndex
- type RootIndexParameters
- type Store
- type StoreConfig
- type StoreConstructor
- type StoreProperties
- type VariantRecordState
- type VariantVisitor
- type Writer
Constants ¶
const (
TypeRoot = "idx:root"
)
Variables ¶
var ( ErrIndexNotFound = errors.New("index not found") ErrIndexExists = errors.New("index already exists") ErrIndexStoreNotFound = errors.New("index store not found") ErrLockerStateNotFound = errors.New("locker state not found") ErrLockerStateExists = errors.New("locker state already exists") )
Functions ¶
func RegisterStoreType ¶
func RegisterStoreType(storeType string, ctor StoreConstructor)
func RootIndexID ¶
func RootIndexID(userID string, accessLevel model.AccessLevel) string
Types ¶
type AssetRecordVisitor ¶
type AssetRecordVisitor func(recordID string, r *AssetState) error
type AssetState ¶
type AssetState struct {
ImpressionID string `json:"impression"`
AssetID string `json:"asset"`
ContentType string `json:"contentType"`
RevisionNumber int64 `json:"revisionNumber,omitempty"`
WasRevisionOf string `json:"wasRevisionOf,omitempty"`
SpecializationOf string `json:"specializationOf,omitempty"`
}
func (*AssetState) Bytes ¶
func (as *AssetState) Bytes() []byte
type Client ¶
type Client interface {
io.Closer
// Bind links all underlying index states to a specific genesis block hash. If any of the stores
// were already linked to a different hash, the call would fail.
Bind(ctx context.Context, gbHash string) error
// RootIndex returns a root index for the given account and requested access level.
// If the index is not found, it will return ErrIndexNotFound.
RootIndex(ctx context.Context, userID string, lvl model.AccessLevel) (RootIndex, error)
// Index returns an index with the given id for the given account.
// If the index is not found, it will return ErrIndexNotFound.
Index(ctx context.Context, userID string, id string) (Index, error)
// ListIndexes return a list of index definitions for all the indexes that are available
// through this index client. We return a list of Properties to avoid construction of
// all index instances that may be an expensive operation.
ListIndexes(ctx context.Context, userID string) ([]*Properties, error)
// DeleteIndex deletes the index from all the underlying index stores.
DeleteIndex(ctx context.Context, userID, id string) error
// IndexStore returns the index store with the given name.
// If the store is not found, it will return ErrIndexStoreNotFound
IndexStore(ctx context.Context, storeName string) (Store, error)
// IndexStores return a list of index store definitions for all the stores that are available
// through this index client. We return a list of StoreProperties to avoid construction of
// all store instances that may be an expensive operation.
IndexStores(ctx context.Context) []*StoreProperties
// AddIndexStore instantiates and adds a new index store based on the provided configuration.
AddIndexStore(ctx context.Context, cfg *StoreConfig, resolver cmdbase.ParameterResolver) error
}
Client provides an interface to a group of index stores, accessed using a priority list. It hides the implementation details of the store types available, and actual location of the index stores.
func NewLocalIndexClient ¶
func NewLocalIndexClient(ctx context.Context, storeConfigs []*StoreConfig, resolver cmdbase.ParameterResolver, genesisBlockHash string) (Client, error)
type EncryptionMode ¶
type EncryptionMode string
const ( ModeNoEncryption EncryptionMode = "none" ModeManagedEncryption EncryptionMode = "managed" ModeClientEncryption EncryptionMode = "client" )
type Index ¶
type Index interface {
io.Closer
ID() string
Properties() *Properties
IsLocked() bool
Unlock(key []byte) error
Lock()
IsWritable() bool
Writer() (Writer, error)
}
Index is a database or any other storage system that provided an index of all or selected ledger records for easy and efficient access. Indexes can be generic or purpose-built.
type LockerState ¶
type LockerState struct {
ID string `json:"id"`
IndexID string `json:"indexID"`
AccountID string `json:"accountID"`
FirstBlock uint64 `json:"firstBlock,omitempty"`
TopBlock uint64 `json:"topBlock,omitempty"`
}
func (*LockerState) Bytes ¶
func (ls *LockerState) Bytes() []byte
type Options ¶
type Options struct {
ClientKey []byte `json:"key,omitempty"`
Parameters any `json:"parameters,omitempty"`
}
func NewOptions ¶
NewOptions reads Options from Option array
type Properties ¶
type RecordState ¶
type RecordState struct {
ID string `json:"id"`
Operation model.OpType `json:"op"`
Status model.RecordStatus `json:"status"`
LockerID string `json:"locker"`
ParticipantID string `json:"participant"`
BlockNumber uint64 `json:"blockNumber"`
Index uint32 `json:"index"`
ImpressionID string `json:"impression,omitempty"`
ContentType string `json:"contentType,omitempty"`
}
func (*RecordState) Bytes ¶
func (rs *RecordState) Bytes() []byte
type RecordVisitor ¶
type RecordVisitor func(r *RecordState) error
type RootIndex ¶
type RootIndex interface {
Index
GetRecord(ctx context.Context, recordID string) (*RecordState, error)
TraverseRecords(ctx context.Context, lockerFilter, participantFilter string, vFunc RecordVisitor, maxRecords uint64) error
TraverseVariants(ctx context.Context, lockerFilter, participantFilter string, vFunc VariantVisitor, includeHistory bool, maxVariants uint64) error
TraverseAssetRecords(ctx context.Context, assetID string, vFunc AssetRecordVisitor, maxRecords uint64) error
GetRecordsByImpressionID(ctx context.Context, impID string, lockerFilter map[string]bool) ([]string, error)
GetVariant(ctx context.Context, variantID string, includeHistory bool) (*VariantRecordState, []*VariantRecordState, error)
}
RootIndex is a special type of index used by data wallets to provide fast access to ledger records and facilitate generic operations over available lockers and records.
type RootIndexParameters ¶
type RootIndexParameters struct {
ClientKey []byte `json:"key,omitempty"`
}
type Store ¶
type Store interface {
io.Closer
ID() string
Name() string
Properties() *StoreProperties
CreateIndex(ctx context.Context, userID string, indexType string, accessLevel model.AccessLevel, opts ...Option) (Index, error)
RootIndex(ctx context.Context, userID string, lvl model.AccessLevel) (RootIndex, error)
Index(ctx context.Context, userID string, id string) (Index, error)
ListIndexes(ctx context.Context, userID string) ([]*Properties, error)
DeleteIndex(ctx context.Context, userID, id string) error
// Bind links the index store to a particular ledger instance by storing genesis block ID in the store.
// If the store is already bound to a ledger, if will check the provided hash and return an error
// if there is a mismatch. This is useful to catch conditions when the index store was used
// in the context of a different ledger (i.e. in the development environment.
Bind(ctx context.Context, gbHash string) error
GenesisBlockHash(ctx context.Context) string
}
Store is a facility that can store indexes. Typically, a store is based on a specific database or storage technology that provides the desired runtime properties.
func CreateStore ¶
func CreateStore(cfg *StoreConfig, resolver cmdbase.ParameterResolver) (Store, error)
type StoreConfig ¶
type StoreConfig struct {
ID string `koanf:"id" json:"id"`
Name string `koanf:"name" json:"name"`
Type string `koanf:"type" json:"type"`
EncryptionMode EncryptionMode `koanf:"encryptionMode" json:"encryptionMode"`
Rebind bool `koanf:"rebind" json:"rebind"`
Params map[string]any `koanf:"params" json:"params,omitempty"`
}
type StoreConstructor ¶
type StoreConstructor func(cfg *StoreConfig, resolver cmdbase.ParameterResolver) (Store, error)
type StoreProperties ¶
type StoreProperties struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
EncryptionMode EncryptionMode `json:"encryptionMode"`
}
func NewStorePropertiesFromConfig ¶
func NewStorePropertiesFromConfig(cfg *StoreConfig) *StoreProperties
type VariantRecordState ¶
type VariantRecordState struct {
ID string `json:"id"`
Operation model.OpType `json:"op"`
Status model.RecordStatus `json:"status"`
LockerID string `json:"locker"`
ParticipantID string `json:"participant"`
BlockNumber uint64 `json:"block"`
Index uint32 `json:"index"`
AssetID string `json:"asset"`
ImpressionID string `json:"imp"`
RevisionNumber int64 `json:"rev"`
CreatedAt *time.Time `json:"at"`
ContentType string `json:"ctype"`
}
func (*VariantRecordState) Bytes ¶
func (rs *VariantRecordState) Bytes() []byte
type VariantVisitor ¶
type VariantVisitor func(variantID string, master *VariantRecordState, history []*VariantRecordState) error
type Writer ¶
type Writer interface {
io.Closer
ID() string
LockerStates(ctx context.Context) ([]LockerState, error)
AddLockerState(ctx context.Context, accountID, lockerID string, firstBlock uint64) error
AddLease(ctx context.Context, ds model.DataSet, effectiveBlockNumber uint64) error
AddLeaseRevocation(ctx context.Context, ds model.DataSet) error
UpdateTopBlock(ctx context.Context, blockNumber uint64) error
}
Writer is an interface for adding new records into an index.