package dbi import ( "context" "database/sql" "fmt" ) type Appearance struct { UID string `json:"uid"` Title string `json:"title"` Description string `json:"description"` Hyperlink string `json:"hyperlink"` Status string `json:"status"` Created string `json:"created"` Modified string `json:"modified"` Username string `json:"username"` } func CreateAppearance(conn *sql.Conn, a *Appearance) error { if a.UID == "" { a.UID = GenUUID() } now := GetNow() a.Created = now a.Modified = now _, err := conn.ExecContext(context.Background(), `INSERT INTO appearances (UID, Title, Description, Hyperlink, Status, Created, Modified, Username) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, a.UID, a.Title, a.Description, a.Hyperlink, a.Status, a.Created, a.Modified, a.Username, ) return err } func GetAppearance(conn *sql.Conn, uid string) (Appearance, error) { row := conn.QueryRowContext(context.Background(), `SELECT UID, Title, Description, Hyperlink, Status, Created, Modified, Username FROM appearances WHERE UID = ?`, uid, ) var a Appearance err := row.Scan(&a.UID, &a.Title, &a.Description, &a.Hyperlink, &a.Status, &a.Created, &a.Modified, &a.Username) if err == sql.ErrNoRows { return Appearance{}, fmt.Errorf("appearance %q not found", uid) } return a, err } func UpdateAppearance(conn *sql.Conn, a *Appearance) error { a.Modified = GetNow() _, err := conn.ExecContext(context.Background(), `UPDATE appearances SET Title = ?, Description = ?, Hyperlink = ?, Status = ?, Modified = ?, Username = ? WHERE UID = ?`, a.Title, a.Description, a.Hyperlink, a.Status, a.Modified, a.Username, a.UID, ) return err } func DeleteAppearance(conn *sql.Conn, uid string) error { _, err := conn.ExecContext(context.Background(), `DELETE FROM appearances WHERE UID = ?`, uid, ) return err } func GetAppearancesForUsername(conn *sql.Conn, username string) ([]Appearance, error) { rows, err := conn.QueryContext(context.Background(), `SELECT UID, Title, Description, Hyperlink, Status, Created, Modified, Username FROM appearances WHERE Username = ?`, username, ) if err != nil { return nil, err } defer rows.Close() var results []Appearance for rows.Next() { var a Appearance if err := rows.Scan(&a.UID, &a.Title, &a.Description, &a.Hyperlink, &a.Status, &a.Created, &a.Modified, &a.Username); err != nil { return nil, err } results = append(results, a) } return results, rows.Err() }