Skip to content

Commit

Permalink
refactor: move ObjectProperies to db package
Browse files Browse the repository at this point in the history
  • Loading branch information
fiftin committed May 7, 2021
1 parent c16406c commit 55e8024
Show file tree
Hide file tree
Showing 10 changed files with 243 additions and 114 deletions.
96 changes: 48 additions & 48 deletions .circleci/config.yml
Expand Up @@ -243,51 +243,51 @@ jobs:
- *store-bin-artifacts


workflows:
version: 2

build-test:
jobs:
- test:docker
- test:golang
- test:integration:hooks
- test:integration
- build:local
- test:db:migration:
requires:
- build:local

# Don't build on master because build is just a gorelease without the release
- build:
requires:
- test:golang
- test:db:migration
- test:integration
filters:
branches:
ignore: master

# Dev deploys require all tests to pass and app builds
- deploy:dev:
requires:
- build
- test:docker
filters:
branches:
only: develop

# Production deploys only happen if everything passes
# and we have a tag starting with v
- release:
filters:
branches:
ignore: /.*/
tags:
only: /^v.*/

- deploy:prod:
filters:
branches:
ignore: /.*/
tags:
only: /^v.*/
#workflows:
# version: 2
#
# build-test:
# jobs:
# - test:docker
# - test:golang
# - test:integration:hooks
# - test:integration
# - build:local
# - test:db:migration:
# requires:
# - build:local
#
## Don't build on master because build is just a gorelease without the release
# - build:
# requires:
# - test:golang
# - test:db:migration
# - test:integration
# filters:
# branches:
# ignore: master
#
## Dev deploys require all tests to pass and app builds
# - deploy:dev:
# requires:
# - build
# - test:docker
# filters:
# branches:
# only: develop
#
## Production deploys only happen if everything passes
## and we have a tag starting with v
# - release:
# filters:
# branches:
# ignore: /.*/
# tags:
# only: /^v.*/
#
# - deploy:prod:
# filters:
# branches:
# ignore: /.*/
# tags:
# only: /^v.*/
35 changes: 35 additions & 0 deletions db/Store.go
Expand Up @@ -27,6 +27,13 @@ type RetrieveQueryParams struct {
SortInverted bool
}

type ObjectProperties struct {
TableName string
SortableColumns []string
IsGlobal bool
TemplateColumnName string
}

var ErrNotFound = errors.New("sql: no rows in result set")
var ErrInvalidOperation = errors.New("sql: no rows in result set")
var Forbidden = errors.New("sql: no rows in result set")
Expand Down Expand Up @@ -127,4 +134,32 @@ type Store interface {
CreateTaskOutput(output TaskOutput) (TaskOutput, error)
}

var AccessKeyObject = ObjectProperties{
TableName: "access_key",
SortableColumns: []string{"name", "type"},
TemplateColumnName: "ssh_key_id",
}

var GlobalAccessKeyObject = ObjectProperties{
IsGlobal: true,
TableName: "access_key",
SortableColumns: []string{"name", "type"},
TemplateColumnName: "ssh_key_id",
}

var EnvironmentObject = ObjectProperties{
TableName: "project__environment",
SortableColumns: []string{"name"},
}

var InventoryObject = ObjectProperties{
TableName: "project__inventory",
SortableColumns: []string{"name"},
TemplateColumnName: "inventory_id",
}

var RepositoryObject = ObjectProperties{
TableName: "project__repository",
TemplateColumnName: "repository_id",
}

20 changes: 16 additions & 4 deletions db/bolt/BoltDb.go
@@ -1,24 +1,36 @@
package bolt

import (
"fmt"
"github.com/ansible-semaphore/semaphore/util"
bolt "go.etcd.io/bbolt"
"go.etcd.io/bbolt"
)

type BoltDb struct {
db *bolt.DB
db *bbolt.DB
}

func (d *BoltDb) Migrate() {
func makeObjectId(tableName string, ids ...int) ([]byte, error) {
n := len(ids)

id := tableName
for i := 0; i < n; i++ {
id += fmt.Sprintf("_%010d", ids[i])
}

return []byte(id), nil
}

func (d *BoltDb) Migrate() error {
return nil
}

func (d *BoltDb) Connect() error {
config, err := util.Config.GetDBConfig()
if err != nil {
return err
}
db, err := bolt.Open(config.Hostname, 0666, nil)
db, err := bbolt.Open(config.Hostname, 0666, nil)
if err != nil {
return err
}
Expand Down
119 changes: 119 additions & 0 deletions db/bolt/inventory.go
@@ -0,0 +1,119 @@
package bolt

import (
"encoding/json"
"github.com/ansible-semaphore/semaphore/db"
bolt "go.etcd.io/bbolt"
"strconv"
)


func (d *BoltDb) GetInventory(projectID int, inventoryID int) (inventory db.Inventory, err error) {
id, err := makeObjectId("inventory", projectID)

err = d.db.View(func(tx *bolt.Tx) error {
b := tx.Bucket(id)
if b == nil {
return db.ErrNotFound
}

id := []byte(strconv.Itoa(inventoryID))
str := b.Get(id)
if str == nil {
return db.ErrNotFound
}

return json.Unmarshal(str, &inventory)
})

if err != nil {
return
}

//if inventory.KeyID != nil {
// inventory.Key, err = d.GetAccessKey(projectID, *inventory.KeyID)
// if err != nil {
// return
// }
//}
//
//if inventory.SSHKeyID != nil {
// inventory.SSHKey, err = d.GetAccessKey(projectID, *inventory.SSHKeyID)
//}

return
}

func (d *BoltDb) GetInventories(projectID int, params db.RetrieveQueryParams) (inventories []db.Inventory, err error) {
err = d.db.Update(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("inventory_" + strconv.Itoa(projectID)))
if b == nil {
return db.ErrNotFound
}

return nil
})

return inventories, err
}

func (d *BoltDb) DeleteInventory(projectID int, inventoryID int) error {
return d.db.Update(func (tx *bolt.Tx) error {
b := tx.Bucket([]byte("inventory_" + strconv.Itoa(projectID)))
if b == nil {
return db.ErrNotFound
}
return b.Delete([]byte(strconv.Itoa(inventoryID)))
})
}

func (d *BoltDb) DeleteInventorySoft(projectID int, inventoryID int) error {
return d.DeleteInventory(projectID, inventoryID)
}

func (d *BoltDb) UpdateInventory(inventory db.Inventory) error {
err := d.db.Update(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("inventory_" + strconv.Itoa(inventory.ProjectID)))
if b == nil {
return db.ErrNotFound
}

id := []byte(strconv.Itoa(inventory.ID))
if b.Get(id) == nil {
return db.ErrNotFound
}

str, err2 := json.Marshal(inventory)
if err2 != nil {
return err2
}

return b.Put(id, str)
})

return err
}

func (d *BoltDb) CreateInventory(inventory db.Inventory) (newInventory db.Inventory, err error) {
err = d.db.Update(func(tx *bolt.Tx) error {
b, err2 := tx.CreateBucketIfNotExists([]byte("inventory_" + strconv.Itoa(inventory.ProjectID)))
if err2 != nil {
return err2
}

id, _ := b.NextSequence()
newInventory = inventory
newInventory.ID = int(id)
str, err2 := json.Marshal(newInventory)
if err2 != nil {
return err2
}

return b.Put([]byte(strconv.Itoa(newInventory.ID)), str)
})

return
}



17 changes: 5 additions & 12 deletions db/sql/SqlDb.go
Expand Up @@ -188,14 +188,7 @@ func createDb() error {
return nil
}

type objectProperties struct {
TableName string
SortableColumns []string
IsGlobal bool
TemplateColumnName string
}

func (d *SqlDb) getObject(projectID int, props objectProperties, objectID int, object interface{}) (err error) {
func (d *SqlDb) getObject(projectID int, props db.ObjectProperties, objectID int, object interface{}) (err error) {
q := squirrel.Select("*").
From(props.TableName).
Where("id=?", objectID)
Expand All @@ -221,7 +214,7 @@ func (d *SqlDb) getObject(projectID int, props objectProperties, objectID int, o
return
}

func (d *SqlDb) getObjects(projectID int, props objectProperties, params db.RetrieveQueryParams, objects interface{}) (err error) {
func (d *SqlDb) getObjects(projectID int, props db.ObjectProperties, params db.RetrieveQueryParams, objects interface{}) (err error) {
q := squirrel.Select("*").
From(props.TableName + " pe").
Where("pe.project_id=?", projectID)
Expand Down Expand Up @@ -249,7 +242,7 @@ func (d *SqlDb) getObjects(projectID int, props objectProperties, params db.Retr
return
}

func (d *SqlDb) isObjectInUse(projectID int, props objectProperties, objectID int) (bool, error) {
func (d *SqlDb) isObjectInUse(projectID int, props db.ObjectProperties, objectID int) (bool, error) {
templatesC, err := d.sql.SelectInt(
"select count(1) from project__template where project_id=? and " + props.TemplateColumnName + "=?",
projectID,
Expand All @@ -262,7 +255,7 @@ func (d *SqlDb) isObjectInUse(projectID int, props objectProperties, objectID in
return templatesC > 0, nil
}

func (d *SqlDb) deleteObject(projectID int, props objectProperties, objectID int) error {
func (d *SqlDb) deleteObject(projectID int, props db.ObjectProperties, objectID int) error {
inUse, err := d.isObjectInUse(projectID, props, objectID)

if err != nil {
Expand All @@ -280,7 +273,7 @@ func (d *SqlDb) deleteObject(projectID int, props objectProperties, objectID int
objectID))
}

func (d *SqlDb) deleteObjectSoft(projectID int, props objectProperties, objectID int) error {
func (d *SqlDb) deleteObjectSoft(projectID int, props db.ObjectProperties, objectID int) error {
return validateMutationResult(
d.sql.Exec(
"update " + props.TableName + " set removed=1 where project_id=? and id=?",
Expand Down

0 comments on commit 55e8024

Please sign in to comment.