Skip to content

Commit

Permalink
database: Add feature_type database model
Browse files Browse the repository at this point in the history
  • Loading branch information
KeyboardNerd committed Feb 19, 2019
1 parent c6c8fce commit 00eed77
Show file tree
Hide file tree
Showing 4 changed files with 143 additions and 26 deletions.
26 changes: 0 additions & 26 deletions database/affected_feature_type.go

This file was deleted.

52 changes: 52 additions & 0 deletions database/feature_type.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Copyright 2019 clair authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package database

import (
"database/sql/driver"
"fmt"
)

// FeatureType indicates the type of feature that a vulnerability
// affects.
type FeatureType string

const (
SourcePackage FeatureType = "source"
BinaryPackage FeatureType = "binary"
)

var featureTypes = []FeatureType{
SourcePackage,
BinaryPackage,
}

// Scan implements the database/sql.Scanner interface.
func (t *FeatureType) Scan(value interface{}) error {
val := value.(string)
for _, ft := range featureTypes {
if string(ft) == val {
*t = ft
return nil
}
}

panic(fmt.Sprintf("invalid feature type received from database: '%s'", val))
}

// Value implements the database/sql/driver.Valuer interface.
func (t *FeatureType) Value() (driver.Value, error) {
return string(*t), nil
}
53 changes: 53 additions & 0 deletions database/pgsql/feature_type.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// Copyright 2019 clair authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package pgsql

import "github.com/coreos/clair/database"

const (
selectAllFeatureTypes = `SELECT id, name FROM feature_type`
)

type featureTypes struct {
byID map[int]database.FeatureType
byName map[database.FeatureType]int
}

func newFeatureTypes() *featureTypes {
return &featureTypes{make(map[int]database.FeatureType), make(map[database.FeatureType]int)}
}

func (tx *pgSession) getFeatureTypeMap() (*featureTypes, error) {
rows, err := tx.Query(selectAllFeatureTypes)
if err != nil {
return nil, err
}

types := newFeatureTypes()
for rows.Next() {
var (
id int
name database.FeatureType
)
if err := rows.Scan(&id, &name); err != nil {
return nil, err
}

types.byID[id] = name
types.byName[name] = id
}

return types, nil
}
38 changes: 38 additions & 0 deletions database/pgsql/feature_type_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Copyright 2019 clair authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package pgsql

import (
"testing"

"github.com/stretchr/testify/require"

"github.com/coreos/clair/database"
)

func TestGetFeatureTypeMap(t *testing.T) {
tx, cleanup := createTestPgSession(t, "TestGetFeatureTypeMap")
defer cleanup()

types, err := tx.getFeatureTypeMap()
if err != nil {
require.Nil(t, err, err.Error())
}

require.Equal(t, database.SourcePackage, types.byID[1])
require.Equal(t, database.BinaryPackage, types.byID[2])
require.Equal(t, 1, types.byName[database.SourcePackage])
require.Equal(t, 2, types.byName[database.BinaryPackage])
}

0 comments on commit 00eed77

Please sign in to comment.