github.com/andrewrech/ih-abstract@v0.0.0-20210322142951-2fec1c8d0f38/connect.go (about)

     1  package main
     2  
     3  import (
     4  	"database/sql"
     5  	"fmt"
     6  	"log"
     7  	"net/url"
     8  )
     9  
    10  // connect connects to an SQL database.
    11  func connect(config string) (db *sql.DB, err error) {
    12  	if config == "" {
    13  		config, err = locateDefaultConfig()
    14  
    15  		if err != nil {
    16  			log.Fatalln(err)
    17  		}
    18  	}
    19  
    20  	vars, err := loadConfig(config)
    21  	if err != nil {
    22  		return db, err
    23  	}
    24  
    25  	c := url.Values{}
    26  	c.Add("Database", vars.Database)
    27  	c.Add("Trusted_Connection", "Yes")
    28  
    29  	u := &url.URL{
    30  		Scheme:   "sqlserver",
    31  		User:     url.UserPassword(vars.Username, vars.Password),
    32  		Host:     fmt.Sprintf("%s:%s", vars.Host, vars.Port),
    33  		RawQuery: c.Encode(),
    34  	}
    35  
    36  	db, err = sql.Open("sqlserver", u.String())
    37  
    38  	return db, err
    39  }
    40  
    41  // rawRecords contains a header, a channel of raw records, and a channel indicating when reading is done.
    42  type rawRecords struct {
    43  	header []string
    44  	out    chan []string
    45  	done   chan struct{}
    46  }
    47  
    48  // DB reads records from an Sql database.
    49  func DB(config string, db *sql.DB) (r rawRecords) {
    50  	defer db.Close()
    51  
    52  	var err error
    53  
    54  	if config == "" {
    55  		config, err = locateDefaultConfig()
    56  
    57  		if err != nil {
    58  			log.Fatalln(err)
    59  		}
    60  	}
    61  
    62  	vars, err := loadConfig(config)
    63  
    64  	// sql query
    65  	rows, err := db.Query(vars.Query)
    66  	if err != nil {
    67  		log.Fatalln("failed to run query", err)
    68  	}
    69  
    70  	r = readSQLRows(rows)
    71  
    72  	return r
    73  }