initial commit
This commit is contained in:
commit
43c5ef6548
141
cmd/importPunkte/main.go
Normal file
141
cmd/importPunkte/main.go
Normal file
@ -0,0 +1,141 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"database/sql"
|
||||
"encoding/csv"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
var (
|
||||
dbURL = flag.String("db", "julian:hi@/test", "The Database")
|
||||
)
|
||||
|
||||
const (
|
||||
queryInsert = "INSERT INTO Punkte (Matrnr, Aufgabe, Punkte) VALUES(?,?,?)"
|
||||
)
|
||||
|
||||
// This function assumes it input to be only one float
|
||||
func convertFloat(input string) string {
|
||||
// replace all , with .
|
||||
return strings.Replace(input, ",", ".", -1)
|
||||
}
|
||||
|
||||
func YesNo() bool {
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
for {
|
||||
line, _, err := reader.ReadLine()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
// default case
|
||||
if len(line) == 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
switch line[0] {
|
||||
case 'Y':
|
||||
fallthrough
|
||||
case 'y':
|
||||
return true
|
||||
case 'N':
|
||||
fallthrough
|
||||
case 'n':
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
files := flag.Args()
|
||||
if len(files) == 0 {
|
||||
log.Fatal("no files given!")
|
||||
}
|
||||
|
||||
db, err := sql.Open("mysql", *dbURL)
|
||||
if err != nil {
|
||||
log.Fatal("error connecting to Database:", err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
for _, f := range files {
|
||||
log.Println("importing", f)
|
||||
file, err := os.Open(f)
|
||||
if err != nil {
|
||||
log.Println("could not open file:", f+":", err)
|
||||
continue
|
||||
}
|
||||
|
||||
reader := csv.NewReader(file)
|
||||
transaction, err := db.Begin()
|
||||
if err != nil {
|
||||
log.Fatal("cannot prepare statement:", err)
|
||||
}
|
||||
|
||||
stmt, err := transaction.Prepare(queryInsert)
|
||||
if err != nil {
|
||||
log.Fatal("could not prepare insert statement:", err)
|
||||
}
|
||||
defer stmt.Close()
|
||||
|
||||
var (
|
||||
line []string
|
||||
count = 0
|
||||
linecount = 0
|
||||
|
||||
ID int
|
||||
Aufgabe = 1
|
||||
points float64
|
||||
)
|
||||
|
||||
for {
|
||||
linecount++
|
||||
line, err = reader.Read()
|
||||
if err != nil || line == nil {
|
||||
break
|
||||
}
|
||||
|
||||
if len(line) < 2 {
|
||||
log.Println(linecount, ": malformed line")
|
||||
continue
|
||||
}
|
||||
|
||||
if ID, err = strconv.Atoi(line[0]); err != nil {
|
||||
log.Println(linecount, ": no ID given, could not convert:", err)
|
||||
continue
|
||||
}
|
||||
|
||||
fmt.Print(ID, " ")
|
||||
|
||||
Aufgabe = 1
|
||||
for _, p := range line[1:] {
|
||||
if points, err = strconv.ParseFloat(convertFloat(p), 32); err != nil {
|
||||
log.Println(linecount, "A", Aufgabe, ": could not parse points:", err)
|
||||
}
|
||||
fmt.Print(points, " ")
|
||||
|
||||
if _, err = stmt.Exec(ID, Aufgabe, points); err != nil {
|
||||
log.Println(linecount, ": error inserting:", err)
|
||||
}
|
||||
Aufgabe++
|
||||
}
|
||||
fmt.Println()
|
||||
count++
|
||||
}
|
||||
fmt.Println("read", count, "Students")
|
||||
fmt.Println("commit changes? (Y/n)")
|
||||
if YesNo() {
|
||||
transaction.Commit()
|
||||
}
|
||||
}
|
||||
}
|
111
cmd/importTeilnehmer/main.go
Normal file
111
cmd/importTeilnehmer/main.go
Normal file
@ -0,0 +1,111 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/csv"
|
||||
"flag"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
// Student from Database
|
||||
type Student struct {
|
||||
Vorname, Nachname string
|
||||
Matrikelnummer int
|
||||
StudiengangID int
|
||||
}
|
||||
|
||||
var (
|
||||
databaseURL = flag.String("db", "julian:hi@/test", "The Database url")
|
||||
)
|
||||
|
||||
const (
|
||||
insertQuery = "INSERT INTO Teilnehmer (Nachname, Vorname, Matrnr, Studiengang) VALUES(?,?,?,?)"
|
||||
)
|
||||
|
||||
// Main Function
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
if flag.NArg() == 0 {
|
||||
log.Fatal("no file(s) given!")
|
||||
}
|
||||
|
||||
// try to open file
|
||||
file, err := os.Open(flag.Arg(0))
|
||||
if err != nil {
|
||||
log.Fatal("could not open file:", err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
reader := csv.NewReader(file)
|
||||
|
||||
defer log.Println("shutdown completed")
|
||||
// list all Database providers
|
||||
log.Println("Database providers:", sql.Drivers())
|
||||
|
||||
// connect to database
|
||||
db, err := sql.Open("mysql", *databaseURL)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer db.Close()
|
||||
log.Println("mysql connection established")
|
||||
// prepare Queries
|
||||
newStudent, err := db.Prepare(insertQuery)
|
||||
if err != nil {
|
||||
log.Fatal("Error preparing statement:", insertQuery+":", err)
|
||||
}
|
||||
|
||||
defer newStudent.Close()
|
||||
|
||||
// init completed
|
||||
defer log.Println("shutting down")
|
||||
|
||||
var (
|
||||
line []string
|
||||
linenumber = 0
|
||||
count = 0
|
||||
)
|
||||
|
||||
for ; err == nil; line, err = reader.Read() {
|
||||
linenumber++
|
||||
if len(line) < 4 {
|
||||
log.Println("line", linenumber, "malformed")
|
||||
continue
|
||||
}
|
||||
|
||||
number, err := strconv.Atoi(line[2])
|
||||
if err != nil {
|
||||
log.Println("line", linenumber, ":could not convert ID:"+line[2]+":", err)
|
||||
continue
|
||||
}
|
||||
if number < 0 {
|
||||
log.Println("line", linenumber, ":ID invalid:", number)
|
||||
continue
|
||||
}
|
||||
|
||||
studiengang, err := strconv.Atoi(line[3])
|
||||
if err != nil {
|
||||
log.Println("line", linenumber, ":studiengang could not be converted:", err)
|
||||
continue
|
||||
}
|
||||
if studiengang < 0 || studiengang > 2 {
|
||||
log.Println("line", linenumber, ":Studiengang does not exist:", studiengang)
|
||||
continue
|
||||
}
|
||||
|
||||
if _, err := newStudent.Exec(line[0], line[1], number, studiengang); err != nil {
|
||||
log.Println("line", linenumber, ":could not execute INSERT:", err)
|
||||
continue
|
||||
}
|
||||
|
||||
count++
|
||||
}
|
||||
|
||||
log.Println("done, inserted", count, "records")
|
||||
}
|
59
cmd/list/main.go
Normal file
59
cmd/list/main.go
Normal file
@ -0,0 +1,59 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"encoding/json"
|
||||
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
var (
|
||||
dbURL = flag.String("db", "julian:hi@/test", "The Database")
|
||||
)
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
db, err := sql.Open("mysql", *dbURL)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if err = readStudiengaenge(db); err != nil {
|
||||
log.Fatal("readStudiengaenge:", err)
|
||||
}
|
||||
|
||||
result, err := db.Query("SELECT Vorname, Nachname, Matrnr, Studiengang FROM Teilnehmer")
|
||||
if err != nil {
|
||||
log.Fatal("error fetching students:", err)
|
||||
}
|
||||
|
||||
var (
|
||||
stud Student
|
||||
ID int
|
||||
)
|
||||
|
||||
for result.Next() {
|
||||
if err = result.Scan(&stud.Vorname, &stud.Nachname, &stud.Matrnr, &ID); err != nil {
|
||||
log.Println("could not retrieve Student:", err)
|
||||
continue
|
||||
}
|
||||
|
||||
name, ok := studiengaenge[ID]
|
||||
if !ok {
|
||||
log.Println("illegal Studiengang:", ID)
|
||||
continue
|
||||
}
|
||||
|
||||
stud.Studiengang = name
|
||||
|
||||
out, err := json.Marshal(stud)
|
||||
if err != nil {
|
||||
log.Fatal("could not marshal to json:", err)
|
||||
}
|
||||
fmt.Println(string(out))
|
||||
}
|
||||
}
|
17
cmd/list/studenten.go
Normal file
17
cmd/list/studenten.go
Normal file
@ -0,0 +1,17 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// Ein Student
|
||||
type Student struct {
|
||||
Vorname, Nachname string
|
||||
Matrnr int
|
||||
Studiengang Studiengang
|
||||
}
|
||||
|
||||
// Gibt den Studenten als String zurück
|
||||
func (s Student) String() string {
|
||||
return "{" + strconv.Itoa(s.Matrnr) + " " + s.Nachname + ", " + s.Vorname + " \"" + *s.Studiengang + "\"}"
|
||||
}
|
32
cmd/list/studiengang.go
Normal file
32
cmd/list/studiengang.go
Normal file
@ -0,0 +1,32 @@
|
||||
package main
|
||||
|
||||
import "database/sql"
|
||||
|
||||
// Ein Studiengang
|
||||
type Studiengang *string
|
||||
|
||||
// globale Tabelle aller Studiengänge
|
||||
var studiengaenge map[int]Studiengang
|
||||
|
||||
// lese alle Studiengänge aus der mysql Tabelle
|
||||
func readStudiengaenge(db *sql.DB) error {
|
||||
studiengaenge = make(map[int]Studiengang)
|
||||
result, err := db.Query("SELECT ID, Studiengaenge.Name FROM Studiengaenge")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var (
|
||||
ID int
|
||||
stud string
|
||||
)
|
||||
|
||||
for result.Next() {
|
||||
if err = result.Scan(&ID, &stud); err != nil {
|
||||
return err
|
||||
}
|
||||
studiengaenge[ID] = Studiengang(&stud)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
83
cmd/stripColumns/main.go
Normal file
83
cmd/stripColumns/main.go
Normal file
@ -0,0 +1,83 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"flag"
|
||||
"log"
|
||||
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
var (
|
||||
dbURL = flag.String("db", "julian:hi@/test", "Die URL zur Datenbank")
|
||||
table = flag.String("table", "Teilnehmer", "Die Tabelle")
|
||||
key = flag.String("key", "Matrnr", "Der Tabellenschlüsselname")
|
||||
attr = flag.String("attr", "Nachname", "Die Spalte zum Cleanen")
|
||||
)
|
||||
|
||||
const (
|
||||
querySelect = "SELECT ?,? FROM ?"
|
||||
queryUpdate = "UPDATE ? SET ?=? WHERE ?=?"
|
||||
)
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
db, err := sql.Open("mysql", *dbURL)
|
||||
if err != nil {
|
||||
log.Fatal("error connecting to database:", err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
statement, err := db.Prepare("SELECT " + *key + "," + *attr + " FROM " + *table)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal("error in precompiled statement:", querySelect+":", err)
|
||||
}
|
||||
defer statement.Close()
|
||||
|
||||
rows, err := statement.Query()
|
||||
|
||||
if err != nil {
|
||||
log.Fatal("error executing query:", err)
|
||||
}
|
||||
|
||||
context, err := db.Begin()
|
||||
if err != nil {
|
||||
log.Fatal("error creating context:", err)
|
||||
}
|
||||
|
||||
update, err := context.Prepare("UPDATE " + *table + " SET " + *attr + "=? WHERE " + *key + "=?")
|
||||
if err != nil {
|
||||
log.Fatal("error in precompiled statement:", queryUpdate+":", err)
|
||||
}
|
||||
|
||||
var (
|
||||
keyBuffer int
|
||||
dirty, clean string
|
||||
|
||||
count int
|
||||
)
|
||||
|
||||
for rows.Next() {
|
||||
if err = rows.Scan(&keyBuffer, &dirty); err != nil {
|
||||
log.Println("error while reading:", err)
|
||||
}
|
||||
|
||||
clean = strip(dirty)
|
||||
if clean != dirty {
|
||||
if result, err := update.Exec(clean, keyBuffer); err != nil {
|
||||
log.Fatal("error on update, change canceled:", err)
|
||||
} else if i, err := result.RowsAffected(); err == nil && i != 1 {
|
||||
log.Fatal("changed to many rows... aborting")
|
||||
} else {
|
||||
count++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
log.Println("committing change,", count, "rows affected")
|
||||
if err := context.Commit(); err != nil {
|
||||
log.Println("could not commit changed:", err)
|
||||
}
|
||||
}
|
15
cmd/stripColumns/strip.go
Normal file
15
cmd/stripColumns/strip.go
Normal file
@ -0,0 +1,15 @@
|
||||
package main
|
||||
|
||||
func strip(str string) (output string) {
|
||||
var (
|
||||
start = 0
|
||||
end = len(str)
|
||||
)
|
||||
for ; start < len(str) && str[start] == ' '; start++ {
|
||||
}
|
||||
|
||||
for ; end > 0 && str[end-1] == ' '; end-- {
|
||||
}
|
||||
|
||||
return str[start:end]
|
||||
}
|
Loading…
Reference in New Issue
Block a user