package main import ( "database/sql" "flag" "fmt" "os" "path/filepath" "fagott.pw/grilist/grilist" "fagott.pw/grilist/modules/grils" _ "github.com/lib/pq" ) var path string var sourceType string var imgUrlExportFile string var exportFile *os.File var db *sql.DB var r GrilReader type WrappedGril struct { Gril grils.Gril Image string Thumb string } type GrilReader interface { Read(path string) WrappedGril ID() int } func GetGrilReader(rType string) GrilReader { switch rType { case "ACD": return &ACDReader{} case "ACDv2": return &ACDv2Reader{} } return nil } func LogErr(err error) { if err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) } } func TryGetExistingGril(g WrappedGril, idmap map[int]int) int { dbID, _ := idmap[g.Gril.ID] return dbID } func InsertGril(g WrappedGril) int { var dbID int row := db.QueryRow("INSERT INTO grilist.grils (age) VALUES (NULL) RETURNING id;") row.Scan(&dbID) fmt.Printf( "Assigned %d from %s to %d\n", g.Gril.ID, sourceType, dbID) db.Exec(`INSERT INTO grilist.grils_id_mappings (gril_id, source, source_id) VALUES ($1, $2, $3);`, dbID, r.ID(), g.Gril.ID) if g.Gril.KanjiName != "" { _, err := db.Exec(`INSERT INTO grilist.gril_names (gril_id, name, name_type) VALUES ($1, $2, $3);`, dbID, g.Gril.KanjiName, 0) LogErr(err) } if g.Gril.RomajiName != "" { _, err := db.Exec(`INSERT INTO grilist.gril_names (gril_id, name, name_type) VALUES ($1, $2, $3);`, dbID, g.Gril.RomajiName, 1) LogErr(err) } for _, v := range g.Gril.OtherNames { _, err := db.Exec(`INSERT INTO grilist.gril_names (gril_id, name, name_type) VALUES ($1, $2, $3);`, dbID, v, 2) LogErr(err) } if exportFile != nil { if g.Image != "" { fmt.Fprintf( exportFile, "%d %d %s\n", dbID, 0, g.Image) } if g.Thumb != "" { fmt.Fprintf( exportFile, "%d %d %s\n", dbID, 1, g.Thumb) } } fmt.Printf("Inserted %s\n", g.Gril.RomajiName) return dbID } func InsertTags(dbID int, g WrappedGril, taglist map[string]int) { for _, v := range g.Gril.Tags { if _, ok := taglist[v]; ok { continue } var id int row := db.QueryRow("INSERT INTO grilist.tags (name) VALUES ($1) RETURNING id;", v) row.Scan(&id) taglist[v] = id fmt.Printf("Inserted tag %s as %d\n", v, id) } rows, err := db.Query("SELECT tag_id FROM grils_tags WHERE gril_id = $1;", dbID) LogErr(err) existingTags := make(map[int]bool, 0) for rows.Next() { var tagID int rows.Scan(&tagID) existingTags[tagID] = true } for _, v := range g.Gril.Tags { tagID := taglist[v] if _, ok := existingTags[tagID]; ok { continue } _, err := db.Exec(`INSERT INTO grilist.grils_tags (gril_id, tag_id) VALUES ($1, $2);`, dbID, tagID) fmt.Printf("Assigned tag %s to %s\n", v, g.Gril.RomajiName) LogErr(err) } } func main() { flag.StringVar(&path, "path", "", "path of the source files") flag.StringVar(&sourceType, "type", "", "type of the files (ACD, AniDB)") flag.StringVar(&imgUrlExportFile, "imageexportfile", "", "image URLs will be exported to this file, THIS WILL OVERWRITE EVERYTHING IN THE FILE!") flag.Parse() if imgUrlExportFile != "" { var err error if exportFile, err = os.Create(imgUrlExportFile); err != nil { fmt.Fprintf(os.Stderr, "%s\n", "error while accessing \"%s\"") fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } } if path == "" { fmt.Fprintf(os.Stderr, "%s\n", "\"path\" must be specified!") flag.Usage() os.Exit(1) } r = GetGrilReader(sourceType) if r == nil { fmt.Fprintf(os.Stderr, "%s\n", "\"type\" must be specified and a valid gril source!") flag.Usage() os.Exit(1) } config := grilist.LoadConfig() var err error db, err = sql.Open("postgres", config.DBConnectionString()) if err == nil { err = db.Ping() } if err != nil { fmt.Fprintf(os.Stderr, "%s\n", "error with database connection") fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) } taglist := make(map[string]int) rows, _ := db.Query("SELECT id, name FROM grilist.tags;") for rows.Next() { var id int var name string rows.Scan(&id, &name) taglist[name] = id } idmap := make(map[int]int) rows, _ = db.Query("SELECT source_id, gril_id FROM grilist.grils_id_mappings WHERE source = $1;", r.ID()) for rows.Next() { var sourceID int var grilID int rows.Scan(&sourceID, &grilID) idmap[sourceID] = grilID } filepath.Walk(path, func(path string, info os.FileInfo, err error) error { if info.IsDir() { return nil } g := r.Read(path) var dbID int if dbID = TryGetExistingGril(g, idmap); dbID == 0 { dbID = InsertGril(g) } InsertTags(dbID, g, taglist) return nil }) }