From d4285354f492186ab8dac8a41824697d72380ffa Mon Sep 17 00:00:00 2001 From: divyam234 <47589864+divyam234@users.noreply.github.com> Date: Tue, 20 May 2025 22:52:29 +0530 Subject: [PATCH] feat: support direct ssl negotiation postgres --- cmd/check.go | 2 +- cmd/run.go | 2 +- go.mod | 10 +++++--- go.sum | 20 +++++++-------- internal/database/database.go | 46 ++++++++++++++++++++--------------- 5 files changed, 44 insertions(+), 36 deletions(-) diff --git a/cmd/check.go b/cmd/check.go index a689be9..ebfd9df 100644 --- a/cmd/check.go +++ b/cmd/check.go @@ -379,7 +379,7 @@ func runCheckCmd(cmd *cobra.Command, cfg *config.ServerCmdConfig) { defer logging.DefaultLogger().Sync() cfg.DB.LogLevel = "fatal" - db, err := database.NewDatabase(&cfg.DB, lg) + db, err := database.NewDatabase(ctx, &cfg.DB, lg) if err != nil { lg.Fatalw("failed to create database", "err", err) } diff --git a/cmd/run.go b/cmd/run.go index 7c50a46..bb9f73c 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -98,7 +98,7 @@ func runApplication(ctx context.Context, conf *config.ServerCmdConfig) { cacher := cache.NewCache(ctx, &conf.Cache) - db, err := database.NewDatabase(&conf.DB, lg) + db, err := database.NewDatabase(ctx, &conf.DB, lg) if err != nil { lg.Fatalw("failed to create database", "err", err) diff --git a/go.mod b/go.mod index b3cf985..1a2524d 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/iyear/connectproxy v0.1.1 github.com/jedib0t/go-pretty/v6 v6.6.7 github.com/manifoldco/promptui v0.9.0 - github.com/ogen-go/ogen v1.12.0 + github.com/ogen-go/ogen v1.13.0 github.com/redis/go-redis/v9 v9.8.0 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 @@ -73,9 +73,9 @@ require ( golang.org/x/tools v0.33.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gorm.io/driver/mysql v1.5.7 // indirect - modernc.org/libc v1.65.6 // indirect + modernc.org/libc v1.65.7 // indirect modernc.org/mathutil v1.7.1 // indirect - modernc.org/memory v1.10.0 // indirect + modernc.org/memory v1.11.0 // indirect modernc.org/sqlite v1.37.0 // indirect ) @@ -90,7 +90,7 @@ require ( github.com/gotd/neo v0.1.5 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.4 + github.com/jackc/pgx/v5 v5.7.5 github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/klauspost/compress v1.18.0 // indirect @@ -113,3 +113,5 @@ require ( ) tool github.com/ogen-go/ogen/cmd/ogen + +replace gorm.io/driver/postgres => github.com/divyam234/postgres v0.0.0-20250520164515-3701d5363f8d diff --git a/go.sum b/go.sum index 76bffcf..5307204 100644 --- a/go.sum +++ b/go.sum @@ -54,6 +54,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/divyam234/postgres v0.0.0-20250520164515-3701d5363f8d h1:WeFBtyQWxx2xO05LOL3hFzNfyEZQmR3/WSaKc4ohLlY= +github.com/divyam234/postgres v0.0.0-20250520164515-3701d5363f8d/go.mod h1:KH5adw2D6huXcPgy/igd9tv+Td6GuoOPrtuEChi7m9M= github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -131,8 +133,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= -github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jedib0t/go-pretty/v6 v6.6.7 h1:m+LbHpm0aIAPLzLbMfn8dc3Ht8MW7lsSO4MPItz/Uuo= @@ -170,8 +172,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -github.com/ogen-go/ogen v1.12.0 h1:JMkn957i9/IPaSehqpblviy6Uao3eqQ+eVKUn4LM9pg= -github.com/ogen-go/ogen v1.12.0/go.mod h1:RL25amedfhq5xKTUuPBPn6nhYU59CWaVWYJ8YIjNHs0= +github.com/ogen-go/ogen v1.13.0 h1:RI3jAMZvn6fIlFCZR8g9KqTmpGRxBMmsax1qcjhcD38= +github.com/ogen-go/ogen v1.13.0/go.mod h1:SNGTKeDIFhILb0+22f+gkT1FaeYmFgKrNmzUXMsnDro= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -297,8 +299,6 @@ gorm.io/datatypes v1.2.5 h1:9UogU3jkydFVW1bIVVeoYsTpLRgwDVW3rHfJG6/Ek9I= gorm.io/datatypes v1.2.5/go.mod h1:I5FUdlKpLb5PMqeMQhm30CQ6jXP8Rj89xkTeCSAaAD4= gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo= gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= -gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314= -gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= gorm.io/driver/sqlite v1.4.3 h1:HBBcZSDnWi5BW3B3rwvVTc510KGkBkexlOg0QrmLUuU= gorm.io/driver/sqlite v1.4.3/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= gorm.io/driver/sqlserver v1.5.4 h1:xA+Y1KDNspv79q43bPyjDMUgHoYHLhXYmdFcYPobg8g= @@ -314,12 +314,12 @@ modernc.org/fileutil v1.3.1 h1:8vq5fe7jdtEvoCf3Zf9Nm0Q05sH6kGx0Op2CPx1wTC8= modernc.org/fileutil v1.3.1/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= -modernc.org/libc v1.65.6 h1:OhJUhmuJ6MVZdqL5qmnd0/my46DKGFhSX4WOR7ijfyE= -modernc.org/libc v1.65.6/go.mod h1:MOiGAM9lrMBT9L8xT1nO41qYl5eg9gCp9/kWhz5L7WA= +modernc.org/libc v1.65.7 h1:Ia9Z4yzZtWNtUIuiPuQ7Qf7kxYrxP1/jeHZzG8bFu00= +modernc.org/libc v1.65.7/go.mod h1:011EQibzzio/VX3ygj1qGFt5kMjP0lHb0qCW5/D/pQU= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= -modernc.org/memory v1.10.0 h1:fzumd51yQ1DxcOxSO+S6X7+QTuVU+n8/Aj7swYjFfC4= -modernc.org/memory v1.10.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= diff --git a/internal/database/database.go b/internal/database/database.go index 8149448..f3e6546 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -3,9 +3,10 @@ package database import ( "time" - "github.com/tgdrive/teldrive/internal/config" + "context" extraClausePlugin "github.com/WinterYukky/gorm-extra-clause-plugin" + "github.com/tgdrive/teldrive/internal/config" "go.uber.org/zap" "go.uber.org/zap/zapcore" "gorm.io/driver/postgres" @@ -13,7 +14,7 @@ import ( "gorm.io/gorm/schema" ) -func NewDatabase(cfg *config.DBConfig, lg *zap.SugaredLogger) (*gorm.DB, error) { +func NewDatabase(ctx context.Context, cfg *config.DBConfig, lg *zap.SugaredLogger) (*gorm.DB, error) { level, err := zapcore.ParseLevel(cfg.LogLevel) if err != nil { level = zapcore.InfoLevel @@ -22,26 +23,31 @@ func NewDatabase(cfg *config.DBConfig, lg *zap.SugaredLogger) (*gorm.DB, error) var db *gorm.DB for i := 0; i <= 5; i++ { - db, err = gorm.Open(postgres.New(postgres.Config{ - DSN: cfg.DataSource, - PreferSimpleProtocol: !cfg.PrepareStmt, - }), &gorm.Config{ - Logger: NewLogger(lg, time.Second, true, level), - NamingStrategy: schema.NamingStrategy{ - TablePrefix: "teldrive.", - SingularTable: false, - }, - NowFunc: func() time.Time { - return time.Now().UTC() - }, - }) - if err == nil { - break + select { + case <-ctx.Done(): + return nil, ctx.Err() + default: + db, err = gorm.Open(postgres.New(postgres.Config{ + DSN: cfg.DataSource, + PreferSimpleProtocol: !cfg.PrepareStmt, + }), &gorm.Config{ + Logger: NewLogger(lg, time.Second, true, level), + NamingStrategy: schema.NamingStrategy{ + TablePrefix: "teldrive.", + SingularTable: false, + }, + NowFunc: func() time.Time { + return time.Now().UTC() + }, + }) + if err == nil { + break + } + lg.Warnf("failed to open database: %v", err) + time.Sleep(500 * time.Millisecond) } - lg.Warnf("failed to open database: %v", err) - time.Sleep(500 * time.Millisecond) - } + } if err != nil { lg.Fatalf("database: %v", err) }