rigged shuffle

This commit is contained in:
2025-08-01 10:49:46 -05:00
parent 3ed12cee68
commit 8d4c8f71b0
21 changed files with 578 additions and 146 deletions

View File

@@ -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) {