Skip to content

Commit cebb7e3

Browse files
committed
fix: try setting maxLifeTime parameter
1 parent 186b108 commit cebb7e3

File tree

2 files changed

+21
-13
lines changed

2 files changed

+21
-13
lines changed

internal/app/query/cli.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package query
33
import (
44
"fmt"
55
"os"
6+
"time"
67

78
"github.com/cgi-fr/lino/internal/app/urlbuilder"
89
infra "github.com/cgi-fr/lino/internal/infra/query"
@@ -27,27 +28,31 @@ func Inject(
2728

2829
// NewCommand implements the cli analyse command
2930
func NewCommand(fullName string, err *os.File, out *os.File, in *os.File) *cobra.Command {
31+
var maxLifeTime time.Duration
32+
3033
cmd := &cobra.Command{
3134
Use: "query",
3235
Short: "Execute direct query",
3336
Example: fmt.Sprintf(" %[1]s", fullName),
3437
Args: cobra.ExactArgs(2),
3538
Run: func(cmd *cobra.Command, args []string) {
36-
if er := execute(cmd, args[0], args[1]); er != nil {
39+
if er := execute(cmd, args[0], args[1], maxLifeTime); er != nil {
3740
fmt.Fprintln(err, er.Error())
3841
os.Exit(1)
3942
}
4043
},
4144
}
4245

46+
cmd.Flags().DurationVarP(&maxLifeTime, "timeout", "t", 4*time.Minute, "sets the maximum amount of time a connection may be reused")
47+
4348
cmd.SetOut(out)
4449
cmd.SetErr(err)
4550
cmd.SetIn(in)
4651

4752
return cmd
4853
}
4954

50-
func execute(cmd *cobra.Command, dataconnectorName string, querystr string) error {
55+
func execute(cmd *cobra.Command, dataconnectorName string, querystr string, maxLifeTime time.Duration) error {
5156
alias, e1 := dataconnector.Get(dataconnectorStorage, dataconnectorName)
5257
if e1 != nil {
5358
return e1
@@ -64,7 +69,7 @@ func execute(cmd *cobra.Command, dataconnectorName string, querystr string) erro
6469
return fmt.Errorf("no extractor found for database type")
6570
}
6671

67-
driver := query.NewDriver(dataSourceFactory.New(u.URL.String()), infra.NewJSONWriter(cmd.OutOrStdout()))
72+
driver := query.NewDriver(dataSourceFactory.New(u.URL.String(), maxLifeTime), infra.NewJSONWriter(cmd.OutOrStdout()))
6873

6974
if err := driver.Open(); err != nil {
7075
return fmt.Errorf("%w", err)

internal/infra/query/sql.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package query
22

33
import (
44
"fmt"
5+
"time"
56

67
"github.com/cgi-fr/lino/pkg/query"
78
"github.com/jmoiron/sqlx"
@@ -54,8 +55,9 @@ func (dr *DataReader) Error() error {
5455
}
5556

5657
type DataSource struct {
57-
url string
58-
dbx *sqlx.DB
58+
url string
59+
dbx *sqlx.DB
60+
maxLifeTime time.Duration
5961
}
6062

6163
func (ds *DataSource) Open() error {
@@ -71,6 +73,8 @@ func (ds *DataSource) Open() error {
7173

7274
ds.dbx = sqlx.NewDb(db, u.UnaliasedDriver)
7375

76+
ds.dbx.SetConnMaxLifetime(ds.maxLifeTime)
77+
7478
err = ds.dbx.Ping()
7579
if err != nil {
7680
return fmt.Errorf("%w", err)
@@ -88,23 +92,22 @@ func (ds *DataSource) Close() error {
8892
}
8993

9094
func (ds *DataSource) Query(query string) (query.DataReader, error) {
91-
result, err := ds.dbx.Exec(query)
95+
rows, err := ds.dbx.Queryx(query)
9296
if err != nil {
9397
return nil, fmt.Errorf("%w", err)
9498
}
9599

96-
if nbrows, err := result.RowsAffected(); err != nil {
97-
log.Info().Str("query", query).Int64("rows", nbrows).Msg("success executing SQL query")
98-
}
100+
log.Info().Str("query", query).Msg("success executing SQL query")
99101

100-
return nil, nil
102+
return &DataReader{rows, nil, nil}, nil
101103
}
102104

103105
type DataSourceFactory struct{}
104106

105-
func (dsf DataSourceFactory) New(url string) query.DataSource {
107+
func (dsf DataSourceFactory) New(url string, maxLifeTime time.Duration) query.DataSource {
106108
return &DataSource{
107-
url: url,
108-
dbx: nil,
109+
url: url,
110+
dbx: nil,
111+
maxLifeTime: maxLifeTime,
109112
}
110113
}

0 commit comments

Comments
 (0)