2815 lines
105 KiB
Go
2815 lines
105 KiB
Go
// db.go
|
|
package db
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"log"
|
|
"strings"
|
|
|
|
"strconv"
|
|
"time"
|
|
|
|
"bytes"
|
|
"crypto/tls"
|
|
|
|
"io/ioutil"
|
|
"net/http"
|
|
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
|
|
"pool/internal/utility"
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"go.uber.org/zap"
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
|
)
|
|
|
|
const DB_VERSION string = "v2.0a"
|
|
|
|
var dbconnstr string
|
|
var sharesdbconnstr string
|
|
|
|
type DbConfigInfo struct {
|
|
Ip string `json:"ip"`
|
|
Port int `json:"port"`
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
Dbname string `json:"dbname"`
|
|
}
|
|
|
|
type DbConfig struct {
|
|
Zaplog zap.Config `json:"zap"`
|
|
Db DbConfigInfo `json:"db"`
|
|
Shares DbConfigInfo `json:"shares"`
|
|
Logrotae utility.LogRotateConfig `json:"logrotate"`
|
|
}
|
|
|
|
type Config_db_info struct {
|
|
DbHostIp string
|
|
DbHostPort int
|
|
DbUserName string
|
|
DbPassWord string
|
|
DbName string
|
|
}
|
|
|
|
type PoolDb struct {
|
|
*sql.DB
|
|
Logg *zap.Logger
|
|
}
|
|
|
|
type DbContext struct {
|
|
DbExit bool
|
|
AppExit chan bool
|
|
|
|
Db_obj *PoolDb
|
|
Shares_obj *PoolDb
|
|
|
|
DbCfg DbConfig
|
|
Coin string
|
|
Module string
|
|
|
|
LastMinersTime time.Time
|
|
LastMinersStatsTime time.Time
|
|
/*LastMinerTime time.Time
|
|
LastUsersTime time.Time
|
|
LastUsersStatsTime time.Time
|
|
LastUsersBlkStatsTime time.Time
|
|
LastPoolTime time.Time
|
|
LastPoolStatsTime time.Time*/
|
|
LastPoolBlkStatsTime time.Time
|
|
LastBlockDetailHeight int64
|
|
LastBlockNewTime time.Time
|
|
LastAddressTime time.Time
|
|
|
|
Miners_ch chan Miners_db_msg
|
|
MinersStats_ch chan MinersStats_db_msg
|
|
/*Miner_ch chan Miner_db_msg
|
|
Users_ch chan Users_db_msg
|
|
UsersStats_ch chan UsersStats_db_msg
|
|
UsersBlkStats_ch chan UsersBlkStats_db_msg
|
|
Pool_ch chan Pool_db_msg
|
|
PoolStats_ch chan PoolStats_db_msg*/
|
|
PoolBlkStats_ch chan PoolBlkStats_db_msg
|
|
BlkDetail_ch chan BlkDetail_db_msg
|
|
BlkNew_ch chan BlkNew_db_msg
|
|
Address_ch chan Address_db_msg
|
|
|
|
LogR *lumberjack.Logger
|
|
}
|
|
|
|
type Miners_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
|
|
Fromip string
|
|
State string
|
|
Online time.Time
|
|
Offline time.Time
|
|
Retry int
|
|
Duration float64
|
|
Protocol string
|
|
User string
|
|
Miner string
|
|
Index string
|
|
Diff float64
|
|
Height uint32
|
|
Accepts float64
|
|
Rejects float64
|
|
Ratio float64
|
|
Staleds float64
|
|
Lows float64
|
|
Duplicates float64
|
|
Formats float64
|
|
Others float64
|
|
Disabled bool
|
|
Last_submit time.Time
|
|
Submits int
|
|
Blocks int
|
|
Orphans int
|
|
Orphan_ratio float64
|
|
}
|
|
|
|
type MinersStats_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
|
|
User string
|
|
Miner string
|
|
Index string
|
|
|
|
Shares5m float64
|
|
Shares15m float64
|
|
Shares30m float64
|
|
Shares1h float64
|
|
Shares3h float64
|
|
Shares6h float64
|
|
Shares12h float64
|
|
Shares24h float64
|
|
Shares48h float64
|
|
|
|
Rejects5m float64
|
|
Rejects15m float64
|
|
Rejects30m float64
|
|
Rejects1h float64
|
|
Rejects3h float64
|
|
Rejects6h float64
|
|
Rejects12h float64
|
|
Rejects24h float64
|
|
Rejects48h float64
|
|
|
|
Mhs5m float64
|
|
Mhs15m float64
|
|
Mhs30m float64
|
|
Mhs1h float64
|
|
Mhs3h float64
|
|
Mhs6h float64
|
|
Mhs12h float64
|
|
Mhs24h float64
|
|
Mhs48h float64
|
|
|
|
Ratio5m float64
|
|
Ratio15m float64
|
|
Ratio30m float64
|
|
Ratio1h float64
|
|
Ratio3h float64
|
|
Ratio6h float64
|
|
Ratio12h float64
|
|
Ratio24h float64
|
|
Ratio48h float64
|
|
}
|
|
|
|
/*
|
|
type Miner_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
|
|
User string
|
|
Miner string
|
|
Index string
|
|
|
|
Target string
|
|
Submit_target string
|
|
Height int64
|
|
Success int
|
|
Pow string
|
|
Net_target string
|
|
Submit string
|
|
Hash string
|
|
Header string
|
|
Accepts float64
|
|
Total_accepts float64
|
|
Rejects float64
|
|
Total_rejects float64
|
|
Reward float64
|
|
Fee float64
|
|
Nonce string
|
|
SubIdx int64
|
|
}*/
|
|
/*
|
|
type Users_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
|
|
User string
|
|
Normal int64
|
|
Abnormal int64
|
|
|
|
Offline int64
|
|
MhsZero int64
|
|
MhsLow int64
|
|
HighRejects int64
|
|
Unstable int64
|
|
|
|
Submits int64
|
|
Blocks int64
|
|
Orphans int64
|
|
Orphan_ratio float64
|
|
Reward float64
|
|
Fee float64
|
|
}*/
|
|
|
|
/*type UsersStats_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
|
|
User string
|
|
|
|
Shares5m float64
|
|
Shares15m float64
|
|
Shares30m float64
|
|
Shares1h float64
|
|
Shares3h float64
|
|
Shares6h float64
|
|
Shares12h float64
|
|
Shares24h float64
|
|
Shares48h float64
|
|
|
|
Rejects5m float64
|
|
Rejects15m float64
|
|
Rejects30m float64
|
|
Rejects1h float64
|
|
Rejects3h float64
|
|
Rejects6h float64
|
|
Rejects12h float64
|
|
Rejects24h float64
|
|
Rejects48h float64
|
|
|
|
Mhs5m float64
|
|
Mhs15m float64
|
|
Mhs30m float64
|
|
Mhs1h float64
|
|
Mhs3h float64
|
|
Mhs6h float64
|
|
Mhs12h float64
|
|
Mhs24h float64
|
|
Mhs48h float64
|
|
|
|
Ratio5m float64
|
|
Ratio15m float64
|
|
Ratio30m float64
|
|
Ratio1h float64
|
|
Ratio3h float64
|
|
Ratio6h float64
|
|
Ratio12h float64
|
|
Ratio24h float64
|
|
Ratio48h float64
|
|
}*/
|
|
|
|
/*type UsersBlkStats_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
|
|
User string
|
|
Miner string
|
|
Index string
|
|
|
|
Height int64
|
|
Hash string
|
|
Pow string
|
|
Net_target string
|
|
Submit string
|
|
Success int
|
|
Accepts float64
|
|
Rejects float64
|
|
Reward float64
|
|
Fee float64
|
|
Nonce string
|
|
SubIdx int64
|
|
}*/
|
|
|
|
/*type Pool_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
|
|
Miners int64
|
|
Normal int64
|
|
Abnormal int64
|
|
|
|
Offline int64
|
|
MhsZero int64
|
|
MhsLow int64
|
|
HighRejects int64
|
|
Unstable int64
|
|
|
|
Net_target string
|
|
Height uint64
|
|
Submits int64
|
|
Blocks int64
|
|
Orphans int64
|
|
Orphan_ratio float64
|
|
Reward float64
|
|
Fee float64
|
|
}*/
|
|
|
|
/*type PoolStats_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
|
|
Shares5m float64
|
|
Shares15m float64
|
|
Shares30m float64
|
|
Shares1h float64
|
|
Shares3h float64
|
|
Shares6h float64
|
|
Shares12h float64
|
|
Shares24h float64
|
|
Shares48h float64
|
|
|
|
Rejects5m float64
|
|
Rejects15m float64
|
|
Rejects30m float64
|
|
Rejects1h float64
|
|
Rejects3h float64
|
|
Rejects6h float64
|
|
Rejects12h float64
|
|
Rejects24h float64
|
|
Rejects48h float64
|
|
|
|
Mhs5m float64
|
|
Mhs15m float64
|
|
Mhs30m float64
|
|
Mhs1h float64
|
|
Mhs3h float64
|
|
Mhs6h float64
|
|
Mhs12h float64
|
|
Mhs24h float64
|
|
Mhs48h float64
|
|
|
|
Ratio5m float64
|
|
Ratio15m float64
|
|
Ratio30m float64
|
|
Ratio1h float64
|
|
Ratio3h float64
|
|
Ratio6h float64
|
|
Ratio12h float64
|
|
Ratio24h float64
|
|
Ratio48h float64
|
|
}*/
|
|
|
|
type PoolBlkStats_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
FromGroup uint32
|
|
ToGroup uint32
|
|
Height int64
|
|
Hash string
|
|
Pow string
|
|
Net_target string
|
|
Submit string
|
|
Success int
|
|
Accepts float64
|
|
Rejects float64
|
|
Reward float64
|
|
Fee float64
|
|
Nonce string
|
|
SubIdx int64
|
|
}
|
|
|
|
type BlkHeightDetail_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
|
|
From int64
|
|
To int64
|
|
}
|
|
|
|
type BlkDetail_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
FromGroup uint32
|
|
ToGroup uint32
|
|
Height int64
|
|
Hash string
|
|
User string
|
|
Miner string
|
|
Index string
|
|
Success int
|
|
Miner_diff float64
|
|
Pool_diff float64
|
|
Nonce string
|
|
SubIdx int64
|
|
}
|
|
|
|
type BlkNew_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
FromGroup uint32
|
|
ToGroup uint32
|
|
Height int64
|
|
Hash string
|
|
Success int
|
|
Nonce string
|
|
SubIdx int64
|
|
}
|
|
|
|
type Address_db_msg struct {
|
|
Id int
|
|
Msg string
|
|
MinerType string
|
|
Date time.Time
|
|
|
|
Addr string
|
|
Sum string
|
|
Valid bool
|
|
}
|
|
|
|
var DbCtx DbContext
|
|
|
|
func InitConfig(dbconfig *DbConfig) {
|
|
data, err := ioutil.ReadFile("db.conf")
|
|
if err != nil {
|
|
panic(err.Error())
|
|
}
|
|
if err = json.Unmarshal(data, &dbconfig); err != nil {
|
|
panic(err.Error())
|
|
}
|
|
}
|
|
|
|
func OpenPoolDb(dbtype string, dbsql string) (*PoolDb, error) {
|
|
db, err := sql.Open(dbtype, dbsql)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
pooldb := &PoolDb{DB: db}
|
|
return pooldb, nil
|
|
}
|
|
|
|
func (this *PoolDb) ClosePoolDb() error {
|
|
err := this.Close()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (this *PoolDb) QueryPoolDb(query string, args ...interface{}) (*sql.Rows, error) {
|
|
result, err := this.DB.Query(query, args...)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("query db err", err.Error()))
|
|
return nil, err
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
/*
|
|
func (this *PoolDb) InsertPoolDb2(table string, coinType string, table_name string, result interface{}) error {
|
|
//log.Println(table_name)
|
|
switch table {
|
|
case "miner":
|
|
var msg Miner_db_msg = result.(Miner_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,user,miner,`refindex`,target,submit_target,height,`success`,pow,net_target,submit,hash,header,accepts,total_accepts,rejects,total_rejects,reward,fee,nonce,subidx) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_miner,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.User, msg.Miner, msg.Index, msg.Target, msg.Submit_target, msg.Height, msg.Success, msg.Pow, msg.Net_target, msg.Submit, msg.Hash, msg.Header, msg.Accepts, msg.Total_accepts, msg.Rejects, msg.Total_rejects, msg.Reward, msg.Fee, msg.Nonce, msg.SubIdx)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_miner,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert miner table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
break
|
|
default:
|
|
this.Logg.Error("[db]", zap.String("inser table unkown table", table))
|
|
break
|
|
}
|
|
return nil
|
|
}*/
|
|
|
|
func (this *PoolDb) InsertPoolDb(table string, coinType string, result interface{}) error {
|
|
var table_name string = coinType + "_" + table
|
|
switch table {
|
|
case "miners":
|
|
var msg Miners_db_msg = result.(Miners_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,fromip,state,online,offline,retry,duration,protocol,user,miner,`refindex`,diff,height,accepts,rejects,ratio,staleds,lows,duplicates,formats,others,is_disabled,last_submit,submits,blocks,orphans,orphan_ratio) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_miners,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.Fromip, msg.State, msg.Online, msg.Offline, msg.Retry, msg.Duration, msg.Protocol, msg.User, msg.Miner, msg.Index, msg.Diff, msg.Height, msg.Accepts, msg.Rejects, msg.Ratio, msg.Staleds, msg.Lows, msg.Duplicates, msg.Formats, msg.Others, msg.Disabled, msg.Last_submit, msg.Submits, msg.Blocks, msg.Orphans, msg.Orphan_ratio)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_miners,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert miners table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
break
|
|
case "miners_stats":
|
|
var msg MinersStats_db_msg = result.(MinersStats_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,user,miner,`refindex`,shares5m,shares15m,shares30m,shares1h,shares3h,shares6h,shares12h,shares24h,shares48h,rejects5m,rejects15m,rejects30m,rejects1h,rejects3h,rejects6h,rejects12h,rejects24h,rejects48h,mhs5m,mhs15m,mhs30m,mhs1h,mhs3h,mhs6h,mhs12h,mhs24h,mhs48h,ratio5m,ratio15m,ratio30m,ratio1h,ratio3h,ratio6h,ratio12h,ratio24h,ratio48h) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_miners_stats,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.User, msg.Miner, msg.Index, msg.Shares5m, msg.Shares15m, msg.Shares30m, msg.Shares1h, msg.Shares3h, msg.Shares6h, msg.Shares12h, msg.Shares24h, msg.Shares48h, msg.Rejects5m, msg.Rejects15m, msg.Rejects30m, msg.Rejects1h, msg.Rejects3h, msg.Rejects6h, msg.Rejects12h, msg.Rejects24h, msg.Rejects48h, msg.Mhs5m, msg.Mhs15m, msg.Mhs30m, msg.Mhs1h, msg.Mhs3h, msg.Mhs6h, msg.Mhs12h, msg.Mhs24h, msg.Mhs48h, msg.Ratio5m, msg.Ratio15m, msg.Ratio30m, msg.Ratio1h, msg.Ratio3h, msg.Ratio6h, msg.Ratio12h, msg.Ratio24h, msg.Ratio48h)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_miners_stats,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert miners stats table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
|
|
break
|
|
/*case "miner":
|
|
var msg Miner_db_msg = result.(Miner_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,user,miner,`refindex`,target,submit_target,height,`success`,pow,net_target,submit,hash,header,accepts,total_accepts,rejects,total_rejects,reward,fee,nonce,subidx) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_miner,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.User, msg.Miner, msg.Index, msg.Target, msg.Submit_target, msg.Height, msg.Success, msg.Pow, msg.Net_target, msg.Submit, msg.Hash, msg.Header, msg.Accepts, msg.Total_accepts, msg.Rejects, msg.Total_rejects, msg.Reward, msg.Fee, msg.Nonce, msg.SubIdx)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_miner,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert miner table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
break
|
|
case "users":
|
|
var msg Users_db_msg = result.(Users_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,user,normal,abnormal,offline,mhszero,mhslow,highreject,unstable,submits,blocks,orphans,orphan_ratio,reward,fee) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_users,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.User, msg.Normal, msg.Abnormal, msg.Offline, msg.MhsZero, msg.MhsLow, msg.HighRejects, msg.Unstable, msg.Submits, msg.Blocks, msg.Orphans, msg.Orphan_ratio, msg.Reward, msg.Fee)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_users,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert users table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
break
|
|
case "users_stats":
|
|
var msg UsersStats_db_msg = result.(UsersStats_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,user,shares5m,shares15m,shares30m,shares1h,shares3h,shares6h,shares12h,shares24h,shares48h,rejects5m,rejects15m,rejects30m,rejects1h,rejects3h,rejects6h,rejects12h,rejects24h,rejects48h,mhs5m,mhs15m,mhs30m,mhs1h,mhs3h,mhs6h,mhs12h,mhs24h,mhs48h,ratio5m,ratio15m,ratio30m,ratio1h,ratio3h,ratio6h,ratio12h,ratio24h,ratio48h) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_users_stats,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.User, msg.Shares5m, msg.Shares15m, msg.Shares30m, msg.Shares1h, msg.Shares3h, msg.Shares6h, msg.Shares12h, msg.Shares24h, msg.Shares48h, msg.Rejects5m, msg.Rejects15m, msg.Rejects30m, msg.Rejects1h, msg.Rejects3h, msg.Rejects6h, msg.Rejects12h, msg.Rejects24h, msg.Rejects48h, msg.Mhs5m, msg.Mhs15m, msg.Mhs30m, msg.Mhs1h, msg.Mhs3h, msg.Mhs6h, msg.Mhs12h, msg.Mhs24h, msg.Mhs48h, msg.Ratio5m, msg.Ratio15m, msg.Ratio30m, msg.Ratio1h, msg.Ratio3h, msg.Ratio6h, msg.Ratio12h, msg.Ratio24h, msg.Ratio48h)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_users_stats,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert users stats table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
break
|
|
case "users_blkstats":
|
|
var msg UsersBlkStats_db_msg = result.(UsersBlkStats_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id, `date`, `user`, miner, `refindex`, height, `hash`, pow, net_target, submit, `success`, accepts, rejects, reward, fee, nonce, subidx) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
|
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_users_blkstats,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.User, msg.Miner, msg.Index, msg.Height, msg.Hash, msg.Pow, msg.Net_target, msg.Submit, msg.Success, msg.Accepts, msg.Rejects, msg.Reward, msg.Fee, msg.Nonce, msg.SubIdx)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_users_blkstats,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert users blkstats table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
|
|
break
|
|
case "pool":
|
|
var msg Pool_db_msg = result.(Pool_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,miners,normal,abnormal,offline,mhszero,mhslow,highreject,unstable,net_target,height,submits,blocks,orphans,orphan_ratio,reward,fee) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_pool,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.Miners, msg.Normal, msg.Abnormal, msg.Offline, msg.MhsZero, msg.MhsLow, msg.HighRejects, msg.Unstable, msg.Net_target, msg.Height, msg.Submits, msg.Blocks, msg.Orphans, msg.Orphan_ratio, msg.Reward, msg.Fee)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_pool,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert pool table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
break
|
|
case "pool_stats":
|
|
var msg PoolStats_db_msg = result.(PoolStats_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,shares5m,shares15m,shares30m,shares1h,shares3h,shares6h,shares12h,shares24h,shares48h,rejects5m,rejects15m,rejects30m,rejects1h,rejects3h,rejects6h,rejects12h,rejects24h,rejects48h,mhs5m,mhs15m,mhs30m,mhs1h,mhs3h,mhs6h,mhs12h,mhs24h,mhs48h,ratio5m,ratio15m,ratio30m,ratio1h,ratio3h,ratio6h,ratio12h,ratio24h,ratio48h) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_pool_stats,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.Shares5m, msg.Shares15m, msg.Shares30m, msg.Shares1h, msg.Shares3h, msg.Shares6h, msg.Shares12h, msg.Shares24h, msg.Shares48h, msg.Rejects5m, msg.Rejects15m, msg.Rejects30m, msg.Rejects1h, msg.Rejects3h, msg.Rejects6h, msg.Rejects12h, msg.Rejects24h, msg.Rejects48h, msg.Mhs5m, msg.Mhs15m, msg.Mhs30m, msg.Mhs1h, msg.Mhs3h, msg.Mhs6h, msg.Mhs12h, msg.Mhs24h, msg.Mhs48h, msg.Ratio5m, msg.Ratio15m, msg.Ratio30m, msg.Ratio1h, msg.Ratio3h, msg.Ratio6h, msg.Ratio12h, msg.Ratio24h, msg.Ratio48h)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_pool_stats,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert pool stats table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
break*/
|
|
case "pool_blkstats":
|
|
var msg PoolBlkStats_db_msg = result.(PoolBlkStats_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,height,hash,pow,net_target,submit,`success`,accepts,rejects,reward,fee,nonce,subidx) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_pool_blkstats,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.Height, msg.Hash, msg.Pow, msg.Net_target, msg.Submit, msg.Success, msg.Accepts, msg.Rejects, msg.Reward, msg.Fee, msg.Nonce, msg.SubIdx)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_pool_blkstats,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert pool blkstats table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
break
|
|
case "blk_detail":
|
|
var msg BlkDetail_db_msg = result.(BlkDetail_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,height,hash,user,miner,`refindex`,`success`,miner_diff,pool_diff,nonce,subidx) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_block_detail,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.Height, msg.Hash, msg.User, msg.Miner, msg.Index, msg.Success, msg.Miner_diff, msg.Pool_diff, msg.Nonce, msg.SubIdx)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_block_detail,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert block detail table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
break
|
|
case "blk_height_detail":
|
|
var msg BlkHeightDetail_db_msg = result.(BlkHeightDetail_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += " (id,date,`from`,`to`) VALUES (?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_block_height_detail,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.From, msg.To)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_block_height_detail,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert block height detail table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
break
|
|
case "blk_new":
|
|
var msg BlkNew_db_msg = result.(BlkNew_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,height,hash,`success`,nonce,subidx) VALUES (?,?,?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_block_new,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.Height, msg.Hash, msg.Success, msg.Nonce, msg.SubIdx)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_block_new,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert block new table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
|
|
break
|
|
case "address":
|
|
var msg Address_db_msg = result.(Address_db_msg)
|
|
var insert_sql string = "INSERT INTO " + table_name
|
|
insert_sql += "(id,date,addr,alias,valid) VALUES (?,?,?,?,?)"
|
|
stmt, err := this.Prepare(insert_sql)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_address,Prepare err", err.Error()))
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(msg.Id, msg.Date.Format("2006-01-02 15:04:05"), msg.Addr, msg.Sum, msg.Valid)
|
|
if err != nil {
|
|
this.Logg.Error("[db]", zap.String("db_handle_address,Exec err", err.Error()), zap.Any("db_handle_miners,res", res))
|
|
return err
|
|
}
|
|
this.Logg.Info("[db]", zap.String("insert address table sucess,miner type", coinType), zap.String("sql", insert_sql))
|
|
|
|
break
|
|
default:
|
|
this.Logg.Error("[db]", zap.String("inser table unkown table", table))
|
|
break
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (this *PoolDb) UpdatePoolDb(sql string, args ...interface{}) (int64, error) {
|
|
|
|
result, err := this.Exec(sql, args...)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
var count int64
|
|
count, err = result.RowsAffected()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
func (this *PoolDb) DeletePoolDb(sql string, args ...interface{}) (int64, error) {
|
|
|
|
result, err := this.Exec(sql, args...)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
var count int64
|
|
count, err = result.RowsAffected()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
func CheckHeightRangeFromTable(DbCtx *DbContext, TableName string, height int64) (int64, int64) {
|
|
if DbCtx == nil {
|
|
return -1, -1
|
|
}
|
|
|
|
query := fmt.Sprintf("SELECT `from`,`to` FROM %s WHERE `from` <= ? AND `to` > ?", TableName)
|
|
rows, err := DbCtx.Shares_obj.Query(query, height, height)
|
|
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("failed to query %s", err.Error()))
|
|
return -1, -1
|
|
}
|
|
defer rows.Close()
|
|
|
|
for rows.Next() {
|
|
var from int64 = -1
|
|
var to int64 = -1
|
|
if err := rows.Scan(&from, &to); err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("failed to scan %s", err.Error()))
|
|
}
|
|
return from, to
|
|
}
|
|
return -1, -1
|
|
}
|
|
|
|
/*func CheckUserFromTable(DbCtx *DbContext, TableName string, User string) bool {
|
|
if DbCtx == nil {
|
|
return false
|
|
}
|
|
|
|
query := fmt.Sprintf("SELECT user FROM %s WHERE user = ?", TableName)
|
|
rows, err := DbCtx.Db_obj.Query(query, User)
|
|
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("failed to query %s", err.Error()))
|
|
return false
|
|
}
|
|
defer rows.Close()
|
|
|
|
for rows.Next() {
|
|
var user string
|
|
if err := rows.Scan(&user); err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("failed to scan %s", err.Error()))
|
|
}
|
|
return true
|
|
}
|
|
return false
|
|
}*/
|
|
|
|
func CheckUserMinerFromTable(DbCtx *DbContext, TableName string, User string, Miner string, Index string) bool {
|
|
if DbCtx == nil {
|
|
return false
|
|
}
|
|
|
|
query := fmt.Sprintf("SELECT user FROM %s WHERE user = ? AND miner = ? AND `refindex` = ?", TableName)
|
|
rows, err := DbCtx.Db_obj.Query(query, User, Miner, Index)
|
|
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("failed to query %s", err.Error()))
|
|
return false
|
|
}
|
|
defer rows.Close()
|
|
|
|
for rows.Next() {
|
|
var user string
|
|
if err := rows.Scan(&user); err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("failed to scan %s", err.Error()))
|
|
}
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func CheckTableIsExist(DbCtx *DbContext, tableName string) bool {
|
|
table_exist := true
|
|
query := fmt.Sprintf("SHOW TABLES LIKE '%s'", tableName)
|
|
var result string
|
|
if strings.Contains(tableName, "blk_detail") || strings.Contains(tableName, "blk_new") || strings.Contains(tableName, "blk_height_detail") || strings.Contains(tableName, "block_detail") {
|
|
err := DbCtx.Shares_obj.QueryRow(query).Scan(&result)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
table_exist = false
|
|
}
|
|
DbCtx.Shares_obj.Logg.Warn("[db]", zap.String("check table existence failed:", tableName), zap.String("err", err.Error()))
|
|
table_exist = false
|
|
}
|
|
return table_exist
|
|
}
|
|
err := DbCtx.Db_obj.QueryRow(query).Scan(&result)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
table_exist = false
|
|
}
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("check table existence failed:", tableName), zap.String("err", err.Error()))
|
|
table_exist = false
|
|
}
|
|
return table_exist
|
|
}
|
|
|
|
/*
|
|
func CreateTable2(DbCtx *DbContext, table string, coinType string, table_name string) error {
|
|
var table_sql string
|
|
if CheckTableIsExist(DbCtx, table_name) {
|
|
return nil
|
|
}
|
|
switch table {
|
|
case "miner":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`user` VARCHAR(128),"
|
|
table_sql += "`miner` VARCHAR(128),"
|
|
table_sql += "`refindex` VARCHAR(128),"
|
|
table_sql += "`target` VARCHAR(128),"
|
|
table_sql += "`submit_target` VARCHAR(128),"
|
|
table_sql += "`height` INT(10),"
|
|
table_sql += "`success` TINYINT(1),"
|
|
table_sql += "`pow` VARCHAR(128),"
|
|
table_sql += "`net_target` VARCHAR(128),"
|
|
table_sql += "`submit` VARCHAR(64),"
|
|
table_sql += "`hash` VARCHAR(128),"
|
|
table_sql += "`header` VARCHAR(1024),"
|
|
table_sql += "`accepts` DECIMAL(32,6),"
|
|
table_sql += "`total_accepts` DECIMAL(32,6),"
|
|
table_sql += "`rejects` DECIMAL(32,6),"
|
|
table_sql += "`total_rejects` DECIMAL(32,6),"
|
|
table_sql += "`reward` DECIMAL(32,6),"
|
|
table_sql += "`fee` DECIMAL(32,6),"
|
|
table_sql += "`nonce` VARCHAR(64),"
|
|
table_sql += "`subidx` INT(10),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
default:
|
|
log.Println("[db],create table unkown table")
|
|
DbCtx.Db_obj.Logg.Info("[db]", zap.String("create table unkown table:", table))
|
|
break
|
|
}
|
|
//log.Println(table, table_sql, table_name)
|
|
_, err := DbCtx.Db_obj.QueryPoolDb(table_sql)
|
|
if err != nil {
|
|
//log.Println("[db],create table err: result:", err.Error())
|
|
DbCtx.Db_obj.Logg.Info("[db]", zap.String("create table err: result:", err.Error()))
|
|
}
|
|
return err
|
|
}*/
|
|
|
|
func CreateTable(DbCtx *DbContext, table string, coinType string) error {
|
|
var table_sql string
|
|
var table_name string
|
|
table_name = coinType + "_" + table
|
|
|
|
if CheckTableIsExist(DbCtx, table_name) {
|
|
return nil
|
|
}
|
|
|
|
switch table {
|
|
case "miners":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`fromip` VARCHAR(64),"
|
|
table_sql += "`state` VARCHAR(64),"
|
|
table_sql += "`online` DATETIME,"
|
|
table_sql += "`offline` DATETIME,"
|
|
table_sql += "`retry` INT(10),"
|
|
table_sql += "`duration` DECIMAL(12,6),"
|
|
table_sql += "`protocol` VARCHAR(64),"
|
|
table_sql += "`user` VARCHAR(128),"
|
|
table_sql += "`miner` VARCHAR(128),"
|
|
table_sql += "`refindex` VARCHAR(128),"
|
|
table_sql += "`diff` DECIMAL(32,6),"
|
|
table_sql += "`height` INT(10),"
|
|
table_sql += "`accepts` DECIMAL(32,6),"
|
|
table_sql += "`rejects` DECIMAL(32,6),"
|
|
table_sql += "`ratio` DECIMAL(32,6),"
|
|
table_sql += "`staleds` DECIMAL(32,6),"
|
|
table_sql += "`lows` DECIMAL(32,6),"
|
|
table_sql += "`duplicates` DECIMAL(32,6),"
|
|
table_sql += "`formats` DECIMAL(32,6),"
|
|
table_sql += "`others` DECIMAL(32,6),"
|
|
table_sql += "`is_disabled` TINYINT(1),"
|
|
table_sql += "`last_submit` DATETIME,"
|
|
table_sql += "`submits` INT(10),"
|
|
table_sql += "`blocks` INT(10),"
|
|
table_sql += "`orphans` INT(10),"
|
|
table_sql += "`orphan_ratio` DECIMAL(32,6),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
case "miners_stats":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`user` VARCHAR(128),"
|
|
table_sql += "`miner` VARCHAR(128),"
|
|
table_sql += "`refindex` VARCHAR(128),"
|
|
table_sql += "`shares5m` DECIMAL(32,6),"
|
|
table_sql += "`shares15m` DECIMAL(32,6),"
|
|
table_sql += "`shares30m` DECIMAL(32,6),"
|
|
table_sql += "`shares1h` DECIMAL(32,6),"
|
|
table_sql += "`shares3h` DECIMAL(32,6),"
|
|
table_sql += "`shares6h` DECIMAL(32,6),"
|
|
table_sql += "`shares12h` DECIMAL(32,6),"
|
|
table_sql += "`shares24h` DECIMAL(32,6),"
|
|
table_sql += "`shares48h` DECIMAL(32,6),"
|
|
table_sql += "`rejects5m` DECIMAL(32,6),"
|
|
table_sql += "`rejects15m` DECIMAL(32,6),"
|
|
table_sql += "`rejects30m` DECIMAL(32,6),"
|
|
table_sql += "`rejects1h` DECIMAL(32,6),"
|
|
table_sql += "`rejects3h` DECIMAL(32,6),"
|
|
table_sql += "`rejects6h` DECIMAL(32,6),"
|
|
table_sql += "`rejects12h` DECIMAL(32,6),"
|
|
table_sql += "`rejects24h` DECIMAL(32,6),"
|
|
table_sql += "`rejects48h` DECIMAL(32,6),"
|
|
table_sql += "`mhs5m` DECIMAL(32,6),"
|
|
table_sql += "`mhs15m` DECIMAL(32,6),"
|
|
table_sql += "`mhs30m` DECIMAL(32,6),"
|
|
table_sql += "`mhs1h` DECIMAL(32,6),"
|
|
table_sql += "`mhs3h` DECIMAL(32,6),"
|
|
table_sql += "`mhs6h` DECIMAL(32,6),"
|
|
table_sql += "`mhs12h` DECIMAL(32,6),"
|
|
table_sql += "`mhs24h` DECIMAL(32,6),"
|
|
table_sql += "`mhs48h` DECIMAL(32,6),"
|
|
table_sql += "`ratio5m` DECIMAL(32,6),"
|
|
table_sql += "`ratio15m` DECIMAL(32,6),"
|
|
table_sql += "`ratio30m` DECIMAL(32,6),"
|
|
table_sql += "`ratio1h` DECIMAL(32,6),"
|
|
table_sql += "`ratio3h` DECIMAL(32,6),"
|
|
table_sql += "`ratio6h` DECIMAL(32,6),"
|
|
table_sql += "`ratio12h` DECIMAL(32,6),"
|
|
table_sql += "`ratio24h` DECIMAL(32,6),"
|
|
table_sql += "`ratio48h` DECIMAL(32,6),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
/*case "miner":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`user` VARCHAR(128),"
|
|
table_sql += "`miner` VARCHAR(128),"
|
|
table_sql += "`refindex` VARCHAR(128),"
|
|
table_sql += "`target` VARCHAR(128),"
|
|
table_sql += "`submit_target` VARCHAR(128),"
|
|
table_sql += "`height` INT(10),"
|
|
table_sql += "`success` TINYINT(1),"
|
|
table_sql += "`pow` VARCHAR(128),"
|
|
table_sql += "`net_target` VARCHAR(128),"
|
|
table_sql += "`submit` VARCHAR(64),"
|
|
table_sql += "`hash` VARCHAR(128),"
|
|
table_sql += "`header` VARCHAR(1024),"
|
|
table_sql += "`accepts` DECIMAL(32,6),"
|
|
table_sql += "`total_accepts` DECIMAL(32,6),"
|
|
table_sql += "`rejects` DECIMAL(32,6),"
|
|
table_sql += "`total_rejects` DECIMAL(32,6),"
|
|
table_sql += "`reward` DECIMAL(32,6),"
|
|
table_sql += "`fee` DECIMAL(32,6),"
|
|
table_sql += "`nonce` VARCHAR(64),"
|
|
table_sql += "`subidx` INT(10),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
case "users":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`user` VARCHAR(128),"
|
|
table_sql += "`normal` INT(10),"
|
|
table_sql += "`abnormal` INT(10),"
|
|
table_sql += "`offline` INT(10),"
|
|
table_sql += "`mhszero` INT(10),"
|
|
table_sql += "`mhslow` INT(10),"
|
|
table_sql += "`highreject` INT(10),"
|
|
table_sql += "`unstable` INT(10),"
|
|
table_sql += "`submits` INT(10),"
|
|
table_sql += "`blocks` INT(10),"
|
|
table_sql += "`orphans` INT(10),"
|
|
table_sql += "`orphan_ratio` DECIMAL(32,6),"
|
|
table_sql += "`reward` DECIMAL(32,6),"
|
|
table_sql += "`fee` DECIMAL(32,6),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
case "users_stats":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`user` VARCHAR(128),"
|
|
table_sql += "`shares5m` DECIMAL(32,6),"
|
|
table_sql += "`shares15m` DECIMAL(32,6),"
|
|
table_sql += "`shares30m` DECIMAL(32,6),"
|
|
table_sql += "`shares1h` DECIMAL(32,6),"
|
|
table_sql += "`shares3h` DECIMAL(32,6),"
|
|
table_sql += "`shares6h` DECIMAL(32,6),"
|
|
table_sql += "`shares12h` DECIMAL(32,6),"
|
|
table_sql += "`shares24h` DECIMAL(32,6),"
|
|
table_sql += "`shares48h` DECIMAL(32,6),"
|
|
table_sql += "`rejects5m` DECIMAL(32,6),"
|
|
table_sql += "`rejects15m` DECIMAL(32,6),"
|
|
table_sql += "`rejects30m` DECIMAL(32,6),"
|
|
table_sql += "`rejects1h` DECIMAL(32,6),"
|
|
table_sql += "`rejects3h` DECIMAL(32,6),"
|
|
table_sql += "`rejects6h` DECIMAL(32,6),"
|
|
table_sql += "`rejects12h` DECIMAL(32,6),"
|
|
table_sql += "`rejects24h` DECIMAL(32,6),"
|
|
table_sql += "`rejects48h` DECIMAL(32,6),"
|
|
table_sql += "`mhs5m` DECIMAL(32,6),"
|
|
table_sql += "`mhs15m` DECIMAL(32,6),"
|
|
table_sql += "`mhs30m` DECIMAL(32,6),"
|
|
table_sql += "`mhs1h` DECIMAL(32,6),"
|
|
table_sql += "`mhs3h` DECIMAL(32,6),"
|
|
table_sql += "`mhs6h` DECIMAL(32,6),"
|
|
table_sql += "`mhs12h` DECIMAL(32,6),"
|
|
table_sql += "`mhs24h` DECIMAL(32,6),"
|
|
table_sql += "`mhs48h` DECIMAL(32,6),"
|
|
table_sql += "`ratio5m` DECIMAL(32,6),"
|
|
table_sql += "`ratio15m` DECIMAL(32,6),"
|
|
table_sql += "`ratio30m` DECIMAL(32,6),"
|
|
table_sql += "`ratio1h` DECIMAL(32,6),"
|
|
table_sql += "`ratio3h` DECIMAL(32,6),"
|
|
table_sql += "`ratio6h` DECIMAL(32,6),"
|
|
table_sql += "`ratio12h` DECIMAL(32,6),"
|
|
table_sql += "`ratio24h` DECIMAL(32,6),"
|
|
table_sql += "`ratio48h` DECIMAL(32,6),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
case "users_blkstats":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`height` INT(10),"
|
|
table_sql += "`user` VARCHAR(128),"
|
|
table_sql += "`miner` VARCHAR(128),"
|
|
table_sql += "`refindex` VARCHAR(128),"
|
|
table_sql += "`hash` VARCHAR(128),"
|
|
table_sql += "`pow` VARCHAR(128),"
|
|
table_sql += "`net_target` VARCHAR(128),"
|
|
table_sql += "`submit` VARCHAR(64),"
|
|
table_sql += "`success` TINYINT(1),"
|
|
table_sql += "`accepts` DECIMAL(32,6),"
|
|
table_sql += "`rejects` DECIMAL(32,6),"
|
|
table_sql += "`reward` DECIMAL(32,6),"
|
|
table_sql += "`fee` DECIMAL(32,6),"
|
|
table_sql += "`nonce` VARCHAR(64),"
|
|
table_sql += "`subidx` INT(10),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
case "pool":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`miners` INT(10),"
|
|
table_sql += "`normal` INT(10),"
|
|
table_sql += "`abnormal` INT(10),"
|
|
table_sql += "`offline` INT(10),"
|
|
table_sql += "`mhszero` INT(10),"
|
|
table_sql += "`mhslow` INT(10),"
|
|
table_sql += "`highreject` INT(10),"
|
|
table_sql += "`unstable` INT(10),"
|
|
table_sql += "`net_target` VARCHAR(128),"
|
|
table_sql += "`height` INT(10),"
|
|
table_sql += "`submits` INT(10),"
|
|
table_sql += "`blocks` INT(10),"
|
|
table_sql += "`orphans` INT(10),"
|
|
table_sql += "`orphan_ratio` DECIMAL(32,6),"
|
|
table_sql += "`reward` DECIMAL(32,6),"
|
|
table_sql += "`fee` DECIMAL(32,6),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
case "pool_stats":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`mhs5m` DECIMAL(32,6),"
|
|
table_sql += "`mhs15m` DECIMAL(32,6),"
|
|
table_sql += "`mhs30m` DECIMAL(32,6),"
|
|
table_sql += "`mhs1h` DECIMAL(32,6),"
|
|
table_sql += "`mhs3h` DECIMAL(32,6),"
|
|
table_sql += "`mhs6h` DECIMAL(32,6),"
|
|
table_sql += "`mhs12h` DECIMAL(32,6),"
|
|
table_sql += "`mhs24h` DECIMAL(32,6),"
|
|
table_sql += "`mhs48h` DECIMAL(32,6),"
|
|
table_sql += "`shares5m` DECIMAL(32,6),"
|
|
table_sql += "`shares15m` DECIMAL(32,6),"
|
|
table_sql += "`shares30m` DECIMAL(32,6),"
|
|
table_sql += "`shares1h` DECIMAL(32,6),"
|
|
table_sql += "`shares3h` DECIMAL(32,6),"
|
|
table_sql += "`shares6h` DECIMAL(32,6),"
|
|
table_sql += "`shares12h` DECIMAL(32,6),"
|
|
table_sql += "`shares24h` DECIMAL(32,6),"
|
|
table_sql += "`shares48h` DECIMAL(32,6),"
|
|
table_sql += "`rejects5m` DECIMAL(32,6),"
|
|
table_sql += "`rejects15m` DECIMAL(32,6),"
|
|
table_sql += "`rejects30m` DECIMAL(32,6),"
|
|
table_sql += "`rejects1h` DECIMAL(32,6),"
|
|
table_sql += "`rejects3h` DECIMAL(32,6),"
|
|
table_sql += "`rejects6h` DECIMAL(32,6),"
|
|
table_sql += "`rejects12h` DECIMAL(32,6),"
|
|
table_sql += "`rejects24h` DECIMAL(32,6),"
|
|
table_sql += "`rejects48h` DECIMAL(32,6),"
|
|
table_sql += "`ratio5m` DECIMAL(32,6),"
|
|
table_sql += "`ratio15m` DECIMAL(32,6),"
|
|
table_sql += "`ratio30m` DECIMAL(32,6),"
|
|
table_sql += "`ratio1h` DECIMAL(32,6),"
|
|
table_sql += "`ratio3h` DECIMAL(32,6),"
|
|
table_sql += "`ratio6h` DECIMAL(32,6),"
|
|
table_sql += "`ratio12h` DECIMAL(32,6),"
|
|
table_sql += "`ratio24h` DECIMAL(32,6),"
|
|
table_sql += "`ratio48h` DECIMAL(32,6),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break*/
|
|
case "pool_blkstats":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`height` INT(10),"
|
|
table_sql += "`hash` VARCHAR(128),"
|
|
table_sql += "`pow` VARCHAR(128),"
|
|
table_sql += "`net_target` VARCHAR(128),"
|
|
table_sql += "`submit` VARCHAR(64),"
|
|
table_sql += "`success` TINYINT(1),"
|
|
table_sql += "`accepts` DECIMAL(32,6),"
|
|
table_sql += "`rejects` DECIMAL(32,6),"
|
|
table_sql += "`reward` DECIMAL(32,6),"
|
|
table_sql += "`fee` DECIMAL(32,6),"
|
|
table_sql += "`nonce` VARCHAR(64),"
|
|
table_sql += "`subidx` INT(10),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
case "blk_height_detail":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`from` INT(10),"
|
|
table_sql += "`to` INT(10),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
case "blk_detail":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`height` INT(10),"
|
|
table_sql += "`hash` VARCHAR(128),"
|
|
table_sql += "`user` VARCHAR(128),"
|
|
table_sql += "`miner` VARCHAR(128),"
|
|
table_sql += "`refindex` VARCHAR(128),"
|
|
table_sql += "`success` TINYINT(1),"
|
|
table_sql += "`miner_diff` DECIMAL(32,6),"
|
|
table_sql += "`pool_diff` DECIMAL(32,6),"
|
|
table_sql += "`nonce` VARCHAR(64),"
|
|
table_sql += "`subidx` INT(10),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
case "blk_new":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) NOT NULL AUTO_INCREMENT,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`height` INT(10),"
|
|
table_sql += "`hash` VARCHAR(128),"
|
|
table_sql += "`success` TINYINT(1),"
|
|
table_sql += "`nonce` VARCHAR(64),"
|
|
table_sql += "`subidx` INT(10),"
|
|
table_sql += " PRIMARY KEY (`id`))"
|
|
break
|
|
case "address":
|
|
table_sql = "CREATE TABLE "
|
|
table_sql += "`" + table_name + "`"
|
|
table_sql += "(`id` INT(10) AUTO_INCREMENT UNIQUE,"
|
|
table_sql += "`date` DATETIME NOT NULL,"
|
|
table_sql += "`addr` VARCHAR(128),"
|
|
table_sql += "`alias` VARCHAR(128),"
|
|
table_sql += "`valid` TINYINT(1),"
|
|
table_sql += " PRIMARY KEY (`addr`))"
|
|
break
|
|
default:
|
|
log.Println("[db],create table unkown table")
|
|
DbCtx.Db_obj.Logg.Info("[db]", zap.String("create table unkown table:", table))
|
|
break
|
|
}
|
|
//log.Println(table, table_sql)
|
|
if strings.Contains(table, "blk_detail") || strings.Contains(table, "blk_new") || strings.Contains(table, "blk_height_detail") || strings.Contains(table, "block_detail") {
|
|
_, err := DbCtx.Shares_obj.QueryPoolDb(table_sql)
|
|
if err != nil {
|
|
log.Println("[db],create table err: result:", err.Error())
|
|
DbCtx.Shares_obj.Logg.Info("[db]", zap.String("create table err: result:", err.Error()))
|
|
}
|
|
return err
|
|
}
|
|
_, err := DbCtx.Db_obj.QueryPoolDb(table_sql)
|
|
if err != nil {
|
|
log.Println("[db],create table err: result:", err.Error())
|
|
DbCtx.Db_obj.Logg.Info("[db]", zap.String("create table err: result:", err.Error()))
|
|
}
|
|
return err
|
|
}
|
|
|
|
func createdb(DbCtx *DbContext) (int, error) {
|
|
var result int = 0
|
|
var db_sql string = DbCtx.DbCfg.Db.Username + ":" + DbCtx.DbCfg.Db.Password + "@tcp(" + DbCtx.DbCfg.Db.Ip + ":" + strconv.Itoa(DbCtx.DbCfg.Db.Port) + ")/" + DbCtx.DbCfg.Db.Dbname + "?charset=utf8"
|
|
//log.Println("[db],create db sql:", db_sql)
|
|
dbconnstr = db_sql
|
|
db_obj, err := OpenPoolDb("mysql", db_sql)
|
|
if err != nil {
|
|
log.Println("[db],open db err:", err.Error())
|
|
//DbCtx.Db_obj.Logg.Info("[db]", zap.String("open db err:", err.Error()))
|
|
result = -1
|
|
}
|
|
DbCtx.Db_obj = db_obj
|
|
|
|
var sharesdb_sql string = DbCtx.DbCfg.Shares.Username + ":" + DbCtx.DbCfg.Shares.Password + "@tcp(" + DbCtx.DbCfg.Shares.Ip + ":" + strconv.Itoa(DbCtx.DbCfg.Shares.Port) + ")/" + DbCtx.DbCfg.Shares.Dbname + "?charset=utf8"
|
|
//log.Println("[db],create db sql:", db_sql)
|
|
sharesdbconnstr = sharesdb_sql
|
|
sharesdb_obj, err := OpenPoolDb("mysql", sharesdb_sql)
|
|
if err != nil {
|
|
log.Println("[db],open db err:", err.Error())
|
|
//DbCtx.Shares_obj.Logg.Info("[db]", zap.String("open db err:", err.Error()))
|
|
result = -1
|
|
}
|
|
DbCtx.Shares_obj = sharesdb_obj
|
|
log.Println("open db!")
|
|
return result, err
|
|
}
|
|
|
|
func do_handle_miners(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.Miners_ch
|
|
switch msg.Msg {
|
|
case "miners":
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
curTableName := msg.MinerType + "_" + msg.Msg
|
|
if DbCtx.Module == "server" {
|
|
if msg.Date.Sub(DbCtx.LastMinersTime) >= 300*time.Second {
|
|
prev := DbCtx.LastMinersTime
|
|
DbCtx.LastMinersTime = msg.Date
|
|
table_exist := true
|
|
tableName := msg.MinerType + "_" + msg.Msg + "_" + prev.Format("20060102")
|
|
query := fmt.Sprintf("SHOW TABLES LIKE '%s'", tableName)
|
|
var result string
|
|
err := DbCtx.Db_obj.QueryRow(query).Scan(&result)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
table_exist = false
|
|
}
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("check table existence failed:", tableName), zap.String("err", err.Error()))
|
|
table_exist = false
|
|
}
|
|
if !table_exist {
|
|
createTableSQL := fmt.Sprintf("CREATE TABLE %s LIKE %s", tableName, curTableName)
|
|
_, err = DbCtx.Db_obj.Exec(createTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("create miners table err", err.Error()))
|
|
//continue
|
|
}
|
|
alterTableSQL := fmt.Sprintf("ALTER TABLE %s ADD COLUMN save_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP", tableName)
|
|
_, err = DbCtx.Db_obj.Exec(alterTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("add miners column table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
copyDataSQL := fmt.Sprintf("INSERT INTO %s (date, fromip, state, online, offline, retry, duration, protocol, user, miner, `refindex`, diff, height, accepts, rejects, ratio, staleds, lows, duplicates, formats, others, is_disabled, last_submit, submits, blocks, orphans, orphan_ratio, save_ts) SELECT date, fromip, state, online, offline, retry, duration, protocol, user, miner, `refindex`, diff, height, accepts, rejects, ratio, staleds, lows, duplicates, formats, others, is_disabled, last_submit, submits, blocks, orphans, orphan_ratio, '%s' FROM %s", tableName, prev.Format("2006-01-02 15:04:05"), curTableName)
|
|
_, err = DbCtx.Db_obj.Exec(copyDataSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("add miners column table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
found := CheckUserMinerFromTable(DbCtx, msg.MinerType+"_"+msg.Msg, msg.User, msg.Miner, msg.Index)
|
|
if found {
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET date = ?, fromip = ?, state = ?, online = ?, offline = ?, retry = ?, duration = ?, protocol = ?, diff = ?, height = ?, accepts = ?, rejects = ?, ratio = ?, staleds = ?, lows = ?, duplicates = ?, formats = ?, others = ?, is_disabled = ?, last_submit = ?, submits = ?, blocks = ?, orphans = ?, orphan_ratio = ? WHERE user = ? AND miner = ? AND `refindex` = ?", curTableName)
|
|
count, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, msg.Date.Format("2006-01-02 15:04:05"), msg.Fromip, msg.State, msg.Online, msg.Offline, msg.Retry, msg.Duration, msg.Protocol, msg.Diff, msg.Height, msg.Accepts, msg.Rejects, msg.Ratio, msg.Staleds, msg.Lows, msg.Duplicates, msg.Formats, msg.Others, msg.Disabled, msg.Last_submit, msg.Submits, msg.Blocks, msg.Orphans, msg.Orphan_ratio, msg.User, msg.Miner, msg.Index)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update miners table err", err.Error()))
|
|
//continue
|
|
}
|
|
DbCtx.Db_obj.Logg.Info("[db]", zap.Int64("update miners table count", count), zap.String("update miners table MinerType", msg.MinerType), zap.String("sql", updateSQL))
|
|
} else {
|
|
err := DbCtx.Db_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("insert miners table err", err.Error()))
|
|
}
|
|
}
|
|
} else if DbCtx.Module == "gbt" {
|
|
/*curTableName := msg.MinerType + "_" + msg.Msg
|
|
last_blocks := GetLastBlocksFromTable(DbCtx, curTableName, msg.User, msg.Miner, msg.Index)
|
|
if last_blocks >= 0 {
|
|
last_blocks += 1
|
|
UpdateBlocksToTable(DbCtx, curTableName, msg.User, msg.Miner, msg.Index, last_blocks)
|
|
}*/
|
|
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
break
|
|
default:
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("do_handle_miners", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func do_handle_miners_stats(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.MinersStats_ch
|
|
switch msg.Msg {
|
|
case "miners_stats":
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
curTableName := msg.MinerType + "_" + msg.Msg
|
|
if DbCtx.Module == "server" {
|
|
if msg.Date.Sub(DbCtx.LastMinersStatsTime) >= 300*time.Second {
|
|
prev := DbCtx.LastMinersStatsTime
|
|
DbCtx.LastMinersStatsTime = msg.Date
|
|
table_exist := true
|
|
tableName := msg.MinerType + "_" + msg.Msg + "_" + prev.Format("20060102")
|
|
query := fmt.Sprintf("SHOW TABLES LIKE '%s'", tableName)
|
|
var result string
|
|
err := DbCtx.Db_obj.QueryRow(query).Scan(&result)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
table_exist = false
|
|
}
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("check table existence failed:", tableName), zap.String("err", err.Error()))
|
|
table_exist = false
|
|
}
|
|
if !table_exist {
|
|
createTableSQL := fmt.Sprintf("CREATE TABLE %s LIKE %s", tableName, curTableName)
|
|
_, err = DbCtx.Db_obj.Exec(createTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("create miners_stats table err", err.Error()))
|
|
//continue
|
|
}
|
|
alterTableSQL := fmt.Sprintf("ALTER TABLE %s ADD COLUMN save_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP", tableName)
|
|
_, err = DbCtx.Db_obj.Exec(alterTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("add miners_stats column table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
copyDataSQL := fmt.Sprintf("INSERT INTO %s (date, user, miner, `refindex`, shares5m, shares15m, shares30m, shares1h, shares3h, shares6h, shares12h, shares24h, shares48h, rejects5m, rejects15m, rejects30m, rejects1h, rejects3h, rejects6h, rejects12h, rejects24h, rejects48h, mhs5m, mhs15m, mhs30m, mhs1h, mhs3h, mhs6h, mhs12h, mhs24h, mhs48h, ratio5m, ratio15m, ratio30m, ratio1h, ratio3h, ratio6h, ratio12h, ratio24h, ratio48h, save_ts) SELECT date, user, miner, `refindex`, shares5m, shares15m, shares30m, shares1h, shares3h, shares6h, shares12h, shares24h, shares48h, rejects5m, rejects15m, rejects30m, rejects1h, rejects3h, rejects6h, rejects12h, rejects24h, rejects48h, mhs5m, mhs15m, mhs30m, mhs1h, mhs3h, mhs6h, mhs12h, mhs24h, mhs48h, ratio5m, ratio15m, ratio30m, ratio1h, ratio3h, ratio6h, ratio12h, ratio24h, ratio48h, '%s' FROM %s", tableName, prev.Format("2006-01-02 15:04:05"), curTableName)
|
|
_, err = DbCtx.Db_obj.Exec(copyDataSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("add miners_stats column table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
found := CheckUserMinerFromTable(DbCtx, msg.MinerType+"_"+msg.Msg, msg.User, msg.Miner, msg.Index)
|
|
if found {
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET date = ?, shares5m = ?, shares15m = ?, shares30m = ?, shares1h = ?, shares3h = ?, shares6h = ?, shares12h = ?, shares24h = ?, shares48h = ?, rejects5m = ?, rejects15m = ?, rejects30m = ?, rejects1h = ?, rejects3h = ?, rejects6h = ?, rejects12h = ?, rejects24h = ?, rejects48h = ?, mhs5m = ?, mhs15m = ?, mhs30m = ?, mhs1h = ?, mhs3h = ?, mhs6h = ?, mhs12h = ?, mhs24h = ?, mhs48h = ?, ratio5m = ?, ratio15m = ?, ratio30m = ?, ratio1h = ?, ratio3h = ?, ratio6h = ?, ratio12h = ?, ratio24h = ?, ratio48h = ? WHERE user = ? AND miner = ? AND `refindex` = ?", curTableName)
|
|
count, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, msg.Date.Format("2006-01-02 15:04:05"), msg.Shares5m, msg.Shares15m, msg.Shares30m, msg.Shares1h, msg.Shares3h, msg.Shares6h, msg.Shares12h, msg.Shares24h, msg.Shares48h, msg.Rejects5m, msg.Rejects15m, msg.Rejects30m, msg.Rejects1h, msg.Rejects3h, msg.Rejects6h, msg.Rejects12h, msg.Rejects24h, msg.Rejects48h, msg.Mhs5m, msg.Mhs15m, msg.Mhs30m, msg.Mhs1h, msg.Mhs3h, msg.Mhs6h, msg.Mhs12h, msg.Mhs24h, msg.Mhs48h, msg.Ratio5m, msg.Ratio15m, msg.Ratio30m, msg.Ratio1h, msg.Ratio3h, msg.Ratio6h, msg.Ratio12h, msg.Ratio24h, msg.Ratio48h, msg.User, msg.Miner, msg.Index)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update miners_stats table err", err.Error()))
|
|
//continue
|
|
}
|
|
DbCtx.Db_obj.Logg.Info("[db]", zap.Int64("update miners_stats table count", count), zap.String("update miners table MinerType", msg.MinerType), zap.String("sql", updateSQL))
|
|
} else {
|
|
err := DbCtx.Db_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("insert miners_stats table err", err.Error()))
|
|
}
|
|
}
|
|
} else if DbCtx.Module == "gbt" {
|
|
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
|
|
break
|
|
default:
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("do_handle_miners_stats", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
/*func do_handle_miner(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.Miner_ch
|
|
switch msg.Msg {
|
|
case "miner":
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
if DbCtx.Module == "server" {
|
|
minerTableName := msg.MinerType + "_" + msg.Msg + "_" + msg.User + "_" + msg.Miner + "_" + msg.Index
|
|
table_exist := true
|
|
query := fmt.Sprintf("SHOW TABLES LIKE '%s'", minerTableName)
|
|
var result string
|
|
err := DbCtx.Db_obj.QueryRow(query).Scan(&result)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
table_exist = false
|
|
}
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("check table existence failed:", tableName), zap.String("err", err.Error()))
|
|
table_exist = false
|
|
}
|
|
if !table_exist {
|
|
CreateTable2(DbCtx, msg.Msg, msg.MinerType, minerTableName)
|
|
}
|
|
DbCtx.LastMinerTime = GetLastTimeFromTable(DbCtx, minerTableName)
|
|
|
|
newTableName := minerTableName + "_" + DbCtx.LastMinerTime.Format("20060102")
|
|
//fmt.Printf("do_handle_miner %v,%v,%v", DbCtx.LastMinerTime, DbCtx.LastMinerTime.Format("20060102"), newTableName)
|
|
if msg.Date.Format("2006-01-02") != DbCtx.LastMinerTime.Format("2006-01-02") {
|
|
//DbCtx.LastMinerTime = msg.Date
|
|
renameTableSQL := fmt.Sprintf("RENAME TABLE %s TO %s", minerTableName, newTableName)
|
|
_, err := DbCtx.Db_obj.Exec(renameTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("miner rename ", "failed"), zap.String("err ", err.Error()))
|
|
//continue
|
|
}
|
|
|
|
CreateTable2(DbCtx, msg.Msg, msg.MinerType, minerTableName)
|
|
}
|
|
err = DbCtx.Db_obj.InsertPoolDb2(msg.Msg, msg.MinerType, minerTableName, msg)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("insert miner table err", err.Error()))
|
|
}
|
|
|
|
} else if DbCtx.Module == "gbt" {
|
|
minerTableName := msg.MinerType + "_" + msg.Msg + "_" + msg.User + "_" + msg.Miner + "_" + msg.Index
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `success` = ?, reward = ?, fee = ? WHERE height = ? AND nonce = ?", minerTableName)
|
|
_, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, msg.Success, msg.Reward, msg.Fee, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
log.Printf("[db] update miner table err %s %s", minerTableName, err.Error())
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update miner table err", err.Error()))
|
|
//continue
|
|
}
|
|
//log.Printf("[db] update %s %d %s %d\n", minerTableName, msg.Height, msg.Nonce, msg.Success)
|
|
now := time.Now()
|
|
yesterday := now.AddDate(0, 0, -1)
|
|
yesterdayTableName := minerTableName + "_" + yesterday.Format("20060102")
|
|
if CheckTableIsExist(DbCtx, yesterdayTableName) {
|
|
updateYesterdaySQL := fmt.Sprintf("UPDATE %s SET `success` = ?, reward = ?, fee = ? WHERE height = ? AND nonce = ?", yesterdayTableName)
|
|
_, err = DbCtx.Db_obj.UpdatePoolDb(updateYesterdaySQL, msg.Success, msg.Reward, msg.Fee, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update users table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
break
|
|
default:
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("do_handle_miner", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}*/
|
|
|
|
/*func do_handle_users(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.Users_ch
|
|
switch msg.Msg {
|
|
case "users":
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
curTableName := msg.MinerType + "_" + msg.Msg
|
|
if DbCtx.Module == "server" {
|
|
if msg.Date.Sub(DbCtx.LastUsersTime) >= 300*time.Second {
|
|
|
|
msg.Normal = 0
|
|
msg.Abnormal = 0
|
|
|
|
msg.Offline = 0
|
|
msg.MhsZero = 0
|
|
msg.MhsLow = 0
|
|
msg.HighRejects = 0
|
|
msg.Unstable = 0
|
|
|
|
startTime := time.Now().Add(-48 * time.Hour).Unix()
|
|
minersTable := msg.MinerType + "_" + "miners"
|
|
minersMhsTable := msg.MinerType + "_" + "miners_stats"
|
|
|
|
query := fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE UNIX_TIMESTAMP(date) >= %d AND user = '%s'", minersTable, startTime, msg.User)
|
|
var total_count int64 = 0
|
|
err := DbCtx.Db_obj.QueryRow(query).Scan(&total_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database total_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database total_count:", curTableName+" "+err.Error()))
|
|
}
|
|
//log.Printf("[db] users total_count %d %s\n", total_count, query)
|
|
|
|
//query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'online' AND mhs5m >= 10 AND UNIX_TIMESTAMP(date) >= %d AND user = %s", minersTable, startTime, msg.User)
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s po JOIN %s pm ON po.user = pm.user AND po.miner = pm.miner AND po.refindex = pm.refindex WHERE po.`state` = 'online' AND pm.mhs5m >= 10.0 AND UNIX_TIMESTAMP(po.`date`) >= %d AND po.user = '%s'", minersTable, minersMhsTable, startTime, msg.User)
|
|
var normal_count int64 = 0
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&normal_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database normal_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database normal_count:", curTableName+" "+err.Error()))
|
|
}
|
|
msg.Normal = normal_count
|
|
msg.Abnormal = total_count - normal_count
|
|
//log.Printf("[db] users normal_count %d %s\n", normal_count, query)
|
|
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'offline' AND UNIX_TIMESTAMP(date) >= %d AND user = '%s'", minersTable, startTime, msg.User)
|
|
var offline_count int64 = 0
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&offline_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database offline_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database offline_count:", curTableName+" "+err.Error()))
|
|
}
|
|
msg.Offline = offline_count
|
|
//log.Printf("[db] users offline_count %d %s\n", offline_count, query)
|
|
|
|
//query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'online' AND mhs5m <= 0 AND duration > 300 AND UNIX_TIMESTAMP(date) >= %d AND user = %s", minersTable, startTime, msg.User)
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s po JOIN %s pm ON po.user = pm.user AND po.miner = pm.miner AND po.refindex = pm.refindex WHERE po.`state` = 'online' AND pm.mhs5m <= 0.0 AND po.duration > 300.0 AND UNIX_TIMESTAMP(po.`date`) >= %d AND po.user = '%s'", minersTable, minersMhsTable, startTime, msg.User)
|
|
var mhszero_count int64
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&mhszero_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database mhszero_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database mhszero_count:", curTableName+" "+err.Error()))
|
|
}
|
|
msg.MhsZero = mhszero_count
|
|
//log.Printf("[db] users mhszero_count %d %s\n", mhszero_count, query)
|
|
|
|
//query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'online' AND mhs5m < 10 AND duration > 300 AND UNIX_TIMESTAMP(date) >= %d AND user = '%s'", minersTable, startTime, msg.User)
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s po JOIN %s pm ON po.user = pm.user AND po.miner = pm.miner AND po.refindex = pm.refindex WHERE po.`state` = 'online' AND pm.mhs5m < 10.0 AND po.duration > 300.0 AND UNIX_TIMESTAMP(po.date) >= %d AND po.user = '%s'", minersTable, minersMhsTable, startTime, msg.User)
|
|
var mhslow_count int64
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&mhslow_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database mhslow_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database mhslow_count:", curTableName+" "+err.Error()))
|
|
}
|
|
msg.MhsLow = mhslow_count
|
|
//log.Printf("[db] users mhslow_count %d %s\n", mhslow_count, query)
|
|
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'online' AND ratio > 0.01 AND UNIX_TIMESTAMP(date) >= %d AND user = '%s'", minersTable, startTime, msg.User)
|
|
var highreject_count int64
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&highreject_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database highreject_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database highreject_count:", curTableName+" "+err.Error()))
|
|
}
|
|
msg.HighRejects = highreject_count
|
|
//log.Printf("[db] users highreject_count %d %s\n", highreject_count, query)
|
|
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'online' AND retry > 10 AND UNIX_TIMESTAMP(date) >= %d AND user = '%s'", minersTable, startTime, msg.User)
|
|
var unstable_count int64
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&unstable_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database unstable_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database unstable_count:", curTableName+" "+err.Error()))
|
|
}
|
|
msg.Unstable = unstable_count
|
|
//log.Printf("[db] users unstable_count %d %s\n", unstable_count, query)
|
|
|
|
prev := DbCtx.LastUsersTime
|
|
DbCtx.LastUsersTime = msg.Date
|
|
table_exist := true
|
|
tableName := msg.MinerType + "_" + msg.Msg + "_" + prev.Format("20060102")
|
|
query = fmt.Sprintf("SHOW TABLES LIKE '%s'", tableName)
|
|
var result string
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&result)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
table_exist = false
|
|
}
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("check table existence failed:", tableName), zap.String("err", err.Error()))
|
|
table_exist = false
|
|
}
|
|
if !table_exist {
|
|
createTableSQL := fmt.Sprintf("CREATE TABLE %s LIKE %s", tableName, curTableName)
|
|
_, err = DbCtx.Db_obj.Exec(createTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("create users table err", err.Error()))
|
|
//continue
|
|
}
|
|
alterTableSQL := fmt.Sprintf("ALTER TABLE %s ADD COLUMN save_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP", tableName)
|
|
_, err = DbCtx.Db_obj.Exec(alterTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("add users column table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
copyDataSQL := fmt.Sprintf("INSERT INTO %s (date,user,normal,abnormal,offline,mhszero,mhslow,highreject,unstable,submits,blocks,orphans,orphan_ratio,reward,fee, save_ts) SELECT date,user,normal,abnormal,offline,mhszero,mhslow,highreject,unstable,submits,blocks,orphans,orphan_ratio,reward,fee, '%s' FROM %s", tableName, prev.Format("2006-01-02 15:04:05"), curTableName)
|
|
_, err = DbCtx.Db_obj.Exec(copyDataSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("add users column table err", err.Error()))
|
|
//return
|
|
}
|
|
}
|
|
found := CheckUserFromTable(DbCtx, msg.MinerType+"_"+msg.Msg, msg.User)
|
|
if found {
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET date = ?, normal = ?, abnormal = ?, offline = ?, mhszero = ?, mhslow = ?, highreject = ?, unstable = ?, submits = ?, blocks = ?, orphans = ?, orphan_ratio = ?, reward = ?, fee = ? WHERE user = ?", curTableName)
|
|
count, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, msg.Date.Format("2006-01-02 15:04:05"), msg.Normal, msg.Abnormal, msg.Offline, msg.MhsZero, msg.MhsLow, msg.HighRejects, msg.Unstable, msg.Submits, msg.Blocks, msg.Orphans, msg.Orphan_ratio, msg.Reward, msg.Fee, msg.User)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update users table err", err.Error()))
|
|
//continue
|
|
}
|
|
DbCtx.Db_obj.Logg.Info("[db]", zap.Int64("update users table count", count), zap.String("update miners table MinerType", msg.MinerType), zap.String("sql", updateSQL))
|
|
} else {
|
|
err := DbCtx.Db_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("insert users table err", err.Error()))
|
|
}
|
|
}
|
|
} else if DbCtx.Module == "gbt" {
|
|
curTableName := msg.MinerType + "_" + msg.Msg
|
|
last_blocks := GetLastBlocksFromTable(DbCtx, curTableName, msg.User, "", "")
|
|
if last_blocks >= 0 {
|
|
last_blocks += 1
|
|
UpdateBlocksToTable(DbCtx, curTableName, msg.User, "", "", last_blocks)
|
|
}
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
|
|
break
|
|
default:
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("do_handle_users", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}*/
|
|
|
|
/*func do_handle_users_stats(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.UsersStats_ch
|
|
switch msg.Msg {
|
|
case "users_stats":
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
curTableName := msg.MinerType + "_" + msg.Msg
|
|
if DbCtx.Module == "server" {
|
|
if msg.Date.Sub(DbCtx.LastUsersStatsTime) >= 300*time.Second {
|
|
prev := DbCtx.LastUsersStatsTime
|
|
DbCtx.LastUsersStatsTime = msg.Date
|
|
table_exist := true
|
|
tableName := msg.MinerType + "_" + msg.Msg + "_" + prev.Format("20060102")
|
|
query := fmt.Sprintf("SHOW TABLES LIKE '%s'", tableName)
|
|
var result string
|
|
err := DbCtx.Db_obj.QueryRow(query).Scan(&result)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
table_exist = false
|
|
}
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("check table existence failed:", tableName), zap.String("err", err.Error()))
|
|
table_exist = false
|
|
}
|
|
if !table_exist {
|
|
createTableSQL := fmt.Sprintf("CREATE TABLE %s LIKE %s", tableName, curTableName)
|
|
_, err = DbCtx.Db_obj.Exec(createTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("create users_stats table err", err.Error()))
|
|
//continue
|
|
}
|
|
alterTableSQL := fmt.Sprintf("ALTER TABLE %s ADD COLUMN save_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP", tableName)
|
|
_, err = DbCtx.Db_obj.Exec(alterTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("add users_stats column table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
copyDataSQL := fmt.Sprintf("INSERT INTO %s (date,user,shares5m,shares15m,shares30m,shares1h,shares3h,shares6h,shares12h,shares24h,shares48h,rejects5m,rejects15m,rejects30m,rejects1h,rejects3h,rejects6h,rejects12h,rejects24h,rejects48h,mhs5m,mhs15m,mhs30m,mhs1h,mhs3h,mhs6h,mhs12h,mhs24h,mhs48h,ratio5m,ratio15m,ratio30m,ratio1h,ratio3h,ratio6h,ratio12h,ratio24h,ratio48h,save_ts) SELECT date,user,shares5m,shares15m,shares30m,shares1h,shares3h,shares6h,shares12h,shares24h,shares48h,rejects5m,rejects15m,rejects30m,rejects1h,rejects3h,rejects6h,rejects12h,rejects24h,rejects48h,mhs5m,mhs15m,mhs30m,mhs1h,mhs3h,mhs6h,mhs12h,mhs24h,mhs48h,ratio5m,ratio15m,ratio30m,ratio1h,ratio3h,ratio6h,ratio12h,ratio24h,ratio48h,'%s' FROM %s", tableName, prev.Format("2006-01-02 15:04:05"), curTableName)
|
|
|
|
_, err = DbCtx.Db_obj.Exec(copyDataSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("add users_stats column table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
found := CheckUserFromTable(DbCtx, msg.MinerType+"_"+msg.Msg, msg.User)
|
|
if found {
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET date = ?, shares5m = ?, shares15m = ?, shares30m = ?, shares1h = ?, shares3h = ?, shares6h = ?, shares12h = ?, shares24h = ?, shares48h = ?, rejects5m = ?, rejects15m = ?, rejects30m = ?, rejects1h = ?, rejects3h = ?, rejects6h = ?, rejects12h = ?, rejects24h = ?, rejects48h = ?, mhs5m = ?, mhs15m = ?, mhs30m = ?, mhs1h = ?, mhs3h = ?, mhs6h = ?, mhs12h = ?, mhs24h = ?, mhs48h = ?, ratio5m = ?, ratio15m = ?, ratio30m = ?, ratio1h = ?, ratio3h = ?, ratio6h = ?, ratio12h = ?, ratio24h = ?, ratio48h = ? WHERE user = ?", curTableName)
|
|
count, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, msg.Date.Format("2006-01-02 15:04:05"), msg.Shares5m, msg.Shares15m, msg.Shares30m, msg.Shares1h, msg.Shares3h, msg.Shares6h, msg.Shares12h, msg.Shares24h, msg.Shares48h, msg.Rejects5m, msg.Rejects15m, msg.Rejects30m, msg.Rejects1h, msg.Rejects3h, msg.Rejects6h, msg.Rejects12h, msg.Rejects24h, msg.Rejects48h, msg.Mhs5m, msg.Mhs15m, msg.Mhs30m, msg.Mhs1h, msg.Mhs3h, msg.Mhs6h, msg.Mhs12h, msg.Mhs24h, msg.Mhs48h, msg.Ratio5m, msg.Ratio15m, msg.Ratio30m, msg.Ratio1h, msg.Ratio3h, msg.Ratio6h, msg.Ratio12h, msg.Ratio24h, msg.Ratio48h, msg.User)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update users_stats table err", err.Error()))
|
|
//continue
|
|
}
|
|
DbCtx.Db_obj.Logg.Info("[db]", zap.Int64("update users_stats table count", count), zap.String("update miners table MinerType", msg.MinerType), zap.String("sql", updateSQL))
|
|
} else {
|
|
err := DbCtx.Db_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("insert users_stats table err", err.Error()))
|
|
}
|
|
}
|
|
} else if DbCtx.Module == "gbt" {
|
|
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
|
|
break
|
|
default:
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("do_handle_users", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}*/
|
|
|
|
/*func do_handle_users_blkstats(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.UsersBlkStats_ch
|
|
switch msg.Msg {
|
|
case "users_blkstats":
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
if DbCtx.Module == "server" {
|
|
tableName := msg.MinerType + "_" + msg.Msg
|
|
newTableName := msg.MinerType + "_" + msg.Msg + "_" + DbCtx.LastUsersBlkStatsTime.Format("20060102")
|
|
|
|
if msg.Date.Format("2006-01-02") != DbCtx.LastUsersBlkStatsTime.Format("2006-01-02") {
|
|
DbCtx.LastUsersBlkStatsTime = msg.Date
|
|
renameTableSQL := fmt.Sprintf("RENAME TABLE %s TO %s", tableName, newTableName)
|
|
_, err := DbCtx.Db_obj.Exec(renameTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("users_blkstats rename ", "failed"), zap.String("err ", err.Error()))
|
|
//continue
|
|
}
|
|
|
|
CreateTable(DbCtx, msg.Msg, msg.MinerType)
|
|
}
|
|
err := DbCtx.Db_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("insert users_blkstats table err", err.Error()))
|
|
}
|
|
} else if DbCtx.Module == "gbt" {
|
|
curTableName := msg.MinerType + "_" + msg.Msg
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `success` = ?, reward = ?, fee = ? WHERE height = ? AND nonce = ?", curTableName)
|
|
_, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, msg.Success, msg.Reward, msg.Fee, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update users table err", err.Error()))
|
|
//continue
|
|
}
|
|
now := time.Now()
|
|
yesterday := now.AddDate(0, 0, -1)
|
|
yesterdayTableName := curTableName + "_" + yesterday.Format("20060102")
|
|
if CheckTableIsExist(DbCtx, yesterdayTableName) {
|
|
updateYesterdaySQL := fmt.Sprintf("UPDATE %s SET `success` = ?, reward = ?, fee = ? WHERE height = ? AND nonce = ?", yesterdayTableName)
|
|
_, err = DbCtx.Db_obj.UpdatePoolDb(updateYesterdaySQL, msg.Success, msg.Reward, msg.Fee, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update users table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
|
|
break
|
|
default:
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("do_handle_users_blkstats", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}*/
|
|
|
|
/*func do_handle_pool(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.Pool_ch
|
|
switch msg.Msg {
|
|
case "pool":
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
if DbCtx.Module == "server" {
|
|
tableName := msg.MinerType + "_" + msg.Msg
|
|
|
|
msg.Miners = 0
|
|
msg.Normal = 0
|
|
msg.Abnormal = 0
|
|
|
|
msg.Offline = 0
|
|
msg.MhsZero = 0
|
|
msg.MhsLow = 0
|
|
msg.HighRejects = 0
|
|
msg.Unstable = 0
|
|
|
|
startTime := time.Now().Add(-48 * time.Hour).Unix()
|
|
minersTable := msg.MinerType + "_" + "miners"
|
|
minersMhsTable := msg.MinerType + "_" + "miners_stats"
|
|
|
|
query := fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE UNIX_TIMESTAMP(date) >= %d", minersTable, startTime)
|
|
var total_count int64 = 0
|
|
err := DbCtx.Db_obj.QueryRow(query).Scan(&total_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database total_count: %s %v %s", tableName, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database total_count:", tableName+" "+err.Error()))
|
|
}
|
|
msg.Miners = total_count
|
|
//log.Printf("[db] pool total_count %d %s\n", total_count, query)
|
|
|
|
//query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'online' AND mhs5m >= 10 AND UNIX_TIMESTAMP(date) >= %d", minersTable, startTime)
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s po JOIN %s pm ON po.user = pm.user AND po.miner = pm.miner AND po.refindex = pm.refindex WHERE po.`state` = 'online' AND pm.mhs5m >= 10.0 AND UNIX_TIMESTAMP(po.date) >= %d", minersTable, minersMhsTable, startTime)
|
|
var normal_count int64 = 0
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&normal_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database normal_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database normal_count:", tableName+" "+err.Error()))
|
|
}
|
|
msg.Normal = normal_count
|
|
msg.Abnormal = msg.Miners - normal_count
|
|
|
|
//log.Printf("[db] pool normal_count %d %s\n", normal_count, query)
|
|
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'offline' AND UNIX_TIMESTAMP(date) >= %d", minersTable, startTime)
|
|
var offline_count int64 = 0
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&offline_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database offline_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database offline_count:", tableName+" "+err.Error()))
|
|
}
|
|
msg.Offline = offline_count
|
|
//log.Printf("[db] pool offline_count %d %s\n", offline_count, query)
|
|
|
|
//query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'online' AND mhs5m <= 0 AND duration > 300 AND UNIX_TIMESTAMP(date) >= %d", minersTable, startTime)
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s po JOIN %s pm ON po.user = pm.user AND po.miner = pm.miner AND po.refindex = pm.refindex WHERE po.`state` = 'online' AND pm.mhs5m <= 0.0 AND po.duration > 300.0 AND UNIX_TIMESTAMP(po.date) >= %d", minersTable, minersMhsTable, startTime)
|
|
var mhszero_count int64
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&mhszero_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database mhszero_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database mhszero_count:", tableName+" "+err.Error()))
|
|
}
|
|
msg.MhsZero = mhszero_count
|
|
//log.Printf("[db] pool mhszero_count %d %s\n", mhszero_count, query)
|
|
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s po JOIN %s pm ON po.user = pm.user AND po.miner = pm.miner AND po.refindex = pm.refindex WHERE po.`state` = 'online' AND pm.mhs5m < 10.0 AND po.duration > 300.0 AND UNIX_TIMESTAMP(po.`date`) >= %d", minersTable, minersMhsTable, startTime)
|
|
var mhslow_count int64
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&mhslow_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database mhslow_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database mhslow_count:", tableName+" "+err.Error()))
|
|
}
|
|
msg.MhsLow = mhslow_count
|
|
//log.Printf("[db] pool mhslow_count %d %s\n", mhslow_count, query)
|
|
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'online' AND ratio > 0.01 AND UNIX_TIMESTAMP(date) >= %d", minersTable, startTime)
|
|
var highreject_count int64
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&highreject_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database highreject_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database highreject_count:", tableName+" "+err.Error()))
|
|
}
|
|
msg.HighRejects = highreject_count
|
|
//log.Printf("[db] pool highreject_count %d %s\n", highreject_count, query)
|
|
|
|
query = fmt.Sprintf("SELECT COUNT(*) FROM %s WHERE `state` = 'online' AND retry > 10 AND UNIX_TIMESTAMP(date) >= %d", minersTable, startTime)
|
|
var unstable_count int64
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&unstable_count)
|
|
if err != nil {
|
|
log.Printf("Error querying database unstable_count: %s %v %s", minersTable, err, query)
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Error querying database unstable_count:", tableName+" "+err.Error()))
|
|
}
|
|
msg.Unstable = unstable_count
|
|
//log.Printf("[db] pool unstable_count %d %s\n", unstable_count, query)
|
|
|
|
newTableName := msg.MinerType + "_" + msg.Msg + "_" + DbCtx.LastPoolTime.Format("20060102")
|
|
|
|
if msg.Date.Format("2006-01-02") != DbCtx.LastPoolTime.Format("2006-01-02") {
|
|
DbCtx.LastPoolTime = msg.Date
|
|
renameTableSQL := fmt.Sprintf("RENAME TABLE %s TO %s", tableName, newTableName)
|
|
_, err := DbCtx.Db_obj.Exec(renameTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("pool rename ", "failed"), zap.String("err ", err.Error()))
|
|
//continue
|
|
}
|
|
|
|
CreateTable(DbCtx, msg.Msg, msg.MinerType)
|
|
}
|
|
err = DbCtx.Db_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("insert pool table err", err.Error()))
|
|
}
|
|
|
|
} else if DbCtx.Module == "gbt" {
|
|
curTableName := msg.MinerType + "_" + msg.Msg
|
|
last_blocks := GetLastBlocksFromTable(DbCtx, curTableName, "", "", "")
|
|
if last_blocks >= 0 {
|
|
last_blocks += 1
|
|
UpdateBlocksToTable(DbCtx, curTableName, "", "", "", last_blocks)
|
|
}
|
|
last_reward, last_fee := GetLastRewardFromTable(DbCtx, curTableName, "", "", "")
|
|
if last_reward >= 0 {
|
|
last_reward += msg.Reward
|
|
last_fee += msg.Fee
|
|
UpdateRewardToTable(DbCtx, curTableName, last_reward, last_fee)
|
|
}
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
|
|
break
|
|
default:
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("do_handle_pool", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}*/
|
|
|
|
/*func do_handle_pool_stats(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.PoolStats_ch
|
|
switch msg.Msg {
|
|
case "pool_stats":
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
if DbCtx.Module == "server" {
|
|
tableName := msg.MinerType + "_" + msg.Msg
|
|
newTableName := msg.MinerType + "_" + msg.Msg + "_" + DbCtx.LastPoolStatsTime.Format("20060102")
|
|
|
|
if msg.Date.Format("2006-01-02") != DbCtx.LastPoolStatsTime.Format("2006-01-02") {
|
|
DbCtx.LastPoolStatsTime = msg.Date
|
|
renameTableSQL := fmt.Sprintf("RENAME TABLE %s TO %s", tableName, newTableName)
|
|
_, err := DbCtx.Db_obj.Exec(renameTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("pool_stats rename ", "failed"), zap.String("err ", err.Error()))
|
|
//continue
|
|
}
|
|
|
|
CreateTable(DbCtx, msg.Msg, msg.MinerType)
|
|
}
|
|
err := DbCtx.Db_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("insert pool_stats table err", err.Error()))
|
|
}
|
|
|
|
} else if DbCtx.Module == "gbt" {
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
break
|
|
default:
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("do_handle_pool_stats", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}*/
|
|
|
|
func do_handle_pool_blkstats(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.PoolBlkStats_ch
|
|
switch msg.Msg {
|
|
case "pool_blkstats":
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
if DbCtx.Module == "server" {
|
|
tableName := msg.MinerType + "_" + msg.Msg
|
|
newTableName := msg.MinerType + "_" + msg.Msg + "_" + DbCtx.LastPoolBlkStatsTime.Format("20060102")
|
|
|
|
if msg.Date.Format("2006-01-02") != DbCtx.LastPoolBlkStatsTime.Format("2006-01-02") {
|
|
DbCtx.LastPoolBlkStatsTime = msg.Date
|
|
renameTableSQL := fmt.Sprintf("RENAME TABLE %s TO %s", tableName, newTableName)
|
|
_, err := DbCtx.Db_obj.Exec(renameTableSQL)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("pool_blkstats rename ", "failed"), zap.String("err ", err.Error()))
|
|
//continue
|
|
}
|
|
|
|
CreateTable(DbCtx, msg.Msg, msg.MinerType)
|
|
}
|
|
err := DbCtx.Db_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("insert pool_blkstats table err", err.Error()))
|
|
}
|
|
|
|
} else if DbCtx.Module == "gbt" {
|
|
curTableName := msg.MinerType + "_" + msg.Msg
|
|
|
|
if msg.Submit == "" {
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `success` = ?, reward = ?, fee = ? WHERE height = ? AND nonce = ?", curTableName)
|
|
_, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, msg.Success, msg.Reward, msg.Fee, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update pool_blkstats table err", err.Error()))
|
|
//continue
|
|
}
|
|
} else {
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `submit` = ? WHERE height = ? AND nonce = ?", curTableName)
|
|
_, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, msg.Submit, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update pool_blkstats table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
|
|
now := time.Now()
|
|
yesterday := now.AddDate(0, 0, -1)
|
|
yesterdayTableName := curTableName + "_" + yesterday.Format("20060102")
|
|
if CheckTableIsExist(DbCtx, yesterdayTableName) {
|
|
if msg.Submit == "" {
|
|
updateYesterdaySQL := fmt.Sprintf("UPDATE %s SET `success` = ?, reward = ?, fee = ? WHERE height = ? AND nonce = ?", yesterdayTableName)
|
|
_, err := DbCtx.Db_obj.UpdatePoolDb(updateYesterdaySQL, msg.Success, msg.Reward, msg.Fee, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update pool_blkstats table err", err.Error()))
|
|
//continue
|
|
}
|
|
} else {
|
|
updateYesterdaySQL := fmt.Sprintf("UPDATE %s SET `submit` = ? WHERE height = ? AND nonce = ?", yesterdayTableName)
|
|
_, err := DbCtx.Db_obj.UpdatePoolDb(updateYesterdaySQL, msg.Submit, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update pool_blkstats table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
}
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
|
|
break
|
|
default:
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("do_handle_pool_blkstats", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func do_handle_blk_detail(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.BlkDetail_ch
|
|
switch msg.Msg {
|
|
case "blk_detail":
|
|
ret := CheckSharesDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
if DbCtx.Module == "server" {
|
|
tableName := msg.MinerType + "_" + msg.Msg
|
|
newTableName := msg.MinerType + "_block_detail" + "_" + fmt.Sprint(DbCtx.LastBlockDetailHeight) + "_" + fmt.Sprint(msg.Height-1)
|
|
|
|
if DbCtx.LastBlockDetailHeight > 0 {
|
|
|
|
if msg.Height-DbCtx.LastBlockDetailHeight > 100 {
|
|
var heightMsg BlkHeightDetail_db_msg
|
|
heightMsg.From = DbCtx.LastBlockDetailHeight
|
|
|
|
DbCtx.LastBlockDetailHeight = msg.Height
|
|
log.Println("do_handle_blk_detail", tableName, newTableName)
|
|
renameTableSQL := fmt.Sprintf("RENAME TABLE %s TO %s", tableName, newTableName)
|
|
_, err := DbCtx.Shares_obj.Exec(renameTableSQL)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Warn("[db]", zap.String("pool_detail rename ", "failed"), zap.String("err ", err.Error()))
|
|
//continue
|
|
}
|
|
|
|
CreateTable(DbCtx, msg.Msg, msg.MinerType)
|
|
|
|
heightMsg.Id = 0
|
|
heightMsg.To = msg.Height
|
|
heightMsg.MinerType = msg.MinerType
|
|
heightMsg.Date = msg.Date
|
|
heightMsg.Msg = "blk_height_detail"
|
|
err = DbCtx.Shares_obj.InsertPoolDb(heightMsg.Msg, heightMsg.MinerType, heightMsg)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("insert pool_height_detail table err", err.Error()))
|
|
}
|
|
}
|
|
}
|
|
err := DbCtx.Shares_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("insert pool_detail table err", err.Error()))
|
|
}
|
|
} else if DbCtx.Module == "gbt" {
|
|
curTableName := msg.MinerType + "_" + msg.Msg
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `success` = ? WHERE height = ? AND nonce = ?", curTableName)
|
|
_, err := DbCtx.Shares_obj.UpdatePoolDb(updateSQL, msg.Success, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("update users table err", err.Error()))
|
|
//continue
|
|
}
|
|
from, to := CheckHeightRangeFromTable(DbCtx, msg.MinerType+"_"+"blk_height_detail", msg.Height)
|
|
if (from > 0) && (to > 0) {
|
|
oldTableName := curTableName + "_" + fmt.Sprint(from) + "_" + fmt.Sprint(to)
|
|
if CheckTableIsExist(DbCtx, oldTableName) {
|
|
updateOldSQL := fmt.Sprintf("UPDATE %s SET `success` = ? WHERE height = ? AND nonce = ?", oldTableName)
|
|
_, err := DbCtx.Shares_obj.UpdatePoolDb(updateOldSQL, msg.Success, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("update users table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
}
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
|
|
break
|
|
default:
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("do_handle_blk_detail", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func Save_blk_detail(DbCtx *DbContext, msg *BlkDetail_db_msg) {
|
|
switch msg.Msg {
|
|
case "blk_detail":
|
|
ret := CheckSharesDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
//continue
|
|
break
|
|
}
|
|
if DbCtx.Module == "server" {
|
|
tableName := msg.MinerType + "_" + msg.Msg
|
|
newTableName := msg.MinerType + "_block_detail" + "_" + fmt.Sprint(DbCtx.LastBlockDetailHeight) + "_" + fmt.Sprint(msg.Height-1)
|
|
|
|
if DbCtx.LastBlockDetailHeight > 0 {
|
|
|
|
if msg.Height-DbCtx.LastBlockDetailHeight > 100 {
|
|
var heightMsg BlkHeightDetail_db_msg
|
|
heightMsg.From = DbCtx.LastBlockDetailHeight
|
|
|
|
DbCtx.LastBlockDetailHeight = msg.Height
|
|
log.Println("do_handle_blk_detail", tableName, newTableName)
|
|
renameTableSQL := fmt.Sprintf("RENAME TABLE %s TO %s", tableName, newTableName)
|
|
_, err := DbCtx.Shares_obj.Exec(renameTableSQL)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Warn("[db]", zap.String("pool_detail rename ", "failed"), zap.String("err ", err.Error()))
|
|
//continue
|
|
}
|
|
|
|
CreateTable(DbCtx, msg.Msg, msg.MinerType)
|
|
|
|
heightMsg.Id = 0
|
|
heightMsg.To = msg.Height
|
|
heightMsg.MinerType = msg.MinerType
|
|
heightMsg.Date = msg.Date
|
|
heightMsg.Msg = "blk_height_detail"
|
|
err = DbCtx.Shares_obj.InsertPoolDb(heightMsg.Msg, heightMsg.MinerType, heightMsg)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("insert pool_height_detail table err", err.Error()))
|
|
}
|
|
}
|
|
}
|
|
err := DbCtx.Shares_obj.InsertPoolDb(msg.Msg, msg.MinerType, *msg)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("insert pool_detail table err", err.Error()))
|
|
}
|
|
} else if DbCtx.Module == "gbt" {
|
|
curTableName := msg.MinerType + "_" + msg.Msg
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `success` = ? WHERE height = ? AND nonce = ?", curTableName)
|
|
_, err := DbCtx.Shares_obj.UpdatePoolDb(updateSQL, msg.Success, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("update users table err", err.Error()))
|
|
//continue
|
|
}
|
|
from, to := CheckHeightRangeFromTable(DbCtx, msg.MinerType+"_"+"blk_height_detail", msg.Height)
|
|
if (from > 0) && (to > 0) {
|
|
oldTableName := curTableName + "_" + fmt.Sprint(from) + "_" + fmt.Sprint(to)
|
|
if CheckTableIsExist(DbCtx, oldTableName) {
|
|
updateOldSQL := fmt.Sprintf("UPDATE %s SET `success` = ? WHERE height = ? AND nonce = ?", oldTableName)
|
|
_, err := DbCtx.Shares_obj.UpdatePoolDb(updateOldSQL, msg.Success, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("update users table err", err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
}
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
|
|
break
|
|
default:
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("save_blk_detail", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
|
|
func do_handle_blk_new(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.BlkNew_ch
|
|
switch msg.Msg {
|
|
case "blk_new":
|
|
ret := CheckSharesDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
if DbCtx.Module == "server" {
|
|
/*tableName := msg.MinerType + "_" + msg.Msg
|
|
newTableName := msg.MinerType + "_" + msg.Msg + "_" + DbCtx.LastBlockNewTime.Format("20060102")
|
|
|
|
if msg.Date.Format("2006-01-02") != DbCtx.LastBlockNewTime.Format("2006-01-02") {
|
|
DbCtx.LastBlockNewTime = msg.Date
|
|
renameTableSQL := fmt.Sprintf("RENAME TABLE %s TO %s", tableName, newTableName)
|
|
_, err := DbCtx.Shares_obj.Exec(renameTableSQL)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Warn("[db]", zap.String("block_new rename ", "failed"), zap.String("err ", err.Error()))
|
|
//continue
|
|
}
|
|
|
|
CreateTable(DbCtx, msg.Msg, msg.MinerType)
|
|
}*/
|
|
/*err := DbCtx.Shares_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("insert pool_blknew table err", err.Error()))
|
|
}*/
|
|
} else if DbCtx.Module == "gbt" {
|
|
/*tableName := msg.MinerType + "_" + msg.Msg
|
|
newTableName := msg.MinerType + "_" + msg.Msg + "_" + DbCtx.LastBlockNewTime.Format("20060102")
|
|
|
|
if msg.Date.Format("2006-01-02") != DbCtx.LastBlockNewTime.Format("2006-01-02") {
|
|
DbCtx.LastBlockNewTime = msg.Date
|
|
renameTableSQL := fmt.Sprintf("RENAME TABLE %s TO %s", tableName, newTableName)
|
|
_, err := DbCtx.Shares_obj.Exec(renameTableSQL)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Warn("[db]", zap.String("block_new rename ", "failed"), zap.String("err ", err.Error()))
|
|
//continue
|
|
}
|
|
|
|
CreateTable(DbCtx, msg.Msg, msg.MinerType)
|
|
}*/
|
|
err := DbCtx.Shares_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("insert pool_blknew table err", err.Error()))
|
|
}
|
|
/*curTableName := msg.MinerType + "_" + msg.Msg
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `success` = ? WHERE height = ? AND nonce = ?", curTableName)
|
|
_, err := DbCtx.Shares_obj.UpdatePoolDb(updateSQL, msg.Success, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("update users table err", err.Error()))
|
|
//continue
|
|
}
|
|
|
|
now := time.Now()
|
|
yesterday := now.AddDate(0, 0, -1)
|
|
yesterdayTableName := curTableName + "_" + yesterday.Format("20060102")
|
|
updateYesterdaySQL := fmt.Sprintf("UPDATE %s SET `success` = ? WHERE height = ? AND nonce = ?", yesterdayTableName)
|
|
_, err = DbCtx.Shares_obj.UpdatePoolDb(updateYesterdaySQL, msg.Success, msg.Height, msg.Nonce)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("update users table err", err.Error()))
|
|
//continue
|
|
}*/
|
|
} else if DbCtx.Module == "block" {
|
|
} else {
|
|
}
|
|
break
|
|
default:
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("do_handle_blk_new", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func do_handle_address(DbCtx *DbContext) {
|
|
for {
|
|
if DbCtx.DbExit {
|
|
return
|
|
}
|
|
msg := <-DbCtx.Address_ch
|
|
switch msg.Msg {
|
|
case "address":
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
continue
|
|
}
|
|
if DbCtx.Module == "server" {
|
|
err := DbCtx.Db_obj.InsertPoolDb(msg.Msg, msg.MinerType, msg)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("insert address table err", err.Error()))
|
|
}
|
|
} else if DbCtx.Module == "gbt" {
|
|
|
|
} else if DbCtx.Module == "block" {
|
|
}
|
|
break
|
|
default:
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("do_handle_address", "unkown msg "+msg.Msg))
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func GetAddressFromTable(DbCtx *DbContext) []string {
|
|
var addresses []string
|
|
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
return addresses
|
|
}
|
|
query := "SELECT addr, alias, valid FROM " + DbCtx.Coin + "_address"
|
|
rows, err := DbCtx.Db_obj.Query(query)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("query address from Pool db ", err.Error()))
|
|
return addresses
|
|
}
|
|
defer rows.Close()
|
|
|
|
for rows.Next() {
|
|
var addr string
|
|
var alias string
|
|
var valid int = 0
|
|
// 将每一行的字段值扫描到结构体中
|
|
err := rows.Scan(&addr, &alias, &valid)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("scan address from Pool db ", err.Error()))
|
|
continue
|
|
}
|
|
|
|
hash := md5.Sum([]byte(addr + "m2pool_alias"))
|
|
hashString := hex.EncodeToString(hash[:])
|
|
if hashString == alias {
|
|
addresses = append(addresses, addr)
|
|
}
|
|
}
|
|
return addresses
|
|
}
|
|
|
|
/*func UpdateBlocksToTable(DbCtx *DbContext, tableName string, user string, miner string, minerid string, update_blocks int64) {
|
|
if len(miner) > 0 {
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `blocks` = ? WHERE user = ? AND miner = ? AND refindex = ?", tableName)
|
|
_, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, update_blocks, user, miner, minerid)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update table err", tableName+" "+err.Error()))
|
|
//continue
|
|
}
|
|
} else if len(user) > 0 {
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `blocks` = ? WHERE user = ?", tableName)
|
|
_, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, update_blocks, user)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update table err", tableName+" "+err.Error()))
|
|
//continue
|
|
}
|
|
} else {
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `blocks` = ?", tableName)
|
|
_, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, update_blocks)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update table err", tableName+" "+err.Error()))
|
|
//continue
|
|
}
|
|
}
|
|
}*/
|
|
|
|
/*func GetLastBlocksFromTable(DbCtx *DbContext, tableName string, user string, miner string, minerid string) int64 {
|
|
var last_blocks int64 = -1
|
|
query := fmt.Sprintf("SELECT blocks FROM %s", tableName)
|
|
if len(miner) > 0 {
|
|
query = fmt.Sprintf("SELECT blocks FROM %s WHERE user = '%s' AND miner = '%s' AND refindex = '%s'", tableName, user, miner, minerid)
|
|
} else if len(user) > 0 {
|
|
query = fmt.Sprintf("SELECT blocks FROM %s WHERE user = '%s'", tableName, user)
|
|
} else {
|
|
}
|
|
err := DbCtx.Db_obj.QueryRow(query).Scan(&last_blocks)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("get blocks failed:", tableName), zap.String("err", err.Error()))
|
|
}
|
|
|
|
return last_blocks
|
|
}*/
|
|
/*
|
|
func UpdateRewardToTable(DbCtx *DbContext, tableName string, reward float64, fee float64) {
|
|
updateSQL := fmt.Sprintf("UPDATE %s SET `reward` = ?, `fee` = ?", tableName)
|
|
|
|
_, err := DbCtx.Db_obj.UpdatePoolDb(updateSQL, reward, fee)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("update table err", tableName+" "+err.Error()))
|
|
}
|
|
}*/
|
|
/*
|
|
func GetLastRewardFromTable(DbCtx *DbContext, tableName string, user string, miner string, minerid string) (float64, float64) {
|
|
var last_reward float64 = -1
|
|
var last_fee float64 = -1
|
|
query := fmt.Sprintf("SELECT reward,fee FROM %s", tableName)
|
|
err := DbCtx.Db_obj.QueryRow(query).Scan(&last_reward, &last_fee)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("get blocks failed:", tableName), zap.String("err", err.Error()))
|
|
}
|
|
|
|
return last_reward, last_fee
|
|
}*/
|
|
|
|
func GetLastTimeFromTable(DbCtx *DbContext, tableName string) time.Time {
|
|
var last_time time.Time
|
|
|
|
if !CheckTableIsExist(DbCtx, tableName) {
|
|
last_time = time.Now()
|
|
return last_time
|
|
}
|
|
|
|
var last_time_str sql.NullString
|
|
|
|
query := fmt.Sprintf("SELECT DATE_FORMAT(date, '%%Y-%%m-%%d %%H:%%i:%%S') AS last_time FROM %s ORDER BY id DESC LIMIT 1", tableName)
|
|
|
|
var err error
|
|
if strings.Contains(tableName, "blk_new") || strings.Contains(tableName, "blk_detail") || strings.Contains(tableName, "blk_height_detail") || strings.Contains(tableName, "block_detail") {
|
|
err = DbCtx.Shares_obj.QueryRow(query).Scan(&last_time_str)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Warn("[db]", zap.String("get failed:", tableName), zap.String("err", err.Error()))
|
|
last_time = time.Now()
|
|
}
|
|
} else {
|
|
err = DbCtx.Db_obj.QueryRow(query).Scan(&last_time_str)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("get failed:", tableName), zap.String("err", err.Error()))
|
|
last_time = time.Now()
|
|
}
|
|
}
|
|
|
|
if last_time_str.Valid {
|
|
last_time, err = time.Parse("2006-01-02 15:04:05", last_time_str.String)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("parse datetime error", err.Error()))
|
|
last_time = time.Now()
|
|
}
|
|
}
|
|
|
|
return last_time
|
|
}
|
|
|
|
/*func GetLastTimeFromTable(DbCtx *DbContext, tableName string) time.Time {
|
|
var last_time time.Time
|
|
var last_time_str sql.NullString
|
|
read_ok := false
|
|
query := fmt.Sprintf("SELECT DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s') FROM %s ORDER BY id DESC LIMIT 1", tableName)
|
|
if strings.Contains(tableName, "blk_new") || strings.Contains(tableName, "blk_detail") {
|
|
err := DbCtx.Shares_obj.QueryRow(query).Scan(&last_time_str)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Warn("[db]", zap.String("get failed:", tableName), zap.String("err ", err.Error()))
|
|
last_time = time.Now()
|
|
}
|
|
} else {
|
|
err := DbCtx.Db_obj.QueryRow(query).Scan(&last_time_str)
|
|
if err != nil {
|
|
DbCtx.Db_obj.Logg.Warn("[db]", zap.String("get failed:", tableName), zap.String("err ", err.Error()))
|
|
last_time = time.Now()
|
|
}
|
|
}
|
|
if read_ok {
|
|
mysqlDateTimeFormat := "2006-01-02 15:04:05"
|
|
last_time, _ = time.Parse(mysqlDateTimeFormat, datetimeStr)
|
|
|
|
}
|
|
return last_time
|
|
}*/
|
|
|
|
func GetLastHeightFromTable(DbCtx *DbContext, tableName string) int64 {
|
|
var last_height int64
|
|
query := fmt.Sprintf("SELECT height FROM %s ORDER BY id DESC LIMIT 1", tableName)
|
|
err := DbCtx.Shares_obj.QueryRow(query).Scan(&last_height)
|
|
if err != nil {
|
|
DbCtx.Shares_obj.Logg.Warn("[db]", zap.String("get failed:", tableName), zap.String("err ", err.Error()))
|
|
last_height = -1
|
|
}
|
|
return last_height
|
|
}
|
|
|
|
func InitDbData(DbCtx *DbContext, Module string) {
|
|
ret := CheckPoolDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
}
|
|
ret = CheckSharesDbAlive(DbCtx)
|
|
if ret != 0 {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("Pool db ", "disconnected"))
|
|
}
|
|
if Module == "server" {
|
|
DbCtx.LastMinersTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"miners")
|
|
DbCtx.LastMinersStatsTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"miners_stats")
|
|
//DbCtx.LastMinerTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"miner")
|
|
/*DbCtx.LastUsersTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"users")
|
|
DbCtx.LastUsersStatsTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"users_stats")
|
|
DbCtx.LastUsersBlkStatsTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"users_blkstats")
|
|
DbCtx.LastPoolTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"pool")
|
|
DbCtx.LastPoolStatsTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"pool_stats")*/
|
|
DbCtx.LastPoolBlkStatsTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"pool_blkstats")
|
|
DbCtx.LastBlockDetailHeight = GetLastHeightFromTable(DbCtx, DbCtx.Coin+"_"+"blk_detail")
|
|
DbCtx.LastBlockNewTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"blk_new")
|
|
DbCtx.LastAddressTime = GetLastTimeFromTable(DbCtx, DbCtx.Coin+"_"+"address")
|
|
}
|
|
}
|
|
|
|
func InitDb(Coin string, Module string) *DbContext {
|
|
DbCtx.AppExit = make(chan bool, 256)
|
|
|
|
DbCtx.Miners_ch = make(chan Miners_db_msg, 32768)
|
|
DbCtx.MinersStats_ch = make(chan MinersStats_db_msg, 32768)
|
|
/*DbCtx.Miner_ch = make(chan Miner_db_msg, 32768)
|
|
|
|
DbCtx.Users_ch = make(chan Users_db_msg, 32768)
|
|
DbCtx.UsersStats_ch = make(chan UsersStats_db_msg, 32768)
|
|
DbCtx.UsersBlkStats_ch = make(chan UsersBlkStats_db_msg, 32768)
|
|
|
|
DbCtx.Pool_ch = make(chan Pool_db_msg, 32768)
|
|
DbCtx.PoolStats_ch = make(chan PoolStats_db_msg, 32768)*/
|
|
DbCtx.PoolBlkStats_ch = make(chan PoolBlkStats_db_msg, 32768)
|
|
|
|
DbCtx.BlkDetail_ch = make(chan BlkDetail_db_msg, 32768)
|
|
DbCtx.BlkNew_ch = make(chan BlkNew_db_msg, 32768)
|
|
|
|
DbCtx.Address_ch = make(chan Address_db_msg, 16)
|
|
|
|
DbCtx.Module = Module
|
|
DbCtx.Coin = Coin
|
|
|
|
InitConfig(&(DbCtx.DbCfg))
|
|
l, r, e := utility.InitLogg(&(DbCtx.DbCfg.Zaplog), &(DbCtx.DbCfg.Logrotae), Coin, "db")
|
|
if e != nil {
|
|
log.Fatalln("[db]", e)
|
|
return nil
|
|
}
|
|
DbCtx.LogR = r
|
|
|
|
var result int = 0
|
|
result, err := createdb(&DbCtx)
|
|
if result != 0 || err != nil {
|
|
DbCtx.Db_obj.Logg.Info("[db]", zap.String("create db failed: ", err.Error()))
|
|
return nil
|
|
}
|
|
|
|
DbCtx.Db_obj.Logg = l
|
|
DbCtx.Shares_obj.Logg = l
|
|
|
|
InitDbData(&DbCtx, Module)
|
|
|
|
go do_handle_miners(&DbCtx)
|
|
go do_handle_miners_stats(&DbCtx)
|
|
/*go do_handle_miner(&DbCtx)
|
|
go do_handle_users(&DbCtx)
|
|
go do_handle_users_stats(&DbCtx)
|
|
go do_handle_users_blkstats(&DbCtx)
|
|
go do_handle_pool(&DbCtx)
|
|
go do_handle_pool_stats(&DbCtx)*/
|
|
go do_handle_pool_blkstats(&DbCtx)
|
|
go do_handle_blk_detail(&DbCtx)
|
|
go do_handle_blk_new(&DbCtx)
|
|
go do_handle_address(&DbCtx)
|
|
|
|
if Module == "server" {
|
|
} else if Module == "block" {
|
|
} else if Module == "gbt" {
|
|
} else if Module == "job" {
|
|
} else {
|
|
}
|
|
|
|
return &DbCtx
|
|
}
|
|
|
|
func StopDb(coin string, App string) {
|
|
DbCtx.DbExit = true
|
|
defer close(DbCtx.Miners_ch)
|
|
/*defer close(DbCtx.MinersStats_ch)
|
|
defer close(DbCtx.Miner_ch)
|
|
defer close(DbCtx.Users_ch)
|
|
defer close(DbCtx.UsersStats_ch)
|
|
defer close(DbCtx.UsersBlkStats_ch)
|
|
defer close(DbCtx.Pool_ch)
|
|
defer close(DbCtx.PoolStats_ch)*/
|
|
defer close(DbCtx.PoolBlkStats_ch)
|
|
defer close(DbCtx.BlkDetail_ch)
|
|
defer close(DbCtx.BlkNew_ch)
|
|
defer close(DbCtx.Address_ch)
|
|
defer DbCtx.Db_obj.Logg.Sync()
|
|
DbCtx.Db_obj.ClosePoolDb()
|
|
DbCtx.Shares_obj.ClosePoolDb()
|
|
}
|
|
|
|
func (this *PoolDb) PingPoolDb(DbCtx *DbContext) int {
|
|
for i := 0; i < 3; i++ {
|
|
err := this.Ping()
|
|
if err != nil {
|
|
if DbCtx.DbExit {
|
|
return -1
|
|
}
|
|
time.Sleep(200 * time.Millisecond)
|
|
continue
|
|
}
|
|
return 0
|
|
}
|
|
return -1
|
|
}
|
|
|
|
func CheckPoolDbAlive(DbCtx *DbContext) int {
|
|
//ping
|
|
ret := DbCtx.Db_obj.PingPoolDb(DbCtx)
|
|
if ret != 0 {
|
|
backup_l := DbCtx.Db_obj.Logg
|
|
DbCtx.Db_obj.ClosePoolDb()
|
|
//reconnect
|
|
db_obj, err := OpenPoolDb("mysql", dbconnstr)
|
|
if err != nil {
|
|
backup_l.Info("[db]", zap.String("reconnect db err", err.Error()))
|
|
//log.Println("[db]reconnect db err", err.Error())
|
|
return -1
|
|
}
|
|
DbCtx.Db_obj = db_obj
|
|
DbCtx.Db_obj.Logg = backup_l
|
|
|
|
//ping
|
|
if DbCtx.Db_obj.PingPoolDb(DbCtx) != 0 {
|
|
DbCtx.Db_obj.Logg.Error("[db]", zap.String("reconnect ping db", "failed"))
|
|
DbCtx.Db_obj.ClosePoolDb()
|
|
return -1
|
|
}
|
|
DbCtx.Db_obj.Logg.Info("[db]", zap.String("reconnect db sucess", dbconnstr))
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func CheckSharesDbAlive(DbCtx *DbContext) int {
|
|
//ping
|
|
ret := DbCtx.Shares_obj.PingPoolDb(DbCtx)
|
|
if ret != 0 {
|
|
backup_l := DbCtx.Shares_obj.Logg
|
|
DbCtx.Shares_obj.ClosePoolDb()
|
|
//reconnect
|
|
db_obj, err := OpenPoolDb("mysql", sharesdbconnstr)
|
|
if err != nil {
|
|
backup_l.Info("[db]", zap.String("reconnect db err", err.Error()))
|
|
//log.Println("[db]reconnect db err", err.Error())
|
|
return -1
|
|
}
|
|
DbCtx.Shares_obj = db_obj
|
|
DbCtx.Shares_obj.Logg = backup_l
|
|
|
|
//ping
|
|
if DbCtx.Shares_obj.PingPoolDb(DbCtx) != 0 {
|
|
DbCtx.Shares_obj.Logg.Error("[db]", zap.String("reconnect ping db", "failed"))
|
|
DbCtx.Shares_obj.ClosePoolDb()
|
|
return -1
|
|
}
|
|
DbCtx.Shares_obj.Logg.Info("[db]", zap.String("reconnect db sucess", sharesdbconnstr))
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func CheckUserIsPermitted(User string) bool {
|
|
//DbCtx.Db_obj.Logg.Info("[db]", zap.Any("CheckUserIsPermitted", User))
|
|
//return true
|
|
|
|
url := "https://m2pool.com/api/pool/checkAccount"
|
|
data := map[string]string{
|
|
"coin": "alph",
|
|
"ma": User,
|
|
}
|
|
//log.Println("CheckUserIsPermitted user =", User, data)
|
|
jsonData, err := json.Marshal(data)
|
|
if err != nil {
|
|
log.Println("Error marshalling JSON:", err)
|
|
return false
|
|
}
|
|
|
|
tr := &http.Transport{
|
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
|
}
|
|
client := &http.Client{Transport: tr}
|
|
|
|
resp, err := client.Post(url, "application/json", bytes.NewBuffer(jsonData))
|
|
if err != nil {
|
|
log.Println("Error making POST request:", err)
|
|
return false
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
|
|
if resp.StatusCode == http.StatusOK {
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
log.Println("Error reading response body:", err)
|
|
return false
|
|
}
|
|
log.Println("CheckUserIsPermitted", string(body))
|
|
if string(body) == "true" {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|