package main import ( "fmt" "log" ) type GuildService struct { db *DB } type GuildServiceQuery struct { Name *string `db:"name"` ID *int64 `db:"id"` } func (gs *GuildService) Query(query GuildServiceQuery) ([]Guild, error) { res := []Guild{} sqlQuery := "SELECT id, name FROM guild" whereQuery := BuildWhereQuery(query) if whereQuery != "" { sqlQuery += " " + whereQuery } rows, err := gs.db.readConn.Query(sqlQuery) if err != nil { return res, fmt.Errorf("failed getting guilds for query %q: %v", sqlQuery, err) } defer rows.Close() for rows.Next() { guild := Guild{} err := rows.Scan(&guild.ID, &guild.Name) if err != nil { return res, fmt.Errorf("failed scanning guild: %v", err) } res = append(res, guild) } return res, nil } func (gs *GuildService) Create(name string) (Guild, error) { log.Printf("Creating guild %s", name) guild := Guild{} res, err := gs.db.writeConn.Exec("insert into guild (name) values (?)", name) if err != nil { return guild, fmt.Errorf("failed to insert guild: %v", err) } id, err := res.LastInsertId() if err != nil { return guild, fmt.Errorf("failed to get last insert id: %v", err) } log.Printf("Created guild %s with id %d", name, id) qres, err := gs.Query(GuildServiceQuery{ID: &id}) if err != nil { return guild, fmt.Errorf("failed getting guild for id %d: %v", id, err) } if len(qres) > 1 { return guild, fmt.Errorf("more than one guild found for id %d", id) } return qres[0], nil } func (gs *GuildService) GetOrCreate(name string) (Guild, error) { guild := Guild{} guilds, err := gs.Query(GuildServiceQuery{Name: &name}) if len(guilds) > 1 { return guild, fmt.Errorf("more than one guild found for name %s", name) } if err != nil || len(guilds) == 0 { guild, err = gs.Create(name) if err != nil { return guild, fmt.Errorf("failed creating guild: %v", err) } } if len(guilds) == 1 { guild = guilds[0] } return guild, nil }