trunkless/cmd/ingest/main.go
2024-02-08 21:14:35 -08:00

70 lines
1.3 KiB
Go

package main
import (
"bufio"
"database/sql"
"errors"
"fmt"
"os"
"strings"
_ "github.com/mattn/go-sqlite3"
)
const dsn = "phrase.db"
func createSource(db *sql.DB, sourceName string) (int64, error) {
stmt, err := db.Prepare("INSERT INTO sources (name) VALUES (?) ON CONFLICT DO NOTHING RETURNING id")
if err != nil {
return -1, err
}
result, err := stmt.Exec(sourceName)
if err != nil {
return -1, err
}
return result.LastInsertId()
}
func _main(args []string) error {
if len(os.Args) == 0 {
return errors.New("need a source name argument")
}
db, err := sql.Open("sqlite3", dsn)
if err != nil {
return err
}
defer db.Close()
s := bufio.NewScanner(os.Stdin)
sourceName := strings.Join(os.Args[1:], " ")
sourceID, err := createSource(db, sourceName)
if err != nil {
return fmt.Errorf("could not make source: %w", err)
}
for s.Scan() {
phrase := s.Text()
stmt, err := db.Prepare("INSERT INTO phrases (sourceid, phrase) VALUES (?, ?) ON CONFLICT DO NOTHING")
if err != nil {
return err
}
if _, err = stmt.Exec(sourceID, phrase); err != nil {
return fmt.Errorf("could not insert phrase '%s' for source '%d': %w", phrase, sourceID, err)
}
}
return nil
}
func main() {
if err := _main(os.Args[1:]); err != nil {
fmt.Fprintf(os.Stderr, "error: %s", err)
os.Exit(1)
}
}