package main
import (
"crypto/md5"
"database/sql"
"encoding/csv"
"fmt"
"html/template"
"io"
"log"
"net/http"
"os"
_ "github.com/go-sql-driver/mysql"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
"encoding/hex"
)
var (
// uidRow int
surnameRow string
nameRow string
middlenameRow string
DateofBirthRow int
addresRow string
policyRow string
)
func downloadData(w http.ResponseWriter, request *http.Request) {
db, err := sql.Open("mysql", "root:PASSWD@unix(/var/lib/mysql/mysql.sock)/people")
// db, err := sql.Open("mysql", "root:PASSWD@/base")
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err.Error())
}
file, err := os.Open("./makc31nas.csv")
if err != nil {
fmt.Println("Error:", err)
return
}
defer file.Close()
reader := csv.NewReader(file)
reader.Comma = ';'
reader.Comment = '#'
reader.FieldsPerRecord = -1
reader.TrimLeadingSpace = true
lineCount := 1
for {
record, err := reader.Read()
if err == io.EOF {
break
} else if err != nil {
fmt.Println("Error:", err)
lineCount++
reader.Read()
continue
}
dbDrop, err := db.Prepare("DROP TABLE IF EXISTS november")
if err != nil {
panic(err.Error())
}
defer dbDrop.Close()
dbIns, err := db.Prepare("INSERT INTO november VALUES( ?, ?, ?, ?, ?, ?, ? )")
if err != nil {
panic(err.Error())
}
defer dbIns.Close()
_, err = dbIns.Exec(lineCount, record[0], record[1], record[2], record[3], record[5], record[11])
if err != nil {
panic(err.Error()) // proper error handling instead of panic in your app
}
lineCount++
}
}
func createUser(w http.ResponseWriter, request *http.Request) {
w.Header().Set("Content-type", "text/html")
t, _ := template.ParseFiles("./views/createUser.html")
t.Execute(w, nil)
}
func GetMD5Hash(text string) string {
hasher := md5.New()
hasher.Write([]byte(text))
return hex.EncodeToString(hasher.Sum(nil))
}
func users(w http.ResponseWriter, request *http.Request) {
w.Header().Set("Content-type", "text/html")
t, _ := template.ParseFiles("./views/users.html")
t.Execute(w, nil)
username := request.FormValue("username")
password := request.FormValue("password")
fmt.Fprint(w, username)
fmt.Fprintf(w, " %x", md5.Sum([]byte(password)))
db, err := sql.Open("mysql", "root:PASSWD@unix(/var/lib/mysql/mysql.sock)/people")
// db, err := sql.Open("mysql", "root:PASSWD@/base")
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err.Error())
}
dbUserNew, err := db.Prepare("INSERT INTO users (username, password) VALUES (?,?)")
//INSERT INTO users (username, password) VALUES ("admin", "21232f297a57a5a743894a0e4a801fc3");
if err != nil {
panic(err.Error())
}
defer dbUserNew.Close()
passConvert := GetMD5Hash(password)
_, err = dbUserNew.Exec(username, passConvert)
if err != nil {
fmt.Println("ERRRRRRRRRRRROOORRR!!!")
panic(err.Error()) // proper error handling instead of panic in your app
}
}
func viewPeople(w http.ResponseWriter, request *http.Request) {
w.Header().Set("Content-type", "text/html")
t, _ := template.ParseFiles("./views/viewPeople.html")
t.Execute(w, nil)
db, err := sql.Open("mysql", "root:PASSWD@unix(/var/lib/mysql/mysql.sock)/people")
// db, err := sql.Open("mysql", "root:PASSWD@/base")
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err.Error())
}
surname := request.FormValue("surname")
name := request.FormValue("name")
middlename := request.FormValue("middlename")
rows, err := db.Query("SELECT surname, name, middlename, DateofBirth, addres,"+" policy FROM november WHERE surname LIKE ? AND name LIKE ? AND middlename LIKE ?", surname+"%",
name+"%", middlename+"%")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
if err := rows.Scan(&surnameRow, &nameRow, &middlenameRow, &DateofBirthRow,
&addresRow, &policyRow); err != nil {
log.Fatal(err)
}
fmt.Fprint(w, "<tr><td>", surnameRow, "</td>",
"<td>", nameRow, "</td>",
"<td>", middlenameRow, "</td>",
"<td>", DateofBirthRow, "</td>",
"<td>", addresRow, "</td>",
"<td>", policyRow, "</td></tr>")
}
fmt.Fprint(w, "</table>")
}
func viewPeoplePolicy(w http.ResponseWriter, request *http.Request) {
w.Header().Set("Content-type", "text/html")
t, _ := template.ParseFiles("./views/viewPeoplePolicy.html")
t.Execute(w, nil)
db, err := sql.Open("mysql", "root:PASSWD@unix(/var/lib/mysql/mysql.sock)/people")
// db, err := sql.Open("mysql", "root:PASSWD@/base")
if err != nil {
panic(err)
}
defer db.Close()
err = db.Ping()
if err != nil {
panic(err.Error())
}
policy := request.FormValue("policy")
rows, err := db.Query("SELECT surname, name, middlename, DateofBirth, addres,"+" policy FROM november WHERE policy LIKE ?", "%"+policy+"%")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
if err := rows.Scan(&surnameRow, &nameRow, &middlenameRow, &DateofBirthRow,
&addresRow, &policyRow); err != nil {
log.Fatal(err)
}
fmt.Fprint(w, "<tr><td>", surnameRow, "</td>",
"<td>", nameRow, "</td>",
"<td>", middlenameRow, "</td>",
"<td>", DateofBirthRow, "</td>",
"<td>", addresRow, "</td>",
"<td>", policyRow, "</td></tr>")
}
fmt.Fprint(w, "</table>")
}
func main() {
router := mux.NewRouter()
router.Handle("/", http.FileServer(http.Dir("./views/")))
router.HandleFunc("/downloadData", downloadData)
router.HandleFunc("/viewPeople", viewPeople)
router.HandleFunc("/viewPeoplePolicy", viewPeoplePolicy)
router.HandleFunc("/createUser", createUser)
router.HandleFunc("/users", users)
router.PathPrefix("/static/").Handler(http.StripPrefix("/static/",
http.FileServer(http.Dir("./static/"))))
http.ListenAndServe(":8989", handlers.LoggingHandler(os.Stdout, router))
}