@@ -12,6 +12,12 @@ import (
12
12
"github.com/jackc/pgx/v5"
13
13
)
14
14
15
+ const (
16
+ transactionPooler = "transaction"
17
+ sessionPooler = "session"
18
+ statementPooler = "statement"
19
+ )
20
+
15
21
type PGBouncer struct {
16
22
PrivateIP string
17
23
Credentials Credentials
@@ -68,6 +74,37 @@ func (p *PGBouncer) ConfigurePrimary(ctx context.Context, primary string, reload
68
74
return nil
69
75
}
70
76
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
+
71
108
func (p * PGBouncer ) initialize () error {
72
109
cmdStr := fmt .Sprintf ("mkdir -p %s" , p .ConfigPath )
73
110
if err := utils .RunCommand (cmdStr ); err != nil {
@@ -157,6 +194,40 @@ func (p *PGBouncer) forceReconnect(ctx context.Context, databases []string) erro
157
194
return nil
158
195
}
159
196
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
+
160
231
func (p * PGBouncer ) NewConnection (ctx context.Context ) (* pgx.Conn , error ) {
161
232
host := net .JoinHostPort (p .PrivateIP , strconv .Itoa (p .Port ))
162
233
return openConnection (ctx , host , "pgbouncer" , p .Credentials )
0 commit comments