70 lines
1.3 KiB
Go
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)
|
|
}
|
|
}
|