package main import ( "fmt" ) type GuildService struct { db *DB } type GuildServiceQuery struct { Name *string `db:"name"` ID *int64 `db:"id"` } func (gs *GuildService) Query(query GuildServiceQuery) (Guild, error) { guild := Guild{} sqlQuery := "SELECT id, name FROM guild" whereQuery := BuildWhereQuery(query) if whereQuery != "" { sqlQuery += " " + whereQuery } err := gs.db.readConn.QueryRow(sqlQuery).Scan(&guild.ID, &guild.Name) if err != nil { return guild, fmt.Errorf("failed getting guild for query %q: %v", sqlQuery, err) } return guild, nil } func (gs *GuildService) Create(name string) (Guild, error) { 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) } return gs.Query(GuildServiceQuery{ID: &id}) } func (gs *GuildService) GetOrCreate(name string) (Guild, error) { guild := Guild{} guild, err := gs.Query(GuildServiceQuery{Name: &name}) if err != nil { guild, err = gs.Create(name) if err != nil { return guild, fmt.Errorf("failed creating guild: %v", err) } } return guild, nil }