diff options
Diffstat (limited to 'db.go')
| -rw-r--r-- | db.go | 22 |
1 files changed, 16 insertions, 6 deletions
@@ -9,13 +9,15 @@ import ( "fmt" "reflect" "sync" + + "go.xyrillian.de/oblast/internal" ) // DB wraps an [sql.DB] instance for use with Oblast's query interface. type DB struct { *sql.DB dialect Dialect - plans map[reflect.Type]plan + plans map[reflect.Type]internal.Plan planMutex sync.Mutex } @@ -23,14 +25,22 @@ func NewDB(db *sql.DB, dialect Dialect) *DB { return &DB{ DB: db, dialect: dialect, - plans: make(map[reflect.Type]plan), + plans: make(map[reflect.Type]internal.Plan), } } -// TODO: remove -func Keks[T IsTable](ctx context.Context, db *DB) error { - _, err := db.getPlan(reflect.TypeFor[T]()) - return err +func (d *DB) getPlan(t reflect.Type) (internal.Plan, error) { + d.planMutex.Lock() + defer d.planMutex.Unlock() + p, ok := d.plans[t] + if ok { + return p, nil + } + p, err := internal.BuildPlan(t, d.dialect) + if err == nil { + d.plans[t] = p + } + return p, err } // TODO: Begin() -> custom Tx type; add interface to allow Select() et all to take either *DB or *Tx |
