github.com/snowflakedb/gosnowflake@v1.9.0/cmd/selectmany/selectmany.go (about)

     1  // Example: Fetch many rows and allow cancel the query by Ctrl+C.
     2  package main
     3  
     4  import (
     5  	"context"
     6  	"database/sql"
     7  	"flag"
     8  	"fmt"
     9  	"log"
    10  	"os"
    11  	"os/signal"
    12  	"runtime/debug"
    13  	"runtime/pprof"
    14  
    15  	sf "github.com/snowflakedb/gosnowflake"
    16  )
    17  
    18  var (
    19  	cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
    20  	memprofile = flag.String("memprofile", "", "write memory profile to this file")
    21  )
    22  
    23  // run is an actual main
    24  func run(dsn string) {
    25  	// handler interrupt signal
    26  	ctx, cancel := context.WithCancel(context.Background())
    27  	c := make(chan os.Signal, 1)
    28  	defer close(c)
    29  	signal.Notify(c, os.Interrupt)
    30  	defer func() {
    31  		signal.Stop(c)
    32  	}()
    33  	go func() {
    34  		select {
    35  		case <-c:
    36  			cancel()
    37  		case <-ctx.Done():
    38  		}
    39  	}()
    40  
    41  	db, err := sql.Open("snowflake", dsn)
    42  	if err != nil {
    43  		log.Fatalf("failed to connect. err: %v", err)
    44  	}
    45  	defer db.Close()
    46  	query := `select * from
    47  	  (select 0 a union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) A,
    48  	  (select 0 b union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) B,
    49  	  (select 0 c union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) C,
    50  	  (select 0 d union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) E,
    51  	  (select 0 e union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) F,
    52  	  (select 0 f union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) G,
    53  	  (select 0 f union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) H`
    54  	fmt.Printf("Executing a query. It may take long. You may stop by Ctrl+C.\n")
    55  	rows, err := db.QueryContext(ctx, query)
    56  	if err != nil {
    57  		log.Fatalf("failed to run a query. %v, err: %v", query, err)
    58  	}
    59  	defer rows.Close()
    60  	var v1, v2, v3, v4, v5, v6, v7 int
    61  	fmt.Printf("Fetching the results. It may take long. You may stop by Ctrl+C.\n")
    62  	counter := 0
    63  	for rows.Next() {
    64  		if err = rows.Scan(&v1, &v2, &v3, &v4, &v5, &v6, &v7); err != nil {
    65  			log.Fatalf("failed to get result. err: %v", err)
    66  		}
    67  		if counter%10000 == 0 {
    68  			fmt.Printf("data: %v, %v, %v, %v, %v, %v, %v\n", v1, v2, v3, v4, v5, v6, v7)
    69  		}
    70  		if counter%1000000 == 0 {
    71  			debug.FreeOSMemory()
    72  		}
    73  		counter++
    74  	}
    75  	if rows.Err() != nil {
    76  		fmt.Printf("ERROR: %v\n", rows.Err())
    77  		return
    78  	}
    79  	fmt.Printf("Congrats! You have successfully run %v with Snowflake DB!\n", query)
    80  }
    81  
    82  func main() {
    83  	if !flag.Parsed() {
    84  		flag.Parse()
    85  	}
    86  
    87  	cfg, err := sf.GetConfigFromEnv([]*sf.ConfigParam{
    88  		{Name: "Account", EnvName: "SNOWFLAKE_TEST_ACCOUNT", FailOnMissing: true},
    89  		{Name: "User", EnvName: "SNOWFLAKE_TEST_USER", FailOnMissing: true},
    90  		{Name: "Password", EnvName: "SNOWFLAKE_TEST_PASSWORD", FailOnMissing: true},
    91  		{Name: "Host", EnvName: "SNOWFLAKE_TEST_HOST", FailOnMissing: false},
    92  		{Name: "Port", EnvName: "SNOWFLAKE_TEST_PORT", FailOnMissing: false},
    93  		{Name: "Protocol", EnvName: "SNOWFLAKE_TEST_PROTOCOL", FailOnMissing: false},
    94  	})
    95  	if err != nil {
    96  		log.Fatalf("failed to create Config, err: %v", err)
    97  	}
    98  	dsn, err := sf.DSN(cfg)
    99  	if err != nil {
   100  		log.Fatalf("failed to create DSN from Config: %v, err: %v", cfg, err)
   101  	}
   102  
   103  	if *cpuprofile != "" {
   104  		f, err := os.Create(*cpuprofile)
   105  		if err != nil {
   106  			log.Fatal(err)
   107  		}
   108  		pprof.StartCPUProfile(f)
   109  		defer pprof.StopCPUProfile()
   110  	}
   111  
   112  	run(dsn)
   113  
   114  	if *memprofile != "" {
   115  		f, err := os.Create(*memprofile)
   116  		if err != nil {
   117  			log.Fatal(err)
   118  		}
   119  		pprof.WriteHeapProfile(f)
   120  		f.Close()
   121  		return
   122  	}
   123  }