package store import ( "database/sql" "errors" "time" ) var ErrInstanceLimit = errors.New("instance limit reached") func reserveSlot(tx *sql.Tx, uid string) error { var count int if err := tx.QueryRow(`SELECT count(*) FROM instances WHERE uid=?`, uid).Scan(&count); err != nil { return err } if count >= 2 { return ErrInstanceLimit } return nil } func (s *Store) ReserveInstance(i Instance) error { tx, err := s.DB.Begin() if err != nil { return err } defer tx.Rollback() if err = reserveSlot(tx, i.UID); err != nil { return err } if err = insertInstance(tx, i); err != nil { return err } return tx.Commit() } func insertInstance(tx *sql.Tx, i Instance) error { _, err := tx.Exec(`INSERT INTO instances VALUES(?,?,?,?,?,?,?,?)`, i.ID, i.UID, i.Name, i.Version, i.ImageID, i.Status, i.ContainerID, time.Now().Unix()) return err }