m2pool_core/internal/db/db.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
}