rigged shuffle
This commit is contained in:
@@ -10,12 +10,13 @@ import (
|
||||
|
||||
const writeBufferSize = 100
|
||||
|
||||
type SqlcGeneric func(*Queries, context.Context, any) error
|
||||
type GenericQuery func(*Queries, context.Context, any) (any, error)
|
||||
|
||||
type WriteTx struct {
|
||||
ErrChan chan error
|
||||
Query SqlcGeneric
|
||||
Args interface{}
|
||||
ErrChan chan error
|
||||
ReturnChan chan any
|
||||
Query GenericQuery
|
||||
Args any
|
||||
}
|
||||
|
||||
type Queue struct {
|
||||
@@ -27,7 +28,7 @@ type Queue struct {
|
||||
cancel context.CancelFunc
|
||||
}
|
||||
|
||||
func NewQueue(sqlDb *sql.DB, ctx context.Context) (*Queue, error) {
|
||||
func NewQueue(ctx context.Context, sqlDb *sql.DB) (*Queue, error) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
sqldb := &Queue{
|
||||
Queries: New(sqlDb),
|
||||
@@ -42,15 +43,19 @@ func NewQueue(sqlDb *sql.DB, ctx context.Context) (*Queue, error) {
|
||||
|
||||
func (d *Queue) Start() {
|
||||
d.wg.Add(1)
|
||||
defer d.wg.Done()
|
||||
go func() {
|
||||
// TODO: I think this might be a naive approach.
|
||||
defer d.wg.Done()
|
||||
for {
|
||||
select {
|
||||
case <-d.ctx.Done():
|
||||
return
|
||||
case writeTx := <-d.WriteQueue:
|
||||
err := writeTx.Query(d.Queries, d.ctx, writeTx.Args)
|
||||
ret, err := writeTx.Query(d.Queries, d.ctx, writeTx.Args)
|
||||
writeTx.ErrChan <- err
|
||||
writeTx.ReturnChan <- ret
|
||||
close(writeTx.ErrChan)
|
||||
close(writeTx.ReturnChan)
|
||||
}
|
||||
}
|
||||
}()
|
||||
@@ -63,21 +68,24 @@ func (d *Queue) Stop() error {
|
||||
return d.Db.Close()
|
||||
}
|
||||
|
||||
func (d *Queue) EnqueueWriteTx(queryFunc SqlcGeneric, args any) error {
|
||||
func (d *Queue) EnqueueWriteTx(queryFunc GenericQuery, args any) (any, error) {
|
||||
select {
|
||||
case <-d.ctx.Done():
|
||||
return errors.New("database is shutting down")
|
||||
return nil, errors.New("database is shutting down")
|
||||
default:
|
||||
}
|
||||
|
||||
errChan := make(chan error, 1)
|
||||
retChan := make(chan any, 1)
|
||||
writeTx := WriteTx{
|
||||
Query: queryFunc,
|
||||
Args: args,
|
||||
ErrChan: errChan,
|
||||
Query: queryFunc,
|
||||
Args: args,
|
||||
ErrChan: errChan,
|
||||
ReturnChan: retChan,
|
||||
}
|
||||
d.WriteQueue <- writeTx
|
||||
return <-errChan
|
||||
err := <-errChan
|
||||
val := <-retChan
|
||||
return val, err
|
||||
}
|
||||
|
||||
func OpenSqliteDb(dbPath string) (*sql.DB, error) {
|
||||
|
||||
Reference in New Issue
Block a user