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 }