Skip to content

Commit 20ec4eb

Browse files
committed
Move open db into db package
1 parent c81ac21 commit 20ec4eb

File tree

4 files changed

+121
-115
lines changed

4 files changed

+121
-115
lines changed

config.go renamed to db/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package sql
1+
package db
22

33
import (
44
"fmt"

db/db.go

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package db
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
"log"
7+
"path/filepath"
8+
"strings"
9+
"time"
10+
)
11+
12+
func Detect(s string) string {
13+
if strings.Index(s, "sqlserver:") == 0 {
14+
return "mssql"
15+
} else if strings.Index(s, "postgres:") == 0 {
16+
return "postgres"
17+
} else {
18+
if strings.Index(s, "user=") >= 0 && strings.Index(s, "password=") >= 0 {
19+
if strings.Index(s, "dbname=") >= 0 || strings.Index(s, "host=") >= 0 || strings.Index(s, "port=") >= 0 {
20+
return "postgres"
21+
} else {
22+
return "godror"
23+
}
24+
} else {
25+
_, err := filepath.Abs(s)
26+
if (strings.Index(s, "@tcp(") >= 0 || strings.Index(s, "charset=") > 0 || strings.Index(s, "parseTime=") > 0 || strings.Index(s, "loc=") > 0 || strings.Index(s, "@") >= 0 || strings.Index(s, ":") >= 0) && err != nil {
27+
return "mysql"
28+
} else {
29+
return "sqlite3"
30+
}
31+
}
32+
}
33+
}
34+
func OpenByConfig(c Config) (*sql.DB, error) {
35+
if c.Mock {
36+
return nil, nil
37+
}
38+
if c.Retry.Retry1 <= 0 {
39+
return open(c)
40+
} else {
41+
durations := DurationsFromValue(c.Retry, "Retry", 9)
42+
return Open(c, durations...)
43+
}
44+
}
45+
func open(c Config) (*sql.DB, error) {
46+
dsn := c.DataSourceName
47+
if len(dsn) > 0 {
48+
if len(strings.TrimSpace(c.Driver)) == 0 {
49+
c.Driver = Detect(dsn)
50+
}
51+
} else {
52+
dsn = BuildDataSourceName(c)
53+
}
54+
db, err := sql.Open(c.Driver, dsn)
55+
if err != nil {
56+
return db, err
57+
}
58+
if c.ConnMaxLifetime != nil {
59+
db.SetConnMaxLifetime(*c.ConnMaxLifetime)
60+
}
61+
if c.MaxIdleConns > 0 {
62+
db.SetMaxIdleConns(c.MaxIdleConns)
63+
}
64+
if c.MaxOpenConns > 0 {
65+
db.SetMaxOpenConns(c.MaxOpenConns)
66+
}
67+
return db, err
68+
}
69+
func Open(c Config, retries ...time.Duration) (*sql.DB, error) {
70+
if c.Mock {
71+
return nil, nil
72+
}
73+
if len(retries) == 0 {
74+
return open(c)
75+
} else {
76+
db, er1 := open(c)
77+
if er1 == nil {
78+
return db, er1
79+
}
80+
i := 0
81+
err := Retry(retries, func() (err error) {
82+
i = i + 1
83+
db2, er2 := open(c)
84+
if er2 == nil {
85+
db = db2
86+
}
87+
return er2
88+
})
89+
if err != nil {
90+
log.Printf("Cannot conect to database: %s.", err.Error())
91+
}
92+
return db, err
93+
}
94+
}
95+
func BuildDataSourceName(c Config) string {
96+
if c.Driver == "postgres" {
97+
uri := fmt.Sprintf("user=%s dbname=%s password=%s host=%s port=%d sslmode=disable", c.User, c.Database, c.Password, c.Host, c.Port)
98+
return uri
99+
} else if c.Driver == "mysql" {
100+
uri := ""
101+
if c.MultiStatements {
102+
uri = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&multiStatements=True", c.User, c.Password, c.Host, c.Port, c.Database)
103+
return uri
104+
}
105+
uri = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", c.User, c.Password, c.Host, c.Port, c.Database)
106+
return uri
107+
} else if c.Driver == "mssql" { // mssql
108+
uri := fmt.Sprintf("sqlserver://%s:%s@%s:%d?Database=%s", c.User, c.Password, c.Host, c.Port, c.Database)
109+
return uri
110+
} else if c.Driver == "godror" || c.Driver == "oracle" {
111+
return fmt.Sprintf("user=\"%s\" password=\"%s\" connectString=\"%s:%d/%s\"", c.User, c.Password, c.Host, c.Port, c.Database)
112+
} else { //sqlite
113+
return c.Host // return sql.Open("sqlite3", c.Host)
114+
}
115+
}

driver.go

Lines changed: 0 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,8 @@ package sql
22

33
import (
44
"database/sql"
5-
"fmt"
6-
"log"
7-
"path/filepath"
85
"reflect"
96
"strconv"
10-
"strings"
11-
"time"
127
)
138

149
const (
@@ -77,107 +72,3 @@ func GetBuild(db *sql.DB) func(i int) string {
7772
return BuildParam
7873
}
7974
}
80-
func Detect(s string) string {
81-
if strings.Index(s, "sqlserver:") == 0 {
82-
return "mssql"
83-
} else if strings.Index(s, "postgres:") == 0 {
84-
return "postgres"
85-
} else {
86-
if strings.Index(s, "user=") >= 0 && strings.Index(s, "password=") >= 0 {
87-
if strings.Index(s, "dbname=") >= 0 || strings.Index(s, "host=") >= 0 || strings.Index(s, "port=") >= 0 {
88-
return "postgres"
89-
} else {
90-
return "godror"
91-
}
92-
} else {
93-
_, err := filepath.Abs(s)
94-
if (strings.Index(s, "@tcp(") >= 0 || strings.Index(s, "charset=") > 0 || strings.Index(s, "parseTime=") > 0 || strings.Index(s, "loc=") > 0 || strings.Index(s, "@") >= 0 || strings.Index(s, ":") >= 0) && err != nil {
95-
return "mysql"
96-
} else {
97-
return "sqlite3"
98-
}
99-
}
100-
}
101-
}
102-
func OpenByConfig(c Config) (*sql.DB, error) {
103-
if c.Mock {
104-
return nil, nil
105-
}
106-
if c.Retry.Retry1 <= 0 {
107-
return open(c)
108-
} else {
109-
durations := DurationsFromValue(c.Retry, "Retry", 9)
110-
return Open(c, durations...)
111-
}
112-
}
113-
func open(c Config) (*sql.DB, error) {
114-
dsn := c.DataSourceName
115-
if len(dsn) > 0 {
116-
if len(strings.TrimSpace(c.Driver)) == 0 {
117-
c.Driver = Detect(dsn)
118-
}
119-
} else {
120-
dsn = BuildDataSourceName(c)
121-
}
122-
db, err := sql.Open(c.Driver, dsn)
123-
if err != nil {
124-
return db, err
125-
}
126-
if c.ConnMaxLifetime != nil {
127-
db.SetConnMaxLifetime(*c.ConnMaxLifetime)
128-
}
129-
if c.MaxIdleConns > 0 {
130-
db.SetMaxIdleConns(c.MaxIdleConns)
131-
}
132-
if c.MaxOpenConns > 0 {
133-
db.SetMaxOpenConns(c.MaxOpenConns)
134-
}
135-
return db, err
136-
}
137-
func Open(c Config, retries ...time.Duration) (*sql.DB, error) {
138-
if c.Mock {
139-
return nil, nil
140-
}
141-
if len(retries) == 0 {
142-
return open(c)
143-
} else {
144-
db, er1 := open(c)
145-
if er1 == nil {
146-
return db, er1
147-
}
148-
i := 0
149-
err := Retry(retries, func() (err error) {
150-
i = i + 1
151-
db2, er2 := open(c)
152-
if er2 == nil {
153-
db = db2
154-
}
155-
return er2
156-
})
157-
if err != nil {
158-
log.Printf("Cannot conect to database: %s.", err.Error())
159-
}
160-
return db, err
161-
}
162-
}
163-
func BuildDataSourceName(c Config) string {
164-
if c.Driver == "postgres" {
165-
uri := fmt.Sprintf("user=%s dbname=%s password=%s host=%s port=%d sslmode=disable", c.User, c.Database, c.Password, c.Host, c.Port)
166-
return uri
167-
} else if c.Driver == "mysql" {
168-
uri := ""
169-
if c.MultiStatements {
170-
uri = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&multiStatements=True", c.User, c.Password, c.Host, c.Port, c.Database)
171-
return uri
172-
}
173-
uri = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", c.User, c.Password, c.Host, c.Port, c.Database)
174-
return uri
175-
} else if c.Driver == "mssql" { // mssql
176-
uri := fmt.Sprintf("sqlserver://%s:%s@%s:%d?Database=%s", c.User, c.Password, c.Host, c.Port, c.Database)
177-
return uri
178-
} else if c.Driver == "godror" || c.Driver == "oracle" {
179-
return fmt.Sprintf("user=\"%s\" password=\"%s\" connectString=\"%s:%d/%s\"", c.User, c.Password, c.Host, c.Port, c.Database)
180-
} else { //sqlite
181-
return c.Host // return sql.Open("sqlite3", c.Host)
182-
}
183-
}

writer/sql_writer.go renamed to writer/writer.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
q "github.com/core-go/sql"
1010
)
1111

12-
type SqlWriter[T any] struct {
12+
type Writer[T any] struct {
1313
db *sql.DB
1414
tableName string
1515
BuildParam func(i int) string
@@ -25,7 +25,7 @@ type SqlWriter[T any] struct {
2525
func NewSqlWriterWithMap[T any](db *sql.DB, tableName string, mp func(context.Context, interface{}) (interface{}, error), toArray func(interface{}) interface {
2626
driver.Valuer
2727
sql.Scanner
28-
}, options ...func(i int) string) *SqlWriter[T] {
28+
}, options ...func(i int) string) *Writer[T] {
2929
var buildParam func(i int) string
3030
if len(options) > 0 && options[0] != nil {
3131
buildParam = options[0]
@@ -40,18 +40,18 @@ func NewSqlWriterWithMap[T any](db *sql.DB, tableName string, mp func(context.Co
4040
modelType = modelType.Elem()
4141
}
4242
schema := q.CreateSchema(modelType)
43-
return &SqlWriter[T]{db: db, tableName: tableName, BuildParam: buildParam, Map: mp, BoolSupport: boolSupport, schema: schema, ToArray: toArray}
43+
return &Writer[T]{db: db, tableName: tableName, BuildParam: buildParam, Map: mp, BoolSupport: boolSupport, schema: schema, ToArray: toArray}
4444
}
4545

46-
func NewSqlWriter[T any](db *sql.DB, tableName string, options ...func(ctx context.Context, model interface{}) (interface{}, error)) *SqlWriter[T] {
46+
func NewSqlWriter[T any](db *sql.DB, tableName string, options ...func(ctx context.Context, model interface{}) (interface{}, error)) *Writer[T] {
4747
var mp func(context.Context, interface{}) (interface{}, error)
4848
if len(options) >= 1 {
4949
mp = options[0]
5050
}
5151
return NewSqlWriterWithMap[T](db, tableName, mp, nil)
5252
}
5353

54-
func (w *SqlWriter[T]) Write(ctx context.Context, model T) error {
54+
func (w *Writer[T]) Write(ctx context.Context, model T) error {
5555
if w.Map != nil {
5656
m2, er0 := w.Map(ctx, model)
5757
if er0 != nil {

0 commit comments

Comments
 (0)