@@ -12,6 +12,12 @@ import (
1212 "github.com/jackc/pgx/v5"
1313)
1414
15+ const (
16+ transactionPooler = "transaction"
17+ sessionPooler = "session"
18+ statementPooler = "statement"
19+ )
20+
1521type PGBouncer struct {
1622 PrivateIP string
1723 Credentials Credentials
@@ -68,6 +74,37 @@ func (p *PGBouncer) ConfigurePrimary(ctx context.Context, primary string, reload
6874 return nil
6975}
7076
77+ func (p * PGBouncer ) CurrentConfig () (ConfigMap , error ) {
78+ internal , err := ReadFromFile (p .InternalConfigFile ())
79+ if err != nil {
80+ return nil , err
81+ }
82+ user , err := ReadFromFile (p .UserConfigFile ())
83+ if err != nil {
84+ return nil , err
85+ }
86+
87+ all := ConfigMap {}
88+
89+ for k , v := range internal {
90+ all [k ] = v
91+ }
92+ for k , v := range user {
93+ all [k ] = v
94+ }
95+
96+ return all , nil
97+ }
98+
99+ func (p * PGBouncer ) poolMode () (string , error ) {
100+ conf , err := p .CurrentConfig ()
101+ if err != nil {
102+ return "" , err
103+ }
104+
105+ return conf ["pool_mode" ].(string ), nil
106+ }
107+
71108func (p * PGBouncer ) initialize () error {
72109 cmdStr := fmt .Sprintf ("mkdir -p %s" , p .ConfigPath )
73110 if err := utils .RunCommand (cmdStr ); err != nil {
@@ -157,6 +194,40 @@ func (p *PGBouncer) forceReconnect(ctx context.Context, databases []string) erro
157194 return nil
158195}
159196
197+ func (p * PGBouncer ) killConnections (ctx context.Context , databases []string ) error {
198+ conn , err := p .NewConnection (ctx )
199+ if err != nil {
200+ return err
201+ }
202+ defer conn .Close (ctx )
203+
204+ for _ , db := range databases {
205+ _ , err = conn .Exec (ctx , fmt .Sprintf ("KILL %s;" , db ))
206+ if err != nil {
207+ return err
208+ }
209+ }
210+
211+ return nil
212+ }
213+
214+ func (p * PGBouncer ) resumeConnections (ctx context.Context , databases []string ) error {
215+ conn , err := p .NewConnection (ctx )
216+ if err != nil {
217+ return err
218+ }
219+ defer conn .Close (ctx )
220+
221+ for _ , db := range databases {
222+ _ , err = conn .Exec (ctx , fmt .Sprintf ("RESUME %s;" , db ))
223+ if err != nil {
224+ return err
225+ }
226+ }
227+
228+ return nil
229+ }
230+
160231func (p * PGBouncer ) NewConnection (ctx context.Context ) (* pgx.Conn , error ) {
161232 host := net .JoinHostPort (p .PrivateIP , strconv .Itoa (p .Port ))
162233 return openConnection (ctx , host , "pgbouncer" , p .Credentials )
0 commit comments