88
99 "log"
1010
11- q "github.com/loilo-inc/exql/v2/query "
11+ "golang.org/x/xerrors "
1212)
1313
1414type DB interface {
@@ -31,35 +31,50 @@ type DB interface {
3131}
3232
3333type db struct {
34+ * saver
35+ * finder
36+ * mapper
3437 db * sql.DB
35- s * saver
36- f * finder
3738 mutex sync.Mutex
3839}
3940
41+ // OpenFunc is an abstraction of sql.Open function.
42+ type OpenFunc func (driverName string , url string ) (* sql.DB , error )
43+
4044type OpenOptions struct {
41- // @default "mysql"
42- DriverName string
45+ // @required
4346 // DSN format for database connection.
4447 Url string
48+ // @default "mysql"
49+ DriverName string
4550 // @default 5
4651 MaxRetryCount int
4752 // @default 5s
4853 RetryInterval time.Duration
54+ // Custom opener function.
55+ OpenFunc OpenFunc
4956}
5057
5158// Open opens the connection to the database and makes exql.DB interface.
59+ func Open (opts * OpenOptions ) (DB , error ) {
60+ return OpenContext (context .Background (), opts )
61+ }
62+
63+ // OpenContext opens the connection to the database and makes exql.DB interface.
5264// If something failed, it retries automatically until given retry strategies satisfied
5365// or aborts handshaking.
5466//
5567// Example:
5668//
57- // db, err := exql.Open(&exql.OpenOptions{
69+ // db, err := exql.Open(context.Background(), &exql.OpenOptions{
5870// Url: "user:pass@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local",
5971// MaxRetryCount: 3,
6072// RetryInterval: 10, //sec
6173// })
62- func Open (opts * OpenOptions ) (DB , error ) {
74+ func OpenContext (ctx context.Context , opts * OpenOptions ) (DB , error ) {
75+ if opts .Url == "" {
76+ return nil , xerrors .New ("opts.Url is required" )
77+ }
6378 driverName := "mysql"
6479 if opts .DriverName != "" {
6580 driverName = opts .DriverName
@@ -74,12 +89,16 @@ func Open(opts *OpenOptions) (DB, error) {
7489 }
7590 var d * sql.DB
7691 var err error
92+ var openFunc OpenFunc = sql .Open
93+ if opts .OpenFunc != nil {
94+ openFunc = opts .OpenFunc
95+ }
7796 retryCnt := 0
7897 for retryCnt < maxRetryCount {
79- d , err = sql . Open (driverName , opts .Url )
98+ d , err = openFunc (driverName , opts .Url )
8099 if err != nil {
81100 goto retry
82- } else if err = d .Ping ( ); err != nil {
101+ } else if err = d .PingContext ( ctx ); err != nil {
83102 goto retry
84103 } else {
85104 goto success
@@ -98,71 +117,14 @@ success:
98117
99118func NewDB (d * sql.DB ) DB {
100119 return & db {
101- db : d ,
102- s : & saver {ex : d },
103- f : newFinder (d ),
120+ saver : newSaver (d ),
121+ finder : newFinder (d ),
122+ mapper : & mapper {},
123+ db : d ,
104124 }
105125}
106126
107- func (d * db ) Insert (modelPtr Model ) (sql.Result , error ) {
108- return d .s .Insert (modelPtr )
109- }
110-
111- func (d * db ) InsertContext (ctx context.Context , modelPtr Model ) (sql.Result , error ) {
112- return d .s .InsertContext (ctx , modelPtr )
113- }
114-
115- func (d * db ) Update (table string , set map [string ]interface {}, where q.Condition ) (sql.Result , error ) {
116- return d .s .Update (table , set , where )
117- }
118-
119- func (d * db ) UpdateModel (ptr ModelUpdate , where q.Condition ) (sql.Result , error ) {
120- return d .s .UpdateModel (ptr , where )
121- }
122-
123- func (d * db ) UpdateContext (ctx context.Context , table string , set map [string ]interface {}, where q.Condition ) (sql.Result , error ) {
124- return d .s .UpdateContext (ctx , table , set , where )
125- }
126-
127- func (d * db ) UpdateModelContext (ctx context.Context , ptr ModelUpdate , where q.Condition ) (sql.Result , error ) {
128- return d .s .UpdateModelContext (ctx , ptr , where )
129- }
130-
131- func (d * db ) Delete (table string , where q.Condition ) (sql.Result , error ) {
132- return d .s .Delete (table , where )
133- }
134-
135- func (d * db ) DeleteContext (ctx context.Context , table string , where q.Condition ) (sql.Result , error ) {
136- return d .s .DeleteContext (ctx , table , where )
137- }
138-
139- func (d * db ) Exec (query q.Query ) (sql.Result , error ) {
140- return d .s .Exec (query )
141- }
142-
143- func (d * db ) ExecContext (ctx context.Context , query q.Query ) (sql.Result , error ) {
144- return d .s .ExecContext (ctx , query )
145- }
146-
147- func (d * db ) Query (query q.Query ) (* sql.Rows , error ) {
148- return d .s .Query (query )
149- }
150-
151- func (d * db ) QueryContext (ctx context.Context , query q.Query ) (* sql.Rows , error ) {
152- return d .s .QueryContext (ctx , query )
153- }
154-
155- func (d * db ) QueryRow (query q.Query ) (* sql.Row , error ) {
156- return d .s .QueryRow (query )
157- }
158-
159- func (d * db ) QueryRowContext (ctx context.Context , query q.Query ) (* sql.Row , error ) {
160- return d .s .QueryRowContext (ctx , query )
161- }
162-
163127func (d * db ) Close () error {
164- d .mutex .Lock ()
165- defer d .mutex .Unlock ()
166128 return d .db .Close ()
167129}
168130
@@ -174,7 +136,7 @@ func (d *db) SetDB(db *sql.DB) {
174136 d .mutex .Lock ()
175137 defer d .mutex .Unlock ()
176138 d .db = db
177- d .s .ex = db
139+ d .saver .ex = db
178140}
179141
180142func (d * db ) Transaction (callback func (tx Tx ) error ) error {
@@ -184,33 +146,3 @@ func (d *db) Transaction(callback func(tx Tx) error) error {
184146func (d * db ) TransactionWithContext (ctx context.Context , opts * sql.TxOptions , callback func (tx Tx ) error ) error {
185147 return Transaction (d .db , ctx , opts , callback )
186148}
187-
188- // Find implements DB
189- func (d * db ) Find (q q.Query , destPtrOfStruct any ) error {
190- return d .f .Find (q , destPtrOfStruct )
191- }
192-
193- // FindContext implements DB
194- func (d * db ) FindContext (ctx context.Context , q q.Query , destPtrOfStruct any ) error {
195- return d .f .FindContext (ctx , q , destPtrOfStruct )
196- }
197-
198- // FindMany implements DB
199- func (d * db ) FindMany (q q.Query , destSlicePtrOfStruct any ) error {
200- return d .f .FindMany (q , destSlicePtrOfStruct )
201- }
202-
203- // FindManyContext implements DB
204- func (d * db ) FindManyContext (ctx context.Context , q q.Query , destSlicePtrOfStruct any ) error {
205- return d .f .FindManyContext (ctx , q , destSlicePtrOfStruct )
206- }
207-
208- // Deprecated: Use Find or MapRow. It will be removed in next version.
209- func (d * db ) Map (rows * sql.Rows , destPtr any ) error {
210- return MapRow (rows , destPtr )
211- }
212-
213- // Deprecated: Use FindContext or MapRows. It will be removed in next version.
214- func (d * db ) MapMany (rows * sql.Rows , destSlicePtr any ) error {
215- return MapRows (rows , destSlicePtr )
216- }
0 commit comments