Documentation
¶
Overview ¶
Package repo provides a repository model that assumes the use of SQL. Enumeration [DB_type] specifies the type of SQL database, which for¨ now is always SQLite.
The (as yet unimplemented) goal is to use generics to provide a CRUD-style interface for every "interesting", persistent struct.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type DBBackups ¶
type DBBackups interface {
MoveToBackup() (string, error)
CopyToBackup() (string, error)
RestoreFromMostRecentBackup() (string, error)
}
DBBackups methods work with locations, whose type (filepath, dir path, or URI/URL) and naming convention (incorporating date & time) are determined by the implementation for each DB. Methods exist to move DB to, copy DB to, or restore DB from a location. Each method returns the location of the new backup or restored-from backup.
It defines methods on a (probably empty) singleton that selects (for now: only) SQLite implementations of this interface.
At the CLI?
- sqlite3 my_database.sq3 ".backup 'backup_file.sq3'"
- sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
- sqlite3 my_database .backup > my_database.back
.
type DBEntity ¶
type DBEntity interface {
Handle() *sql.DB // (noun) the handle to the DB
Type() D.DB_type // DB_SQLite ("sqlite", equiv.to "sqlite3")
Path() string // file/URL (or dir/URL, if uses multiple files)
IsURL() bool // false for a local SQLite file
IsSingleFile() bool // true for SQLite
}
DBEntity provides realization-related operations for databases.
It defines methods on a (probably empty) singleton that selects (for now: only) SQLite implementations of this interface. .
type DBGetting ¶
type DBGetting interface {
OpenAtPath(string) (string, error)
NewAtPath(string) (string, error)
OpenExistingAtPath(string) (string, error)
}
DBGetting has methods to create / find / open databases.
The default action is to call OpenAtPath, which then selects one of the other two.
It defines methods on a (probably empty) singleton that selects (for now: only) SQLite implementations of this interface.
.
type DBImplementation ¶
type GenericRepo ¶
type QueryRunner ¶
type QueryRunner interface {
RunQuery0(*RU.QuerySpec) (any, error) // ie. Exec()
RunQuery1(*RU.QuerySpec) (any, error) // One row, like by_ID
RunQueryN(*RU.QuerySpec) ([]any, error) // Multiple rows
}
QueryRunner runs queries!
https://github.com/golang/go/wiki/SQLInterface
- ExecContext is used when no rows are returned ("0")
- QueryContext is used for retrieving rows ("N")
- QueryRowContext is used where only a single row is expected ("1")
.
type RepoAppTables ¶
type RepoAppTables interface {
// SetAppTables specifies the schemata of the specified app's
// tables, which this interface creates and/or manages. Multiple
// calls, whether with tables previously specified or not before
// seen do not conflict; if a table name is repeated but with a
// different schema, the result is undefined.
SetAppTables(string, []RU.TableDescriptor) error
// EmptyAllTables deletes (app-level) data from the app's tables
// but does not delete any tables (i.e. no DROP TABLE are done).
EmptyAppTables() error
// CreateTables creates the app's tables per already-supplied
// schema(ta); if the tables exist, they are emptied of data.
CreateAppTables() error
}
RepoAppTables is table-related methods for a specified app's schema. The app name is case-insensitive, and used as all lower case, and prefixed to table names as "appname_". If the app name is left blank (""), a default namespace is used and no prefix is added to table names.
type SessionLifecycle ¶
type SessionLifecycle interface {
// Open is called on an existing repo file, and can be called
// multiple times in a sessions, so it should not pragma-style
// initialization; however, options passed in the connection
// string (such as SQLite's "...?foreign_keys=on") are kosher.
Open() error
// TODO:? return it, for use or understanding
// InitString() string
// IsOpen pings the DB as a health check.
IsOpen() bool
// Verify runs app-level sanity & consistency checks (but things
// like foreign key integtrity should be delegated to DB setup).
Verify() error
Flush() error
// Close remembers the path (like os.File does).
Close() error
}
SessionLifecycle is session lifecycle operations for databases.
Example ¶
ExampleSessionLifecycle tests (for SQLite) the interface:
- Open() error
- IsOpen() bool
- Verify() error
- Flush() error
- Close() error
.
package main
import (
"fmt"
RS "github.com/fbaube/reposqlite"
"io/ioutil"
"os"
)
func main() {
var F *os.File
// S implements repo.SessionLifecycle
var S *RS.SqliteRepo
var e error
// func TempFile(dir, pattern string) (f *os.File, err error)
F, e = ioutil.TempFile("", "*.db")
if e != nil {
panic(e)
}
// We would like to print out the path, but we
// can't, because it is random but the output
// has to be matched for the test to pass.
// fmt.Println("Path:", F.Name())
F.Close()
// Now the test begins.
S, e = RS.OpenRepoAtPath(F.Name())
if e != nil {
panic(e)
}
fmt.Printf("IsOpen #1: %t\n", S.IsOpen())
e = S.Verify()
if e != nil {
panic(e)
}
e = S.Close()
if e != nil {
panic(e)
}
fmt.Printf("IsOpen #2: %t\n", S.IsOpen())
}
Output: IsOpen #1: true IsOpen #2: false
type SimpleRepo ¶
type SimpleRepo interface {
DBImplementation // "sqlite"
DBEntity // path, open, isOpen, etc.
DBBackups // cp, mv, restoreFrom
SessionLifecycle // open, close, etc.
StatementBuilder // using struct RU.QuerySpec
QueryRunner // return 0,1,N rows
}
SimpleRepo can be fully described by
- a filepath or a URL, which may be either relative or absolute, plus
- the ImplementationName
Each field in the struct can be a ptr, and all can (for example) point to the same single object.
A SimpleRepo is expected to implement DBBackups. .
type StatementBuilder ¶
type TypedRepoer ¶
type TypedRepoer[T any] interface { Add(T) (int, error) Mod(T) error Del(T) error GetByID(int) error ModByID(int) error DelByID(int) error GetAll() ([]T, []error) AddAll([]T) ([]int, []error) ModAll([]T) ([]T, []error) DelAll([]T) []error DelAllByID([]int) []error }
TypedRepoer does
- Get (Retrieve,find,list)
- Add (Create,save,store)
- Mod (Update,modify)
- Del (Delete,remove)