You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

142 lines
4.0 KiB

package events_alerter
import (
"database/sql"
"fmt"
"strings"
"time"
)
import _ "github.com/go-sql-driver/mysql"
type MsgStr struct {
remote string
message string
}
func (msg MsgStr) Remote() string {
return msg.remote
}
func (msg MsgStr) Message() string {
return msg.message
}
type MsgInt interface {
Remote() string
Message() string
}
type DbRequester struct {
login string
pass string
host string
database string
}
func (dbStruct *DbRequester) ReqPrepare(sqlStr ...string) string {
if len(sqlStr) > 1 {
values := make([]interface{}, len(sqlStr)-1)
for i, _ := range sqlStr[1:] {
k := i + 1
values[i] = sqlStr[k]
}
return fmt.Sprintf(sqlStr[0], values...)
} else {
return sqlStr[0]
}
}
func (dbStruct *DbRequester) Requester(sqlStr string) (allResult [][]string, err error) {
connStr := fmt.Sprintf("%v:%v@tcp(%v)/%v", dbStruct.login, dbStruct.pass, dbStruct.host, dbStruct.database)
db, err := sql.Open("mysql", connStr)
if err != nil {
return
}
defer db.Close()
err = db.Ping()
if err != nil {
return
}
req, err := db.Prepare(sqlStr)
if err != nil {
return
}
defer req.Close()
rows, err := req.Query() //пыщим запросий
if err != nil {
return
}
cols, err := rows.Columns() // получаем слайс стрингов с названиями колонок
if err != nil {
return
}
rawResult := make([][]byte, len(cols)) // слайс слайсов байт, это одна строка выхлопа сырая
dest := make([]interface{}, len(cols)) // слайс пустых интерфейсов
for i, _ := range rawResult {
dest[i] = &rawResult[i] // Put pointers to each string in the interface slice
}
for rows.Next() {
err = rows.Scan(dest...)
if err != nil {
return
}
result := make([]string, len(cols)) // слайс строк, одна строка выхлопа, которую надо добавить в общий выхлоп
for i, raw := range rawResult {
if raw == nil {
result[i] = "Null"
} else {
result[i] = string(raw)
}
}
allResult = append(allResult, result)
}
return
}
func BuildAlert() (msgSl []MsgInt) {
msgTpl := `Вспомни! %v время для важного!
Задача '%v' ждет тебя,
Лови ссыль:
https://pm.constanta-smt.ru/index.php/tasksComments?tasks_id=%v&projects_id=%v`
dbuser := DbRequester{
login: "bot",
pass: "z68puEFJhEBtS",
host: "10.176.120.51",
database: "qdpm",
}
createdFormat := "2006-01-02 15:04"
t := time.Now()
sqlTpl := `select extra_fields_list.value, tasks.projects_id as pid, tasks.id as tid, name tname, tasks.assigned_to as users
from extra_fields_list, tasks
where extra_fields_list.extra_fields_id = 10 and extra_fields_list.value = '%v' and extra_fields_list.bind_id = tasks.id ;`
//sqlTpl := `select extra_fields_list.value, tasks.projects_id as pid, tasks.id as tid, name tname, tasks.assigned_to as users
//from extra_fields_list, tasks
//where extra_fields_list.extra_fields_id = 10 and extra_fields_list.value <> '' and extra_fields_list.bind_id = tasks.id ;`
fmt.Println(dbuser.ReqPrepare(sqlTpl, t.Format(createdFormat)))
res, err := dbuser.Requester(dbuser.ReqPrepare(sqlTpl, t.Format(createdFormat)))
fmt.Printf("%#v, %#v\n", res, err)
if len(res) > 0 { // обработка запроса, если найдено больше 0 строк
for _, v := range res {
fmt.Println(v)
msgStr := fmt.Sprintf(msgTpl, v[0], v[3], v[2], v[1])
uidSl := strings.Split(v[4], ",")
jidSl := make([]string, len(uidSl))
for _, uid := range uidSl {
sqlTpl = "select value from qdpm.extra_fields_list where extra_fields_id = 11 and bind_id = '%v';"
jid, _ := dbuser.Requester(dbuser.ReqPrepare(sqlTpl, uid))
if len(jid) > 0 {
tmpJid := jid[0][0]
jidSl = append(jidSl, tmpJid)
fmt.Printf("%v\n", tmpJid)
tmpMsg := MsgStr{remote: tmpJid, message: msgStr}
msgSl = append(msgSl, tmpMsg)
}
}
}
fmt.Println(msgSl)
}
return
}

Powered by TurnKey Linux.