Skip to content

Commit

Permalink
remove jinzu gorm, replace with native sql
Browse files Browse the repository at this point in the history
  • Loading branch information
irahardianto committed Dec 16, 2017
1 parent ef52f28 commit c73c3f7
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 72 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
*.so
*.dylib

.idea/

# Test binary, build with `go test -c`
*.test

Expand Down
52 changes: 28 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ Inspired by [Manuel Kiessling go-cleanarchitecture](http://manuel.kiessling.net/
It has simple dependencies:

- [Chi (Router)](https://github.com/go-chi/chi)
- [Jinzhu GORM (ORM)](https://github.com/jinzhu/gorm)
- [Testify (Test & Mock framework)](https://github.com/stretchr/testify)
- [Mockery (Mock generator)](https://github.com/vektra/mockery)
- [Hystrix-Go (Circuit Breaker)](https://github.com/afex/hystrix-go)
Expand Down Expand Up @@ -319,11 +318,11 @@ You see, instead of calling directly to PlayerService, PlayerController uses the

func (k *kernel) InjectPlayerController() controllers.PlayerController {

sqlconn := new(infrastructures.SqlConnection)
sqlconn.InitDB()
sqlConn, _ := sql.Open("sqlite3", "/var/tmp/tennis.db")
sqliteHandler := &infrastructures.SQLiteHandler{}
sqliteHandler.Conn = sqlConn

playerRepository := &repositories.PlayerRepository{}
playerRepository.Db.Db = sqlconn.GetDB()
playerRepository := &repositories.PlayerRepository{*sqliteHandler}

playerService := &services.PlayerService{}
playerService.PlayerRepository = &repositories.PlayerRepositoryWithCircuitBreaker{playerRepository}
Expand Down Expand Up @@ -446,17 +445,22 @@ If you recall we inject our PlayerService with PlayerRepositoryWithCircuitBreake
Base PlayerRepository implementation :

type PlayerRepository struct {
Db infrastructures.SqlConnection
infrastructures.SQLiteHandler
}

func (repository *PlayerRepository) GetPlayerByName(name string) (models.PlayerModel, error) {

conn := repository.Db.GetDB()
row, err :=repository.Query(fmt.Sprintf("SELECT * FROM player_models WHERE name = '%s'", name))
if err != nil {
return models.PlayerModel{}, err
}

player := models.PlayerModel{}
conn.First(&player, "Name = ?", name)
var player models.PlayerModel

return player, nil
row.Next()
row.Scan(&player.Id, &player.Name, &player.Score)

return player, nil
}

PlayerRepository extension implementation :
Expand All @@ -467,23 +471,23 @@ PlayerRepository extension implementation :

func (repository *PlayerRepositoryWithCircuitBreaker) GetPlayerByName(name string) (models.PlayerModel, error) {

output := make(chan models.PlayerModel, 1)
hystrix.ConfigureCommand("get_player_by_name", hystrix.CommandConfig{Timeout: 1000})
errors := hystrix.Go("get_player_by_name", func() error {
output := make(chan models.PlayerModel, 1)
hystrix.ConfigureCommand("get_player_by_name", hystrix.CommandConfig{Timeout: 1000})
errors := hystrix.Go("get_player_by_name", func() error {

player, _ := repository.PlayerRepository.GetPlayerByName(name)
player, _ := repository.PlayerRepository.GetPlayerByName(name)

output <- player
return nil
}, nil)
output <- player
return nil
}, nil)

select {
case out := <-output:
return out, nil
case err := <-errors:
println(err)
return models.PlayerModel{}, err
}
select {
case out := <-output:
return out, nil
case err := <-errors:
println(err)
return models.PlayerModel{}, err
}
}

Basically PlayerRepositoryWithCircuitBreaker implement the same interface as PlayerRepository, IPlayerRepository
Expand Down
46 changes: 46 additions & 0 deletions infrastructures/SQLiteHandler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package infrastructures

import (
"database/sql"
"fmt"
"github.com/irahardianto/service-pattern-go/interfaces"
)

type SQLiteHandler struct {
Conn *sql.DB
}

func (handler *SQLiteHandler) Execute(statement string) {
handler.Conn.Exec(statement)
}

func (handler *SQLiteHandler) Query(statement string) (interfaces.Row, error) {
//fmt.Println(statement)
rows, err := handler.Conn.Query(statement)

if err != nil {
fmt.Println(err)
return new(SqliteRow),err
}
row := new(SqliteRow)
row.Rows = rows

return row, nil
}

type SqliteRow struct {
Rows *sql.Rows
}

func (r SqliteRow) Scan(dest ...interface{}) error {
err := r.Rows.Scan(dest...)
if err != nil {
return err
}

return nil
}

func (r SqliteRow) Next() bool {
return r.Rows.Next()
}
39 changes: 0 additions & 39 deletions infrastructures/SqlConnection.go

This file was deleted.

11 changes: 11 additions & 0 deletions interfaces/IDbHandler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package interfaces

type DbHandler interface {
Execute(statement string)
Query(statement string) (Row, error)
}

type Row interface {
Scan(dest ...interface{}) error
Next() bool
}
14 changes: 10 additions & 4 deletions repositories/PlayerRepository.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/irahardianto/service-pattern-go/models"

_ "github.com/jinzhu/gorm/dialects/sqlite"
"fmt"
)

type PlayerRepositoryWithCircuitBreaker struct {
Expand Down Expand Up @@ -35,15 +36,20 @@ func (repository *PlayerRepositoryWithCircuitBreaker) GetPlayerByName(name strin
}

type PlayerRepository struct {
Db infrastructures.SqlConnection
infrastructures.SQLiteHandler
}

func (repository *PlayerRepository) GetPlayerByName(name string) (models.PlayerModel, error) {

conn := repository.Db.GetDB()
row, err :=repository.Query(fmt.Sprintf("SELECT * FROM player_models WHERE name = '%s'", name))
if err != nil {
return models.PlayerModel{}, err
}

var player models.PlayerModel

player := models.PlayerModel{}
conn.First(&player, "Name = ?", name)
row.Next()
row.Scan(&player.Id, &player.Name, &player.Score)

return player, nil
}
11 changes: 6 additions & 5 deletions servicecontainer.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import (
"sync"

"github.com/irahardianto/service-pattern-go/controllers"
"github.com/irahardianto/service-pattern-go/infrastructures"
"github.com/irahardianto/service-pattern-go/repositories"
"github.com/irahardianto/service-pattern-go/infrastructures"
"github.com/irahardianto/service-pattern-go/services"
"database/sql"
)

type IServiceContainer interface {
Expand All @@ -17,11 +18,11 @@ type kernel struct{}

func (k *kernel) InjectPlayerController() controllers.PlayerController {

sqlconn := &infrastructures.SqlConnection{}
sqlconn.InitDB()
sqlConn, _ := sql.Open("sqlite3", "/var/tmp/tennis.db")
sqliteHandler := &infrastructures.SQLiteHandler{}
sqliteHandler.Conn = sqlConn

playerRepository := &repositories.PlayerRepository{}
playerRepository.Db.Db = sqlconn.GetDB()
playerRepository := &repositories.PlayerRepository{*sqliteHandler}

playerService := &services.PlayerService{}
playerService.PlayerRepository = &repositories.PlayerRepositoryWithCircuitBreaker{playerRepository}
Expand Down

0 comments on commit c73c3f7

Please sign in to comment.