Skip to content

Instantly share code, notes, and snippets.

@hauxe
hauxe / crud_update_part.go
Created June 17, 2018 04:42
crud update part
// Update update data
func (crud *CRUD) Update(data interface{}) error {
_, err := crud.Config.DB.NamedExec(crud.Config.sqlCRUDUpdate, data)
if err != nil {
return errors.Wrap(err, "error crud update")
}
return nil
}
// PrioritizedEntity interface
type PrioritizedEntity interface {
GetPriority() int
AccessResource(interface{})
}
// GreedyMutex a mutex that handles greedy entities with higher priority
type GreedyMutex struct {
sync.Mutex
TimeToWait time.Duration
// Compete compete for resource
func (mux *GreedyMutex) Compete(ctx context.Context, resource interface{}) {
mux.Lock()
greedyEntities := []PrioritizedEntity{}
defer func() { go mux.Compete(ctx, resource) }()
defer mux.Unlock()
defer func() {
var winner PrioritizedEntity
for _, entity := range greedyEntities {
if winner == nil || winner.GetPriority() < entity.GetPriority() {
// GateKeeper defines gate keeper for resource
type GateKeeper struct {
ctx context.Context
cancel context.CancelFunc
mux sync.Mutex
queue chan PrioritizedEntity
}
// New new gate keeper
func New(queuedElements int) *GateKeeper {
// Start starts monitoring for competition entity for resource
func (k *GateKeeper) Start(resource interface{}, waitTime time.Duration) {
k.mux.Lock()
defer k.mux.Unlock()
if k.cancel != nil {
k.cancel()
}
k.ctx, k.cancel = context.WithCancel(context.Background())
mux := &GreedyMutex{
TimeToWait: waitTime,
package main
import (
"fmt"
"time"
resourceprioritize "github.com/hauxe/go-resource-prioritize"
)
// PrioritizedEntity defines prioritized entity
reader, writer, err := os.Pipe()
if err != nil {
panic(err)
}
os.Stdout = writer
os.Stderr = writer
log.SetOutput(writer)
out := make(chan string)
go func() {
var buf bytes.Buffer
io.Copy(&buf, reader)
out <- buf.String()
}()
func (crud *CRUD) registerD() gomHTTP.ServerRoute {
// build create sql
crud.Config.sqlCRUDDelete = fmt.Sprintf(sqlCRUDDelete, crud.Config.TableName,
crud.Config.pk.name)
return gomHTTP.ServerRoute{
Name: "crud_delete_" + crud.Config.TableName,
Method: http.MethodDelete,
Path: fmt.Sprintf("/%s", crud.Config.TableName),
Validators: []gomHTTP.ParamValidator{validatePrimaryKey(crud.Config.pk.index)},
Handler: crud.handleDelete,