39 lines
731 B
Go
39 lines
731 B
Go
package database
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"net/url"
|
|
"strings"
|
|
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
type Engine struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func connect(dbURL string) (*sql.DB, error) {
|
|
dbU, err := url.Parse(dbURL)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse database URL: %w", err)
|
|
}
|
|
|
|
return sql.Open(dbU.Scheme, strings.TrimPrefix(dbURL, dbU.Scheme+":"))
|
|
}
|
|
|
|
func New(databaseURI string) (*Engine, error) {
|
|
db, err := connect(databaseURI)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to connect to database: %w", err)
|
|
}
|
|
|
|
// TODO: try for several seconds before giving up
|
|
if err := db.Ping(); err != nil {
|
|
return nil, fmt.Errorf("failed to ping database: %w", err)
|
|
}
|
|
|
|
return &Engine{
|
|
db: db,
|
|
}, nil
|
|
}
|