132 lines
2.8 KiB
Go
132 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
_ "embed"
|
|
"fmt"
|
|
|
|
"zombiezen.com/go/sqlite/sqlitex"
|
|
)
|
|
|
|
//go:embed character.sql
|
|
var characterSQL string
|
|
|
|
//go:embed character.affinity2.sql
|
|
var characterAffinity2SQL string
|
|
|
|
//go:embed character.affinity3.sql
|
|
var characterAffinity3SQL string
|
|
|
|
type Character struct {
|
|
ID int
|
|
Name string
|
|
}
|
|
|
|
func Characters(ctx context.Context, db *sqlitex.Pool) ([]Character, error) {
|
|
conn, err := db.Take(ctx)
|
|
defer db.Put(conn)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("couldn't get connection for characters: %w", err)
|
|
}
|
|
stmt, _, err := conn.PrepareTransient(characterSQL)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("couldn't prepare statement for characters: %w", err)
|
|
}
|
|
defer stmt.Finalize()
|
|
|
|
var r []Character
|
|
for {
|
|
ok, err := stmt.Step()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error stepping characters: %w", err)
|
|
}
|
|
if !ok {
|
|
break
|
|
}
|
|
c := Character{
|
|
ID: stmt.ColumnInt(0),
|
|
Name: stmt.ColumnText(1),
|
|
}
|
|
r = append(r, c)
|
|
}
|
|
return r, nil
|
|
}
|
|
|
|
type AffinityRelation struct {
|
|
IDA int
|
|
NameA string
|
|
IDB int
|
|
NameB string
|
|
IDC int
|
|
NameC string
|
|
Affinity int
|
|
}
|
|
|
|
func CharacterPairs(ctx context.Context, db *sqlitex.Pool) ([]AffinityRelation, error) {
|
|
conn, err := db.Take(ctx)
|
|
defer db.Put(conn)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("couldn't get connection for character pairs: %w", err)
|
|
}
|
|
stmt, _, err := conn.PrepareTransient(characterAffinity2SQL)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("couldn't prepare statement for character pairs: %w", err)
|
|
}
|
|
defer stmt.Finalize()
|
|
|
|
var r []AffinityRelation
|
|
for {
|
|
ok, err := stmt.Step()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error stepping character pairs: %w", err)
|
|
}
|
|
if !ok {
|
|
break
|
|
}
|
|
p := AffinityRelation{
|
|
IDA: stmt.ColumnInt(0),
|
|
NameA: stmt.ColumnText(1),
|
|
IDB: stmt.ColumnInt(2),
|
|
NameB: stmt.ColumnText(3),
|
|
Affinity: stmt.ColumnInt(4),
|
|
}
|
|
r = append(r, p)
|
|
}
|
|
return r, nil
|
|
}
|
|
|
|
func CharacterTrios(ctx context.Context, db *sqlitex.Pool) ([]AffinityRelation, error) {
|
|
conn, err := db.Take(ctx)
|
|
defer db.Put(conn)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("couldn't get connection for character trios: %w", err)
|
|
}
|
|
stmt, _, err := conn.PrepareTransient(characterAffinity3SQL)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("couldn't prepare statement for character trios: %w", err)
|
|
}
|
|
defer stmt.Finalize()
|
|
|
|
var r []AffinityRelation
|
|
for {
|
|
ok, err := stmt.Step()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error stepping character trios: %w", err)
|
|
}
|
|
if !ok {
|
|
break
|
|
}
|
|
p := AffinityRelation{
|
|
IDA: stmt.ColumnInt(0),
|
|
NameA: stmt.ColumnText(1),
|
|
IDB: stmt.ColumnInt(2),
|
|
NameB: stmt.ColumnText(3),
|
|
IDC: stmt.ColumnInt(4),
|
|
NameC: stmt.ColumnText(5),
|
|
Affinity: stmt.ColumnInt(6),
|
|
}
|
|
r = append(r, p)
|
|
}
|
|
return r, nil
|
|
}
|