diff --git a/backend/goserver/goserver b/backend/goserver/goserver index 156b726..d9b2026 100755 Binary files a/backend/goserver/goserver and b/backend/goserver/goserver differ diff --git a/backend/goserver/main.go b/backend/goserver/main.go index de2a49a..bf26d64 100644 --- a/backend/goserver/main.go +++ b/backend/goserver/main.go @@ -1,56 +1,56 @@ package main import ( "fmt" "io/ioutil" sw "kritaServers/backend/goserver/server" "net/http" "time" _ "github.com/lib/pq" ) type ColorGroup struct { ID int Name string Colors []string } func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) fmt.Printf("REQUEST") bodyBuffer, _ := ioutil.ReadAll(r.Body) fmt.Printf("after parse") sw.InsertGeneralInfo(bodyBuffer) } func viewHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "

Last requests

%s
", "in console") } func main() { fmt.Printf("hello") // connectionString := // fmt.Sprintf("user=%s password=%s dbname=%s host=%s port=%s sslmode=disable", user, password, dbname, host, port) sw.InitDB() defer sw.Db.Close() http.HandleFunc("/receiver/submit/org.krita.krita", handler) http.HandleFunc("/GoogleLogin", sw.HandleGoogleLogin) http.HandleFunc("/GoogleCallback", sw.HandleGoogleCallback) http.HandleFunc("/agregatedData", sw.AgregatedDataHandler) http.HandleFunc("/", viewHandler) //ticker := time.NewTicker(time.Minute * 2) - ticker := time.NewTicker(time.Second * 30) + ticker := time.NewTicker(time.Minute * 10) go func() { for t := range ticker.C { sw.CollectData() fmt.Println("Tick at", t) } }() http.ListenAndServe(":8080", nil) } diff --git a/backend/goserver/server/agregate.go b/backend/goserver/server/agregate.go index f18b623..38f7782 100644 --- a/backend/goserver/server/agregate.go +++ b/backend/goserver/server/agregate.go @@ -1,24 +1,25 @@ package server import ( "fmt" "net/http" - "time" ) func AgregatedDataHandler(w http.ResponseWriter, r *http.Request) { - const selectQuery = "SELECT cameToServer,data from generalinfo order by cameToServer desc limit 1" + const selectQuery = "SELECT data from agregatedinfo order by generatedTime desc limit 1" rows, err := Db.Query(selectQuery) checkErr(err) + var data []byte + for rows.Next() { - var data []byte - var cameToServer time.Time - err := rows.Scan(&cameToServer, &data) + err := rows.Scan(&data) checkErr(err) - fmt.Printf("Data from db") + fmt.Printf("frontend request from db") fmt.Printf(string(data)) // fmt.Printf(string(cameToServer)) } + w.Header().Set("Content-Type", "application/json") + w.Write(data) } diff --git a/backend/goserver/server/collectData.go b/backend/goserver/server/collectData.go index 3de745c..2b18f26 100644 --- a/backend/goserver/server/collectData.go +++ b/backend/goserver/server/collectData.go @@ -1,30 +1,105 @@ package server import ( + "encoding/json" "fmt" md "kritaServers/backend/goserver/server/models" + "strconv" ) func count(query string, whatCount string) float64 { rows, err := Db.Query(query, whatCount) checkErr(err) var count int for rows.Next() { err := rows.Scan(&count) checkErr(err) - fmt.Printf("scanned!") + fmt.Println("scanned!") - //fmt.Printf(string(rows)) - // fmt.Printf(string(cameToServer)) + } + return float64(count) //golang хранит числа в json только в флоат64 +} + +// //ПЕРЕМЕННОЕ КОЛИЧЕСТВО АРГУМЕНТОВ СДЕЛАТЬ +// func countOther(query string, whatCount1 string, whatCount2 string) float64 { +// rows, err := Db.Query(query, whatCount1, whatCount2) +// checkErr(err) +// var count int + +// for rows.Next() { +// err := rows.Scan(&count) +// checkErr(err) +// fmt.Println("scanned other platforms!") + +// } +// return float64(count) //golang хранит числа в json только в флоат64 +// } +func countOther(query string, queryNotEql string, args ...string) float64 { + execQuery := query + for i, _ := range args { //Зачем я использую препаред стейтмент, когда можно без него? + if i != 0 { + execQuery += " and " + } + //execQuery += queryNotEql + "'" + v + "'" + execQuery += queryNotEql + "$" + strconv.Itoa(i+1) + + } + //execQuery += ";" + fmt.Println(execQuery) + temp, _ := Db.Prepare(execQuery) + fmt.Println(len(args)) + + ///rows, err := temp.Query(args) + old := args + new := make([]interface{}, len(old)) + for i, v := range old { + new[i] = v + } + fmt.Println(new...) + rows, err := temp.Query(new...) + + checkErr(err) + + var count int + + for rows.Next() { + err := rows.Scan(&count) + checkErr(err) + fmt.Println("scanned other abstruct platforms!") } return float64(count) //golang хранит числа в json только в флоат64 } + func CollectData() { var result md.CollectedData const osQuery = "select count( data -> 'platform'->>'os') as os from generalInfo where data -> 'platform'->>'os' = $1" result.Platform.Os.Linux = count(osQuery, "linux") fmt.Println(result.Platform.Os.Linux) + result.Platform.Os.Windows = count(osQuery, "windows") + result.Platform.Os.Mac = count(osQuery, "mac") + const osOtherQuery = "select count( data -> 'platform'->>'os') as os from generalInfo WHERE " + const osOtherNotEql = "data -> 'platform'->>'os' !=" + result.Platform.Os.Other = countOther(osOtherQuery, osOtherNotEql, "linux", "windows", "mac") + + //const osOtherQuery = "select count( data -> 'platform'->>'os') as os from generalInfo where data -> 'platform'->>'os' != $1 and data -> 'platform'->>'os'!=$2" + //result.Platform.Os.Other = countOther(osOtherQuery, "windows", "linux") + + const archCPUQuery = "select count( data -> 'cpu'->>'architecture') from generalInfo where data -> 'cpu'->>'architecture' = $1" + result.CPU.Architecture.X86_64 = count(archCPUQuery, "x86_64") + result.CPU.Architecture.X86 = count(archCPUQuery, "i386") // может быть что-то другое нужно + const archCPUOtherQuery = "select count( data -> 'cpu'->>'architecture') from generalInfo where " + const archCPUOtherNotEql = "data -> 'cpu'->>'architecture' !=" + result.CPU.Architecture.Other = countOther(archCPUOtherQuery, archCPUOtherNotEql, "x86_64", "i386") + fmt.Println("BEFORE JSON") + + const insertQuery = "INSERT into agregatedInfo(data) VALUES($1)" + b, err := json.Marshal(result) + fmt.Println("SUCCESS JSON") + fmt.Println(b) + checkErr(err) + _, err = Db.Exec(insertQuery, b) + checkErr(err) } diff --git a/backend/goserver/server/insertIntallInfo.go b/backend/goserver/server/insertIntallInfo.go index 9e9e8ef..ab266a2 100644 --- a/backend/goserver/server/insertIntallInfo.go +++ b/backend/goserver/server/insertIntallInfo.go @@ -1,17 +1,14 @@ package server import ( "fmt" ) func InsertGeneralInfo(request []byte) { const insertQuery = "INSERT into generalinfo(data) VALUES($1)" + fmt.Println(string(request)) s := string(request[:]) _, err := Db.Exec(insertQuery, s) - if err != nil { - fmt.Println("insert error!") - } else { - fmt.Println("insert ended!") - } + checkErr(err) } diff --git a/backend/goserver/server/models/collectModel.go b/backend/goserver/server/models/collectModel.go index 2c2bed4..94c1862 100644 --- a/backend/goserver/server/models/collectModel.go +++ b/backend/goserver/server/models/collectModel.go @@ -1,11 +1,28 @@ package models type CollectedData struct { Platform struct { Os struct { Windows float64 Linux float64 + Mac float64 Other float64 } } + CPU struct { + Architecture struct { + X86_64 float64 + X86 float64 //на самом деле x86_64 c маленькой буквы + Other float64 + } + // Cores struct { + // One float64 + // Two float64 + // Three float64 + // Four float64 + // Six float64 + // Eight float64 + // Other float64 + // } + } } diff --git a/bdCreate.sql b/bdCreate.sql index 28f7025..f54f2b7 100644 --- a/bdCreate.sql +++ b/bdCreate.sql @@ -1,11 +1,11 @@ CREATE TABLE generalInfo( sampleKey bigserial primary key, data jsonb, cameToServer timestamp default current_timestamp ); CREATE TABLE agregatedInfo( sampleKey bigserial primary key, data jsonb, - cameToServer timestamp default current_timestamp + generatedTime timestamp default current_timestamp ); diff --git a/exampleRequest b/exampleRequest new file mode 100644 index 0000000..1336642 --- /dev/null +++ b/exampleRequest @@ -0,0 +1,36 @@ +{ + "compiler": { + "type": "GCC", + "version": "5.4" + }, + "cpu": { + "architecture": "x86_64", + "count": 4 + }, + "locale": { + "language": "English", + "region": "UnitedStates" + }, + "opengl": { + "glslVersion": "1.30", + "renderer": "Mesa DRI Intel(R) Haswell Mobile ", + "type": "GL", + "vendor": "Intel Open Source Technology Center", + "vendorVersion": "Mesa 12.0.6", + "version": "3.0" + }, + "platform": { + "os": "linux", + "version": "ubuntu-16.04" + }, + "qtVersion": { + "value": "5.9.0" + }, + "screens": [ + { + "dpi": 101, + "height": 768, + "width": 1366 + } + ] +}