11package clickhouse
22
33import (
4+ "context"
45 "database/sql"
56 "fmt"
67 "io"
@@ -40,7 +41,7 @@ func init() {
4041 database .Register ("clickhouse" , & ClickHouse {})
4142}
4243
43- func WithInstance (conn * sql.DB , config * Config ) (database.Driver , error ) {
44+ func WithInstance (ctx context. Context , conn * sql.DB , config * Config ) (database.Driver , error ) {
4445 if config == nil {
4546 return nil , ErrNilConfig
4647 }
@@ -54,7 +55,7 @@ func WithInstance(conn *sql.DB, config *Config) (database.Driver, error) {
5455 config : config ,
5556 }
5657
57- if err := ch .init (); err != nil {
58+ if err := ch .init (ctx ); err != nil {
5859 return nil , err
5960 }
6061
@@ -67,7 +68,7 @@ type ClickHouse struct {
6768 isLocked atomic.Bool
6869}
6970
70- func (ch * ClickHouse ) Open (dsn string ) (database.Driver , error ) {
71+ func (ch * ClickHouse ) Open (ctx context. Context , dsn string ) (database.Driver , error ) {
7172 purl , err := url .Parse (dsn )
7273 if err != nil {
7374 return nil , err
@@ -104,14 +105,14 @@ func (ch *ClickHouse) Open(dsn string) (database.Driver, error) {
104105 },
105106 }
106107
107- if err := ch .init (); err != nil {
108+ if err := ch .init (ctx ); err != nil {
108109 return nil , err
109110 }
110111
111112 return ch , nil
112113}
113114
114- func (ch * ClickHouse ) init () error {
115+ func (ch * ClickHouse ) init (ctx context. Context ) error {
115116 if len (ch .config .DatabaseName ) == 0 {
116117 if err := ch .conn .QueryRow ("SELECT currentDatabase()" ).Scan (& ch .config .DatabaseName ); err != nil {
117118 return err
@@ -130,18 +131,18 @@ func (ch *ClickHouse) init() error {
130131 ch .config .MigrationsTableEngine = DefaultMigrationsTableEngine
131132 }
132133
133- return ch .ensureVersionTable ()
134+ return ch .ensureVersionTable (ctx )
134135}
135136
136- func (ch * ClickHouse ) Run (r io.Reader ) error {
137+ func (ch * ClickHouse ) Run (ctx context. Context , r io.Reader ) error {
137138 if ch .config .MultiStatementEnabled {
138139 var err error
139140 if e := multistmt .Parse (r , multiStmtDelimiter , ch .config .MultiStatementMaxSize , func (m []byte ) bool {
140141 tq := strings .TrimSpace (string (m ))
141142 if tq == "" {
142143 return true
143144 }
144- if _ , e := ch .conn .Exec ( string (m )); e != nil {
145+ if _ , e := ch .conn .ExecContext ( ctx , string (m )); e != nil {
145146 err = database.Error {OrigErr : e , Err : "migration failed" , Query : m }
146147 return false
147148 }
@@ -157,13 +158,13 @@ func (ch *ClickHouse) Run(r io.Reader) error {
157158 return err
158159 }
159160
160- if _ , err := ch .conn .Exec ( string (migration )); err != nil {
161+ if _ , err := ch .conn .ExecContext ( ctx , string (migration )); err != nil {
161162 return database.Error {OrigErr : err , Err : "migration failed" , Query : migration }
162163 }
163164
164165 return nil
165166}
166- func (ch * ClickHouse ) Version () (int , bool , error ) {
167+ func (ch * ClickHouse ) Version (ctx context. Context ) (int , bool , error ) {
167168 var (
168169 version int
169170 dirty uint8
@@ -178,22 +179,22 @@ func (ch *ClickHouse) Version() (int, bool, error) {
178179 return version , dirty == 1 , nil
179180}
180181
181- func (ch * ClickHouse ) SetVersion (version int , dirty bool ) error {
182+ func (ch * ClickHouse ) SetVersion (ctx context. Context , version int , dirty bool ) error {
182183 var (
183184 bool = func (v bool ) uint8 {
184185 if v {
185186 return 1
186187 }
187188 return 0
188189 }
189- tx , err = ch .conn .Begin ( )
190+ tx , err = ch .conn .BeginTx ( ctx , nil )
190191 )
191192 if err != nil {
192193 return err
193194 }
194195
195196 query := "INSERT INTO " + ch .config .MigrationsTable + " (version, dirty, sequence) VALUES (?, ?, ?)"
196- if _ , err := tx .Exec ( query , version , bool (dirty ), time .Now ().UnixNano ()); err != nil {
197+ if _ , err := tx .ExecContext ( ctx , query , version , bool (dirty ), time .Now ().UnixNano ()); err != nil {
197198 return & database.Error {OrigErr : err , Query : []byte (query )}
198199 }
199200
@@ -203,13 +204,13 @@ func (ch *ClickHouse) SetVersion(version int, dirty bool) error {
203204// ensureVersionTable checks if versions table exists and, if not, creates it.
204205// Note that this function locks the database, which deviates from the usual
205206// convention of "caller locks" in the ClickHouse type.
206- func (ch * ClickHouse ) ensureVersionTable () (err error ) {
207- if err = ch .Lock (); err != nil {
207+ func (ch * ClickHouse ) ensureVersionTable (ctx context. Context ) (err error ) {
208+ if err = ch .Lock (ctx ); err != nil {
208209 return err
209210 }
210211
211212 defer func () {
212- if e := ch .Unlock (); e != nil {
213+ if e := ch .Unlock (ctx ); e != nil {
213214 if err == nil {
214215 err = e
215216 } else {
@@ -252,15 +253,15 @@ func (ch *ClickHouse) ensureVersionTable() (err error) {
252253 query = fmt .Sprintf (`%s ORDER BY sequence` , query )
253254 }
254255
255- if _ , err := ch .conn .Exec ( query ); err != nil {
256+ if _ , err := ch .conn .ExecContext ( ctx , query ); err != nil {
256257 return & database.Error {OrigErr : err , Query : []byte (query )}
257258 }
258259 return nil
259260}
260261
261- func (ch * ClickHouse ) Drop () (err error ) {
262+ func (ch * ClickHouse ) Drop (ctx context. Context ) (err error ) {
262263 query := "SHOW TABLES FROM " + quoteIdentifier (ch .config .DatabaseName )
263- tables , err := ch .conn .Query ( query )
264+ tables , err := ch .conn .QueryContext ( ctx , query )
264265
265266 if err != nil {
266267 return & database.Error {OrigErr : err , Query : []byte (query )}
@@ -279,7 +280,7 @@ func (ch *ClickHouse) Drop() (err error) {
279280
280281 query = "DROP TABLE IF EXISTS " + quoteIdentifier (ch .config .DatabaseName ) + "." + quoteIdentifier (table )
281282
282- if _ , err := ch .conn .Exec ( query ); err != nil {
283+ if _ , err := ch .conn .ExecContext ( ctx , query ); err != nil {
283284 return & database.Error {OrigErr : err , Query : []byte (query )}
284285 }
285286 }
@@ -290,21 +291,21 @@ func (ch *ClickHouse) Drop() (err error) {
290291 return nil
291292}
292293
293- func (ch * ClickHouse ) Lock () error {
294+ func (ch * ClickHouse ) Lock (ctx context. Context ) error {
294295 if ! ch .isLocked .CAS (false , true ) {
295296 return database .ErrLocked
296297 }
297298
298299 return nil
299300}
300- func (ch * ClickHouse ) Unlock () error {
301+ func (ch * ClickHouse ) Unlock (ctx context. Context ) error {
301302 if ! ch .isLocked .CAS (true , false ) {
302303 return database .ErrNotLocked
303304 }
304305
305306 return nil
306307}
307- func (ch * ClickHouse ) Close () error { return ch .conn .Close () }
308+ func (ch * ClickHouse ) Close (ctx context. Context ) error { return ch .conn .Close () }
308309
309310// Copied from lib/pq implementation: https://github.com/lib/pq/blob/v1.9.0/conn.go#L1611
310311func quoteIdentifier (name string ) string {
0 commit comments