mirror of
https://github.com/golang/go
synced 2024-09-05 07:54:46 +00:00
![Matthew Dempsky](/assets/img/avatar_default.png)
The next CL will remove the -G flag, effectively hard-coding it to its current default (-G=3). Change-Id: Ib4743b529206928f9f1cca9fdb19989728327831 Reviewed-on: https://go-review.googlesource.com/c/go/+/388534 Reviewed-by: Keith Randall <khr@golang.org> Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
75 lines
1.4 KiB
Go
75 lines
1.4 KiB
Go
// compile
|
|
|
|
// Copyright 2021 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
)
|
|
|
|
// Collection generic interface which things can be added to.
|
|
type Collection[T any] interface {
|
|
Add(T)
|
|
}
|
|
|
|
// Slice generic slice implementation of a Collection
|
|
type Slice[T any] []*T
|
|
|
|
func (s *Slice[T]) Add(t *T) {
|
|
*s = append(*s, t)
|
|
}
|
|
|
|
type Scanner interface {
|
|
Scan(...interface{}) error
|
|
}
|
|
|
|
type Mapper[T any] func(s Scanner, t T) error
|
|
|
|
type Repository[T any] struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func (r *Repository[T]) scan(rows *sql.Rows, m Mapper[*T], c Collection[*T]) error {
|
|
for rows.Next() {
|
|
t := new(T)
|
|
if err := m(rows, t); err != nil {
|
|
return err
|
|
}
|
|
c.Add(t)
|
|
}
|
|
return rows.Err()
|
|
}
|
|
|
|
func (r *Repository[T]) query(query string, m Mapper[*T], c Collection[*T]) error {
|
|
rows, err := r.db.Query(query)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := r.scan(rows, m, c); err != nil {
|
|
rows.Close()
|
|
return err
|
|
}
|
|
return rows.Close()
|
|
}
|
|
|
|
type Actor struct {
|
|
ActorID uint16
|
|
FirstName string
|
|
LastName string
|
|
}
|
|
|
|
type ActorRepository struct {
|
|
r Repository[Actor]
|
|
}
|
|
|
|
func (ActorRepository) scan(s Scanner, a *Actor) error {
|
|
return s.Scan(&a.ActorID, &a.FirstName, &a.LastName)
|
|
}
|
|
|
|
func (r *ActorRepository) SelectAll(c Collection[*Actor]) error {
|
|
return r.r.query("SELECT `actor_id`, `first_name`, `last_name` FROM `actor` LIMIT 10", r.scan, c)
|
|
}
|