pgtester.go (2173B)
1 package main 2 3 import ( 4 "database/sql" 5 "fmt" 6 "os" 7 "strconv" 8 "strings" 9 "time" 10 11 _ "github.com/lib/pq" 12 ) 13 14 const ( 15 urlFmt = "<user>:<password>@<host>/<database>[?sslmode=disable]\n" 16 testNum = 3423 17 pgPrefix = "postgresql://" 18 ) 19 20 func must(err error, msg string) { 21 if err == nil { 22 return 23 } 24 fmt.Println(msg+":", err) 25 os.Exit(1) 26 } 27 28 var db *sql.DB 29 30 func test() error { 31 var ( 32 err error 33 readNum int 34 row *sql.Row 35 ) 36 err = db.Ping() 37 if err != nil { 38 return fmt.Errorf("Failed to ping database: %w", err) 39 } 40 _, err = db.Exec(`CREATE TABLE pgtester_temp_table (num int);`) 41 if err != nil { 42 return fmt.Errorf("Failed to create temporary table") 43 } 44 _, err = db.Exec(`INSERT INTO pgtester_temp_table VALUES ($1);`, testNum) 45 if err != nil { 46 return fmt.Errorf("Failed to insert into temporary table") 47 } 48 row = db.QueryRow(`SELECT num FROM pgtester_temp_table;`) 49 err = row.Scan(&readNum) 50 if err != nil { 51 return fmt.Errorf("Failed to read data from temporary table") 52 } 53 if readNum != testNum { 54 err = fmt.Errorf("Inserted data does not match fetched data (%v != %v)\n", readNum, testNum) 55 } 56 _, nerr := db.Exec(`DROP TABLE pgtester_temp_table;`) 57 if nerr != nil { 58 if err == nil { 59 err = fmt.Errorf("Failed to delete temporary database") 60 } else { 61 err = fmt.Errorf("Failed to to delete temporary database, also: %w", err) 62 } 63 } 64 return err 65 } 66 67 func testPrint() { 68 err := test() 69 if err != nil { 70 fmt.Println(err) 71 } else { 72 fmt.Println("All tests passed") 73 } 74 } 75 76 func loop(periodSeconds int) { 77 for { 78 testPrint() 79 time.Sleep(time.Duration(periodSeconds) * time.Second) 80 } 81 82 } 83 84 func main() { 85 if len(os.Args) < 2 { 86 fmt.Printf("Use:\n\t%v [postgresql://]<database_url> [loop_seconds]\nURL format:\n\t%v", os.Args[0], urlFmt) 87 return 88 } 89 dbURL := pgPrefix + strings.TrimPrefix(os.Args[1], pgPrefix) 90 var err error 91 db, err = sql.Open("postgres", dbURL) 92 if err != nil { 93 fmt.Println("Failed to open database:") 94 return 95 } 96 if len(os.Args) > 2 { 97 sec, err := strconv.Atoi(os.Args[2]) 98 if err != nil { 99 fmt.Println("Invalid loop period, please give a whole number of seconds") 100 return 101 } 102 loop(sec) 103 } else { 104 testPrint() 105 } 106 }