database

package
v0.0.0-...-6aee27a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 24, 2024 License: MIT Imports: 15 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func EvidenceToID

func EvidenceToID(e models.Evidence) int64

EvidenceToID is a small helper to grab the ID from a models.Evidence. Useful when paired with helpers.Map

func GetAllEvidenceForOperation

func GetAllEvidenceForOperation(db ConnectionProxy, operationID int64) ([]models.Evidence, error)

func GetEvidenceFromUUIDs

func GetEvidenceFromUUIDs(db ConnectionProxy, operationID int64, evidenceUUIDs []string) ([]models.Evidence, error)

func InputIsTooLongError

func InputIsTooLongError(err error) bool

InputIsTooLongError returns true if the passed error is a database error resulting from attempting to insert a row that exceeds the max length of a column

func InputIsTooLongErrorSq

func InputIsTooLongErrorSq(err error) bool

When updating a row using sq, the above function InputIsTooLongError won't work (because extra text is appended to the error message) so this function manually checks for error code 1406

func IsAlreadyExistsError

func IsAlreadyExistsError(err error) bool

IsAlreadyExistsError returns true if the passed error is a database error resulting from attempting to insert a row with a unique/primary key that already exists

func IsAlreadyExistsErrorSq

func IsAlreadyExistsErrorSq(err error) bool

When updating a row using sq, the above function isAlreadyExistsError won't work (because extra text is appended to the error message) so this function manually checks for error code 1062

func IsEmptyResultSetError

func IsEmptyResultSetError(err error) bool

IsEmptyResultSetError returns true if the passed error is a database error resulting from querying a table expecting 1 row (with db.Get) but recieving 0

Types

type Connection

type Connection struct {
	DB   *sql.DB
	Sqlx *sqlx.DB
	// contains filtered or unexported fields
}

Connection contains the infrastructure needed to manage the database connection

func NewConnection

func NewConnection(dsn string, migrationsDirPath string) (*Connection, error)

NewConnection establishes a new connection to the databse server

func NewTestConnection

func NewTestConnection(t *testing.T, dbName string) *Connection

NewTestConnection creates a new empty database, and applies for integration/service tests

func NewTestConnectionFromNonStandardMigrationPath

func NewTestConnectionFromNonStandardMigrationPath(t *testing.T, dbName, migrationsDirPath string) *Connection

NewTestConnectionFromNonStandardMigrationPath is identical to NewTestConnection, but allows the user to specify where the migrations dir is

func (*Connection) BatchInsert

func (c *Connection) BatchInsert(tableName string, count int, mapFn func(int) map[string]interface{}, onDuplicates ...interface{}) error

BatchInsert is similar to Insert, but instead is designed for multiple inserts. Note that only a single SQL query is run here.

Parameters:

tableName: the name of the target table count: the number of items needed to insert mapFn: A function that produces a single set of values for a new database row.

Note that this will be called <count> times

Returns: an error if the insert fails

func (*Connection) CheckSchema

func (c *Connection) CheckSchema() error

CheckSchema checks the database schema against the migrations and returns an error if they don't match

func (*Connection) Delete

func (c *Connection) Delete(dq squirrel.DeleteBuilder) error

Delete removes records indicated by the given DeleteBuilder

func (*Connection) Exec

func (c *Connection) Exec(query string, values ...interface{}) error

Exec wraps sqlx.Exec, adding multi-value support and query logging

func (*Connection) FailIfTransaction

func (*Connection) FailIfTransaction(err error)

func (*Connection) Get

func (c *Connection) Get(model interface{}, sb squirrel.SelectBuilder) error

Get executes the provided SelectBuilder query, and marshals the response into the provided structure. Note: this is for retriving a single value -- i.e. not a row, but a cell

func (*Connection) Insert

func (c *Connection) Insert(tableName string, valueMap map[string]interface{}, onDuplicates ...interface{}) (int64, error)

Insert provides a generic way to insert a single row into the database. The function expects the table to insert into as well as a map of columnName : columnValue. Also assumes that created_at and updated_at columns exist (And are updated with the current time) Returns the inserted record id, or an error if the insert fails

func (*Connection) MigrateUp

func (c *Connection) MigrateUp() error

MigrateUp performs all migrations

func (*Connection) NewTransaction

func (c *Connection) NewTransaction(ctx context.Context) (*Transactable, error)

NewTransaction creates a new Transactable, which can then be used to execute queries in that transaction. Note that this is NOT the preferred method. Typically, the WithTx method should be used, as this will ensure that no db resources are lost.

func (*Connection) RetrieveUserByID

func (c *Connection) RetrieveUserByID(userID int64) (models.User, error)

RetrieveUserByID retrieves a full user from the users table given a user ID

func (*Connection) RetrieveUserBySlug

func (c *Connection) RetrieveUserBySlug(slug string) (models.User, error)

RetrieveUserBySlug retrieves a full user from the users table give a user slug

func (*Connection) RetrieveUserIDByAuthnID

func (c *Connection) RetrieveUserIDByAuthnID(authn_id string) (models.User, error)

RetrieveUserIDByAuthnID retrieves a full user from a given authn ID

func (*Connection) RetrieveUserIDBySlug

func (c *Connection) RetrieveUserIDBySlug(slug string) (int64, error)

RetrieveUserIDBySlug retrieves a user's ID from a given slug. Likely faster than retriving the full record, so this is preferred if all you need to the slug/id conversion

func (*Connection) RetrieveUserWithAuthDataByID

func (c *Connection) RetrieveUserWithAuthDataByID(userID int64) (models.UserWithAuthData, error)

RetrieveUserWithAuthDataByID retrieves a full user from the users table given that user's ID. Includes data from the auth_scheme_data table (namely, scheme names)

func (*Connection) RetrieveUserWithAuthDataBySlug

func (c *Connection) RetrieveUserWithAuthDataBySlug(slug string) (models.UserWithAuthData, error)

RetrieveUserWithAuthDataBySlug retrieves a full user from the users table given a slug. Includes data from the auth_scheme_data table (namely, scheme names)

func (*Connection) Select

func (c *Connection) Select(modelSlice interface{}, sb squirrel.SelectBuilder) error

Select executes the provided SelectBuilder query, and marshals the response into the provided slice. Note: this is for retriving multiple results, or "rows"

func (*Connection) SelectRaw

func (c *Connection) SelectRaw(modelSlice interface{}, query string) error

SelectRaw executes a raw SQL string Note: this is for retriving multiple results, or "rows"

func (*Connection) Update

func (c *Connection) Update(ub squirrel.UpdateBuilder) error

Update executes the provided UpdateBuilder, in addition to the "updated_at" field, using the server time.

func (*Connection) WithTx

func (c *Connection) WithTx(ctx context.Context, fn func(tx *Transactable)) error

WithTx provides a scoped route to executing queries inside a transaction. Simply pass a function that uses the provided transaction to this method. At the end of the function, Commit will be called, which will either apply those actions to the database, or roll them back to the initial state

Note 1: The provided function will not _necessarily_ be called. In situations where a transaction cannot be created, the function will be bypassed. Note 2: If the provided function needs to be exited early, you can call Rollback or Commit to ensure the desired outcome, and then return from the function as usual. Note 3: any error enountered after a db action will automatically trigger a rollback

type ConnectionProxy

type ConnectionProxy interface {
	Select(modelSlice interface{}, builder sq.SelectBuilder) error
	Get(model interface{}, builder sq.SelectBuilder) error
	// Exec(query string, values ...interface{}) error // not consistent between Transactable and Connection
	Insert(table string, valueMap map[string]interface{}, onDuplicates ...interface{}) (int64, error)
	BatchInsert(tableName string, count int, mapFn func(int) map[string]interface{}, onDuplicates ...interface{}) error
	Update(builder sq.UpdateBuilder) error
	Delete(builder sq.DeleteBuilder) error
	WithTx(ctx context.Context, fn func(tx *Transactable)) error
	// FailIfTransaction tries to call FailTransaction if the underlying connection is a Transactable.
	// Does nothing if the connection is a Connection
	FailIfTransaction(err error)
}

ConnectionProxy provides an interface into the database, using either an underlying connection, or a transaction. This is compatible with both Connection and Transactable types

type Transactable

type Transactable struct {
	// contains filtered or unexported fields
}

Transactable is a wrapped sql.Tx (sql transaction). It provides two pieces of functionality. First: It allows execution of standard sql methods. These are all done in a transaction, on a single connection to the database -- the result being that either all of the queries succeed, or none of them do. Ultimately, this helps prevent the database from getting into an inconsistent state Second: this structure helps track errors that occur during the execution process. Any error that occurs during this processing is recorded, and can be retrieved by using the Error method. Internally, this is also used to determine whether we should commit the changes, or roll them back. Note that any error that occurs short-circuits any other call to be a no-op (except Rollback and Commit)

func (*Transactable) BatchInsert

func (tx *Transactable) BatchInsert(tableName string, count int, mapFn func(int) map[string]interface{}, onDuplicates ...interface{}) error

BatchInsert executes a SQL INSERT query, for multiple value sets. This executes only a single query, but allows the caller to provide multiple db rows. The mapFn parameter should return back data for the i'th row to be added Returns an error if an error has been encountered.

func (*Transactable) Commit

func (tx *Transactable) Commit() error

Commit attempts to apply the transaction to the database. If an error has been encountered, this method will instead attempt to rollback the transaction. An error is returned if any part of the transaction failed to execute, including the commit itself.

func (*Transactable) Delete

func (tx *Transactable) Delete(dq squirrel.DeleteBuilder) error

Delete executes a SQL DELETE query

func (*Transactable) Error

func (tx *Transactable) Error() error

Error retrieves the recorded error, if any (nil otherwise)

func (*Transactable) Exec

func (tx *Transactable) Exec(s squirrel.Sqlizer) error

Exec exectues any SQL query. Used primarily in situations where you need to interact with the dbms directly, or in rare situations where squirrel does not provide sufficient query modeling capability

func (*Transactable) FailIfTransaction

func (tx *Transactable) FailIfTransaction(err error)

func (*Transactable) FailTransaction

func (tx *Transactable) FailTransaction(err error)

FailTransaction marks the transaction as failed without issuing a rollback. This is useful when used with WithTx, since that manages commits and rollbacks

func (*Transactable) Get

func (tx *Transactable) Get(model interface{}, sb squirrel.SelectBuilder) error

Get executes a SQL SELECT query given a reference to the database model and the squirrel SelectBuilder that returns a single row. If no rows are returned, or multiple rows are returned from the SQL query, an error is returned from this method.

func (*Transactable) Insert

func (tx *Transactable) Insert(tableName string, valueMap map[string]interface{}, onDuplicates ...interface{}) (int64, error)

Insert executes a SQL INSERT query, given the tablename along with a columnName:value map. Returns the new row ID added (via LastInsertId), along with an error, if one was encountered

func (*Transactable) Rollback

func (tx *Transactable) Rollback() error

Rollback aborts the transaction, in effect rolling the database back to its initial state. Returns an error if the rollback encounters an error itself

func (*Transactable) Select

func (tx *Transactable) Select(modelSlice interface{}, sb squirrel.SelectBuilder) error

Select executes a SQL SELECT query, given the provided squirrel SelectBuilder and a reference to the database model. Results will be stored in the reference if any rows are returned.

func (*Transactable) SelectRaw

func (tx *Transactable) SelectRaw(modelSlice interface{}, query string) error

SelectRaw executes a raw SQL string Note: this is for retriving multiple results, or "rows"

func (*Transactable) SelectRawWithIntArg

func (tx *Transactable) SelectRawWithIntArg(modelSlice interface{}, query string, intVal int64) error

SelectRaw executes a raw SQL string with args Note: this is for retriving multiple results, or "rows"

func (*Transactable) Update

func (tx *Transactable) Update(ub squirrel.UpdateBuilder) error

Update executes a SQL UPDATE query, and sets the updated_at column to the server time

func (*Transactable) WithTx

func (tx *Transactable) WithTx(ctx context.Context, fn func(tx *Transactable)) error

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL