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
+ }
+ ]
+}