snippets

More or less useful code snippets
Log | Files | Refs

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 }