mirror of
https://github.com/Walter-Sparrow/lunar-tear.git
synced 2026-07-02 13:53:41 +03:00
727 lines
34 KiB
Go
727 lines
34 KiB
Go
package sqlite
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
"lunar-tear/server/internal/model"
|
|
"lunar-tear/server/internal/store"
|
|
)
|
|
|
|
func (s *SQLiteStore) LoadUser(userId int64) (store.UserState, error) {
|
|
var u store.UserState
|
|
var fbId sql.NullInt64
|
|
|
|
err := s.db.QueryRow(`SELECT user_id, uuid, player_id, os_type, platform_type, user_restriction_type,
|
|
register_datetime, game_start_datetime, latest_version, birth_year, birth_month,
|
|
backup_token, charge_money_this_month, facebook_id FROM users WHERE user_id = ?`, userId).Scan(
|
|
&u.UserId, &u.Uuid, &u.PlayerId, &u.OsType, &u.PlatformType, &u.UserRestrictionType,
|
|
&u.RegisterDatetime, &u.GameStartDatetime, &u.LatestVersion, &u.BirthYear, &u.BirthMonth,
|
|
&u.BackupToken, &u.ChargeMoneyThisMonth, &fbId)
|
|
if err == sql.ErrNoRows {
|
|
return u, store.ErrNotFound
|
|
}
|
|
if err != nil {
|
|
return u, fmt.Errorf("load users: %w", err)
|
|
}
|
|
u.FacebookId = fbId.Int64
|
|
|
|
initMaps(&u)
|
|
|
|
load1to1(s.db, userId, &u)
|
|
loadMapTables(s.db, userId, &u)
|
|
|
|
return u, nil
|
|
}
|
|
|
|
func initMaps(u *store.UserState) {
|
|
u.Tutorials = make(map[int32]store.TutorialProgressState)
|
|
u.Characters = make(map[int32]store.CharacterState)
|
|
u.Costumes = make(map[string]store.CostumeState)
|
|
u.Weapons = make(map[string]store.WeaponState)
|
|
u.Companions = make(map[string]store.CompanionState)
|
|
u.Thoughts = make(map[string]store.ThoughtState)
|
|
u.DeckCharacters = make(map[string]store.DeckCharacterState)
|
|
u.Decks = make(map[store.DeckKey]store.DeckState)
|
|
u.DeckSubWeapons = make(map[string][]string)
|
|
u.DeckParts = make(map[string][]string)
|
|
u.Quests = make(map[int32]store.UserQuestState)
|
|
u.QuestMissions = make(map[store.QuestMissionKey]store.UserQuestMissionState)
|
|
u.Missions = make(map[int32]store.UserMissionState)
|
|
u.WeaponStories = make(map[int32]store.WeaponStoryState)
|
|
u.WeaponNotes = make(map[int32]store.WeaponNoteState)
|
|
u.WeaponSkills = make(map[string][]store.WeaponSkillState)
|
|
u.WeaponAbilities = make(map[string][]store.WeaponAbilityState)
|
|
u.WeaponAwakens = make(map[string]store.WeaponAwakenState)
|
|
u.CostumeActiveSkills = make(map[string]store.CostumeActiveSkillState)
|
|
u.CostumeAwakenStatusUps = make(map[store.CostumeAwakenStatusKey]store.CostumeAwakenStatusUpState)
|
|
u.CostumeLotteryEffects = make(map[store.CostumeLotteryEffectKey]store.CostumeLotteryEffectState)
|
|
u.CostumeLotteryEffectPending = make(map[string]store.CostumeLotteryEffectPendingState)
|
|
u.Parts = make(map[string]store.PartsState)
|
|
u.PartsGroupNotes = make(map[int32]store.PartsGroupNoteState)
|
|
u.PartsPresets = make(map[int32]store.PartsPresetState)
|
|
u.DeckTypeNotes = make(map[model.DeckType]store.DeckTypeNoteState)
|
|
u.ConsumableItems = make(map[int32]int32)
|
|
u.Materials = make(map[int32]int32)
|
|
u.ImportantItems = make(map[int32]int32)
|
|
u.PremiumItems = make(map[int32]int64)
|
|
u.NaviCutInPlayed = make(map[int32]bool)
|
|
u.ViewedMovies = make(map[int32]int64)
|
|
u.ContentsStories = make(map[int32]int64)
|
|
u.DrawnOmikuji = make(map[int32]int64)
|
|
u.DokanConfirmed = make(map[int32]bool)
|
|
u.ShopItems = make(map[int32]store.UserShopItemState)
|
|
u.ShopReplaceableLineup = make(map[int32]store.UserShopReplaceableLineupState)
|
|
u.ExploreScores = make(map[int32]store.ExploreScoreState)
|
|
u.CageOrnamentRewards = make(map[int32]store.CageOrnamentRewardState)
|
|
u.CharacterBoards = make(map[int32]store.CharacterBoardState)
|
|
u.CharacterBoardAbilities = make(map[store.CharacterBoardAbilityKey]store.CharacterBoardAbilityState)
|
|
u.CharacterBoardStatusUps = make(map[store.CharacterBoardStatusUpKey]store.CharacterBoardStatusUpState)
|
|
u.CharacterRebirths = make(map[int32]store.CharacterRebirthState)
|
|
u.AutoSaleSettings = make(map[int32]store.AutoSaleSettingState)
|
|
u.SideStoryQuests = make(map[int32]store.SideStoryQuestProgress)
|
|
u.QuestLimitContentStatus = make(map[int32]store.QuestLimitContentStatus)
|
|
u.BigHuntMaxScores = make(map[int32]store.BigHuntMaxScore)
|
|
u.BigHuntStatuses = make(map[int32]store.BigHuntStatus)
|
|
u.BigHuntScheduleMaxScores = make(map[store.BigHuntScheduleScoreKey]store.BigHuntScheduleMaxScore)
|
|
u.BigHuntWeeklyMaxScores = make(map[store.BigHuntWeeklyScoreKey]store.BigHuntWeeklyMaxScore)
|
|
u.BigHuntWeeklyStatuses = make(map[int64]store.BigHuntWeeklyStatus)
|
|
u.Gacha.BannerStates = make(map[int32]store.GachaBannerState)
|
|
u.Gacha.ConvertedGachaMedal.ConvertedMedalPossession = []store.ConsumableItemState{}
|
|
u.Gifts.NotReceived = []store.NotReceivedGiftState{}
|
|
u.Gifts.Received = []store.ReceivedGiftState{}
|
|
u.Gimmick.Progress = make(map[store.GimmickKey]store.GimmickProgressState)
|
|
u.Gimmick.OrnamentProgress = make(map[store.GimmickOrnamentKey]store.GimmickOrnamentProgressState)
|
|
u.Gimmick.Sequences = make(map[store.GimmickSequenceKey]store.GimmickSequenceState)
|
|
u.Gimmick.Unlocks = make(map[store.GimmickKey]store.GimmickUnlockState)
|
|
}
|
|
|
|
func load1to1(db *sql.DB, uid int64, u *store.UserState) {
|
|
var b int
|
|
_ = db.QueryRow(`SELECT is_notify_purchase_alert, latest_version FROM user_setting WHERE user_id=?`, uid).
|
|
Scan(&b, &u.Setting.LatestVersion)
|
|
u.Setting.IsNotifyPurchaseAlert = b != 0
|
|
|
|
_ = db.QueryRow(`SELECT level, exp, stamina_milli_value, stamina_update_datetime, latest_version FROM user_status WHERE user_id=?`, uid).
|
|
Scan(&u.Status.Level, &u.Status.Exp, &u.Status.StaminaMilliValue, &u.Status.StaminaUpdateDatetime, &u.Status.LatestVersion)
|
|
|
|
_ = db.QueryRow(`SELECT paid_gem, free_gem FROM user_gem WHERE user_id=?`, uid).
|
|
Scan(&u.Gem.PaidGem, &u.Gem.FreeGem)
|
|
|
|
_ = db.QueryRow(`SELECT name, name_update_datetime, message, message_update_datetime, favorite_costume_id,
|
|
favorite_costume_id_update_datetime, latest_version FROM user_profile WHERE user_id=?`, uid).
|
|
Scan(&u.Profile.Name, &u.Profile.NameUpdateDatetime, &u.Profile.Message, &u.Profile.MessageUpdateDatetime,
|
|
&u.Profile.FavoriteCostumeId, &u.Profile.FavoriteCostumeIdUpdateDatetime, &u.Profile.LatestVersion)
|
|
|
|
_ = db.QueryRow(`SELECT total_login_count, continual_login_count, max_continual_login_count,
|
|
last_login_datetime, last_comeback_login_datetime, latest_version FROM user_login WHERE user_id=?`, uid).
|
|
Scan(&u.Login.TotalLoginCount, &u.Login.ContinualLoginCount, &u.Login.MaxContinualLoginCount,
|
|
&u.Login.LastLoginDatetime, &u.Login.LastComebackLoginDatetime, &u.Login.LatestVersion)
|
|
|
|
_ = db.QueryRow(`SELECT login_bonus_id, current_page_number, current_stamp_number,
|
|
latest_reward_receive_datetime, latest_version FROM user_login_bonus WHERE user_id=?`, uid).
|
|
Scan(&u.LoginBonus.LoginBonusId, &u.LoginBonus.CurrentPageNumber, &u.LoginBonus.CurrentStampNumber,
|
|
&u.LoginBonus.LatestRewardReceiveDatetime, &u.LoginBonus.LatestVersion)
|
|
|
|
_ = db.QueryRow(`SELECT current_quest_flow_type, current_main_quest_route_id, current_quest_scene_id,
|
|
head_quest_scene_id, is_reached_last_quest_scene, progress_quest_scene_id, progress_head_quest_scene_id,
|
|
progress_quest_flow_type, main_quest_season_id, latest_version, saved_current_quest_scene_id,
|
|
saved_head_quest_scene_id, replay_flow_current_quest_scene_id, replay_flow_head_quest_scene_id
|
|
FROM user_main_quest WHERE user_id=?`, uid).
|
|
Scan(&u.MainQuest.CurrentQuestFlowType, &u.MainQuest.CurrentMainQuestRouteId, &u.MainQuest.CurrentQuestSceneId,
|
|
&u.MainQuest.HeadQuestSceneId, &b, &u.MainQuest.ProgressQuestSceneId, &u.MainQuest.ProgressHeadQuestSceneId,
|
|
&u.MainQuest.ProgressQuestFlowType, &u.MainQuest.MainQuestSeasonId, &u.MainQuest.LatestVersion,
|
|
&u.MainQuest.SavedCurrentQuestSceneId, &u.MainQuest.SavedHeadQuestSceneId,
|
|
&u.MainQuest.ReplayFlowCurrentQuestSceneId, &u.MainQuest.ReplayFlowHeadQuestSceneId)
|
|
u.MainQuest.IsReachedLastQuestScene = b != 0
|
|
|
|
_ = db.QueryRow(`SELECT current_event_quest_chapter_id, current_quest_id, current_quest_scene_id,
|
|
head_quest_scene_id, latest_version FROM user_event_quest WHERE user_id=?`, uid).
|
|
Scan(&u.EventQuest.CurrentEventQuestChapterId, &u.EventQuest.CurrentQuestId,
|
|
&u.EventQuest.CurrentQuestSceneId, &u.EventQuest.HeadQuestSceneId, &u.EventQuest.LatestVersion)
|
|
|
|
_ = db.QueryRow(`SELECT current_quest_id, current_quest_scene_id, head_quest_scene_id, latest_version
|
|
FROM user_extra_quest WHERE user_id=?`, uid).
|
|
Scan(&u.ExtraQuest.CurrentQuestId, &u.ExtraQuest.CurrentQuestSceneId,
|
|
&u.ExtraQuest.HeadQuestSceneId, &u.ExtraQuest.LatestVersion)
|
|
|
|
_ = db.QueryRow(`SELECT current_side_story_quest_id, current_side_story_quest_scene_id, latest_version
|
|
FROM user_side_story_active WHERE user_id=?`, uid).
|
|
Scan(&u.SideStoryActiveProgress.CurrentSideStoryQuestId,
|
|
&u.SideStoryActiveProgress.CurrentSideStoryQuestSceneId, &u.SideStoryActiveProgress.LatestVersion)
|
|
|
|
var isDryRun int
|
|
_ = db.QueryRow(`SELECT current_big_hunt_boss_quest_id, current_big_hunt_quest_id, current_quest_scene_id,
|
|
is_dry_run, latest_version, deck_type, user_triple_deck_number, boss_knock_down_count,
|
|
max_combo_count, total_damage, deck_number, battle_binary
|
|
FROM user_big_hunt_state WHERE user_id=?`, uid).
|
|
Scan(&u.BigHuntProgress.CurrentBigHuntBossQuestId, &u.BigHuntProgress.CurrentBigHuntQuestId,
|
|
&u.BigHuntProgress.CurrentQuestSceneId, &isDryRun, &u.BigHuntProgress.LatestVersion,
|
|
&u.BigHuntBattleDetail.DeckType, &u.BigHuntBattleDetail.UserTripleDeckNumber,
|
|
&u.BigHuntBattleDetail.BossKnockDownCount, &u.BigHuntBattleDetail.MaxComboCount,
|
|
&u.BigHuntBattleDetail.TotalDamage, &u.BigHuntDeckNumber, &u.BigHuntBattleBinary)
|
|
u.BigHuntProgress.IsDryRun = isDryRun != 0
|
|
|
|
var isActive, isUnread int
|
|
_ = db.QueryRow(`SELECT is_active, start_count, finish_count, last_started_at, last_finished_at,
|
|
last_user_party_count, last_npc_party_count, last_battle_binary_size, last_elapsed_frame_count
|
|
FROM user_battle WHERE user_id=?`, uid).
|
|
Scan(&isActive, &u.Battle.StartCount, &u.Battle.FinishCount, &u.Battle.LastStartedAt,
|
|
&u.Battle.LastFinishedAt, &u.Battle.LastUserPartyCount, &u.Battle.LastNpcPartyCount,
|
|
&u.Battle.LastBattleBinarySize, &u.Battle.LastElapsedFrameCount)
|
|
u.Battle.IsActive = isActive != 0
|
|
|
|
_ = db.QueryRow(`SELECT gift_not_receive_count, friend_request_receive_count, is_exist_unread_information
|
|
FROM user_notification WHERE user_id=?`, uid).
|
|
Scan(&u.Notifications.GiftNotReceiveCount, &u.Notifications.FriendRequestReceiveCount, &isUnread)
|
|
u.Notifications.IsExistUnreadInformation = isUnread != 0
|
|
|
|
var isCP int
|
|
_ = db.QueryRow(`SELECT is_current_progress, drop_item_start_datetime, current_drop_item_count, latest_version
|
|
FROM user_portal_cage WHERE user_id=?`, uid).
|
|
Scan(&isCP, &u.PortalCageStatus.DropItemStartDatetime, &u.PortalCageStatus.CurrentDropItemCount,
|
|
&u.PortalCageStatus.LatestVersion)
|
|
u.PortalCageStatus.IsCurrentProgress = isCP != 0
|
|
|
|
_ = db.QueryRow(`SELECT start_datetime, open_minutes, daily_opened_count, latest_version
|
|
FROM user_guerrilla_free_open WHERE user_id=?`, uid).
|
|
Scan(&u.GuerrillaFreeOpen.StartDatetime, &u.GuerrillaFreeOpen.OpenMinutes,
|
|
&u.GuerrillaFreeOpen.DailyOpenedCount, &u.GuerrillaFreeOpen.LatestVersion)
|
|
|
|
var isTicket int
|
|
_ = db.QueryRow(`SELECT is_use_explore_ticket, playing_explore_id, latest_play_datetime, latest_version
|
|
FROM user_explore WHERE user_id=?`, uid).
|
|
Scan(&isTicket, &u.Explore.PlayingExploreId, &u.Explore.LatestPlayDatetime, &u.Explore.LatestVersion)
|
|
u.Explore.IsUseExploreTicket = isTicket != 0
|
|
|
|
_ = db.QueryRow(`SELECT lineup_update_count, latest_lineup_update_datetime, latest_version
|
|
FROM user_shop_replaceable WHERE user_id=?`, uid).
|
|
Scan(&u.ShopReplaceable.LineupUpdateCount, &u.ShopReplaceable.LatestLineupUpdateDatetime,
|
|
&u.ShopReplaceable.LatestVersion)
|
|
|
|
var rewardAvail int
|
|
var obtainItemId, obtainCount sql.NullInt64
|
|
_ = db.QueryRow(`SELECT reward_available, todays_current_draw_count, daily_max_count,
|
|
last_reward_draw_date, obtain_consumable_item_id, obtain_count
|
|
FROM user_gacha WHERE user_id=?`, uid).
|
|
Scan(&rewardAvail, &u.Gacha.TodaysCurrentDrawCount, &u.Gacha.DailyMaxCount,
|
|
&u.Gacha.LastRewardDrawDate, &obtainItemId, &obtainCount)
|
|
u.Gacha.RewardAvailable = rewardAvail != 0
|
|
if obtainItemId.Valid {
|
|
u.Gacha.ConvertedGachaMedal.ObtainPossession = &store.ConsumableItemState{
|
|
ConsumableItemId: int32(obtainItemId.Int64),
|
|
Count: int32(obtainCount.Int64),
|
|
}
|
|
}
|
|
}
|
|
|
|
func loadMapTables(db *sql.DB, uid int64, u *store.UserState) {
|
|
queryRows(db, `SELECT character_id, level, exp, latest_version FROM user_characters WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.CharacterState
|
|
rows.Scan(&v.CharacterId, &v.Level, &v.Exp, &v.LatestVersion)
|
|
u.Characters[v.CharacterId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_costume_uuid, costume_id, limit_break_count, level, exp,
|
|
headup_display_view_id, acquisition_datetime, awaken_count,
|
|
costume_lottery_effect_unlocked_slot_count, latest_version
|
|
FROM user_costumes WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.CostumeState
|
|
rows.Scan(&v.UserCostumeUuid, &v.CostumeId, &v.LimitBreakCount, &v.Level, &v.Exp,
|
|
&v.HeadupDisplayViewId, &v.AcquisitionDatetime, &v.AwakenCount,
|
|
&v.CostumeLotteryEffectUnlockedSlotCount, &v.LatestVersion)
|
|
u.Costumes[v.UserCostumeUuid] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_weapon_uuid, weapon_id, level, exp, limit_break_count,
|
|
is_protected, acquisition_datetime, latest_version FROM user_weapons WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.WeaponState
|
|
var prot int
|
|
rows.Scan(&v.UserWeaponUuid, &v.WeaponId, &v.Level, &v.Exp, &v.LimitBreakCount,
|
|
&prot, &v.AcquisitionDatetime, &v.LatestVersion)
|
|
v.IsProtected = prot != 0
|
|
u.Weapons[v.UserWeaponUuid] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_companion_uuid, companion_id, headup_display_view_id, level,
|
|
acquisition_datetime, latest_version FROM user_companions WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.CompanionState
|
|
rows.Scan(&v.UserCompanionUuid, &v.CompanionId, &v.HeadupDisplayViewId, &v.Level,
|
|
&v.AcquisitionDatetime, &v.LatestVersion)
|
|
u.Companions[v.UserCompanionUuid] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_thought_uuid, thought_id, acquisition_datetime, latest_version
|
|
FROM user_thoughts WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.ThoughtState
|
|
rows.Scan(&v.UserThoughtUuid, &v.ThoughtId, &v.AcquisitionDatetime, &v.LatestVersion)
|
|
u.Thoughts[v.UserThoughtUuid] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_deck_character_uuid, user_costume_uuid, main_user_weapon_uuid,
|
|
user_companion_uuid, power, user_thought_uuid, dressup_costume_id, latest_version
|
|
FROM user_deck_characters WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.DeckCharacterState
|
|
rows.Scan(&v.UserDeckCharacterUuid, &v.UserCostumeUuid, &v.MainUserWeaponUuid,
|
|
&v.UserCompanionUuid, &v.Power, &v.UserThoughtUuid, &v.DressupCostumeId, &v.LatestVersion)
|
|
u.DeckCharacters[v.UserDeckCharacterUuid] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT deck_type, user_deck_number, user_deck_character_uuid01, user_deck_character_uuid02,
|
|
user_deck_character_uuid03, name, power, latest_version FROM user_decks WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.DeckState
|
|
var dt int32
|
|
rows.Scan(&dt, &v.UserDeckNumber, &v.UserDeckCharacterUuid01, &v.UserDeckCharacterUuid02,
|
|
&v.UserDeckCharacterUuid03, &v.Name, &v.Power, &v.LatestVersion)
|
|
v.DeckType = model.DeckType(dt)
|
|
u.Decks[store.DeckKey{DeckType: v.DeckType, UserDeckNumber: v.UserDeckNumber}] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_deck_character_uuid, ordinal, user_weapon_uuid
|
|
FROM user_deck_sub_weapons WHERE user_id=? ORDER BY user_deck_character_uuid, ordinal`, uid,
|
|
func(rows *sql.Rows) {
|
|
var key, val string
|
|
var ord int
|
|
rows.Scan(&key, &ord, &val)
|
|
u.DeckSubWeapons[key] = append(u.DeckSubWeapons[key], val)
|
|
})
|
|
|
|
queryRows(db, `SELECT user_deck_character_uuid, ordinal, user_parts_uuid
|
|
FROM user_deck_parts WHERE user_id=? ORDER BY user_deck_character_uuid, ordinal`, uid,
|
|
func(rows *sql.Rows) {
|
|
var key, val string
|
|
var ord int
|
|
rows.Scan(&key, &ord, &val)
|
|
u.DeckParts[key] = append(u.DeckParts[key], val)
|
|
})
|
|
|
|
queryRows(db, `SELECT quest_id, quest_state_type, is_battle_only, user_deck_number, latest_start_datetime,
|
|
clear_count, daily_clear_count, last_clear_datetime, shortest_clear_frames, is_reward_granted, latest_version
|
|
FROM user_quests WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.UserQuestState
|
|
var bo, rg int
|
|
rows.Scan(&v.QuestId, &v.QuestStateType, &bo, &v.UserDeckNumber, &v.LatestStartDatetime,
|
|
&v.ClearCount, &v.DailyClearCount, &v.LastClearDatetime, &v.ShortestClearFrames, &rg, &v.LatestVersion)
|
|
v.IsBattleOnly = bo != 0
|
|
v.IsRewardGranted = rg != 0
|
|
u.Quests[v.QuestId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT quest_id, quest_mission_id, progress_value, is_clear, latest_clear_datetime, latest_version
|
|
FROM user_quest_missions WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.UserQuestMissionState
|
|
var ic int
|
|
rows.Scan(&v.QuestId, &v.QuestMissionId, &v.ProgressValue, &ic, &v.LatestClearDatetime, &v.LatestVersion)
|
|
v.IsClear = ic != 0
|
|
u.QuestMissions[store.QuestMissionKey{QuestId: v.QuestId, QuestMissionId: v.QuestMissionId}] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT mission_id, start_datetime, progress_value, mission_progress_status_type,
|
|
clear_datetime, latest_version FROM user_missions WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.UserMissionState
|
|
rows.Scan(&v.MissionId, &v.StartDatetime, &v.ProgressValue, &v.MissionProgressStatusType,
|
|
&v.ClearDatetime, &v.LatestVersion)
|
|
u.Missions[v.MissionId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT tutorial_type, progress_phase, choice_id, latest_version
|
|
FROM user_tutorials WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.TutorialProgressState
|
|
rows.Scan(&v.TutorialType, &v.ProgressPhase, &v.ChoiceId, &v.LatestVersion)
|
|
u.Tutorials[v.TutorialType] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT side_story_quest_id, head_side_story_quest_scene_id, side_story_quest_state_type, latest_version
|
|
FROM user_side_story_quests WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var id, head, st int32
|
|
var lv int64
|
|
rows.Scan(&id, &head, &st, &lv)
|
|
u.SideStoryQuests[id] = store.SideStoryQuestProgress{
|
|
HeadSideStoryQuestSceneId: head, SideStoryQuestStateType: model.SideStoryQuestStateType(st), LatestVersion: lv,
|
|
}
|
|
})
|
|
|
|
queryRows(db, `SELECT limit_content_id, limit_content_quest_status_type, event_quest_chapter_id, latest_version
|
|
FROM user_quest_limit_content_status WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var id int32
|
|
var v store.QuestLimitContentStatus
|
|
rows.Scan(&id, &v.LimitContentQuestStatusType, &v.EventQuestChapterId, &v.LatestVersion)
|
|
u.QuestLimitContentStatus[id] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT weapon_id, released_max_story_index, latest_version FROM user_weapon_stories WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.WeaponStoryState
|
|
rows.Scan(&v.WeaponId, &v.ReleasedMaxStoryIndex, &v.LatestVersion)
|
|
u.WeaponStories[v.WeaponId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT weapon_id, max_level, max_limit_break_count, first_acquisition_datetime, latest_version
|
|
FROM user_weapon_notes WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.WeaponNoteState
|
|
rows.Scan(&v.WeaponId, &v.MaxLevel, &v.MaxLimitBreakCount, &v.FirstAcquisitionDatetime, &v.LatestVersion)
|
|
u.WeaponNotes[v.WeaponId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_weapon_uuid, slot_number, level FROM user_weapon_skills WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.WeaponSkillState
|
|
rows.Scan(&v.UserWeaponUuid, &v.SlotNumber, &v.Level)
|
|
u.WeaponSkills[v.UserWeaponUuid] = append(u.WeaponSkills[v.UserWeaponUuid], v)
|
|
})
|
|
|
|
queryRows(db, `SELECT user_weapon_uuid, slot_number, level FROM user_weapon_abilities WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.WeaponAbilityState
|
|
rows.Scan(&v.UserWeaponUuid, &v.SlotNumber, &v.Level)
|
|
u.WeaponAbilities[v.UserWeaponUuid] = append(u.WeaponAbilities[v.UserWeaponUuid], v)
|
|
})
|
|
|
|
queryRows(db, `SELECT user_weapon_uuid, latest_version FROM user_weapon_awakens WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.WeaponAwakenState
|
|
rows.Scan(&v.UserWeaponUuid, &v.LatestVersion)
|
|
u.WeaponAwakens[v.UserWeaponUuid] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_costume_uuid, level, acquisition_datetime, latest_version
|
|
FROM user_costume_active_skills WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.CostumeActiveSkillState
|
|
rows.Scan(&v.UserCostumeUuid, &v.Level, &v.AcquisitionDatetime, &v.LatestVersion)
|
|
u.CostumeActiveSkills[v.UserCostumeUuid] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_costume_uuid, status_calculation_type, hp, attack, vitality, agility,
|
|
critical_ratio, critical_attack, latest_version FROM user_costume_awaken_status_ups WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.CostumeAwakenStatusUpState
|
|
var sct int32
|
|
rows.Scan(&v.UserCostumeUuid, &sct, &v.Hp, &v.Attack, &v.Vitality, &v.Agility,
|
|
&v.CriticalRatio, &v.CriticalAttack, &v.LatestVersion)
|
|
v.StatusCalculationType = model.StatusCalculationType(sct)
|
|
u.CostumeAwakenStatusUps[store.CostumeAwakenStatusKey{
|
|
UserCostumeUuid: v.UserCostumeUuid, StatusCalculationType: v.StatusCalculationType,
|
|
}] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_costume_uuid, slot_number, odds_number, latest_version
|
|
FROM user_costume_lottery_effects WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.CostumeLotteryEffectState
|
|
rows.Scan(&v.UserCostumeUuid, &v.SlotNumber, &v.OddsNumber, &v.LatestVersion)
|
|
u.CostumeLotteryEffects[store.CostumeLotteryEffectKey{
|
|
UserCostumeUuid: v.UserCostumeUuid, SlotNumber: v.SlotNumber,
|
|
}] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_costume_uuid, slot_number, odds_number, latest_version
|
|
FROM user_costume_lottery_effect_pending WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.CostumeLotteryEffectPendingState
|
|
rows.Scan(&v.UserCostumeUuid, &v.SlotNumber, &v.OddsNumber, &v.LatestVersion)
|
|
u.CostumeLotteryEffectPending[v.UserCostumeUuid] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_parts_uuid, parts_id, level, parts_status_main_id, is_protected,
|
|
acquisition_datetime, latest_version FROM user_parts WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.PartsState
|
|
var prot int
|
|
rows.Scan(&v.UserPartsUuid, &v.PartsId, &v.Level, &v.PartsStatusMainId, &prot,
|
|
&v.AcquisitionDatetime, &v.LatestVersion)
|
|
v.IsProtected = prot != 0
|
|
u.Parts[v.UserPartsUuid] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT parts_group_id, first_acquisition_datetime, latest_version
|
|
FROM user_parts_group_notes WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.PartsGroupNoteState
|
|
rows.Scan(&v.PartsGroupId, &v.FirstAcquisitionDatetime, &v.LatestVersion)
|
|
u.PartsGroupNotes[v.PartsGroupId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT user_parts_preset_number, user_parts_uuid01, user_parts_uuid02, user_parts_uuid03,
|
|
name, user_parts_preset_tag_number, latest_version FROM user_parts_presets WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.PartsPresetState
|
|
rows.Scan(&v.UserPartsPresetNumber, &v.UserPartsUuid01, &v.UserPartsUuid02, &v.UserPartsUuid03,
|
|
&v.Name, &v.UserPartsPresetTagNumber, &v.LatestVersion)
|
|
u.PartsPresets[v.UserPartsPresetNumber] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT deck_type, max_deck_power, latest_version FROM user_deck_type_notes WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var dt int32
|
|
var v store.DeckTypeNoteState
|
|
rows.Scan(&dt, &v.MaxDeckPower, &v.LatestVersion)
|
|
v.DeckType = model.DeckType(dt)
|
|
u.DeckTypeNotes[v.DeckType] = v
|
|
})
|
|
|
|
loadSimpleMap(db, uid, `SELECT consumable_item_id, count FROM user_consumable_items WHERE user_id=?`, u.ConsumableItems)
|
|
loadSimpleMap(db, uid, `SELECT material_id, count FROM user_materials WHERE user_id=?`, u.Materials)
|
|
loadSimpleMap(db, uid, `SELECT important_item_id, count FROM user_important_items WHERE user_id=?`, u.ImportantItems)
|
|
|
|
queryRows(db, `SELECT premium_item_id, count FROM user_premium_items WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var k int32
|
|
var v int64
|
|
rows.Scan(&k, &v)
|
|
u.PremiumItems[k] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT explore_id, max_score, max_score_update_datetime, latest_version
|
|
FROM user_explore_scores WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.ExploreScoreState
|
|
rows.Scan(&v.ExploreId, &v.MaxScore, &v.MaxScoreUpdateDatetime, &v.LatestVersion)
|
|
u.ExploreScores[v.ExploreId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT possession_auto_sale_item_type, possession_auto_sale_item_value
|
|
FROM user_auto_sale_settings WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.AutoSaleSettingState
|
|
rows.Scan(&v.PossessionAutoSaleItemType, &v.PossessionAutoSaleItemValue)
|
|
u.AutoSaleSettings[v.PossessionAutoSaleItemType] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT navi_cutin_id FROM user_navi_cutin_played WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var id int32
|
|
rows.Scan(&id)
|
|
u.NaviCutInPlayed[id] = true
|
|
})
|
|
|
|
loadTimestampMap(db, uid, `SELECT movie_id, timestamp FROM user_viewed_movies WHERE user_id=?`, u.ViewedMovies)
|
|
loadTimestampMap(db, uid, `SELECT contents_story_id, timestamp FROM user_contents_stories WHERE user_id=?`, u.ContentsStories)
|
|
loadTimestampMap(db, uid, `SELECT omikuji_id, timestamp FROM user_drawn_omikuji WHERE user_id=?`, u.DrawnOmikuji)
|
|
|
|
queryRows(db, `SELECT dokan_id FROM user_dokan_confirmed WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var id int32
|
|
rows.Scan(&id)
|
|
u.DokanConfirmed[id] = true
|
|
})
|
|
|
|
// Gifts
|
|
queryRows(db, `SELECT user_gift_uuid, is_received, possession_type, possession_id, count, grant_datetime,
|
|
description_gift_text_id, equipment_data, expiration_datetime, received_datetime
|
|
FROM user_gifts WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var uuid string
|
|
var isRecv int
|
|
var gc store.GiftCommonState
|
|
var expDt, recvDt sql.NullInt64
|
|
var equipData []byte
|
|
rows.Scan(&uuid, &isRecv, &gc.PossessionType, &gc.PossessionId, &gc.Count, &gc.GrantDatetime,
|
|
&gc.DescriptionGiftTextId, &equipData, &expDt, &recvDt)
|
|
gc.EquipmentData = equipData
|
|
if isRecv == 0 {
|
|
u.Gifts.NotReceived = append(u.Gifts.NotReceived, store.NotReceivedGiftState{
|
|
GiftCommon: gc, ExpirationDatetime: expDt.Int64, UserGiftUuid: uuid,
|
|
})
|
|
} else {
|
|
u.Gifts.Received = append(u.Gifts.Received, store.ReceivedGiftState{
|
|
GiftCommon: gc, ReceivedDatetime: recvDt.Int64,
|
|
})
|
|
}
|
|
})
|
|
|
|
// Gacha converted medals
|
|
queryRows(db, `SELECT consumable_item_id, count FROM user_gacha_converted_medals WHERE user_id=? ORDER BY ordinal`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.ConsumableItemState
|
|
rows.Scan(&v.ConsumableItemId, &v.Count)
|
|
u.Gacha.ConvertedGachaMedal.ConvertedMedalPossession = append(u.Gacha.ConvertedGachaMedal.ConvertedMedalPossession, v)
|
|
})
|
|
|
|
// Gacha banners
|
|
queryRows(db, `SELECT gacha_id, medal_count, step_number, loop_count, draw_count, box_number
|
|
FROM user_gacha_banners WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.GachaBannerState
|
|
rows.Scan(&v.GachaId, &v.MedalCount, &v.StepNumber, &v.LoopCount, &v.DrawCount, &v.BoxNumber)
|
|
v.BoxDrewCounts = make(map[int32]int32)
|
|
u.Gacha.BannerStates[v.GachaId] = v
|
|
})
|
|
queryRows(db, `SELECT gacha_id, box_item_id, count FROM user_gacha_banner_box_drew_counts WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var gachaId, boxItemId, count int32
|
|
rows.Scan(&gachaId, &boxItemId, &count)
|
|
if bs, ok := u.Gacha.BannerStates[gachaId]; ok {
|
|
bs.BoxDrewCounts[boxItemId] = count
|
|
u.Gacha.BannerStates[gachaId] = bs
|
|
}
|
|
})
|
|
|
|
// Character boards
|
|
queryRows(db, `SELECT character_board_id, panel_release_bit1, panel_release_bit2, panel_release_bit3,
|
|
panel_release_bit4, latest_version FROM user_character_boards WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.CharacterBoardState
|
|
rows.Scan(&v.CharacterBoardId, &v.PanelReleaseBit1, &v.PanelReleaseBit2,
|
|
&v.PanelReleaseBit3, &v.PanelReleaseBit4, &v.LatestVersion)
|
|
u.CharacterBoards[v.CharacterBoardId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT character_id, ability_id, level, latest_version
|
|
FROM user_character_board_abilities WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.CharacterBoardAbilityState
|
|
rows.Scan(&v.CharacterId, &v.AbilityId, &v.Level, &v.LatestVersion)
|
|
u.CharacterBoardAbilities[store.CharacterBoardAbilityKey{CharacterId: v.CharacterId, AbilityId: v.AbilityId}] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT character_id, status_calculation_type, hp, attack, vitality, agility,
|
|
critical_ratio, critical_attack, latest_version FROM user_character_board_status_ups WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.CharacterBoardStatusUpState
|
|
rows.Scan(&v.CharacterId, &v.StatusCalculationType, &v.Hp, &v.Attack, &v.Vitality, &v.Agility,
|
|
&v.CriticalRatio, &v.CriticalAttack, &v.LatestVersion)
|
|
u.CharacterBoardStatusUps[store.CharacterBoardStatusUpKey{
|
|
CharacterId: v.CharacterId, StatusCalculationType: v.StatusCalculationType,
|
|
}] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT character_id, rebirth_count, latest_version FROM user_character_rebirths WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.CharacterRebirthState
|
|
rows.Scan(&v.CharacterId, &v.RebirthCount, &v.LatestVersion)
|
|
u.CharacterRebirths[v.CharacterId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT cage_ornament_id, acquisition_datetime, latest_version
|
|
FROM user_cage_ornament_rewards WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.CageOrnamentRewardState
|
|
rows.Scan(&v.CageOrnamentId, &v.AcquisitionDatetime, &v.LatestVersion)
|
|
u.CageOrnamentRewards[v.CageOrnamentId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT shop_item_id, bought_count, latest_bought_count_changed_datetime, latest_version
|
|
FROM user_shop_items WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.UserShopItemState
|
|
rows.Scan(&v.ShopItemId, &v.BoughtCount, &v.LatestBoughtCountChangedDatetime, &v.LatestVersion)
|
|
u.ShopItems[v.ShopItemId] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT slot_number, shop_item_id, latest_version FROM user_shop_replaceable_lineup WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.UserShopReplaceableLineupState
|
|
rows.Scan(&v.SlotNumber, &v.ShopItemId, &v.LatestVersion)
|
|
u.ShopReplaceableLineup[v.SlotNumber] = v
|
|
})
|
|
|
|
// Gimmick tables
|
|
queryRows(db, `SELECT gimmick_sequence_schedule_id, gimmick_sequence_id, gimmick_id,
|
|
is_gimmick_cleared, start_datetime, latest_version FROM user_gimmick_progress WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.GimmickProgressState
|
|
var ic int
|
|
rows.Scan(&v.Key.GimmickSequenceScheduleId, &v.Key.GimmickSequenceId, &v.Key.GimmickId,
|
|
&ic, &v.StartDatetime, &v.LatestVersion)
|
|
v.IsGimmickCleared = ic != 0
|
|
u.Gimmick.Progress[v.Key] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT gimmick_sequence_schedule_id, gimmick_sequence_id, gimmick_id,
|
|
gimmick_ornament_index, progress_value_bit, base_datetime, latest_version
|
|
FROM user_gimmick_ornament_progress WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var v store.GimmickOrnamentProgressState
|
|
rows.Scan(&v.Key.GimmickSequenceScheduleId, &v.Key.GimmickSequenceId, &v.Key.GimmickId,
|
|
&v.Key.GimmickOrnamentIndex, &v.ProgressValueBit, &v.BaseDatetime, &v.LatestVersion)
|
|
u.Gimmick.OrnamentProgress[v.Key] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT gimmick_sequence_schedule_id, gimmick_sequence_id,
|
|
is_gimmick_sequence_cleared, clear_datetime, latest_version FROM user_gimmick_sequences WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.GimmickSequenceState
|
|
var ic int
|
|
rows.Scan(&v.Key.GimmickSequenceScheduleId, &v.Key.GimmickSequenceId,
|
|
&ic, &v.ClearDatetime, &v.LatestVersion)
|
|
v.IsGimmickSequenceCleared = ic != 0
|
|
u.Gimmick.Sequences[v.Key] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT gimmick_sequence_schedule_id, gimmick_sequence_id, gimmick_id,
|
|
is_unlocked, latest_version FROM user_gimmick_unlocks WHERE user_id=?`, uid,
|
|
func(rows *sql.Rows) {
|
|
var v store.GimmickUnlockState
|
|
var iu int
|
|
rows.Scan(&v.Key.GimmickSequenceScheduleId, &v.Key.GimmickSequenceId, &v.Key.GimmickId,
|
|
&iu, &v.LatestVersion)
|
|
v.IsUnlocked = iu != 0
|
|
u.Gimmick.Unlocks[v.Key] = v
|
|
})
|
|
|
|
// Big hunt maps
|
|
queryRows(db, `SELECT big_hunt_boss_id, max_score, max_score_update_datetime, latest_version
|
|
FROM user_big_hunt_max_scores WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var id int32
|
|
var v store.BigHuntMaxScore
|
|
rows.Scan(&id, &v.MaxScore, &v.MaxScoreUpdateDatetime, &v.LatestVersion)
|
|
u.BigHuntMaxScores[id] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT big_hunt_boss_id, daily_challenge_count, latest_challenge_datetime, latest_version
|
|
FROM user_big_hunt_statuses WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var id int32
|
|
var v store.BigHuntStatus
|
|
rows.Scan(&id, &v.DailyChallengeCount, &v.LatestChallengeDatetime, &v.LatestVersion)
|
|
u.BigHuntStatuses[id] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT big_hunt_schedule_id, big_hunt_boss_id, max_score, max_score_update_datetime, latest_version
|
|
FROM user_big_hunt_schedule_max_scores WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var k store.BigHuntScheduleScoreKey
|
|
var v store.BigHuntScheduleMaxScore
|
|
rows.Scan(&k.BigHuntScheduleId, &k.BigHuntBossId, &v.MaxScore, &v.MaxScoreUpdateDatetime, &v.LatestVersion)
|
|
u.BigHuntScheduleMaxScores[k] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT big_hunt_weekly_version, attribute_type, max_score, latest_version
|
|
FROM user_big_hunt_weekly_max_scores WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var k store.BigHuntWeeklyScoreKey
|
|
var v store.BigHuntWeeklyMaxScore
|
|
rows.Scan(&k.BigHuntWeeklyVersion, &k.AttributeType, &v.MaxScore, &v.LatestVersion)
|
|
u.BigHuntWeeklyMaxScores[k] = v
|
|
})
|
|
|
|
queryRows(db, `SELECT big_hunt_weekly_version, is_received_weekly_reward, latest_version
|
|
FROM user_big_hunt_weekly_statuses WHERE user_id=?`, uid, func(rows *sql.Rows) {
|
|
var ver int64
|
|
var ir int
|
|
var lv int64
|
|
rows.Scan(&ver, &ir, &lv)
|
|
u.BigHuntWeeklyStatuses[ver] = store.BigHuntWeeklyStatus{IsReceivedWeeklyReward: ir != 0, LatestVersion: lv}
|
|
})
|
|
}
|
|
|
|
func queryRows(db *sql.DB, query string, uid int64, scan func(*sql.Rows)) {
|
|
rows, err := db.Query(query, uid)
|
|
if err != nil {
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
scan(rows)
|
|
}
|
|
}
|
|
|
|
func loadSimpleMap(db *sql.DB, uid int64, query string, m map[int32]int32) {
|
|
queryRows(db, query, uid, func(rows *sql.Rows) {
|
|
var k, v int32
|
|
rows.Scan(&k, &v)
|
|
m[k] = v
|
|
})
|
|
}
|
|
|
|
func loadTimestampMap(db *sql.DB, uid int64, query string, m map[int32]int64) {
|
|
queryRows(db, query, uid, func(rows *sql.Rows) {
|
|
var k int32
|
|
var v int64
|
|
rows.Scan(&k, &v)
|
|
m[k] = v
|
|
})
|
|
}
|