package insight import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "io/ioutil" "log" "os" "strings" ) const ( InsightDatabaseName = "insight" ) type Connector struct{} func NewInsightConnection() *Connector { return &Connector{} } func (c *Connector) CreateTables() { tableCreationScripts := []string{"create-user-table.sql", "create-timeentry-table.sql"} for _, scriptName := range tableCreationScripts { c.ExecuteSqlScript(InsightDatabaseName, scriptName) } } func (c *Connector) UpdateTimeEntries(entries *[]TimeEntry) { statement := loadSqlFile("update-timeentry.sql") db := c.checkoutConnection(InsightDatabaseName) defer c.returnConnection(db) s, err := db.Prepare(*statement) defer s.Close() if err != nil { log.Fatalln(err) } for _, ent := range *entries { _, err = s.Exec(ent.ActualHours, ent.ActualHoursFormattedString, ent.ActualTimeString, ent.ActualTotal, ent.BillableHours, ent.BillableHoursFormattedString, ent.BillableTimeString, ent.BillableTotal, ent.Date, ent.Description, ent.ProjectId, ent.RateBill, ent.RateBurden, ent.TaskId, ent.TimeSheetId, ent.UserId) if err != nil { log.Printf("%#v\n", s) log.Fatalln(err) } } } func (c *Connector) UpdateUsers(users *[]User) { statement := loadSqlFile("update-users.sql") db := c.checkoutConnection(InsightDatabaseName) defer c.returnConnection(db) s, err := db.Prepare(*statement) defer s.Close() if err != nil { log.Fatalln(err) } for _, user := range *users { _, err = s.Exec(user.Id, user.FirstName, user.LastName, user.EmailAddress) if err != nil { log.Printf("%#v\n", s) log.Fatalln(err) } } } func (c *Connector) ExecuteSqlScript(database string, scriptName string) { db := c.checkoutConnection(database) defer c.returnConnection(db) queryWhole := *loadSqlFile(scriptName) queryParts := strings.Split(queryWhole, ";") log.Printf("\n=============================================\n%s\n==============================================\n", queryWhole) for _, query := range queryParts { if len(query) == 0 || query == "\n" { continue } _, err := db.Exec(query + ";") if err != nil { log.Printf("Query involved in error: %s\n", query) log.Fatal(err) } } } func (c *Connector) checkoutConnection(dataBase string) *sql.DB { return createDbConnection(dataBase) } func (c *Connector) returnConnection(db *sql.DB) { db.Close() } func createDbConnection(database string) *sql.DB { secret := getSecret("/home/dtookey/work/datastudio-db-creds.txt") dbString := "clarity:%s@tcp(data-connect.carolina.engineering)/%s" connectString := fmt.Sprintf(dbString, *secret, database) db, err := sql.Open("mysql", connectString) if err != nil { log.Fatalln(err) } return db } func getSecret(pathlike string) *string { file, err := os.OpenFile(pathlike, os.O_RDONLY, 0755) if err != nil { log.Fatalln(err) } defer file.Close() raw, err := ioutil.ReadAll(file) if err != nil { log.Fatalln(err) } str := strings.Trim(string(raw), "\n") return &str } func loadSqlFile(scriptName string) *string { file, err := os.OpenFile("src/sql/"+scriptName, os.O_RDONLY, 0755) if err != nil { log.Fatalln(err) } defer file.Close() raw, err := ioutil.ReadAll(file) if err != nil { log.Fatalln(err) } str := strings.Trim(string(raw), "\n") return &str }