Skip to content

Commit

Permalink
database: log and mask SQL errors
Browse files Browse the repository at this point in the history
  • Loading branch information
Quentin-M authored and jzelinskie committed Feb 24, 2016
1 parent 970756c commit 6a9cf21
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 51 deletions.
11 changes: 7 additions & 4 deletions database/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ import "errors"

var (
// ErrTransaction is an error that occurs when a database transaction fails.
ErrTransaction = errors.New("database: transaction failed (concurrent modification?)")
// ErrTransaction = errors.New("database: transaction failed (concurrent modification?)")

// ErrBackendException is an error that occurs when the database backend does
// not work properly (ie. unreachable).
ErrBackendException = errors.New("database: could not query backend")
ErrBackendException = errors.New("database: an error occured when querying the backend")

// ErrInconsistent is an error that occurs when a database consistency check
// fails (ie. when an entity which is supposed to be unique is detected twice)
ErrInconsistent = errors.New("database: inconsistent database")

// ErrCantOpen is an error that occurs when the database could not be opened
ErrCantOpen = errors.New("database: could not open database")
)
Expand All @@ -26,8 +29,8 @@ type Datastore interface {
// DeleteVulnerability(id string)

// Notifications
// InsertNotifications([]*Notification) error
// FindNotificationToSend() (*Notification, error)
// InsertNotifications([]Notification) error
// FindNotificationToSend() (Notification, error)
// CountNotificationsToSend() (int, error)
// MarkNotificationAsSent(id string)

Expand Down
19 changes: 11 additions & 8 deletions database/pgsql/feature.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func (pgSQL *pgSQL) insertFeature(feature database.Feature) (int, error) {
var id int
err = pgSQL.QueryRow(getQuery("soi_feature"), feature.Name, namespaceID).Scan(&id)
if err != nil {
return 0, err
return 0, handleError("soi_feature", err)
}

if pgSQL.cache != nil {
Expand Down Expand Up @@ -59,7 +59,7 @@ func (pgSQL *pgSQL) insertFeatureVersion(featureVersion database.FeatureVersion)
tx, err := pgSQL.Begin()
if err != nil {
tx.Rollback()
return 0, err
return 0, handleError("insertFeatureVersion.Begin()", err)
}

// Find or create FeatureVersion.
Expand All @@ -68,7 +68,7 @@ func (pgSQL *pgSQL) insertFeatureVersion(featureVersion database.FeatureVersion)
Scan(&newOrExisting, &featureVersion.ID)
if err != nil {
tx.Rollback()
return 0, err
return 0, handleError("soi_featureversion", err)
}
if newOrExisting == "exi" {
// That featureVersion already exists, return its id.
Expand All @@ -83,14 +83,14 @@ func (pgSQL *pgSQL) insertFeatureVersion(featureVersion database.FeatureVersion)
_, err = tx.Exec(getQuery("l_share_vulnerability_fixedin_feature"))
if err != nil {
tx.Rollback()
return 0, err
return 0, handleError("l_share_vulnerability_fixedin_feature", err)
}

// Select every vulnerability and the fixed version that affect this Feature.
rows, err := tx.Query(getQuery("s_vulnerability_fixedin_feature"), featureID)
if err != nil {
tx.Rollback()
return 0, err
return 0, handleError("s_vulnerability_fixedin_feature", err)
}
defer rows.Close()

Expand All @@ -100,7 +100,7 @@ func (pgSQL *pgSQL) insertFeatureVersion(featureVersion database.FeatureVersion)
err := rows.Scan(&fixedInID, &vulnerabilityID, &fixedInVersion)
if err != nil {
tx.Rollback()
return 0, err
return 0, handleError("s_vulnerability_fixedin_feature.Scan()", err)
}

if featureVersion.Version.Compare(fixedInVersion) < 0 {
Expand All @@ -111,16 +111,19 @@ func (pgSQL *pgSQL) insertFeatureVersion(featureVersion database.FeatureVersion)
featureVersion.ID, fixedInID)
if err != nil {
tx.Rollback()
return 0, err
return 0, handleError("i_vulnerability_affects_featureversion", err)
}
}
}
if err = rows.Err(); err != nil {
return 0, handleError("s_vulnerability_fixedin_feature.Rows()", err)
}

// Commit transaction.
err = tx.Commit()
if err != nil {
tx.Rollback()
return 0, err
return 0, handleError("insertFeatureVersion.Commit()", err)
}

if pgSQL.cache != nil {
Expand Down
16 changes: 11 additions & 5 deletions database/pgsql/keyvalue.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func (pgSQL *pgSQL) InsertKeyValue(key, value string) (err error) {
// First, try to update.
r, err := pgSQL.Exec(getQuery("u_keyvalue"), value, key)
if err != nil {
return err
return handleError("u_keyvalue", err)
}
if n, _ := r.RowsAffected(); n > 0 {
// Updated successfully.
Expand All @@ -41,18 +41,24 @@ func (pgSQL *pgSQL) InsertKeyValue(key, value string) (err error) {
// Got unique constraint violation, retry.
continue
}
return err
return handleError("i_keyvalue", err)
}

return nil
}
}

// GetValue reads a single key / value tuple and returns an empty string if the key doesn't exist.
func (pgSQL *pgSQL) GetKeyValue(key string) (value string, err error) {
err = pgSQL.QueryRow(getQuery("s_keyvalue"), key).Scan(&value)
func (pgSQL *pgSQL) GetKeyValue(key string) (string, error) {
var value string
err := pgSQL.QueryRow(getQuery("s_keyvalue"), key).Scan(&value)

if err == sql.ErrNoRows {
return "", nil
}
return
if err != nil {
return "", handleError("s_keyvalue", err)
}

return value, nil
}
30 changes: 15 additions & 15 deletions database/pgsql/layer.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func (pgSQL *pgSQL) FindLayer(name string, withFeatures, withVulnerabilities boo
return layer, cerrors.ErrNotFound
}
if err != nil {
return layer, err
return layer, handleError("s_layer", err)
}

if !parentID.IsZero() {
Expand Down Expand Up @@ -78,7 +78,7 @@ func (pgSQL *pgSQL) getLayerFeatureVersions(layerID int, idOnly bool) ([]databas
// Query
rows, err := pgSQL.Query(query, layerID)
if err != nil && err != sql.ErrNoRows {
return featureVersions, err
return featureVersions, handleError(query, err)
}
defer rows.Close()

Expand All @@ -91,14 +91,14 @@ func (pgSQL *pgSQL) getLayerFeatureVersions(layerID int, idOnly bool) ([]databas
if idOnly {
err = rows.Scan(&featureVersion.ID, &modification)
if err != nil {
return featureVersions, err
return featureVersions, handleError(query+".Scan()", err)
}
} else {
err = rows.Scan(&featureVersion.ID, &modification, &featureVersion.Feature.Namespace.ID,
&featureVersion.Feature.Namespace.Name, &featureVersion.Feature.ID,
&featureVersion.Feature.Name, &featureVersion.ID, &featureVersion.Version)
if err != nil {
return featureVersions, err
return featureVersions, handleError(query+".Scan()", err)
}
}

Expand All @@ -114,7 +114,7 @@ func (pgSQL *pgSQL) getLayerFeatureVersions(layerID int, idOnly bool) ([]databas
}
}
if err = rows.Err(); err != nil {
return featureVersions, err
return featureVersions, handleError(query+".Rows()", err)
}

// Build result by converting our map to a slice
Expand All @@ -141,7 +141,7 @@ func (pgSQL *pgSQL) loadAffectedBy(featureVersions []database.FeatureVersion) er
rows, err := pgSQL.Query(getQuery("s_featureversions_vulnerabilities"),
buildInputArray(featureVersionIDs))
if err != nil && err != sql.ErrNoRows {
return err
return handleError("s_featureversions_vulnerabilities", err)
}
defer rows.Close()

Expand All @@ -153,12 +153,12 @@ func (pgSQL *pgSQL) loadAffectedBy(featureVersions []database.FeatureVersion) er
&vulnerability.Description, &vulnerability.Link, &vulnerability.Severity,
&vulnerability.Namespace.Name, &vulnerability.FixedBy)
if err != nil {
return err
return handleError("s_featureversions_vulnerabilities.Scan()", err)
}
vulnerabilities[featureversionID] = append(vulnerabilities[featureversionID], vulnerability)
}
if err = rows.Err(); err != nil {
return err
return handleError("s_featureversions_vulnerabilities.Rows()", err)
}

// Assign vulnerabilities to every FeatureVersions
Expand Down Expand Up @@ -208,7 +208,7 @@ func (pgSQL *pgSQL) InsertLayer(layer database.Layer) error {
tx, err := pgSQL.Begin()
if err != nil {
tx.Rollback()
return err
return handleError("InsertLayer.Begin()", err)
}

// Find or insert namespace if provided.
Expand Down Expand Up @@ -243,7 +243,7 @@ func (pgSQL *pgSQL) InsertLayer(layer database.Layer) error {
Scan(&layer.ID)
if err != nil {
tx.Rollback()
return err
return handleError("i_layer", err)
}
} else {
if existingLayer.EngineVersion >= layer.EngineVersion {
Expand All @@ -255,14 +255,14 @@ func (pgSQL *pgSQL) InsertLayer(layer database.Layer) error {
_, err = tx.Exec(getQuery("u_layer"), layer.ID, layer.EngineVersion, namespaceID)
if err != nil {
tx.Rollback()
return err
return handleError("u_layer", err)
}

// Remove all existing Layer_diff_FeatureVersion.
_, err = tx.Exec(getQuery("r_layer_diff_featureversion"), layer.ID)
if err != nil {
tx.Rollback()
return err
return handleError("r_layer_diff_featureversion", err)
}
}

Expand All @@ -276,7 +276,7 @@ func (pgSQL *pgSQL) InsertLayer(layer database.Layer) error {
err = tx.Commit()
if err != nil {
tx.Rollback()
return err
return handleError("InsertLayer.Commit()", err)
}

return nil
Expand Down Expand Up @@ -324,13 +324,13 @@ func (pgSQL *pgSQL) updateDiffFeatureVersions(tx *sql.Tx, layer, existingLayer *
if len(addIDs) > 0 {
_, err = tx.Exec(getQuery("i_layer_diff_featureversion"), layer.ID, "add", buildInputArray(addIDs))
if err != nil {
return err
return handleError("i_layer_diff_featureversion.Add", err)
}
}
if len(delIDs) > 0 {
_, err = tx.Exec(getQuery("i_layer_diff_featureversion"), layer.ID, "del", buildInputArray(delIDs))
if err != nil {
return err
return handleError("i_layer_diff_featureversion.Del", err)
}
}

Expand Down
10 changes: 7 additions & 3 deletions database/pgsql/namespace.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
cerrors "github.com/coreos/clair/utils/errors"
)

func (pgSQL *pgSQL) insertNamespace(namespace database.Namespace) (id int, err error) {
func (pgSQL *pgSQL) insertNamespace(namespace database.Namespace) (int, error) {
if namespace.Name == "" {
return 0, cerrors.NewBadRequestError("could not find/insert invalid Namespace")
}
Expand All @@ -16,11 +16,15 @@ func (pgSQL *pgSQL) insertNamespace(namespace database.Namespace) (id int, err e
}
}

err = pgSQL.QueryRow(getQuery("soi_namespace"), namespace.Name).Scan(&id)
var id int
err := pgSQL.QueryRow(getQuery("soi_namespace"), namespace.Name).Scan(&id)
if err != nil {
return 0, handleError("soi_namespace", err)
}

if pgSQL.cache != nil {
pgSQL.cache.Add("namespace:"+namespace.Name, id)
}

return
return id, nil
}

0 comments on commit 6a9cf21

Please sign in to comment.