Files

40 lines
863 B
Go

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
}