package service import ( "q5" "f5" "jccommon" "main/constant" ) func GetNftItemIdQuality(netId int32, contractAddress string, tokenId string, itemId *int32, quality *int32) { f5.GetGoStyleDb().OrmSelectOne( constant.BCNFT_DB, "t_nft", [][]string { {"net_id", q5.ToString(netId)}, {"contract_address", contractAddress}, {"token_id", tokenId}, }, func (err error, ds *f5.DataSet) { if err != nil { return } if ds.Next() { *itemId = q5.ToInt32(ds.GetByName("item_id")) *quality = q5.ToInt32(ds.GetByName("quality")) tokenType := q5.ToInt32(ds.GetByName("token_type")) if tokenType == jccommon.NFT_TYPE_CFHERO || tokenType == jccommon.NFT_TYPE_CFHERO_NORMAL { f5.GetGoStyleDb().OrmSelectOne( constant.GAME_DB, "t_hero", [][]string { {"token_id", tokenId}, }, func (err error, ds *f5.DataSet) { if err != nil { return } if ds.Next() { *quality = q5.ToInt32(ds.GetByName("quality")) } }) } } }) } func GetHeroByTokenId(tokenId string, itemId *int32, heroQuality *int32) bool { result := false f5.GetGoStyleDb().OrmSelectOne( constant.GAME_DB, "t_hero", [][]string { {"token_id", tokenId}, }, func (err error, ds *f5.DataSet) { if err != nil { return } if ds.Next() { *itemId = q5.ToInt32(ds.GetByName("hero_id")) *heroQuality = q5.ToInt32(ds.GetByName("quality")) result = true } }) return result } func GetGoldBullionByNetIdTokenId(netId int32, tokenId string, itemId *int32) bool { result := false f5.GetGoStyleDb().OrmSelectOne( constant.GAME_DB, "t_gold_bullion", [][]string { {"net_id", q5.ToString(netId)}, {"token_id", tokenId}, }, func (err error, ds *f5.DataSet) { if err != nil { return } if ds.Next() { *itemId = q5.ToInt32(ds.GetByName("item_id")) result = true } }) return result } func GetGoldBullionItemIdByTokenId(tokenId string, itemId *int32) bool { result := false f5.GetGoStyleDb().OrmSelectOne( constant.GAME_DB, "t_gold_bullion", [][]string { {"token_id", tokenId}, }, func (err error, ds *f5.DataSet) { if err != nil { return } if ds.Next() { *itemId = q5.ToInt32(ds.GetByName("item_id")) result = true } }) return result } func GetNoOpenGoldBullionItemIdByTokenId(tokenId string, itemId *int32) bool { result := false f5.GetGoStyleDb().OrmSelectOne( constant.GAME_DB, "t_gold_bullion", [][]string { {"token_id", tokenId}, {"status", q5.ToString(jccommon.GOLD_BULLION_NO_OPEN)}, }, func (err error, ds *f5.DataSet) { if err != nil { return } if ds.Next() { *itemId = q5.ToInt32(ds.GetByName("item_id")) result = true } }) return result } func NftExists(netId int32, contractAddress string, tokenId string) bool { result := false f5.GetGoStyleDb().OrmSelectOne( constant.BCNFT_DB, "t_nft", [][]string { {"net_id", q5.ToString(netId)}, {"token_id", tokenId}, {"contract_address", contractAddress}, }, func (err error, ds *f5.DataSet) { if err != nil { return } if ds.Next() { result = true } }) return result } func NftUpdateLock(netId int32, contractAddress string, tokenId string, lockIdx int64, lockAddress string, lockSender string) bool { nowTime := f5.GetApp().GetRealSeconds() result := false f5.GetGoStyleDb().UpsertEx( constant.BCNFT_DB, "t_nft", [][]string { {"net_id", q5.ToString(netId)}, {"token_id", tokenId}, {"contract_address", contractAddress}, }, [][]string { {"last_lock_idx", q5.ToString(lockIdx)}, {"last_lock_address", lockAddress}, {"last_lock_sender", lockSender}, {"last_lock_time", q5.ToString(nowTime)}, }, [][]string {}, func (err error, lastInsertId int64, rowsAffected int64) { if err != nil { return } result = true }, func (ds *f5.DataSet) bool { return lockIdx > q5.ToInt64(ds.GetByName("last_lock_idx")) }) return result } func RepiarHeroQuality() error { var resultErr error nftDatas := []*jccommon.NftIdentityAndExtData{} { f5.GetGoStyleDb().OrmSelect( constant.BCNFT_DB, "t_nft", [][]string{ {"token_type", q5.ToString(jccommon.NFT_TYPE_CFHERO)}, }, func (err error, ds *f5.DataSet) { resultErr = err if err != nil { return } for ds.Next() { p := new(jccommon.NftIdentityAndExtData) p.LoadFromDb(ds) q5.AppendSlice(&nftDatas, p); } }) if resultErr == nil { f5.GetGoStyleDb().OrmSelect( constant.BCNFT_DB, "t_nft", [][]string{ {"token_type", q5.ToString(jccommon.NFT_TYPE_CFHERO_NORMAL)}, }, func (err error, ds *f5.DataSet) { resultErr = err if err != nil { return } for ds.Next() { p := new(jccommon.NftIdentityAndExtData) p.LoadFromDb(ds) q5.AppendSlice(&nftDatas, p); } }) } } procBatchFunc := func(batch []*jccommon.NftIdentityAndExtData) { if len(batch) <= 0 { return } sql := "SELECT token_id, hero_id, quality FROM t_hero WHERE token_id IN (" params := []string{} tokenIdQualityHash := map[string]*jccommon.NftIdentityAndExtData{} { inited := false for _, val := range batch { if !inited { sql += "?" } else { sql += ", ?" } q5.AppendSlice(¶ms, val.TokenId) tokenIdQualityHash[val.TokenId] = val } } f5.GetGoStyleDb().RawQuery( constant.GAME_DB, sql, params, func (err error, ds *f5.DataSet) { if err != nil { return } for ds.Next() { tokenId := ds.GetByName("token_id") quality := q5.ToInt32(ds.GetByName("quality")) if val, ok := tokenIdQualityHash[tokenId]; ok && val.Quality != quality { } } }) } if resultErr == nil && len(nftDatas) > 0 { batchNftQuality := []*jccommon.NftIdentityAndExtData{} for _, val := range nftDatas { if len(batchNftQuality) < 100 { q5.AppendSlice(&batchNftQuality, val) } else { procBatchFunc(batchNftQuality) batchNftQuality = []*jccommon.NftIdentityAndExtData{} } } if len(batchNftQuality) > 0 { procBatchFunc(batchNftQuality) } } return resultErr } func updateNftItemIdQuality(netId int32, contractAddress string, tokenId string, itemId int32, quality int32) error { var resultErr error f5.GetGoStyleDb().Update( constant.BCNFT_DB, "t_nft", [][]string { {"net_id", q5.ToString(netId)}, {"contract_address", contractAddress}, {"token_id", tokenId}, {"item_id", q5.ToString(0)}, }, [][]string { {"item_id", q5.ToString(itemId)}, {"quality", q5.ToString(quality)}, }, func (err error, lastInsertId int64, rowsAffected int64) { resultErr = err }) return resultErr }