Documentation ¶
Index ¶
- Constants
- Variables
- func AssertPublicId(t *testing.T, prefix, actual string)
- func Clear(i interface{}, fields []string, depth int) error
- func GetGormLogFormatter(log hclog.Logger) func(values ...interface{}) (messages []interface{})
- func GetGormLogger(log hclog.Logger) gormLogger
- func InitDbInDocker(dialect string) (cleanup func() error, retURL, container string, err error)
- func InitStore(dialect string, cleanup func() error, url string) (bool, error)
- func IsCheckConstraintError(err error) bool
- func IsNotNullError(err error) bool
- func IsUniqueError(err error) bool
- func Migrate(connectionUrl string, migrationsDirectory string) error
- func NewPrivateId(prefix string) (string, error)
- func NewPublicId(prefix string) (string, error)
- func Open(dbType DbType, connectionUrl string) (*gorm.DB, error)
- func StartDbInDocker(dialect string) (cleanup func() error, retURL, container string, err error)
- func TestSetup(t *testing.T, dialect string) (*gorm.DB, string)
- func TestVerifyOplog(t *testing.T, r Reader, resourcePublicId string, opt ...TestOption) error
- func TestWrapper(t *testing.T) wrapping.Wrapper
- type Backoff
- type ConstBackoff
- type Db
- func (rw *Db) Create(ctx context.Context, i interface{}, opt ...Option) error
- func (rw *Db) CreateItems(ctx context.Context, createItems []interface{}, opt ...Option) error
- func (rw *Db) DB() (*sql.DB, error)
- func (rw *Db) Delete(ctx context.Context, i interface{}, opt ...Option) (int, error)
- func (rw *Db) DeleteItems(ctx context.Context, deleteItems []interface{}, opt ...Option) (int, error)
- func (w *Db) DoTx(ctx context.Context, retries uint, backOff Backoff, Handler TxHandler) (RetryInfo, error)
- func (rw *Db) Exec(sql string, values []interface{}, opt ...Option) (int, error)
- func (rw *Db) GetTicket(i interface{}) (*store.Ticket, error)
- func (rw *Db) LookupById(ctx context.Context, resourceWithIder interface{}, opt ...Option) error
- func (rw *Db) LookupByName(ctx context.Context, resource ResourceNamer, opt ...Option) error
- func (rw *Db) LookupByPublicId(ctx context.Context, resource ResourcePublicIder, opt ...Option) error
- func (rw *Db) LookupWhere(ctx context.Context, resource interface{}, where string, args ...interface{}) error
- func (rw *Db) Query(sql string, values []interface{}, opt ...Option) (*sql.Rows, error)
- func (rw *Db) ScanRows(rows *sql.Rows, result interface{}) error
- func (rw *Db) SearchWhere(ctx context.Context, resources interface{}, where string, args []interface{}, ...) error
- func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string, ...) (int, error)
- func (rw *Db) WriteOplogEntryWith(ctx context.Context, wrapper wrapping.Wrapper, ticket *store.Ticket, ...) error
- type DbType
- type ExpBackoff
- type OpType
- type Option
- func NewOplogMsg(msg *oplog.Message) Option
- func NewOplogMsgs(msgs *[]*oplog.Message) Option
- func WithFieldMaskPaths(paths []string) Option
- func WithLimit(limit int) Option
- func WithLookup(enable bool) Option
- func WithNullPaths(paths []string) Option
- func WithOplog(wrapper wrapping.Wrapper, md oplog.Metadata) Option
- func WithOrder(withOrder string) Option
- func WithSkipVetForWrite(enable bool) Option
- func WithVersion(version *uint32) Option
- func WithWhere(whereClause string, args ...interface{}) Option
- type Options
- type Reader
- type ResourceNamer
- type ResourcePrivateIder
- type ResourcePublicIder
- type RetryInfo
- type TestOption
- type TxHandler
- type VetForWriter
- type Writer
Constants ¶
const ( NoRowsAffected = 0 // DefaultLimit is the default for results for boundary DefaultLimit = 10000 )
const (
StdRetryCnt = 20
)
Variables ¶
var ( // ErrInvalidPublicId indicates an invalid PublicId. ErrInvalidPublicId = errors.New("invalid publicId") // ErrInvalidParameter is returned by create and update methods if // an attribute on a struct contains illegal or invalid values. ErrInvalidParameter = errors.New("invalid parameter") // ErrInvalidFieldMask is returned by update methods if the field mask // contains unknown fields or fields that cannot be updated. ErrInvalidFieldMask = errors.New("invalid field mask") // ErrEmptyFieldMask is returned by update methods if the field mask is // empty. ErrEmptyFieldMask = errors.New("empty field mask") // ErrNotUnique is returned by create and update methods when a write // to the repository resulted in a unique constraint violation. ErrNotUnique = errors.New("unique constraint violation") // ErrRecordNotFound returns a "record not found" error and it only occurs // when attempting to read from the database into struct. // When reading into a slice it won't return this error. ErrRecordNotFound = errors.New("record not found") // ErrMultipleRecords is returned by update and delete methods when a // write to the repository would result in more than one record being // changed resulting in the transaction being rolled back. ErrMultipleRecords = errors.New("multiple records") )
Errors returned from this package may be tested against these errors with errors.Is.
Functions ¶
func AssertPublicId ¶
AssertPublicId is a test helper that asserts that the provided id is in the format of a public id.
func Clear ¶
Clear sets fields in the value pointed to by i to their zero value. Clear descends i to depth clearing fields at each level. i must be a pointer to a struct. Cycles in i are not detected.
A depth of 2 will change i and i's children. A depth of 1 will change i but no children of i. A depth of 0 will return with no changes to i.
func GetGormLogFormatter ¶
func GetGormLogFormatter(log hclog.Logger) func(values ...interface{}) (messages []interface{})
func GetGormLogger ¶
func GetGormLogger(log hclog.Logger) gormLogger
func InitDbInDocker ¶
InitDbInDocker initializes the data store within docker or an existing
func InitStore ¶
InitStore will execute the migrations needed to initialize the store. It returns true if migrations actually ran; false if we were already current.
func IsCheckConstraintError ¶
IsCheckConstraintError returns a boolean indicating whether the error is known to report a check constraint violation.
func IsNotNullError ¶
IsNotNullError returns a boolean indicating whether the error is known to report a not-null constraint violation.
func IsUniqueError ¶
IsUniqueError returns a boolean indicating whether the error is known to report a unique constraint violation.
func NewPrivateId ¶
func NewPublicId ¶
NewPublicId creates a new public id with the prefix
func Open ¶
Open a database connection which is long-lived. You need to call Close() on the returned gorm.DB
func StartDbInDocker ¶
StartDbInDocker
func TestSetup ¶
setup the tests (initialize the database one-time and intialized testDatabaseURL). Do not close the returned db.
func TestVerifyOplog ¶
TestVerifyOplog will verify that there is an oplog entry. An error is returned if the entry or it's metadata is not found. Returning an error allows clients to test if an entry was not written, which is a valid use case.
Types ¶
type ConstBackoff ¶
type Db ¶
type Db struct {
// contains filtered or unexported fields
}
Db uses a gorm DB connection for read/write
func (*Db) Create ¶
Create an object in the db with options: WithOplog, NewOplogMsg and WithLookup. WithOplog will write an oplog entry for the create. NewOplogMsg will return in-memory oplog message. WithOplog and NewOplogMsg cannot be used together. WithLookup with to force a lookup after create.
func (*Db) CreateItems ¶
CreateItems will create multiple items of the same type. Supported options: WithOplog and WithOplogMsgs. WithOplog and WithOplogMsgs may not be used together. WithLookup is not a supported option.
func (*Db) Delete ¶
Delete an object in the db with options: WithOplog, NewOplogMsg, WithWhere. WithOplog will write an oplog entry for the delete. NewOplogMsg will return in-memory oplog message. WithOplog and NewOplogMsg cannot be used together. WithWhere allows specifying a constraint. Delete returns the number of rows deleted and any errors.
func (*Db) DeleteItems ¶
func (rw *Db) DeleteItems(ctx context.Context, deleteItems []interface{}, opt ...Option) (int, error)
DeleteItems will delete multiple items of the same type. Supported options: WithOplog and WithOplogMsgs. WithOplog and WithOplogMsgs may not be used together.
func (*Db) DoTx ¶
func (w *Db) DoTx(ctx context.Context, retries uint, backOff Backoff, Handler TxHandler) (RetryInfo, error)
DoTx will wrap the Handler func passed within a transaction with retries you should ensure that any objects written to the db in your TxHandler are retryable, which means that the object may be sent to the db several times (retried), so things like the primary key must be reset before retry
func (*Db) Exec ¶
Exec will execute the sql with the values as parameters. The int returned is the number of rows affected by the sql. No options are currently supported.
func (*Db) GetTicket ¶
GetTicket returns an oplog ticket for the aggregate root of "i" which can be used to WriteOplogEntryWith for that aggregate root.
func (*Db) LookupById ¶
LookupByPublicId will lookup resource by its public_id or private_id, which must be unique. Options are ignored.
func (*Db) LookupByName ¶
LookupByName will lookup resource my its friendly name which must be unique
func (*Db) LookupByPublicId ¶
func (rw *Db) LookupByPublicId(ctx context.Context, resource ResourcePublicIder, opt ...Option) error
LookupByPublicId will lookup resource by its public_id, which must be unique. Options are ignored.
func (*Db) LookupWhere ¶
func (rw *Db) LookupWhere(ctx context.Context, resource interface{}, where string, args ...interface{}) error
LookupWhere will lookup the first resource using a where clause with parameters (it only returns the first one)
func (*Db) Query ¶
Query will run the raw query and return the *sql.Rows results. Query will operate within the context of any ongoing transaction for the db.Reader. The caller must close the returned *sql.Rows. Query can/should be used in combination with ScanRows.
func (*Db) SearchWhere ¶
func (rw *Db) SearchWhere(ctx context.Context, resources interface{}, where string, args []interface{}, opt ...Option) error
SearchWhere will search for all the resources it can find using a where clause with parameters. Supports the WithLimit option. If WithLimit < 0, then unlimited results are returned. If WithLimit == 0, then default limits are used for results. Supports the WithOrder option.
func (*Db) Update ¶
func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string, setToNullPaths []string, opt ...Option) (int, error)
Update an object in the db, fieldMask is required and provides field_mask.proto paths for fields that should be updated. The i interface parameter is the type the caller wants to update in the db and its fields are set to the update values. setToNullPaths is optional and provides field_mask.proto paths for the fields that should be set to null. fieldMaskPaths and setToNullPaths must not intersect. The caller is responsible for the transaction life cycle of the writer and if an error is returned the caller must decide what to do with the transaction, which almost always should be to rollback. Update returns the number of rows updated.
Supported options: WithOplog, NewOplogMsg and WithVersion. WithOplog will write an oplog entry for the update. NewOplogMsg will return in-memory oplog message. WithOplog and NewOplogMsg cannot be used together. If WithVersion is used, then the update will include the version number in the update where clause, which basically makes the update use optimistic locking and the update will only succeed if the existing rows version matches the WithVersion option. Zero is not a valid value for the WithVersion option and will return an error.
func (*Db) WriteOplogEntryWith ¶
func (rw *Db) WriteOplogEntryWith(ctx context.Context, wrapper wrapping.Wrapper, ticket *store.Ticket, metadata oplog.Metadata, msgs []*oplog.Message, opt ...Option) error
WriteOplogEntryWith will write an oplog entry with the msgs provided for the ticket's aggregateName. No options are currently supported.
type ExpBackoff ¶
type ExpBackoff struct{}
type Option ¶
type Option func(*Options)
Option - how Options are passed as arguments.
func NewOplogMsg ¶
NewOplogMsg provides an option to ask for a new in-memory oplog message. The new msg will be returned in the provided *oplog.Message parameter. WithOplog and NewOplogMsg cannot be used together.
func NewOplogMsgs ¶
NewOplogMsgs provides an option to ask for multiple new in-memory oplog messages. The new msgs will be returned in the provided *[]oplog.Message parameter. NewOplogMsgs can only be used with write functions that operate on multiple items(CreateItems, DeleteItems). WithOplog and NewOplogMsgs cannot be used together.
func WithFieldMaskPaths ¶
WithFieldMaskPaths provides an option to provide field mask paths.
func WithLimit ¶
WithLimit provides an option to provide a limit. Intentionally allowing negative integers. If WithLimit < 0, then unlimited results are returned. If WithLimit == 0, then default limits are used for results.
func WithNullPaths ¶
WithNullPaths provides an option to provide null paths.
func WithOplog ¶
WithOplog provides an option to write an oplog entry. WithOplog and NewOplogMsg cannot be used together.
func WithSkipVetForWrite ¶
WithSkipVetForWrite provides an option to allow skipping vet checks to allow testing lower-level SQL triggers and constraints
func WithVersion ¶
WithVersion provides an option version number for update operations.
type Options ¶
type Options struct { // WithLimit must be accessible in other packages. WithLimit int // WithFieldMaskPaths must be accessible from other packages. WithFieldMaskPaths []string // WithNullPaths must be accessible from other packages. WithNullPaths []string // WithVersion must be accessible from other packages. WithVersion *uint32 // contains filtered or unexported fields }
Options - how Options are represented.
type Reader ¶
type Reader interface { // LookupByName will lookup resource by its friendly name which must be unique LookupByName(ctx context.Context, resource ResourceNamer, opt ...Option) error // LookupById will lookup a resource by its primary key id, which must be // unique. The resourceWithIder must implement either ResourcePublicIder or // ResourcePrivateIder interface. LookupById(ctx context.Context, resourceWithIder interface{}, opt ...Option) error // LookupByPublicId will lookup resource by its public_id which must be unique. LookupByPublicId(ctx context.Context, resource ResourcePublicIder, opt ...Option) error // LookupWhere will lookup and return the first resource using a where clause with parameters LookupWhere(ctx context.Context, resource interface{}, where string, args ...interface{}) error // SearchWhere will search for all the resources it can find using a where // clause with parameters. Supports the WithLimit option. If // WithLimit < 0, then unlimited results are returned. If WithLimit == 0, then // default limits are used for results. SearchWhere(ctx context.Context, resources interface{}, where string, args []interface{}, opt ...Option) error // Query will run the raw query and return the *sql.Rows results. Query will // operate within the context of any ongoing transaction for the db.Reader. The // caller must close the returned *sql.Rows. Query can/should be used in // combination with ScanRows. Query(sql string, values []interface{}, opt ...Option) (*sql.Rows, error) // ScanRows will scan sql rows into the interface provided ScanRows(rows *sql.Rows, result interface{}) error // DB returns the sql.DB DB() (*sql.DB, error) }
Reader interface defines lookups/searching for resources
type ResourceNamer ¶
type ResourceNamer interface {
GetName() string
}
ResourceNamer defines an interface that LookupByName() can use to get the resource's friendly name
type ResourcePrivateIder ¶
type ResourcePrivateIder interface {
GetPrivateId() string
}
ResourcePrivateIder defines an interface that LookupById() can use to get the resource's private id.
type ResourcePublicIder ¶
type ResourcePublicIder interface {
GetPublicId() string
}
ResourcePublicIder defines an interface that LookupByPublicId() can use to get the resource's public id.
type TestOption ¶
type TestOption func(*testOptions)
TestOption - how Options are passed as arguments
func WithCreateNotBefore ¶
func WithCreateNotBefore(nbfDuration time.Duration) TestOption
WithCreateNotBefore provides an option to specify that the create time is not before (nbf) N seconds
func WithOperation ¶
func WithOperation(op oplog.OpType) TestOption
WithOperation provides an option to specify the operation type
type VetForWriter ¶
type VetForWriter interface {
VetForWrite(ctx context.Context, r Reader, opType OpType, opt ...Option) error
}
VetForWriter provides an interface that Create and Update can use to vet the resource before before writing it to the db. For optType == UpdateOp, options WithFieldMaskPath and WithNullPaths are supported. For optType == CreateOp, no options are supported
type Writer ¶
type Writer interface { // DoTx will wrap the TxHandler in a retryable transaction DoTx(ctx context.Context, retries uint, backOff Backoff, Handler TxHandler) (RetryInfo, error) // Update an object in the db, fieldMask is required and provides // field_mask.proto paths for fields that should be updated. The i interface // parameter is the type the caller wants to update in the db and its // fields are set to the update values. setToNullPaths is optional and // provides field_mask.proto paths for the fields that should be set to // null. fieldMaskPaths and setToNullPaths must not intersect. The caller // is responsible for the transaction life cycle of the writer and if an // error is returned the caller must decide what to do with the transaction, // which almost always should be to rollback. Update returns the number of // rows updated or an error. Supported options: WithOplog. Update(ctx context.Context, i interface{}, fieldMaskPaths []string, setToNullPaths []string, opt ...Option) (int, error) // Create an object in the db with options: WithOplog // the caller is responsible for the transaction life cycle of the writer // and if an error is returned the caller must decide what to do with // the transaction, which almost always should be to rollback. Create(ctx context.Context, i interface{}, opt ...Option) error // CreateItems will create multiple items of the same type. // Supported options: WithOplog and WithOplogMsgs. WithOplog and // WithOplogMsgs may not be used together. WithLookup is not a // supported option. The caller is responsible for the transaction life // cycle of the writer and if an error is returned the caller must decide // what to do with the transaction, which almost always should be to // rollback. CreateItems(ctx context.Context, createItems []interface{}, opt ...Option) error // Delete an object in the db with options: WithOplog // the caller is responsible for the transaction life cycle of the writer // and if an error is returned the caller must decide what to do with // the transaction, which almost always should be to rollback. Delete // returns the number of rows deleted or an error. Delete(ctx context.Context, i interface{}, opt ...Option) (int, error) // DeleteItems will delete multiple items of the same type. // Supported options: WithOplog and WithOplogMsgs. WithOplog and // WithOplogMsgs may not be used together. The caller is responsible for the // transaction life cycle of the writer and if an error is returned the // caller must decide what to do with the transaction, which almost always // should be to rollback. Delete returns the number of rows deleted or an error. DeleteItems(ctx context.Context, deleteItems []interface{}, opt ...Option) (int, error) // DB returns the sql.DB DB() (*sql.DB, error) // Exec will execute the sql with the values as parameters. The int returned // is the number of rows affected by the sql. No options are currently // supported. Exec(sql string, values []interface{}, opt ...Option) (int, error) // GetTicket returns an oplog ticket for the aggregate root of "i" which can // be used to WriteOplogEntryWith for that aggregate root. GetTicket(i interface{}) (*store.Ticket, error) // WriteOplogEntryWith will write an oplog entry with the msgs provided for // the ticket's aggregateName. No options are currently supported. WriteOplogEntryWith( ctx context.Context, wrapper wrapping.Wrapper, ticket *store.Ticket, metadata oplog.Metadata, msgs []*oplog.Message, opt ...Option, ) error }
Writer interface defines create, update and retryable transaction handlers
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package dbassert provides a set of assertions for testing the boundary database applications.
|
Package dbassert provides a set of assertions for testing the boundary database applications. |
common package contains functions from internal/db which need to be shared commonly with other packages that have a cyclic dependency on internal/db like internal/oplog.
|
common package contains functions from internal/db which need to be shared commonly with other packages that have a cyclic dependency on internal/db like internal/oplog. |
Package db_test provides some helper funcs for testing db integrations
|
Package db_test provides some helper funcs for testing db integrations |
Code generated by "make migrations"; DO NOT EDIT.
|
Code generated by "make migrations"; DO NOT EDIT. |