You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
4.3 KiB
Go
182 lines
4.3 KiB
Go
package insight
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
InsightDatabaseName = "insight"
|
|
)
|
|
|
|
//<editor-fold name="DBConnector">
|
|
/*======================================================================================
|
|
DBConnector
|
|
======================================================================================*/
|
|
|
|
type DBConnector struct{}
|
|
|
|
func NewDBConnection() *DBConnector {
|
|
return &DBConnector{}
|
|
}
|
|
|
|
func (c *DBConnector) CreateTables() {
|
|
tableCreationScripts := []string{"create-user-table.sql", "create-timeentry-table.sql"}
|
|
|
|
for _, scriptName := range tableCreationScripts {
|
|
c.ExecuteSqlScript(InsightDatabaseName, scriptName)
|
|
}
|
|
}
|
|
|
|
func (c *DBConnector) 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 *DBConnector) 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 *DBConnector) FetchUsers() *[]*User {
|
|
ret := make([]*User, 0, 50)
|
|
cx := c.checkoutConnection(InsightDatabaseName)
|
|
queryText := "SELECT * FROM users;"
|
|
rs, err := cx.Query(queryText)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
for rs.Next() {
|
|
u := User{}
|
|
err := rs.Scan(&u.Id, &u.FirstName, &u.LastName, &u.EmailAddress)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
ret = append(ret, &u)
|
|
}
|
|
return &ret
|
|
}
|
|
|
|
func (c *DBConnector) 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 *DBConnector) checkoutConnection(dataBase string) *sql.DB {
|
|
return createDbConnection(dataBase)
|
|
}
|
|
|
|
func (c *DBConnector) returnConnection(db *sql.DB) {
|
|
db.Close()
|
|
}
|
|
|
|
//</editor-fold>
|
|
|
|
//<editor-fold name="Utility Functions">
|
|
/*======================================================================================
|
|
Utility Functions
|
|
======================================================================================*/
|
|
|
|
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
|
|
}
|
|
|
|
//</editor-fold>
|