package databaseutils import ( "database/sql" _ "github.com/go-sql-driver/mysql" "errors" ) var ( DBUtil *DBUtils // DB handle for global access ) const ( // Error constants ERR_EMPTY_RESULT = "ERR_EMPTY_RESULT" ERR_NO_COLUMNS = "ERR_NO_COLUMNS" ERR_FAILED_ROW_SCAN = "ERR_FAILED_ROW_SCAN" ) type DBUtils struct { User string Password string Host string Database string Handle *sql.DB } func (dbUtil *DBUtils) Connect() { // setup handle for db var err error dbUtil.Handle, err = sql.Open("mysql", dbUtil.User + ":" + dbUtil.Password + "@tcp(" + dbUtil.Host + ")/" + dbUtil.Database) // open handle if err != nil { panic(err.Error()) // TODO } err = dbUtil.Handle.Ping() // try to connect if err != nil { panic(err.Error()) // TODO } } func (dbUtil DBUtils) Close() { dbUtil.Handle.Close() } func (dbUtil DBUtils) GetString(what string, from string, where string, wherevalue string) string { var buf string rows, err := dbUtil.Handle.Query("SELECT " + what + " FROM " + from + " WHERE " + where + " = " + wherevalue) // TODO Parse? if err != nil { panic(err.Error()) // TODO } defer rows.Close() for rows.Next() { err := rows.Scan(&buf) if err != nil { panic(err.Error()) // TODO } } err = rows.Err() if err != nil { panic(err.Error()) // TODO } return buf } // GetRow(what, from, where, wherevalue) func (dbUtil DBUtils) GetRow(options ...string) ([]string, error) { var err error var rows *sql.Rows // TODO fix this weird bug if len(options) > 3 { // with or without where rows, err = dbUtil.Handle.Query("SELECT " + options[0] + " FROM " + options[1] + " WHERE " + options[2] + " = \"" + options[3] + "\"") // TODO Parse? } else { rows, err = dbUtil.Handle.Query("SELECT " + options[0] + " FROM " + options[1]) // TODO Parse? } defer rows.Close() if err != nil { panic(err.Error()) // TODO } cols, err := rows.Columns() if err != nil { return []string{""}, errors.New(ERR_NO_COLUMNS) } dest := make([]interface{}, len(cols)) // interface for scanning result := make([]sql.NullString, len(cols)) // NullString to check if empty results := make([]string, len(cols)) // final return-result for i, _ := range result { dest[i] = &result[i] // Put pointers to each string in the interface slice } for rows.Next() { err = rows.Scan(dest...) // copy results in dest if err != nil { return []string{""}, errors.New(ERR_FAILED_ROW_SCAN) } } errcounter := 0 // count invalid results for i, _ := range result { if result[i].Valid { results[i] = result[i].String // store valid results in return-slice } else { errcounter++ } } if errcounter == len(cols) { // if nothings valid it's empty return []string{""}, errors.New(ERR_EMPTY_RESULT) } return results, nil } //TODO GetRows