|
|
@ -19,12 +19,13 @@ package driver // import "helm.sh/helm/v3/pkg/storage/driver"
|
|
|
|
import (
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"fmt"
|
|
|
|
"sort"
|
|
|
|
"sort"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"time"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
|
|
"github.com/jmoiron/sqlx"
|
|
|
|
migrate "github.com/rubenv/sql-migrate"
|
|
|
|
migrate "github.com/rubenv/sql-migrate"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sq "github.com/Masterminds/squirrel"
|
|
|
|
|
|
|
|
|
|
|
|
// Import pq for postgres dialect
|
|
|
|
// Import pq for postgres dialect
|
|
|
|
_ "github.com/lib/pq"
|
|
|
|
_ "github.com/lib/pq"
|
|
|
|
|
|
|
|
|
|
|
@ -71,8 +72,9 @@ const (
|
|
|
|
|
|
|
|
|
|
|
|
// SQL is the sql storage driver implementation.
|
|
|
|
// SQL is the sql storage driver implementation.
|
|
|
|
type SQL struct {
|
|
|
|
type SQL struct {
|
|
|
|
db *sqlx.DB
|
|
|
|
db *sqlx.DB
|
|
|
|
namespace string
|
|
|
|
namespace string
|
|
|
|
|
|
|
|
statementBuilder sq.StatementBuilderType
|
|
|
|
|
|
|
|
|
|
|
|
Log func(string, ...interface{})
|
|
|
|
Log func(string, ...interface{})
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -192,8 +194,9 @@ func NewSQL(dialect, connectionString string, logger func(string, ...interface{}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
driver := &SQL{
|
|
|
|
driver := &SQL{
|
|
|
|
db: db,
|
|
|
|
db: db,
|
|
|
|
Log: logger,
|
|
|
|
Log: logger,
|
|
|
|
|
|
|
|
statementBuilder: sq.StatementBuilder.PlaceholderFormat(sq.Dollar),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if err := driver.ensureDBSetup(); err != nil {
|
|
|
|
if err := driver.ensureDBSetup(); err != nil {
|
|
|
@ -209,16 +212,20 @@ func NewSQL(dialect, connectionString string, logger func(string, ...interface{}
|
|
|
|
func (s *SQL) Get(key string) (*rspb.Release, error) {
|
|
|
|
func (s *SQL) Get(key string) (*rspb.Release, error) {
|
|
|
|
var record SQLReleaseWrapper
|
|
|
|
var record SQLReleaseWrapper
|
|
|
|
|
|
|
|
|
|
|
|
query := fmt.Sprintf(
|
|
|
|
qb := s.statementBuilder.
|
|
|
|
"SELECT %s FROM %s WHERE %s = $1 AND %s = $2",
|
|
|
|
Select(sqlReleaseTableBodyColumn).
|
|
|
|
sqlReleaseTableBodyColumn,
|
|
|
|
From(sqlReleaseTableName).
|
|
|
|
sqlReleaseTableName,
|
|
|
|
Where(sq.Eq{sqlReleaseTableKeyColumn: key}).
|
|
|
|
sqlReleaseTableKeyColumn,
|
|
|
|
Where(sq.Eq{sqlReleaseTableNamespaceColumn: s.namespace})
|
|
|
|
sqlReleaseTableNamespaceColumn,
|
|
|
|
|
|
|
|
)
|
|
|
|
query, args, err := qb.ToSql()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
s.Log("failed to build query: %v", err)
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Get will return an error if the result is empty
|
|
|
|
// Get will return an error if the result is empty
|
|
|
|
if err := s.db.Get(&record, query, key, s.namespace); err != nil {
|
|
|
|
if err := s.db.Get(&record, query, args...); err != nil {
|
|
|
|
s.Log("got SQL error when getting release %s: %v", key, err)
|
|
|
|
s.Log("got SQL error when getting release %s: %v", key, err)
|
|
|
|
return nil, ErrReleaseNotFound
|
|
|
|
return nil, ErrReleaseNotFound
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -234,19 +241,20 @@ func (s *SQL) Get(key string) (*rspb.Release, error) {
|
|
|
|
|
|
|
|
|
|
|
|
// List returns the list of all releases such that filter(release) == true
|
|
|
|
// List returns the list of all releases such that filter(release) == true
|
|
|
|
func (s *SQL) List(filter func(*rspb.Release) bool) ([]*rspb.Release, error) {
|
|
|
|
func (s *SQL) List(filter func(*rspb.Release) bool) ([]*rspb.Release, error) {
|
|
|
|
query := fmt.Sprintf(
|
|
|
|
sb := s.statementBuilder.
|
|
|
|
"SELECT %s FROM %s WHERE %s = $1",
|
|
|
|
Select(sqlReleaseTableBodyColumn).
|
|
|
|
sqlReleaseTableBodyColumn,
|
|
|
|
From(sqlReleaseTableName).
|
|
|
|
sqlReleaseTableName,
|
|
|
|
Where(sq.Eq{sqlReleaseTableOwnerColumn: sqlReleaseDefaultOwner})
|
|
|
|
sqlReleaseTableOwnerColumn,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
args := []interface{}{sqlReleaseDefaultOwner}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If a namespace was specified, we only list releases from that namespace
|
|
|
|
// If a namespace was specified, we only list releases from that namespace
|
|
|
|
if s.namespace != "" {
|
|
|
|
if s.namespace != "" {
|
|
|
|
query = fmt.Sprintf("%s AND %s = $2", query, sqlReleaseTableNamespaceColumn)
|
|
|
|
sb = sb.Where(sq.Eq{sqlReleaseTableNamespaceColumn: s.namespace})
|
|
|
|
args = append(args, s.namespace)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
query, args, err := sb.ToSql()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
s.Log("failed to build query: %v", err)
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var records = []SQLReleaseWrapper{}
|
|
|
|
var records = []SQLReleaseWrapper{}
|
|
|
@ -272,15 +280,18 @@ func (s *SQL) List(filter func(*rspb.Release) bool) ([]*rspb.Release, error) {
|
|
|
|
|
|
|
|
|
|
|
|
// Query returns the set of releases that match the provided set of labels.
|
|
|
|
// Query returns the set of releases that match the provided set of labels.
|
|
|
|
func (s *SQL) Query(labels map[string]string) ([]*rspb.Release, error) {
|
|
|
|
func (s *SQL) Query(labels map[string]string) ([]*rspb.Release, error) {
|
|
|
|
var sqlFilterKeys []string
|
|
|
|
sb := s.statementBuilder.
|
|
|
|
sqlFilter := map[string]interface{}{}
|
|
|
|
Select(sqlReleaseTableBodyColumn).
|
|
|
|
for key, val := range labels {
|
|
|
|
From(sqlReleaseTableName)
|
|
|
|
// Build a slice of where filters e.g
|
|
|
|
|
|
|
|
// labels = map[string]string{ "foo": "foo", "bar": "bar" }
|
|
|
|
keys := make([]string, 0, len(labels))
|
|
|
|
// []string{ "foo=?", "bar=?" }
|
|
|
|
for key := range labels {
|
|
|
|
|
|
|
|
keys = append(keys, key)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
sort.Strings(keys)
|
|
|
|
|
|
|
|
for _, key := range keys {
|
|
|
|
if _, ok := labelMap[key]; ok {
|
|
|
|
if _, ok := labelMap[key]; ok {
|
|
|
|
sqlFilterKeys = append(sqlFilterKeys, strings.Join([]string{key, "=:", key}, ""))
|
|
|
|
sb = sb.Where(sq.Eq{key: labels[key]})
|
|
|
|
sqlFilter[key] = val
|
|
|
|
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
s.Log("unknown label %s", key)
|
|
|
|
s.Log("unknown label %s", key)
|
|
|
|
return nil, fmt.Errorf("unknow label %s", key)
|
|
|
|
return nil, fmt.Errorf("unknow label %s", key)
|
|
|
@ -289,36 +300,27 @@ func (s *SQL) Query(labels map[string]string) ([]*rspb.Release, error) {
|
|
|
|
|
|
|
|
|
|
|
|
// If a namespace was specified, we only list releases from that namespace
|
|
|
|
// If a namespace was specified, we only list releases from that namespace
|
|
|
|
if s.namespace != "" {
|
|
|
|
if s.namespace != "" {
|
|
|
|
sqlFilterKeys = append(sqlFilterKeys, fmt.Sprintf("%s=:namespace", sqlReleaseTableNamespaceColumn))
|
|
|
|
sb = sb.Where(sq.Eq{sqlReleaseTableNamespaceColumn: s.namespace})
|
|
|
|
sqlFilter["namespace"] = s.namespace
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
sort.Strings(sqlFilterKeys)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Build our query
|
|
|
|
// Build our query
|
|
|
|
query := strings.Join([]string{
|
|
|
|
query, args, err := sb.ToSql()
|
|
|
|
fmt.Sprintf("SELECT %s FROM %s", sqlReleaseTableBodyColumn, sqlReleaseTableName),
|
|
|
|
|
|
|
|
"WHERE",
|
|
|
|
|
|
|
|
strings.Join(sqlFilterKeys, " AND "),
|
|
|
|
|
|
|
|
}, " ")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rows, err := s.db.NamedQuery(query, sqlFilter)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
s.Log("failed to query with labels: %v", err)
|
|
|
|
s.Log("failed to build query: %v", err)
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var releases []*rspb.Release
|
|
|
|
var records = []SQLReleaseWrapper{}
|
|
|
|
for rows.Next() {
|
|
|
|
if err := s.db.Select(&records, query, args...); err != nil {
|
|
|
|
var record SQLReleaseWrapper
|
|
|
|
s.Log("list: failed to query with labels: %v", err)
|
|
|
|
if err = rows.StructScan(&record); err != nil {
|
|
|
|
return nil, err
|
|
|
|
s.Log("failed to scan record %q: %v", record, err)
|
|
|
|
}
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var releases []*rspb.Release
|
|
|
|
|
|
|
|
for _, record := range records {
|
|
|
|
release, err := decodeRelease(record.Body)
|
|
|
|
release, err := decodeRelease(record.Body)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
s.Log("failed to decode release: %v", err)
|
|
|
|
s.Log("list: failed to decode release: %v: %v", record, err)
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
releases = append(releases, release)
|
|
|
|
releases = append(releases, release)
|
|
|
@ -351,46 +353,51 @@ func (s *SQL) Create(key string, rls *rspb.Release) error {
|
|
|
|
return fmt.Errorf("error beginning transaction: %v", err)
|
|
|
|
return fmt.Errorf("error beginning transaction: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
query := fmt.Sprintf(
|
|
|
|
insertQuery, args, err := s.statementBuilder.
|
|
|
|
"INSERT INTO %s (%s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES (:key, :type, :body, :name, :namespace, :version, :status, :owner, :createdAt)",
|
|
|
|
Insert(sqlReleaseTableName).
|
|
|
|
sqlReleaseTableName,
|
|
|
|
Columns(
|
|
|
|
sqlReleaseTableKeyColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableTypeColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableBodyColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableNameColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableNamespaceColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableVersionColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableStatusColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableOwnerColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableCreatedAtColumn,
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if _, err := transaction.NamedExec(query,
|
|
|
|
|
|
|
|
&SQLReleaseWrapper{
|
|
|
|
|
|
|
|
Key: key,
|
|
|
|
|
|
|
|
Type: sqlReleaseDefaultType,
|
|
|
|
|
|
|
|
Body: body,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Name: rls.Name,
|
|
|
|
|
|
|
|
Namespace: namespace,
|
|
|
|
|
|
|
|
Version: int(rls.Version),
|
|
|
|
|
|
|
|
Status: rls.Info.Status.String(),
|
|
|
|
|
|
|
|
Owner: sqlReleaseDefaultOwner,
|
|
|
|
|
|
|
|
CreatedAt: int(time.Now().Unix()),
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
); err != nil {
|
|
|
|
|
|
|
|
defer transaction.Rollback()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
query := fmt.Sprintf(
|
|
|
|
|
|
|
|
"SELECT %s FROM %s WHERE %s = $1 and %s = $2",
|
|
|
|
|
|
|
|
sqlReleaseTableKeyColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableName,
|
|
|
|
|
|
|
|
sqlReleaseTableKeyColumn,
|
|
|
|
sqlReleaseTableKeyColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableTypeColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableBodyColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableNameColumn,
|
|
|
|
sqlReleaseTableNamespaceColumn,
|
|
|
|
sqlReleaseTableNamespaceColumn,
|
|
|
|
)
|
|
|
|
sqlReleaseTableVersionColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableStatusColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableOwnerColumn,
|
|
|
|
|
|
|
|
sqlReleaseTableCreatedAtColumn,
|
|
|
|
|
|
|
|
).
|
|
|
|
|
|
|
|
Values(
|
|
|
|
|
|
|
|
key,
|
|
|
|
|
|
|
|
sqlReleaseDefaultType,
|
|
|
|
|
|
|
|
body,
|
|
|
|
|
|
|
|
rls.Name,
|
|
|
|
|
|
|
|
namespace,
|
|
|
|
|
|
|
|
int(rls.Version),
|
|
|
|
|
|
|
|
rls.Info.Status.String(),
|
|
|
|
|
|
|
|
sqlReleaseDefaultOwner,
|
|
|
|
|
|
|
|
int(time.Now().Unix()),
|
|
|
|
|
|
|
|
).ToSql()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
s.Log("failed to build insert query: %v", err)
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if _, err := transaction.Exec(insertQuery, args...); err != nil {
|
|
|
|
|
|
|
|
defer transaction.Rollback()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
selectQuery, args, buildErr := s.statementBuilder.
|
|
|
|
|
|
|
|
Select(sqlReleaseTableKeyColumn).
|
|
|
|
|
|
|
|
From(sqlReleaseTableName).
|
|
|
|
|
|
|
|
Where(sq.Eq{sqlReleaseTableKeyColumn: key}).
|
|
|
|
|
|
|
|
Where(sq.Eq{sqlReleaseTableNamespaceColumn: s.namespace}).
|
|
|
|
|
|
|
|
ToSql()
|
|
|
|
|
|
|
|
if buildErr != nil {
|
|
|
|
|
|
|
|
s.Log("failed to build select query: %v", buildErr)
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var record SQLReleaseWrapper
|
|
|
|
var record SQLReleaseWrapper
|
|
|
|
if err := transaction.Get(&record, query, key, s.namespace); err == nil {
|
|
|
|
if err := transaction.Get(&record, selectQuery, args...); err == nil {
|
|
|
|
s.Log("release %s already exists", key)
|
|
|
|
s.Log("release %s already exists", key)
|
|
|
|
return ErrReleaseExists
|
|
|
|
return ErrReleaseExists
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -417,31 +424,24 @@ func (s *SQL) Update(key string, rls *rspb.Release) error {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
query := fmt.Sprintf(
|
|
|
|
query, args, err := s.statementBuilder.
|
|
|
|
"UPDATE %s SET %s=:body, %s=:name, %s=:version, %s=:status, %s=:owner, %s=:modifiedAt WHERE %s=:key AND %s=:namespace",
|
|
|
|
Update(sqlReleaseTableName).
|
|
|
|
sqlReleaseTableName,
|
|
|
|
Set(sqlReleaseTableBodyColumn, body).
|
|
|
|
sqlReleaseTableBodyColumn,
|
|
|
|
Set(sqlReleaseTableNameColumn, rls.Name).
|
|
|
|
sqlReleaseTableNameColumn,
|
|
|
|
Set(sqlReleaseTableVersionColumn, int(rls.Version)).
|
|
|
|
sqlReleaseTableVersionColumn,
|
|
|
|
Set(sqlReleaseTableStatusColumn, rls.Info.Status.String()).
|
|
|
|
sqlReleaseTableStatusColumn,
|
|
|
|
Set(sqlReleaseTableOwnerColumn, sqlReleaseDefaultOwner).
|
|
|
|
sqlReleaseTableOwnerColumn,
|
|
|
|
Set(sqlReleaseTableModifiedAtColumn, int(time.Now().Unix())).
|
|
|
|
sqlReleaseTableModifiedAtColumn,
|
|
|
|
Where(sq.Eq{sqlReleaseTableKeyColumn: key}).
|
|
|
|
sqlReleaseTableKeyColumn,
|
|
|
|
Where(sq.Eq{sqlReleaseTableNamespaceColumn: namespace}).
|
|
|
|
sqlReleaseTableNamespaceColumn,
|
|
|
|
ToSql()
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
if _, err := s.db.NamedExec(query,
|
|
|
|
s.Log("failed to build update query: %v", err)
|
|
|
|
&SQLReleaseWrapper{
|
|
|
|
return err
|
|
|
|
Key: key,
|
|
|
|
}
|
|
|
|
Body: body,
|
|
|
|
|
|
|
|
Name: rls.Name,
|
|
|
|
if _, err := s.db.Exec(query, args...); err != nil {
|
|
|
|
Namespace: namespace,
|
|
|
|
|
|
|
|
Version: int(rls.Version),
|
|
|
|
|
|
|
|
Status: rls.Info.Status.String(),
|
|
|
|
|
|
|
|
Owner: sqlReleaseDefaultOwner,
|
|
|
|
|
|
|
|
ModifiedAt: int(time.Now().Unix()),
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
); err != nil {
|
|
|
|
|
|
|
|
s.Log("failed to update release %s in SQL database: %v", key, err)
|
|
|
|
s.Log("failed to update release %s in SQL database: %v", key, err)
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -457,16 +457,19 @@ func (s *SQL) Delete(key string) (*rspb.Release, error) {
|
|
|
|
return nil, fmt.Errorf("error beginning transaction: %v", err)
|
|
|
|
return nil, fmt.Errorf("error beginning transaction: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
selectQuery := fmt.Sprintf(
|
|
|
|
selectQuery, args, err := s.statementBuilder.
|
|
|
|
"SELECT %s FROM %s WHERE %s=$1 AND %s=$2",
|
|
|
|
Select(sqlReleaseTableBodyColumn).
|
|
|
|
sqlReleaseTableBodyColumn,
|
|
|
|
From(sqlReleaseTableName).
|
|
|
|
sqlReleaseTableName,
|
|
|
|
Where(sq.Eq{sqlReleaseTableKeyColumn: key}).
|
|
|
|
sqlReleaseTableKeyColumn,
|
|
|
|
Where(sq.Eq{sqlReleaseTableNamespaceColumn: s.namespace}).
|
|
|
|
sqlReleaseTableNamespaceColumn,
|
|
|
|
ToSql()
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
s.Log("failed to build select query: %v", err)
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var record SQLReleaseWrapper
|
|
|
|
var record SQLReleaseWrapper
|
|
|
|
err = transaction.Get(&record, selectQuery, key, s.namespace)
|
|
|
|
err = transaction.Get(&record, selectQuery, args...)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
s.Log("release %s not found: %v", key, err)
|
|
|
|
s.Log("release %s not found: %v", key, err)
|
|
|
|
return nil, ErrReleaseNotFound
|
|
|
|
return nil, ErrReleaseNotFound
|
|
|
@ -480,13 +483,16 @@ func (s *SQL) Delete(key string) (*rspb.Release, error) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
defer transaction.Commit()
|
|
|
|
defer transaction.Commit()
|
|
|
|
|
|
|
|
|
|
|
|
deleteQuery := fmt.Sprintf(
|
|
|
|
deleteQuery, args, err := s.statementBuilder.
|
|
|
|
"DELETE FROM %s WHERE %s = $1 AND %s = $2",
|
|
|
|
Delete(sqlReleaseTableName).
|
|
|
|
sqlReleaseTableName,
|
|
|
|
Where(sq.Eq{sqlReleaseTableKeyColumn: key}).
|
|
|
|
sqlReleaseTableKeyColumn,
|
|
|
|
Where(sq.Eq{sqlReleaseTableNamespaceColumn: s.namespace}).
|
|
|
|
sqlReleaseTableNamespaceColumn,
|
|
|
|
ToSql()
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
s.Log("failed to build select query: %v", err)
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_, err = transaction.Exec(deleteQuery, key, s.namespace)
|
|
|
|
_, err = transaction.Exec(deleteQuery, args...)
|
|
|
|
return release, err
|
|
|
|
return release, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|