diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..194c45f --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.idea/ +*.so +vendor/ +Gopkg.lock +*.so +bin/ \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d6b541e --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module github.com/nori-io/sql-gorm + +go 1.14 + +require ( + github.com/Masterminds/semver/v3 v3.0.3 // indirect + github.com/jinzhu/gorm v1.9.15 + github.com/nori-io/common/v3 v3.0.0-20201124183231-795113bbd474 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..9ea5d04 --- /dev/null +++ b/go.sum @@ -0,0 +1,55 @@ +github.com/Masterminds/semver/v3 v3.0.3 h1:znjIyLfpXEDQjOIEWh+ehwpTU14UzUPub3c3sm36u14= +github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/jinzhu/gorm v1.9.15 h1:OdR1qFvtXktlxk73XFYMiYn9ywzTwytqe4QkuMRqc38= +github.com/jinzhu/gorm v1.9.15/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= +github.com/nori-io/common/v3 v3.0.0-20201124183231-795113bbd474 h1:x706sUojg1Rv+d35FyBvWr/aCkutGkjX5pir4fAPKxk= +github.com/nori-io/common/v3 v3.0.0-20201124183231-795113bbd474/go.mod h1:a/ICgA6b3A3x8HlNDSe9z6HCNiFvuvZJhZP78rzX0ME= +github.com/nori-io/common/v3 v3.0.0 h1:5Qa40t9EL1tqD1j8RgK9fOI/ydMqhVoZYZZVGFo64I8= +github.com/nori-io/common/v3 v3.0.0/go.mod h1:xWpo27B7goqoWOSIEt/FZnxDaWhBkzowQ625/whGT80= +github.com/nori-io/interfaces/public/sql/gorm v0.0.0-20200806063219-4ee7b9c342e7 h1:hdCG+ngmottGjsYAXLAHiAp08L6/K4pkZt26SteezeQ= +github.com/nori-io/interfaces/public/sql/gorm v0.0.0-20200806063219-4ee7b9c342e7/go.mod h1:QT6u+AsI2XoQ4ZJscRMyG9yofLXqV1vbshVzrsXPmyg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/hook/hook.go b/internal/hook/hook.go new file mode 100644 index 0000000..3c7945c --- /dev/null +++ b/internal/hook/hook.go @@ -0,0 +1,16 @@ +package hook + +import ( + "github.com/jinzhu/gorm" + "github.com/nori-io/common/v3/logger" +) + +type Logger struct { + Origin logger.FieldLogger +} + +func (l *Logger) Print(values ...interface{}) { + for _, v := range gorm.LogFormatter(values...) { + l.Origin.Debug("%s\n", v) + } +} diff --git a/plugin.go b/plugin.go new file mode 100644 index 0000000..f8bd5b9 --- /dev/null +++ b/plugin.go @@ -0,0 +1,120 @@ +package main + +import ( + "context" + "errors" + + "github.com/nori-io/sql-gorm/internal/hook" + + "github.com/jinzhu/gorm" + "github.com/nori-io/common/v3/config" + "github.com/nori-io/common/v3/logger" + "github.com/nori-io/common/v3/meta" + "github.com/nori-io/common/v3/plugin" + i "github.com/nori-io/interfaces/public/sql/gorm" + + _ "github.com/jinzhu/gorm/dialects/mssql" + _ "github.com/jinzhu/gorm/dialects/mysql" + _ "github.com/jinzhu/gorm/dialects/postgres" + _ "github.com/jinzhu/gorm/dialects/sqlite" +) + +type service struct { + db *gorm.DB + config *pluginConfig + logger logger.FieldLogger +} + +type pluginConfig struct { + dsn string + dialect string + logMode bool +} + +var ( + Plugin plugin.Plugin = &service{} + dialects = [4]string{"mssql", "mysql", "postgres", "sqlite"} +) + +func (p *service) Init(ctx context.Context, config config.Config, log logger.FieldLogger) error { + + var isValidDialect bool + + p.logger = log + p.config.logMode = config.Bool("sql.gorm.logMode", "log mode: true or false")() + p.config.dsn = config.String("sql.gorm.dsn", "database connection string")() + p.config.dialect = config.String("sql.gorm.dialect", "sql dialect: mssql, mysql, postgres, sqlite")() + + for _, v := range dialects { + if v == p.config.dialect { + isValidDialect = true + } + } + + if !isValidDialect { + return errors.New("Dialect is wrong. You should use on of sql dialects: mssql, mysql, postgres, sqlite") + } + return nil +} + +func (p *service) Instance() interface{} { + return p.db +} + +func (p *service) Meta() meta.Meta { + return meta.Data{ + ID: meta.ID{ + ID: "sql/gorm", + Version: "1.9.15", + }, + Author: meta.Author{ + Name: "Nori.io", + URI: "https://nori.io/", + }, + Dependencies: []meta.Dependency{}, + Description: meta.Description{ + Name: "Nori: ORM GORM", + Description: "This plugin implements instance of ORM GORM", + }, + Core: meta.Core{ + VersionConstraint: "^0.2.0", + }, + Interface: i.GormInterface, + License: []meta.License{ + { + Title: "GPLv3", + Type: "GPLv3", + URI: "https://www.gnu.org/licenses/"}, + }, + Links: []meta.Link{}, + Repository: meta.Repository{ + Type: "git", + URI: "https://github.com/nori-io/sql-gorm", + }, + Tags: []string{"orm", "gorm", "sql", "database", "db"}, + } +} + +func (p *service) Start(ctx context.Context, registry plugin.Registry) error { + var err error + p.db, err = gorm.Open(p.config.dialect, p.config.dsn) + if err != nil { + p.logger.Error(err.Error()) + } else { + p.db.LogMode(p.config.logMode) + if p.config.logMode == true { + p.db.SetLogger(&hook.Logger{Origin: p.logger}) + } + } + + return err +} + +func (p *service) Stop(ctx context.Context, registry plugin.Registry) error { + err := p.db.Close() + if err != nil { + p.logger.Error(err.Error()) + } + + return err +}