Documentation
¶
Index ¶
- func JoinColumnName(cns []ColumnName, sep string, format string) string
- func MakeErrSQLRow(err error) sql.Row
- func MakeSQLRowsIterator[T any](rows sqlRows, mapper SQLRowMapper[T]) iterators.Iterator[T]
- type ColumnName
- type Connection
- type ConnectionAdapter
- func (c ConnectionAdapter[DB, TX]) BeginTx(ctx context.Context) (context.Context, error)
- func (c ConnectionAdapter[DB, TX]) Close() error
- func (c ConnectionAdapter[DB, TX]) CommitTx(ctx context.Context) error
- func (c ConnectionAdapter[DB, TX]) ExecContext(ctx context.Context, query string, args ...any) (Result, error)
- func (c ConnectionAdapter[DB, TX]) QueryContext(ctx context.Context, query string, args ...any) (Rows, error)
- func (c ConnectionAdapter[DB, TX]) QueryRowContext(ctx context.Context, query string, args ...any) Row
- func (c ConnectionAdapter[DB, TX]) RollbackTx(ctx context.Context) error
- type DTO
- type MapScan
- type Mapping
- type Queryable
- type QueryableAdapter
- func (a QueryableAdapter[T]) ExecContext(ctx context.Context, query string, args ...any) (Result, error)
- func (a QueryableAdapter[T]) QueryContext(ctx context.Context, query string, args ...any) (Rows, error)
- func (a QueryableAdapter[T]) QueryRowContext(ctx context.Context, query string, args ...any) Row
- type Result
- type Row
- type Rows
- type SQLRowMapper
- type SQLRowMapperFunc
- type ScanFunc
- type Scanner
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func JoinColumnName ¶
func JoinColumnName(cns []ColumnName, sep string, format string) string
func MakeErrSQLRow ¶
func MakeSQLRowsIterator ¶
func MakeSQLRowsIterator[T any](rows sqlRows, mapper SQLRowMapper[T]) iterators.Iterator[T]
Types ¶
type ColumnName ¶
type ColumnName string
func SplitArgs ¶
func SplitArgs(cargs map[ColumnName]any) ([]ColumnName, []any)
type Connection ¶
type Connection interface { comproto.OnePhaseCommitProtocol Queryable io.Closer }
Connection represent an open connection. Connection will respect the transaction state in the received context.Context.
type ConnectionAdapter ¶
type ConnectionAdapter[DB, TX any] struct { // DB is the underlying Database type to access. // It is ideal if ConnectionAdapter used as the Connection type implementation, but you need access to not exposed functionalities. // // type Connection flsql.ConnectionAdapter[*sql.DB, *sql.Tx] // DB DB // TxAdapter provides the mapping for a native driver specific TX type to be usable as a Queryable. TxAdapter func(tx TX) Queryable // DBAdapter provides the mapping for a native driver specific DB type to be usable as a Queryable. DBAdapter func(db DB) Queryable // BeginFunc is a function that must create a new transaction that is also a connection. BeginFunc func(ctx context.Context) (TX, error) // CommitFunc is a function that must commit a given transaction. CommitFunc func(ctx context.Context, tx TX) error // Rollback is a function that must rollback a given transaction. Rollback func(ctx context.Context, tx TX) error // OnClose [optional] is used to implement the io.Closer. // If The ConnectionAdapter needs to close something, // then this function can be used for that. // // default: DB.Close() OnClose func() error // ErrTxDone is the error returned when the transaction is already finished. // ErrTxDone is an optional field. // // default: sql.ErrTxDone ErrTxDone error }
ConnectionAdapter is generic implementation to handle query interactions which are aware of trasnactions within the context.
Example:
type Connection = flsql.ConnectionAdapter[*sql.DB, *sql.Tx]
Example ¶
package main import ( "context" "database/sql" "os" "go.llib.dev/frameless/pkg/flsql" ) func main() { db, err := sql.Open("dbname", os.Getenv("DATABASE_URL")) if err != nil { panic(err) } _ = flsql.ConnectionAdapter[*sql.DB, *sql.Tx]{ DB: db, DBAdapter: flsql.QueryableSQL[*sql.DB], TxAdapter: flsql.QueryableSQL[*sql.Tx], BeginFunc: func(ctx context.Context) (*sql.Tx, error) { // TODO: integrate begin tx options return db.BeginTx(ctx, nil) }, CommitFunc: func(ctx context.Context, tx *sql.Tx) error { return tx.Commit() }, Rollback: func(ctx context.Context, tx *sql.Tx) error { return tx.Rollback() }, } }
func SQLConnectionAdapter ¶
SQLConnectionAdapter is a built-in ConnectionAdapter usage for the stdlib sql.DB/sql.Tx. This can be used with any sql driver that integartes with the sql stdlib.
Example ¶
package main import ( "database/sql" "os" "go.llib.dev/frameless/pkg/flsql" ) func main() { db, err := sql.Open("dbname", os.Getenv("DATABASE_URL")) if err != nil { panic(err) } _ = flsql.SQLConnectionAdapter(db) }
func (ConnectionAdapter[DB, TX]) Close ¶
func (c ConnectionAdapter[DB, TX]) Close() error
func (ConnectionAdapter[DB, TX]) CommitTx ¶
func (c ConnectionAdapter[DB, TX]) CommitTx(ctx context.Context) error
func (ConnectionAdapter[DB, TX]) ExecContext ¶
func (ConnectionAdapter[DB, TX]) QueryContext ¶
func (ConnectionAdapter[DB, TX]) QueryRowContext ¶
func (ConnectionAdapter[DB, TX]) RollbackTx ¶
func (c ConnectionAdapter[DB, TX]) RollbackTx(ctx context.Context) error
type DTO ¶ added in v0.236.0
DTO (Data Transfer Object) is an object used to transfer data between the database and your application. It acts as a bridge between the entity field types in your application and the table column types in your database, to making it easier to map data between them. This helps keep the data structure consistent when passing information between layers or systems.
type Mapping ¶
type Mapping[ENT, ID any] struct { // TableName is the name of the table in the database. TableName string // ToQuery suppose to return back with the column names that needs to be selected from the table, // and the corresponding scan function that // ctx enables you to accept custom query instructions through the context if you require that. ToQuery func(ctx context.Context) ([]ColumnName, MapScan[ENT]) // ToID will convert an ID into query components—specifically, // column names and their corresponding values—that represent the ID in an SQL WHERE statement. // If ID is nil, then ToID func(id ID) (map[ColumnName]any, error) // ToArgs converts an entity pointer into a list of query arguments for CREATE or UPDATE operations. // It must handle empty or zero values and still return a valid column statement. ToArgs func(ENT) (map[ColumnName]any, error) // CreatePrepare is an optional field that allows you to configure an entity prior to crud.Create call. // This is a good place to add support in your Repository implementation for custom ID injection or special timestamp value arrangement. // // To have this working, the user of Mapping needs to call Mapping.OnCreate method within in its crud.Create method implementation. CreatePrepare func(context.Context, *ENT) error // GetID [optional] is a function that allows the ID lookup from an entity. // // default: extid.Lookup GetID func(ENT) ID }
Mapping is a table mapping
Example ¶
package main import ( "context" "go.llib.dev/frameless/pkg/flsql" ) func main() { type ExampleEntity struct { ID int64 Col1 int Col2 string Col3 bool } _ = flsql.Mapping[ExampleEntity, int64]{ TableName: `"public"."entities"`, ToID: func(id int64) (map[flsql.ColumnName]any, error) { return map[flsql.ColumnName]any{"entity_id": id}, nil }, ToArgs: func(ee ExampleEntity) (map[flsql.ColumnName]any, error) { return map[flsql.ColumnName]any{ "entity_id": ee.ID, "col1": ee.Col1, "col2": ee.Col2, "col3": ee.Col3, }, nil }, ToQuery: func(ctx context.Context) ([]flsql.ColumnName, flsql.MapScan[ExampleEntity]) { return []flsql.ColumnName{"entity_id", "col1", "col2", "col3"}, func(ent *ExampleEntity, scan flsql.ScanFunc) error { return scan(&ent.ID, &ent.Col1, &ent.Col2, &ent.Col3) } }, } }
type Queryable ¶
type Queryable interface { ExecContext(ctx context.Context, query string, args ...any) (Result, error) QueryContext(ctx context.Context, query string, args ...any) (Rows, error) QueryRowContext(ctx context.Context, query string, args ...any) Row }
func QueryableSQL ¶
func QueryableSQL[SQLQ sqlQueryable](q SQLQ) Queryable
type QueryableAdapter ¶
type QueryableAdapter[T any] struct { V T ExecFunc func(ctx context.Context, query string, args ...any) (Result, error) QueryFunc func(ctx context.Context, query string, args ...any) (Rows, error) QueryRowFunc func(ctx context.Context, query string, args ...any) Row }
func (QueryableAdapter[T]) ExecContext ¶
func (QueryableAdapter[T]) QueryContext ¶
func (QueryableAdapter[T]) QueryRowContext ¶
type Rows ¶
type Rows interface { // Closer is the interface that wraps the basic Close method. io.Closer // Err returns any error that occurred while reading. Err() error // Next prepares the next row for reading. It returns true if there is another // row and false if no more rows are available. It automatically closes rows // when all rows are read. Next() bool // Scan reads the values from the current row into dest values positionally. // dest can include pointers to core types, values implementing the Scanner // interface, and nil. nil will skip the value entirely. It is an error to // call Scan without first calling Next() and checking that it returned true. Scan(dest ...any) error }
type SQLRowMapper ¶
type SQLRowMapperFunc ¶
func (SQLRowMapperFunc[T]) Map ¶
func (fn SQLRowMapperFunc[T]) Map(s Scanner) (T, error)