本文整理匯總了Golang中github.com/c-darwin/dcoin-go/packages/utils.IntToStr函數的典型用法代碼示例。如果您正苦於以下問題:Golang IntToStr函數的具體用法?Golang IntToStr怎麽用?Golang IntToStr使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了IntToStr函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: MoneyBackRequestFront
func (p *Parser) MoneyBackRequestFront() error {
err := p.generalCheck()
if err != nil {
return p.ErrInfo(err)
}
verifyData := map[string]string{"order_id": "bigint", "seller_enc_text": "comment", "arbitrator0_enc_text": "comment", "arbitrator1_enc_text": "comment", "arbitrator2_enc_text": "comment", "arbitrator3_enc_text": "comment", "arbitrator4_enc_text": "comment"}
err = p.CheckInputData(verifyData)
if err != nil {
return p.ErrInfo(err)
}
var txTime int64
if p.BlockData != nil { // тр-ия пришла в блоке
txTime = p.BlockData.Time
} else { // голая тр-ия
txTime = time.Now().Unix() - 30 // просто на всякий случай небольшой запас
}
// проверим, есть ли такой ордер, не был ли ранее запрос, точно ли покупатель наш юзер
orderId, err := p.Single("SELECT id FROM orders WHERE id = ? AND status = 'normal' AND end_time > ? AND buyer = ?", p.TxMaps.Int64["order_id"], txTime, p.TxUserID).Int64()
if err != nil {
return p.ErrInfo(err)
}
if orderId == 0 {
return p.ErrInfo("orderId==0")
}
forSign := ""
if p.BlockData != nil && p.BlockData.BlockId < 197115 {
forSign = fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s", p.TxMap["type"], p.TxMap["time"], p.TxMap["user_id"], p.TxMap["order_id"], p.TxMap["arbitrator0_enc_text"], p.TxMap["arbitrator1_enc_text"], p.TxMap["arbitrator2_enc_text"], p.TxMap["arbitrator3_enc_text"], p.TxMap["arbitrator4_enc_text"], p.TxMap["seller_enc_text"])
} else {
encData := make(map[string]string)
for i := 0; i < 5; i++ {
iStr := utils.IntToStr(i)
encData["arbitrator"+iStr+"_enc_text"] = string(utils.BinToHex(p.TxMap["arbitrator"+iStr+"_enc_text"]))
if encData["arbitrator"+iStr+"_enc_text"] == "00" {
encData["arbitrator"+iStr+"_enc_text"] = "0"
}
}
forSign = fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s", p.TxMap["type"], p.TxMap["time"], p.TxMap["user_id"], p.TxMap["order_id"], encData["arbitrator0_enc_text"], encData["arbitrator1_enc_text"], encData["arbitrator2_enc_text"], encData["arbitrator3_enc_text"], encData["arbitrator4_enc_text"], utils.BinToHex(p.TxMap["seller_enc_text"]))
}
CheckSignResult, err := utils.CheckSign(p.PublicKeys, forSign, p.TxMap["sign"], false)
if err != nil {
return p.ErrInfo(err)
}
if !CheckSignResult {
return p.ErrInfo("incorrect sign")
}
err = p.limitRequest(consts.LIMIT_MONEY_BACK_REQUEST, "money_back_request", consts.LIMIT_MONEY_BACK_REQUEST_PERIOD)
if err != nil {
return p.ErrInfo(err)
}
return nil
}
示例2: EDataBaseDump
func (c *Controller) EDataBaseDump() (string, error) {
if !c.NodeAdmin || c.SessRestricted != 0 {
return "", utils.ErrInfo(errors.New("Permission denied"))
}
allTables, err := c.GetAllTables()
if err != nil {
return "", utils.ErrInfo(err)
}
c.r.ParseForm()
mainMap := make(map[string][]map[string]string)
for _, table := range allTables {
re := regexp.MustCompile("^e_")
match := re.FindStringSubmatch(table)
if len(match) > 0 {
data, err := c.GetAll(`SELECT * FROM `+table, -1)
if err != nil {
return "", utils.ErrInfo(err)
}
for k, arr := range data {
for name, value := range arr {
if ok, _ := regexp.MatchString("(tx_hash)", name); ok {
data[k][name] = string(utils.BinToHex([]byte(value)))
}
}
}
mainMap[table] = data
}
}
jsonData, _ := json.Marshal(mainMap)
log.Debug(string(jsonData))
c.w.Header().Set("Content-Type", "text/plain")
c.w.Header().Set("Content-Length", utils.IntToStr(len(jsonData)))
t := time.Unix(utils.Time(), 0)
c.w.Header().Set("Content-Disposition", `attachment; filename="dcoin_e_backup-`+t.Format(c.TimeFormat)+`.txt`)
if _, err := c.w.Write(jsonData); err != nil {
return "", utils.ErrInfo(errors.New("unable to write text"))
}
return "", nil
}
示例3: MoneyBackRequest
func (p *Parser) MoneyBackRequest() error {
err := p.selectiveLoggingAndUpd([]string{"status"}, []interface{}{"refund"}, "orders", []string{"id"}, []string{utils.Int64ToStr(p.TxMaps.Int64["order_id"])})
if err != nil {
return p.ErrInfo(err)
}
orderData, err := p.OneRow("SELECT seller, arbitrator0, arbitrator1, arbitrator2, arbitrator3, arbitrator4 FROM orders WHERE id = ?", p.TxMaps.Int64["order_id"]).Int64()
if err != nil {
return p.ErrInfo(err)
}
// проверим, не является ли мы продавцом или арбитром
myUserId, _, myPrefix, _, err := p.GetMyUserId(orderData["seller"])
if err != nil {
return p.ErrInfo(err)
}
if orderData["seller"] == myUserId {
err = p.ExecSql("INSERT INTO "+myPrefix+"my_comments ( type, id, comment, comment_status ) VALUES ( 'seller', ?, ?, 'encrypted' )", p.TxMaps.Int64["order_id"], utils.BinToHex(p.TxMap["seller_enc_text"]))
if err != nil {
return p.ErrInfo(err)
}
}
for i := 0; i < 5; i++ {
iStr := utils.IntToStr(i)
if orderData["arbitrator"+iStr] == 0 {
continue
}
myUserId, _, myPrefix, _, err := p.GetMyUserId(orderData["arbitrator"+iStr])
if err != nil {
return p.ErrInfo(err)
}
if orderData["arbitrator"+iStr] == myUserId {
err = p.ExecSql("INSERT INTO "+myPrefix+"my_comments ( type, id, comment, comment_status ) VALUES ( 'arbitrator', ?, ?, 'encrypted' )", p.TxMaps.Int64["order_id"], utils.BinToHex(p.TxMaps.Bytes["arbitrator"+iStr+"_enc_text"]))
if err != nil {
return p.ErrInfo(err)
}
}
}
return nil
}
示例4: NewMaxOtherCurrencies
func (p *Parser) NewMaxOtherCurrencies() error {
currencyList := make(map[string]int64)
err := json.Unmarshal(p.TxMap["new_max_other_currencies"], ¤cyList)
if err != nil {
return p.ErrInfo(err)
}
var currencyIds []int
for k := range currencyList {
currencyIds = append(currencyIds, utils.StrToInt(k))
}
sort.Ints(currencyIds)
//sort.Sort(sort.Reverse(sort.IntSlice(keys)))
for _, currencyId := range currencyIds {
count := currencyList[utils.IntToStr(currencyId)]
logData, err := p.OneRow("SELECT max_other_currencies, log_id FROM currency WHERE id = ?", currencyId).String()
if err != nil {
return p.ErrInfo(err)
}
logId, err := p.ExecSqlGetLastInsertId("INSERT INTO log_currency ( max_other_currencies, prev_log_id ) VALUES ( ?, ? )", "log_id", logData["max_other_currencies"], logData["log_id"])
if err != nil {
return p.ErrInfo(err)
}
err = p.ExecSql("UPDATE currency SET max_other_currencies = ?, log_id = ? WHERE id = ?", count, logId, currencyId)
if err != nil {
return p.ErrInfo(err)
}
}
err = p.ExecSql("INSERT INTO max_other_currencies_time ( time ) VALUES ( ? )", p.BlockData.Time)
if err != nil {
return p.ErrInfo(err)
}
return nil
}
示例5: MoneyBackRequestRollback
func (p *Parser) MoneyBackRequestRollback() error {
orderData, err := p.OneRow("SELECT seller, arbitrator0, arbitrator1, arbitrator2, arbitrator3, arbitrator4 FROM orders WHERE id = ?", p.TxMaps.Int64["order_id"]).Int64()
if err != nil {
return p.ErrInfo(err)
}
// проверим, не является ли мы продавцом или арбитром
myUserId, _, myPrefix, _, err := p.GetMyUserId(orderData["seller"])
if err != nil {
return p.ErrInfo(err)
}
if orderData["seller"] == myUserId {
err = p.ExecSql("DELETE FROM "+myPrefix+"my_comments WHERE type = 'seller' AND id = ?", p.TxMaps.Int64["order_id"])
if err != nil {
return p.ErrInfo(err)
}
}
for i := 0; i < 5; i++ {
iStr := utils.IntToStr(i)
if orderData["arbitrator"+iStr] == 0 {
continue
}
myUserId, _, myPrefix, _, err := p.GetMyUserId(orderData["arbitrator"+iStr])
if err != nil {
return p.ErrInfo(err)
}
if orderData["arbitrator"+iStr] == myUserId {
err = p.ExecSql("DELETE FROM "+myPrefix+"my_comments WHERE type = 'arbitrator' AND id = ?", p.TxMaps.Int64["order_id"])
if err != nil {
return p.ErrInfo(err)
}
}
}
err = p.selectiveRollback([]string{"status"}, "orders", "id="+utils.Int64ToStr(p.TxMaps.Int64["order_id"]), false)
return nil
}
示例6: CashRequestOutFront
//.........這裏部分代碼省略.........
if err != nil {
return p.ErrInfo(err)
}
rest := maxPromisedAmount - repaidAmount
if rest < promisedAmount {
promisedAmount = rest
}
// минимальная сумма. теоретически может делиться на min_promised_amount пока не достигнет 0.01
if p.TxMaps.Money["amount"] < promisedAmount/float64(p.Variables.Int64["min_promised_amount"]) {
return p.ErrInfo(fmt.Sprintf("%f < %f / %d", p.TxMaps.Money["amount"], promisedAmount, p.Variables.Int64["min_promised_amount"]))
}
if p.TxMaps.Money["amount"] < 0.01 {
return p.ErrInfo("amount<0.01")
}
var txTime int64
if p.BlockData != nil { // тр-ия пришла в блоке
txTime = p.BlockData.Time
} else {
txTime = time.Now().Unix() - 30 // просто на всякий случай небольшой запас
}
// Чтобы не задалбывать получателей запроса на обмен, не даем отправить следующий запрос, пока не пройдет cash_request_time сек с момента предыдущего
cashRequestPending, err := p.Single("SELECT status FROM cash_requests WHERE to_user_id = ? AND del_block_id = 0 AND for_repaid_del_block_id = 0 AND time > ? AND status = 'pending'", p.TxMaps.Int64["to_user_id"], (txTime - p.Variables.Int64["cash_request_time"])).String()
if err != nil {
return p.ErrInfo(err)
}
if len(cashRequestPending) > 0 {
return p.ErrInfo("cash_requests status not null")
}
// не находится ли юзер в данный момент на каникулах.
rows, err := p.Query(p.FormatQuery("SELECT start_time, end_time FROM holidays WHERE user_id = ? AND del = 0"), p.TxMaps.Int64["to_user_id"])
if err != nil {
return p.ErrInfo(err)
}
defer rows.Close()
for rows.Next() {
var startTime, endTime int64
err = rows.Scan(&startTime, &endTime)
if err != nil {
return p.ErrInfo(err)
}
var time1, time2 int64
if p.BlockData != nil {
time1 = p.BlockData.Time
time2 = time1
} else {
// тут используем time() с запасом 1800 сек, т.к. в момент, когда тр-ия попадет в блок, каникулы уже могут начаться.
// т.е. у голой тр-ии проверка идет жестче
time1 = time.Now().Unix() + 1800
time2 = time.Now().Unix()
}
if startTime <= time1 && endTime >= time2 {
return p.ErrInfo("error holidays")
}
}
// === end проверка to_user_id
// === begin проверка отправителя
// является ли данный юзер майнером
err = p.checkMiner(p.TxUserID)
if err != nil {
return p.ErrInfo(err)
}
/*
* WalletsBuffer тут не используем т.к. попадение 2-х тр-ий данного типа в 1 блок во время генарции блока исключается в clear_incompatible_tx.
* там же исключается попадение данного типа с new_forex и пр.
* А проверка 2-го списания идет в ParseDataFull
* */
if p.BlockData != nil && p.BlockData.BlockId > 173941 {
// в блоке 173941 была попытка отправить 2 запроса на 408 и 200 dUSD, в то время как на кошельке было только 449.6
// в итоге check_sender_money возвращало ошибку
// есть ли нужная сумма на кошельке
p.TxMaps.Int64["from_user_id"] = p.TxMaps.Int64["user_id"]
for i := 0; i < 5; i++ {
p.TxMaps.Money["arbitrator"+utils.IntToStr(i)+"_commission"] = 0
}
p.TxMaps.Money["commission"] = 0
//func (p *Parser) checkSenderMoney(currencyId, fromUserId int64, amount, commission, arbitrator0_commission, arbitrator1_commission, arbitrator2_commission, arbitrator3_commission, arbitrator4_commission float64) (float64, error) {
_, err := p.checkSenderMoney(p.TxMaps.Int64["currency_id"], p.TxMaps.Int64["from_user_id"], p.TxMaps.Money["amount"], p.TxMaps.Money["commission"], p.TxMaps.Money["arbitrator0_commission"], p.TxMaps.Money["arbitrator1_commission"], p.TxMaps.Money["arbitrator2_commission"], p.TxMaps.Money["arbitrator3_commission"], p.TxMaps.Money["arbitrator4_commission"])
if err != nil {
return p.ErrInfo(err)
}
}
// У юзера не должно быть cash_requests со статусом pending
err = p.CheckCashRequests(p.TxUserID)
if err != nil {
return p.ErrInfo(err)
}
err = p.limitRequest(p.Variables.Int64["limit_cash_requests_out"], "cash_requests", p.Variables.Int64["limit_cash_requests_out_period"])
if err != nil {
return p.ErrInfo(err)
}
// === end проверка отправителя
return nil
}
示例7: IndexCf
func IndexCf(w http.ResponseWriter, r *http.Request) {
nav := ""
if len(r.URL.RawQuery) > 0 {
re, _ := regexp.Compile(`category\-([0-9]+)`)
match := re.FindStringSubmatch(r.URL.RawQuery)
if len(match) > 0 {
nav = "dc_navigate ('cfCatalog', {'category_id':" + match[1] + "})\n"
} else {
re, _ := regexp.Compile(`([A-Z0-9]{7}|id-[0-9]+)\-?([0-9]+)?\-?(funders|comments|news|home|payment)?`)
match0 := re.FindStringSubmatch(r.URL.RawQuery)
if len(match0) > 1 {
// $m[1] - название валюты или id валюты
// $m[2] - id языка
// $m[3] - тип страницы (funders|comments|news)
addNav := ""
re, _ := regexp.Compile(`id\-([0-9]+)`)
match := re.FindStringSubmatch(match0[1])
if len(match) > 1 {
addNav += "'onlyProjectId':'" + match[1] + "',"
} else {
addNav += "'onlyCfCurrencyName':'" + match[1] + "',"
}
if len(match0) > 2 {
addNav += "'lang_id':'" + match0[2] + "',"
}
if len(match0) > 3 {
addNav += "'page':'" + match0[3] + "',"
}
addNav = addNav[:len(addNav)-1]
nav = "dc_navigate ('cfPagePreview', {" + addNav + "})\n"
}
}
} else {
nav = "dc_navigate ('cfCatalog')\n"
}
log.Debug(nav)
c := new(Controller)
c.r = r
dbInit := false
if len(configIni["db_user"]) > 0 || (configIni["db_type"] == "sqlite") {
dbInit = true
}
if dbInit {
var err error
c.DCDB = utils.DB
if c.DCDB.DB == nil {
log.Error("utils.DB == nil")
dbInit = false
}
// отсутвие таблы выдаст ошибку, значит процесс инсталяции еще не пройден и надо выдать 0-й шаг
_, err = c.DCDB.Single("SELECT progress FROM install").String()
if err != nil {
log.Error("%v", err)
dbInit = false
}
cfUrl, err := c.GetCfUrl()
cfLang, err := c.GetAllCfLng()
r.ParseForm()
c.Parameters, err = c.GetParameters()
log.Debug("parameters=", c.Parameters)
lang := GetLang(w, r, c.Parameters)
analyticsDisabled, err := utils.DB.Single(`SELECT analytics_disabled FROM config`).String()
if err != nil {
log.Error("%v", err)
}
data, err := static.Asset("static/templates/index_cf.html")
t := template.New("template")
t, err = t.Parse(string(data))
if err != nil {
log.Error("%v", err)
}
b := new(bytes.Buffer)
t.Execute(b, &indexCf{CfUrl: cfUrl, Lang: utils.IntToStr(lang), Nav: template.JS(nav), CfLang: cfLang, AnalyticsDisabled: analyticsDisabled})
w.Write(b.Bytes())
}
}
示例8: VotesComplexRollback
func (p *Parser) VotesComplexRollback() error {
currencyVotes := make(map[string][]float64)
if p.BlockData.BlockId > 77951 {
vComplex, err := makeVcomplex(p.TxMap["json_data"])
if err != nil {
return p.ErrInfo(err)
}
if p.BlockData.BlockId > 153750 && vComplex.Admin != 0 {
err := p.selectiveRollback([]string{"admin_user_id", "time"}, "votes_admin", "user_id="+string(p.TxMap["user_id"]), false)
if err != nil {
return p.ErrInfo(err)
}
}
// голоса за реф. %
err = p.selectiveRollback([]string{"first", "second", "third"}, "votes_referral", "user_id="+string(p.TxMap["user_id"]), false)
if err != nil {
return p.ErrInfo(err)
}
currencyVotes = vComplex.Currency
} else { // раньше не было рефских и выбора админа
vComplex := make(map[string][]float64)
err := json.Unmarshal(p.TxMap["json_data"], &vComplex)
if err != nil {
return p.ErrInfo(err)
}
currencyVotes = vComplex
}
// сортируем по $currency_id в обратном порядке
var currencyIds []int
for k := range currencyVotes {
currencyIds = append(currencyIds, utils.StrToInt(k))
}
sort.Sort(sort.Reverse(sort.IntSlice(currencyIds)))
for _, currencyId := range currencyIds {
currencyIdStr := utils.IntToStr(currencyId)
// miner_pct
err := p.selectiveRollback([]string{"pct", "time"}, "votes_miner_pct", "user_id="+string(p.TxMap["user_id"])+" AND currency_id = "+currencyIdStr, false)
if err != nil {
return p.ErrInfo(err)
}
// user_pct
err = p.selectiveRollback([]string{"pct"}, "votes_user_pct", "user_id="+string(p.TxMap["user_id"])+" AND currency_id = "+currencyIdStr, false)
if err != nil {
return p.ErrInfo(err)
}
// reduction
err = p.selectiveRollback([]string{"pct", "time"}, "votes_reduction", "user_id="+string(p.TxMap["user_id"])+" AND currency_id = "+currencyIdStr, false)
if err != nil {
return p.ErrInfo(err)
}
// max_promised_amount
err = p.selectiveRollback([]string{"amount"}, "votes_max_promised_amount", "user_id="+string(p.TxMap["user_id"])+" AND currency_id = "+currencyIdStr, false)
if err != nil {
return p.ErrInfo(err)
}
// max_other_currencies
err = p.selectiveRollback([]string{"count"}, "votes_max_other_currencies", "user_id="+string(p.TxMap["user_id"])+" AND currency_id = "+currencyIdStr, false)
if err != nil {
return p.ErrInfo(err)
}
// проверим, не наш ли это user_id
myUserId, _, myPrefix, _, err := p.GetMyUserId(p.TxUserID)
if err != nil {
return p.ErrInfo(err)
}
if p.TxUserID == myUserId {
// отметимся, что голосовали, чтобы не пришло уведомление о необходимости голосовать раз в 2 недели
err = p.ExecSql("DELETE FROM "+myPrefix+"my_complex_votes WHERE last_voting =?", p.BlockData.Time)
if err != nil {
return p.ErrInfo(err)
}
}
}
return nil
}
示例9: PoolDataBaseDump
func (c *Controller) PoolDataBaseDump() (string, error) {
if !c.NodeAdmin || c.SessRestricted != 0 {
return "", utils.ErrInfo(errors.New("Permission denied"))
}
allTables, err := c.GetAllTables()
if err != nil {
return "", utils.ErrInfo(err)
}
c.r.ParseForm()
dumpUserId := utils.StrToInt64(c.r.FormValue("dump_user_id"))
mainMap := make(map[string][]map[string]string)
if dumpUserId > 0 {
for _, table := range consts.MyTables {
data, err := c.GetAll(`SELECT * FROM `+table, -1)
if err != nil {
return "", utils.ErrInfo(err)
}
mainMap[table] = data
}
} else {
for i := 0; i < len(c.CommunityUsers); i++ {
for _, table := range consts.MyTables {
table = utils.Int64ToStr(c.CommunityUsers[i]) + "_" + table
if utils.InSliceString(table, allTables) {
data, err := c.GetAll(`SELECT * FROM `+table, -1)
for k, arr := range data {
for name, value := range arr {
if ok, _ := regexp.MatchString("(hash_code|public_key|encrypted)", name); ok {
data[k][name] = string(utils.BinToHex([]byte(value)))
}
}
}
if err != nil {
return "", utils.ErrInfo(err)
}
mainMap[table] = data
}
}
}
}
jsonData, _ := json.Marshal(mainMap)
log.Debug(string(jsonData))
c.w.Header().Set("Content-Type", "text/plain")
c.w.Header().Set("Content-Length", utils.IntToStr(len(jsonData)))
t := time.Unix(utils.Time(), 0)
c.w.Header().Set("Content-Disposition", `attachment; filename="dcoin_users_backup-`+t.Format(c.TimeFormat)+`.txt`)
if _, err := c.w.Write(jsonData); err != nil {
return "", utils.ErrInfo(errors.New("unable to write text"))
}
err = json.Unmarshal(jsonData, &mainMap)
if err != nil {
return "", utils.ErrInfo(err)
}
// для теста
for table, arr := range mainMap {
log.Debug(table)
for i, data := range arr {
log.Debug("%v", i)
colNames := ""
values := []string{}
qq := ""
for name, value := range data {
colNames += name + ","
values = append(values, value)
if ok, _ := regexp.MatchString("(hash_code|public_key|encrypted)", name); ok {
qq += "[hex],"
} else {
qq += "?,"
}
}
colNames = colNames[0 : len(colNames)-1]
qq = qq[0 : len(qq)-1]
query := `INSERT INTO ` + table + ` (` + colNames + `) VALUES (` + qq + `)`
log.Debug("%v", query)
log.Debug("%v", values)
}
}
return "", nil
}
示例10: Assignments
//.........這裏部分代碼省略.........
minersIds := utils.GetMinersKeepers(userInfo["photo_block_id"], userInfo["photo_max_miner_id"], userInfo["miners_keepers"], true)
if len(minersIds) > 0 {
photoHosts, err = c.GetList("SELECT http_host FROM miners_data WHERE miner_id IN (" + utils.JoinInts(minersIds, ",") + ")").String()
if err != nil {
return "", utils.ErrInfo(err)
}
}
// отрезки майнера, которого проверяем
relations, err := c.OneRow("SELECT * FROM faces WHERE user_id = ?", userInfo["user_id"]).String()
if err != nil {
return "", utils.ErrInfo(err)
}
// получим допустимые расхождения между точками и совместимость версий
data_, err := c.OneRow("SELECT tolerances, compatibility FROM spots_compatibility").String()
if err != nil {
return "", utils.ErrInfo(err)
}
tolerances := make(map[string]map[string]string)
if err := json.Unmarshal([]byte(data_["tolerances"]), &tolerances); err != nil {
return "", utils.ErrInfo(err)
}
var compatibility []int
if err := json.Unmarshal([]byte(data_["compatibility"]), &compatibility); err != nil {
return "", utils.ErrInfo(err)
}
// формируем кусок SQL-запроса для соотношений отрезков
addSqlTolerances := ""
typesArr := []string{"face", "profile"}
for i := 0; i < len(typesArr); i++ {
for j := 1; j <= len(tolerances[typesArr[i]]); j++ {
currentRelations := utils.StrToFloat64(relations[typesArr[i][:1]+utils.IntToStr(j)])
diff := utils.StrToFloat64(tolerances[typesArr[i]][utils.IntToStr(j)]) * currentRelations
if diff == 0 {
continue
}
min := currentRelations - diff
max := currentRelations + diff
addSqlTolerances += typesArr[i][:1] + utils.IntToStr(j) + ">" + utils.Float64ToStr(min) + " AND " + typesArr[i][:1] + utils.IntToStr(j) + " < " + utils.Float64ToStr(max) + " AND "
}
}
addSqlTolerances = addSqlTolerances[:len(addSqlTolerances)-4]
// формируем кусок SQL-запроса для совместимости версий
addSqlCompatibility := ""
for i := 0; i < len(compatibility); i++ {
addSqlCompatibility += fmt.Sprintf(`%d,`, compatibility[i])
}
addSqlCompatibility = addSqlCompatibility[:len(addSqlCompatibility)-1]
// получаем из БД похожие фото
rows, err := c.Query(c.FormatQuery(`
SELECT miners_data.user_id,
photo_block_id,
photo_max_miner_id,
miners_keepers
FROM faces
LEFT JOIN miners_data ON
miners_data.user_id = faces.user_id
WHERE `+addSqlTolerances+` AND
version IN (`+addSqlCompatibility+`) AND
faces.status = 'used' AND
miners_data.user_id != ?
LIMIT 100
示例11: SendDcRollback
func (p *Parser) SendDcRollback() error {
// нужно отметить в log_time_money_orders, что тр-ия НЕ прошла в блок
err := p.ExecSql("UPDATE log_time_money_orders SET del_block_id = 0 WHERE hex(tx_hash) = ?", p.TxHash)
if err != nil {
return p.ErrInfo(err)
}
// 6 комиссия нода-генератора блока
if p.TxMaps.Float64["commission"] >= 0.01 {
err = p.generalRollback("wallets", p.BlockData.UserId, "AND currency_id = "+utils.Int64ToStr(p.TxMaps.Int64["currency_id"]), false)
if err != nil {
return p.ErrInfo(err)
}
// возможно были списания по кредиту нода-генератора
err = p.loanPaymentsRollback(p.BlockData.UserId, p.TxMaps.Int64["currency_id"])
if err != nil {
return p.ErrInfo(err)
}
}
// 5 обновим сумму на кошельке получателю
// возможно были списания по кредиту
err = p.loanPaymentsRollback(p.TxMaps.Int64["to_user_id"], p.TxMaps.Int64["currency_id"])
if err != nil {
return p.ErrInfo(err)
}
err = p.generalRollback("wallets", p.TxMaps.Int64["to_user_id"], "AND currency_id = "+utils.Int64ToStr(p.TxMaps.Int64["currency_id"]), false)
if err != nil {
return p.ErrInfo(err)
}
// 4 обновим сумму на кошельке отправителя
err = p.generalRollback("wallets", p.TxMaps.Int64["from_user_id"], "AND currency_id = "+utils.Int64ToStr(p.TxMaps.Int64["currency_id"]), false)
if err != nil {
return p.ErrInfo(err)
}
// 3
err = p.pointsUpdateRollbackMain(p.TxMaps.Int64["to_user_id"])
if err != nil {
return p.ErrInfo(err)
}
// 2
err = p.pointsUpdateRollbackMain(p.TxMaps.Int64["from_user_id"])
if err != nil {
return p.ErrInfo(err)
}
// 1
err = p.pointsUpdateRollbackMain(p.BlockData.UserId)
if err != nil {
return p.ErrInfo(err)
}
// отменяем чистку буфера
err = p.ExecSql("UPDATE wallets_buffer SET del_block_id = 0 WHERE hex(hash) = ?", p.TxHash)
if err != nil {
return p.ErrInfo(err)
}
if p.BlockData.BlockId > consts.ARBITRATION_BLOCK_START {
// на какой период манибека согласен продавец
arbitrationDaysRefund, err := p.Single("SELECT arbitration_days_refund FROM users WHERE user_id = ?", p.TxMaps.Int64["to_user_id"]).Int64()
if err != nil {
return p.ErrInfo(err)
}
if arbitrationDaysRefund > 0 {
delOrder := false
for i := 0; i < 5; i++ {
iStr := utils.IntToStr(i)
if p.TxMaps.Int64["arbitrator"+iStr] > 0 && p.TxMaps.Float64["arbitrator"+iStr+"_commission"] >= 0.01 {
err = p.generalRollback("wallets", p.TxMaps.Int64["arbitrator"+iStr], "AND currency_id = "+utils.Int64ToStr(p.TxMaps.Int64["currency_id"]), false)
if err != nil {
return p.ErrInfo(err)
}
if !delOrder {
err = p.ExecSql("DELETE FROM orders WHERE block_id = ? AND buyer = ? AND seller = ? AND currency_id = ? AND amount = ?", p.BlockData.BlockId, p.TxMaps.Int64["from_user_id"], p.TxMaps.Int64["to_user_id"], p.TxMaps.Int64["currency_id"], p.TxMaps.Float64["amount"])
if err != nil {
return p.ErrInfo(err)
}
err = p.rollbackAI("orders", 1)
if err != nil {
return p.ErrInfo(err)
}
delOrder = true
}
// возможно были списания по кредиту арбитра
err = p.loanPaymentsRollback(p.TxMaps.Int64["arbitrator"+iStr], p.TxMaps.Int64["currency_id"])
if err != nil {
return p.ErrInfo(err)
}
}
}
}
}
err = p.mydctxRollback()
if err != nil {
return p.ErrInfo(err)
//.........這裏部分代碼省略.........
示例12: ParseDataGate
/**
Обработка данных (блоков или транзакций), пришедших с гейта. Только проверка.
*/
func (p *Parser) ParseDataGate(onlyTx bool) error {
var err error
p.dataPre()
p.TxIds = []string{}
p.Variables, err = p.GetAllVariables()
if err != nil {
return utils.ErrInfo(err)
}
transactionBinaryData := p.BinaryData
var transactionBinaryDataFull []byte
// если это транзакции (type>0), а не блок (type==0)
if p.dataType > 0 {
// проверим, есть ли такой тип тр-ий
if len(consts.TxTypes[p.dataType]) == 0 {
return p.ErrInfo("Incorrect tx type " + utils.IntToStr(p.dataType))
}
log.Debug("p.dataType %v", p.dataType)
transactionBinaryData = append(utils.DecToBin(int64(p.dataType), 1), transactionBinaryData...)
transactionBinaryDataFull = transactionBinaryData
// нет ли хэша этой тр-ии у нас в БД?
err = p.CheckLogTx(transactionBinaryDataFull)
if err != nil {
return p.ErrInfo(err)
}
p.TxHash = utils.Md5(transactionBinaryData)
// преобразуем бинарные данные транзакции в массив
p.TxSlice, err = p.ParseTransaction(&transactionBinaryData)
if err != nil {
return p.ErrInfo(err)
}
log.Debug("p.TxSlice", p.TxSlice)
if len(p.TxSlice) < 3 {
return p.ErrInfo(errors.New("len(p.TxSlice) < 3"))
}
// время транзакции может быть немного больше, чем время на ноде.
// у нода может быть просто не настроено время.
// время транзакции используется только для борьбы с атаками вчерашними транзакциями.
// А т.к. мы храним хэши в log_transaction за 36 часов, то боятся нечего.
curTime := utils.Time()
if utils.BytesToInt64(p.TxSlice[2])-consts.MAX_TX_FORW > curTime || utils.BytesToInt64(p.TxSlice[2]) < curTime-consts.MAX_TX_BACK {
return p.ErrInfo(errors.New("incorrect tx time"))
}
// $this->transaction_array[3] могут подсунуть пустой
if !utils.CheckInputData(p.TxSlice[3], "bigint") {
return p.ErrInfo(errors.New("incorrect user id"))
}
}
// если это блок
if p.dataType == 0 {
txCounter := make(map[int64]int64)
// если есть $only_tx=true, то значит идет восстановление уже проверенного блока и заголовок не требуется
if !onlyTx {
err = p.ParseBlock()
if err != nil {
return p.ErrInfo(err)
}
// проверим данные, указанные в заголовке блока
err = p.CheckBlockHeader()
if err != nil {
return p.ErrInfo(err)
}
}
log.Debug("onlyTx", onlyTx)
// если в ходе проверки тр-ий возникает ошибка, то вызываем откатчик всех занесенных тр-ий. Эта переменная для него
p.fullTxBinaryData = p.BinaryData
var txForRollbackTo []byte
if len(p.BinaryData) > 0 {
for {
transactionSize := utils.DecodeLength(&p.BinaryData)
if len(p.BinaryData) == 0 {
return utils.ErrInfo(fmt.Errorf("empty BinaryData"))
}
// отчекрыжим одну транзакцию от списка транзакций
transactionBinaryData := utils.BytesShift(&p.BinaryData, transactionSize)
transactionBinaryDataFull = transactionBinaryData
// добавляем взятую тр-ию в набор тр-ий для RollbackTo, в котором пойдем в обратном порядке
txForRollbackTo = append(txForRollbackTo, utils.EncodeLengthPlusData(transactionBinaryData)...)
// нет ли хэша этой тр-ии у нас в БД?
err = p.CheckLogTx(transactionBinaryDataFull)
//.........這裏部分代碼省略.........
示例13: Start
func Start(dir string, thrustWindowLoder *window.Window) {
var err error
IosLog("start")
defer func() {
if r := recover(); r != nil {
log.Error("Recovered", r)
panic(r)
}
}()
if dir != "" {
fmt.Println("dir", dir)
*utils.Dir = dir
}
IosLog("dir:" + dir)
fmt.Println("utils.Dir", *utils.Dir)
fmt.Println("dcVersion:", consts.VERSION)
log.Debug("dcVersion: %v", consts.VERSION)
// читаем config.ini
configIni := make(map[string]string)
configIni_, err := config.NewConfig("ini", *utils.Dir+"/config.ini")
if err != nil {
IosLog("err:" + fmt.Sprintf("%s", utils.ErrInfo(err)))
log.Error("%v", utils.ErrInfo(err))
} else {
configIni, err = configIni_.GetSection("default")
}
// убьем ранее запущенный Dcoin
if !utils.Mobile() {
fmt.Println("kill dcoin.pid")
if _, err := os.Stat(*utils.Dir + "/dcoin.pid"); err == nil {
dat, err := ioutil.ReadFile(*utils.Dir + "/dcoin.pid")
if err != nil {
log.Error("%v", utils.ErrInfo(err))
}
var pidMap map[string]string
err = json.Unmarshal(dat, &pidMap)
if err != nil {
log.Error("%v", utils.ErrInfo(err))
}
fmt.Println("old PID ("+*utils.Dir+"/dcoin.pid"+"):", pidMap["pid"])
utils.DB, err = utils.NewDbConnect(configIni)
err = KillPid(pidMap["pid"])
if nil != err {
fmt.Println(err)
log.Error("KillPid %v", utils.ErrInfo(err))
}
if fmt.Sprintf("%s", err) != "null" {
fmt.Println(fmt.Sprintf("%s", err))
// даем 15 сек, чтобы завершиться предыдущему процессу
for i := 0; i < 15; i++ {
log.Debug("waiting killer %d", i)
if _, err := os.Stat(*utils.Dir + "/dcoin.pid"); err == nil {
fmt.Println("waiting killer")
utils.Sleep(1)
} else { // если dcoin.pid нет, значит завершился
break
}
}
}
}
}
// сохраним текущий pid и версию
if !utils.Mobile() {
pid := os.Getpid()
PidAndVer, err := json.Marshal(map[string]string{"pid": utils.IntToStr(pid), "version": consts.VERSION})
if err != nil {
log.Error("%v", utils.ErrInfo(err))
}
err = ioutil.WriteFile(*utils.Dir+"/dcoin.pid", PidAndVer, 0644)
if err != nil {
log.Error("%v", utils.ErrInfo(err))
panic(err)
}
}
controllers.SessInit()
controllers.ConfigInit()
daemons.ConfigInit()
go func() {
utils.DB, err = utils.NewDbConnect(configIni)
log.Debug("%v", utils.DB)
IosLog("utils.DB:" + fmt.Sprintf("%v", utils.DB))
if err != nil {
IosLog("err:" + fmt.Sprintf("%s", utils.ErrInfo(err)))
log.Error("%v", utils.ErrInfo(err))
panic(err)
os.Exit(1)
}
}()
//.........這裏部分代碼省略.........
示例14: EncryptComment
func (c *Controller) EncryptComment() (string, error) {
var err error
c.r.ParseForm()
txType := c.r.FormValue("type")
var toId int64
var toIds []int64
toIds_ := c.r.FormValue("to_ids")
if len(toIds_) == 0 {
toId = utils.StrToInt64(c.r.FormValue("to_id"))
} else {
var toIdsMap map[string]string
err = json.Unmarshal([]byte(toIds_), &toIdsMap)
if err != nil {
return "", utils.ErrInfo(err)
}
for _, uid := range toIdsMap {
if utils.StrToInt64(uid) > 0 {
toIds = append(toIds, utils.StrToInt64(uid))
}
}
}
comment := c.r.FormValue("comment")
if len(comment) > 1024 {
return "", errors.New("incorrect comment")
}
var toUserId int64
if txType == "project" {
toUserId, err = c.Single("SELECT user_id FROM cf_projects WHERE id = ?", toId).Int64()
if err != nil {
return "", utils.ErrInfo(err)
}
} else {
toUserId = toId
}
if len(toIds) == 0 {
toIds = []int64{toUserId}
}
log.Debug("toId:", toId)
log.Debug("toIds:", toIds)
log.Debug("toUserId:", toUserId)
enc := make(map[string]string)
for i := 0; i < len(toIds); i++ {
if toIds[i] == 0 {
enc[utils.IntToStr(i)] = "0"
continue
}
// если получатель майнер, тогда шифруем нодовским ключем
minersData, err := c.OneRow("SELECT miner_id, node_public_key FROM miners_data WHERE user_id = ?", toIds[i]).String()
if err != nil {
return "", utils.ErrInfo(err)
}
var publicKey string
if utils.StrToInt(minersData["miner_id"]) > 0 && txType != "cash_request" && txType != "bug_reporting" && txType != "project" && txType != "money_back" && txType != "restoringAccess" {
publicKey = minersData["node_public_key"]
} else {
publicKey, err = c.Single("SELECT public_key_0 FROM users WHERE user_id = ?", toIds[i]).String()
if err != nil {
return "", utils.ErrInfo(err)
}
}
pub, err := utils.BinToRsaPubKey([]byte(publicKey))
if err != nil {
return "", utils.ErrInfo(err)
}
enc_, err := rsa.EncryptPKCS1v15(rand.Reader, pub, []byte(comment))
if err != nil {
return "", utils.ErrInfo(err)
}
enc[utils.IntToStr(i)] = string(utils.BinToHex(enc_))
}
if len(enc) < 5 && len(enc) > 0 {
for i := len(enc); i < 5; i++ {
enc[utils.IntToStr(i)] = "0"
}
}
log.Debug("enc:", enc)
if txType != "arbitration_arbitrators" {
return string(enc["0"]), nil
} else {
result, err := json.Marshal(enc)
if err != nil {
return "", utils.ErrInfo(err)
}
return string(result), nil
}
}
示例15: ReductionGenerator
//.........這裏部分代碼省略.........
(cash_request_out_time = 0 OR cash_request_out_time > ?)
GROUP BY currency_id
`, "currency_id", "sum_amount", curTime-variables.Int64["cash_request_time"])
if err != nil {
if d.dPrintSleep(err, d.sleepTime) {
break BEGIN
}
continue BEGIN
}
log.Debug("sumPromisedAmount", sumPromisedAmount)
if len(sumWallets) > 0 {
for currencyId, sumAmount := range sumWallets {
//недопустимо для WOC
if currencyId == 1 {
continue
}
reductionTime, err := d.Single("SELECT max(time) FROM reduction WHERE currency_id = ? AND type = 'auto'", currencyId).Int64()
if err != nil {
if d.dPrintSleep(err, d.sleepTime) {
break BEGIN
}
continue BEGIN
}
log.Debug("reductionTime", reductionTime)
// прошло ли 48 часов
if curTime-reductionTime <= consts.AUTO_REDUCTION_PERIOD {
log.Debug("curTime-reductionTime <= consts.AUTO_REDUCTION_PERIOD %d <= %d", curTime-reductionTime, consts.AUTO_REDUCTION_PERIOD)
continue
}
// если обещанных сумм менее чем 100% от объема DC на кошельках, то запускаем урезание
log.Debug("utils.StrToFloat64(sumPromisedAmount[utils.IntToStr(currencyId)]) < sumAmount*consts.AUTO_REDUCTION_PROMISED_AMOUNT_PCT %d < %d", utils.StrToFloat64(sumPromisedAmount[utils.IntToStr(currencyId)]), sumAmount*consts.AUTO_REDUCTION_PROMISED_AMOUNT_PCT)
if utils.StrToFloat64(sumPromisedAmount[utils.IntToStr(currencyId)]) < sumAmount*consts.AUTO_REDUCTION_PROMISED_AMOUNT_PCT {
// проверим, есть ли хотя бы 1000 юзеров, у которых на кошелках есть или была данная валюты
countUsers, err := d.Single("SELECT count(user_id) FROM wallets WHERE currency_id = ?", currencyId).Int64()
if err != nil {
if d.dPrintSleep(err, d.sleepTime) {
break BEGIN
}
continue BEGIN
}
log.Debug("countUsers>=countUsers %d >= %d", countUsers, consts.AUTO_REDUCTION_PROMISED_AMOUNT_MIN)
if countUsers >= consts.AUTO_REDUCTION_PROMISED_AMOUNT_MIN {
reductionCurrencyId = currencyId
reductionPct = consts.AUTO_REDUCTION_PCT
reductionType = "promised_amount"
break
}
}
}
}
if reductionCurrencyId > 0 && reductionPct > 0 {
_, myUserId, _, _, _, _, err := d.TestBlock()
forSign := fmt.Sprintf("%v,%v,%v,%v,%v,%v", utils.TypeInt("NewReduction"), curTime, myUserId, reductionCurrencyId, reductionPct, reductionType)
log.Debug("forSign = %v", forSign)
binSign, err := d.GetBinSign(forSign, myUserId)
if err != nil {
if d.unlockPrintSleep(utils.ErrInfo(err), d.sleepTime) {
break BEGIN
}
continue BEGIN