METANOIA/database/release.go

97 lines
2.1 KiB
Go

package database
import (
"database/sql"
"encoding/json"
"github.com/lib/pq"
)
type Release struct {
Type
id int64
identifiers []string
metadata []byte
}
func InsertReleaseToDatabase(db *Database, identifiers []string) *Release {
rows, err := db.Query("INSERT INTO releases (identifiers) VALUES ($1) RETURNING id;", pq.Array(identifiers))
if err != nil {
return nil
}
defer rows.Close()
rows.Next()
var id int64
err = rows.Scan(&id)
if err != nil {
return nil
}
return GetReleaseFromDatabase(db, id)
}
func GetReleasesFromDatabaseByIdentifier(db *Database, identifier string) (releases []*Release) {
rows, err := db.Query("SELECT id, identifiers, metadata FROM releases WHERE $1 = ANY(identifiers);", identifier)
if err != nil {
return nil
}
defer rows.Close()
for rows.Next() {
release, err := GetReleaseFromRow(db, rows)
if err != nil {
break
}
releases = append(releases, release)
}
return
}
func GetReleaseFromDatabase(db *Database, id int64) *Release {
rows, err := db.Query("SELECT id, identifiers, metadata FROM releases WHERE id = $1;", id)
if err != nil {
return nil
}
defer rows.Close()
rows.Next()
r, err := GetReleaseFromRow(db, rows)
if err != nil {
return nil
}
return r
}
func GetReleaseFromRow(db *Database, row *sql.Rows) (*Release, error) {
r := &Release{
Type: Type{
db: db,
},
}
err := row.Scan(&r.id, pq.Array(&r.identifiers), &r.metadata)
if err != nil {
return nil, err
}
return r, nil
}
func (r *Release) GetId() int64 {
return r.id
}
func (r *Release) GetIdentifiers() []string {
return r.identifiers
}
func (r *Release) SetIdentifiers(identifiers []string) {
r.identifiers = identifiers
r.db.Exec("UPDATE releases SET identifiers = $2 WHERE id = $1;", r.id, pq.Array(r.identifiers))
}
func (r *Release) GetMetadata() (result map[string]interface{}) {
json.Unmarshal(r.metadata, &result)
return result
}
func (r *Release) SetMetadata(value map[string]interface{}) {
r.metadata, _ = json.Marshal(value)
r.db.Exec("UPDATE releases SET metadata = $2::jsonb WHERE id = $1;", r.id, r.metadata)
}