@@ -5,11 +5,15 @@ import (
55 "fmt"
66 "log/slog"
77 "os/exec"
8+ "sync"
89 "time"
910
1011 "github.com/jackc/pgx/v5"
1112)
1213
14+ var postgresSync sync.Once
15+ var postgresHost string
16+
1317func StartPostgreSQLServer (c context.Context ) (string , error ) {
1418 if err := Installed (); err != nil {
1519 return "" , err
@@ -22,48 +26,64 @@ func StartPostgreSQLServer(c context.Context) (string, error) {
2226 }
2327 }
2428
25- ctx , cancel := context .WithTimeout (c , 5 * time .Second )
26- defer cancel ()
29+ var syncErr error
30+ postgresSync .Do (func () {
31+ ctx , cancel := context .WithTimeout (c , 5 * time .Second )
32+ defer cancel ()
2733
28- cmd := exec .Command ("docker" , "run" ,
29- "--name" , "sqlc_sqltest_docker_postgres" ,
30- "-e" , "POSTGRES_PASSWORD=mysecretpassword" ,
31- "-e" , "POSTGRES_USER=postgres" ,
32- "-p" , "5432:5432" ,
33- "-d" ,
34- "postgres:16" ,
35- "-c" , "max_connections=200" ,
36- )
34+ cmd := exec .Command ("docker" , "run" ,
35+ "--name" , "sqlc_sqltest_docker_postgres" ,
36+ "-e" , "POSTGRES_PASSWORD=mysecretpassword" ,
37+ "-e" , "POSTGRES_USER=postgres" ,
38+ "-p" , "5432:5432" ,
39+ "-d" ,
40+ "postgres:16" ,
41+ "-c" , "max_connections=200" ,
42+ )
3743
38- output , err := cmd .CombinedOutput ()
39- fmt .Println (string (output ))
40- if err != nil {
41- return "" , err
42- }
44+ output , err := cmd .CombinedOutput ()
45+ fmt .Println (string (output ))
46+ if err != nil {
47+ syncErr = err
48+ return
49+ }
4350
44- // Create a ticker that fires every 10ms
45- ticker := time .NewTicker (10 * time .Millisecond )
46- defer ticker .Stop ()
51+ // Create a ticker that fires every 10ms
52+ ticker := time .NewTicker (10 * time .Millisecond )
53+ defer ticker .Stop ()
4754
48- uri := "postgres://postgres:mysecretpassword@localhost:5432/postgres?sslmode=disable"
55+ uri := "postgres://postgres:mysecretpassword@localhost:5432/postgres?sslmode=disable"
4956
50- for {
51- select {
52- case <- ctx .Done ():
53- return "" , fmt .Errorf ("timeout reached: %w" , ctx .Err ())
57+ for {
58+ select {
59+ case <- ctx .Done ():
60+ syncErr = fmt .Errorf ("timeout reached: %w" , ctx .Err ())
61+ return
5462
55- case <- ticker .C :
56- // Run your function here
57- conn , err := pgx .Connect (ctx , uri )
58- if err != nil {
59- slog .Debug ("sqltest" , "connect" , err )
60- continue
63+ case <- ticker .C :
64+ // Run your function here
65+ conn , err := pgx .Connect (ctx , uri )
66+ if err != nil {
67+ slog .Debug ("sqltest" , "connect" , err )
68+ continue
69+ }
70+ if err := conn .Ping (ctx ); err != nil {
71+ slog .Error ("sqltest" , "ping" , err )
72+ continue
73+ }
74+ postgresHost = uri
75+ return
6176 }
62- if err := conn .Ping (ctx ); err != nil {
63- slog .Error ("sqltest" , "ping" , err )
64- continue
65- }
66- return uri , nil
6777 }
78+ })
79+
80+ if syncErr != nil {
81+ return "" , syncErr
6882 }
83+
84+ if postgresHost == "" {
85+ return "" , fmt .Errorf ("postgres server setup failed" )
86+ }
87+
88+ return postgresHost , nil
6989}
0 commit comments