+25
-34
@@ -1,7 +1,6 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -18,10 +17,6 @@ import (
|
||||
)
|
||||
|
||||
func AlbumSeriesAllHandler(ctx *gin.Context) {
|
||||
db, err := sql.Open("sqlite3", "assets/main.db")
|
||||
CheckErr(err)
|
||||
defer db.Close()
|
||||
|
||||
reqTime := time.Now().Unix()
|
||||
|
||||
authorizeStr := ctx.Request.Header["Authorize"]
|
||||
@@ -53,26 +48,24 @@ func AlbumSeriesAllHandler(ctx *gin.Context) {
|
||||
newAuthorizeStr := fmt.Sprintf("consumerKey=lovelive_test&timeStamp=%d&version=1.1&token=%s&nonce=%d&user_id=%s&requestTimeStamp=%d", respTime, authToken, nonce, userId[0], reqTime)
|
||||
// fmt.Println(newAuthorizeStr)
|
||||
|
||||
//
|
||||
sql := `SELECT album_series_id FROM album_series_m`
|
||||
seriesRows, err := db.Query(sql)
|
||||
var albumIds []int
|
||||
err = MainEng.Table("album_series_m").Select("album_series_id").Find(&albumIds)
|
||||
CheckErr(err)
|
||||
albumSeriesAllResp := []model.AlbumSeriesResp{}
|
||||
for seriesRows.Next() {
|
||||
var series int
|
||||
err = seriesRows.Scan(&series)
|
||||
// fmt.Println(albumIds)
|
||||
|
||||
albumSeriesAllRes := []model.AlbumSeriesRes{}
|
||||
for _, albumId := range albumIds {
|
||||
AlbumStmt, err := MainEng.DB().Prepare("SELECT unit_id,rarity FROM unit_m WHERE album_series_id = ?")
|
||||
CheckErr(err)
|
||||
defer AlbumStmt.Close()
|
||||
|
||||
rows, err := AlbumStmt.Query(albumId)
|
||||
CheckErr(err)
|
||||
|
||||
albumSeriesAll := []model.AlbumResult{}
|
||||
stmt, err := db.Prepare("SELECT unit_id,rarity FROM unit_m WHERE album_series_id = ?")
|
||||
CheckErr(err)
|
||||
|
||||
unitRows, err := stmt.Query(series)
|
||||
CheckErr(err)
|
||||
|
||||
for unitRows.Next() {
|
||||
for rows.Next() {
|
||||
var unitId, rarity int
|
||||
err = unitRows.Scan(&unitId, &rarity)
|
||||
err = rows.Scan(&unitId, &rarity)
|
||||
CheckErr(err)
|
||||
|
||||
albumSeries := model.AlbumResult{
|
||||
@@ -105,17 +98,15 @@ func AlbumSeriesAllHandler(ctx *gin.Context) {
|
||||
albumSeries.HighestLovePerUnit = 1000
|
||||
|
||||
// IsSigned
|
||||
stmt, err = db.Prepare("SELECT COUNT(*) AS ct FROM unit_sign_asset_m WHERE unit_id = ?")
|
||||
signStmt, err := MainEng.DB().Prepare("SELECT COUNT(*) AS ct FROM unit_sign_asset_m WHERE unit_id = ?")
|
||||
CheckErr(err)
|
||||
signRows, err := stmt.Query(unitId)
|
||||
defer signStmt.Close()
|
||||
|
||||
var count int
|
||||
err = signStmt.QueryRow(unitId).Scan(&count)
|
||||
CheckErr(err)
|
||||
|
||||
ct := 0
|
||||
for signRows.Next() {
|
||||
err = signRows.Scan(&ct)
|
||||
CheckErr(err)
|
||||
}
|
||||
if ct > 0 {
|
||||
if count > 0 {
|
||||
albumSeries.SignFlag = true
|
||||
} else {
|
||||
albumSeries.SignFlag = false
|
||||
@@ -124,15 +115,15 @@ func AlbumSeriesAllHandler(ctx *gin.Context) {
|
||||
|
||||
albumSeriesAll = append(albumSeriesAll, albumSeries)
|
||||
}
|
||||
albumSeriesAllResp = append(albumSeriesAllResp, model.AlbumSeriesResp{
|
||||
SeriesID: series,
|
||||
|
||||
albumSeriesAllRes = append(albumSeriesAllRes, model.AlbumSeriesRes{
|
||||
SeriesID: albumId,
|
||||
UnitList: albumSeriesAll,
|
||||
})
|
||||
}
|
||||
rb, err := json.Marshal(albumSeriesAllResp)
|
||||
CheckErr(err)
|
||||
resp := model.Response{
|
||||
ResponseData: rb,
|
||||
|
||||
resp := model.AlbumSeriesResp{
|
||||
ResponseData: albumSeriesAllRes,
|
||||
ReleaseInfo: []interface{}{},
|
||||
StatusCode: 200,
|
||||
}
|
||||
|
||||
+5
-16
@@ -1,7 +1,6 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -18,10 +17,6 @@ import (
|
||||
)
|
||||
|
||||
func DownloadAdditionalHandler(ctx *gin.Context) {
|
||||
db, err := sql.Open("sqlite3", "assets/main.db")
|
||||
CheckErr(err)
|
||||
defer db.Close()
|
||||
|
||||
reqTime := time.Now().Unix()
|
||||
|
||||
authorizeStr := ctx.Request.Header["Authorize"]
|
||||
@@ -60,8 +55,9 @@ func DownloadAdditionalHandler(ctx *gin.Context) {
|
||||
pkgList := []model.AdditionalResult{}
|
||||
if CdnUrl != "" {
|
||||
pkgType, pkgId := downloadReq.PackageType, downloadReq.PackageID
|
||||
stmt, err := db.Prepare("SELECT pkg_order,pkg_size FROM download_db WHERE pkg_type = ? AND pkg_id = ? ORDER BY pkg_order ASC")
|
||||
stmt, err := MainEng.DB().Prepare("SELECT pkg_order,pkg_size FROM download_db WHERE pkg_type = ? AND pkg_id = ? ORDER BY pkg_order ASC")
|
||||
CheckErr(err)
|
||||
defer stmt.Close()
|
||||
rows, err := stmt.Query(pkgType, pkgId)
|
||||
CheckErr(err)
|
||||
for rows.Next() {
|
||||
@@ -93,10 +89,6 @@ func DownloadAdditionalHandler(ctx *gin.Context) {
|
||||
}
|
||||
|
||||
func DownloadBatchHandler(ctx *gin.Context) {
|
||||
db, err := sql.Open("sqlite3", "assets/main.db")
|
||||
CheckErr(err)
|
||||
defer db.Close()
|
||||
|
||||
reqTime := time.Now().Unix()
|
||||
|
||||
authorizeStr := ctx.Request.Header["Authorize"]
|
||||
@@ -143,8 +135,9 @@ func DownloadBatchHandler(ctx *gin.Context) {
|
||||
exPkgId = fmt.Sprintf("AND pkg_id NOT IN (%s)", exPkgId)
|
||||
}
|
||||
// fmt.Println(exPkgId)
|
||||
stmt, err := db.Prepare("SELECT pkg_id,pkg_order,pkg_size FROM download_db WHERE pkg_type = ? " + exPkgId + " ORDER BY pkg_id ASC, pkg_order ASC")
|
||||
stmt, err := MainEng.DB().Prepare("SELECT pkg_id,pkg_order,pkg_size FROM download_db WHERE pkg_type = ? " + exPkgId + " ORDER BY pkg_id ASC, pkg_order ASC")
|
||||
CheckErr(err)
|
||||
defer stmt.Close()
|
||||
rows, err := stmt.Query(pkgType)
|
||||
CheckErr(err)
|
||||
for rows.Next() {
|
||||
@@ -176,10 +169,6 @@ func DownloadBatchHandler(ctx *gin.Context) {
|
||||
}
|
||||
|
||||
func DownloadUpdateHandler(ctx *gin.Context) {
|
||||
db, err := sql.Open("sqlite3", "assets/main.db")
|
||||
CheckErr(err)
|
||||
defer db.Close()
|
||||
|
||||
reqTime := time.Now().Unix()
|
||||
|
||||
authorizeStr := ctx.Request.Header["Authorize"]
|
||||
@@ -218,7 +207,7 @@ func DownloadUpdateHandler(ctx *gin.Context) {
|
||||
pkgList := []model.UpdateResult{}
|
||||
if downloadReq.ExternalVersion != PackageVersion && CdnUrl != "" {
|
||||
pkgType := 99
|
||||
rows, err := db.Query("SELECT pkg_id,pkg_order,pkg_size FROM download_db WHERE pkg_type = 99 ORDER BY pkg_id ASC, pkg_order ASC")
|
||||
rows, err := MainEng.DB().Query("SELECT pkg_id,pkg_order,pkg_size FROM download_db WHERE pkg_type = 99 ORDER BY pkg_id ASC, pkg_order ASC")
|
||||
CheckErr(err)
|
||||
for rows.Next() {
|
||||
var pkgId, pkgOrder, pkgSize int
|
||||
|
||||
+10
-1
@@ -1,18 +1,27 @@
|
||||
package handler
|
||||
|
||||
import "honoka-chan/config"
|
||||
import (
|
||||
"honoka-chan/config"
|
||||
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
var (
|
||||
nonce = 0
|
||||
PackageVersion = "97.4.6"
|
||||
CdnUrl string
|
||||
ErrorMsg = `{"code":20001,"message":""}`
|
||||
MainEng *xorm.Engine
|
||||
UserEng *xorm.Engine
|
||||
)
|
||||
|
||||
func init() {
|
||||
if config.Conf.Cdn.CdnUrl != "" {
|
||||
CdnUrl = config.Conf.Cdn.CdnUrl
|
||||
}
|
||||
|
||||
MainEng = config.MainEng
|
||||
UserEng = config.UserEng
|
||||
}
|
||||
|
||||
func CheckErr(err error) {
|
||||
|
||||
+6
-37
@@ -1,7 +1,6 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -103,11 +102,6 @@ func PlayLiveHandler(ctx *gin.Context) {
|
||||
newAuthorizeStr := fmt.Sprintf("consumerKey=lovelive_test&timeStamp=%d&version=1.1&token=%s&nonce=%d&user_id=%s&requestTimeStamp=%d", respTime, authToken, nonce, userId[0], reqTime)
|
||||
// fmt.Println(newAuthorizeStr)
|
||||
|
||||
db, err := sql.Open("sqlite3", "assets/main.db")
|
||||
CheckErr(err)
|
||||
defer db.Close()
|
||||
db.SetMaxOpenConns(1)
|
||||
|
||||
tDifficultyId := playReq.LiveDifficultyID
|
||||
difficultyId, err := strconv.Atoi(tDifficultyId)
|
||||
CheckErr(err)
|
||||
@@ -116,15 +110,10 @@ func PlayLiveHandler(ctx *gin.Context) {
|
||||
// Song type: normal / special
|
||||
// sqlite3 doesn't support FULL OUTER JOIN so use UNION ALL here.
|
||||
sql := `SELECT notes_setting_asset,c_rank_score,b_rank_score,a_rank_score,s_rank_score,ac_flag,swing_flag FROM live_setting_m WHERE live_setting_id IN (SELECT live_setting_id FROM normal_live_m WHERE live_difficulty_id = ? UNION ALL SELECT live_setting_id FROM special_live_m WHERE live_difficulty_id = ?)`
|
||||
rows, err := db.Query(sql, difficultyId, difficultyId)
|
||||
CheckErr(err)
|
||||
|
||||
var notes_setting_asset string
|
||||
var c_rank_score, b_rank_score, a_rank_score, s_rank_score, ac_flag, swing_flag int
|
||||
for rows.Next() {
|
||||
err = rows.Scan(¬es_setting_asset, &c_rank_score, &b_rank_score, &a_rank_score, &s_rank_score, &ac_flag, &swing_flag)
|
||||
CheckErr(err)
|
||||
}
|
||||
err = MainEng.DB().QueryRow(sql, difficultyId, difficultyId).Scan(¬es_setting_asset, &c_rank_score, &b_rank_score, &a_rank_score, &s_rank_score, &ac_flag, &swing_flag)
|
||||
CheckErr(err)
|
||||
|
||||
// fmt.Println(notes_setting_asset)
|
||||
// fmt.Println(c_rank_score, b_rank_score, a_rank_score, s_rank_score)
|
||||
@@ -307,11 +296,6 @@ func PlayScoreHandler(ctx *gin.Context) {
|
||||
newAuthorizeStr := fmt.Sprintf("consumerKey=lovelive_test&timeStamp=%d&version=1.1&token=%s&nonce=%d&user_id=%s&requestTimeStamp=%d", respTime, authToken, nonce, userId[0], reqTime)
|
||||
// fmt.Println(newAuthorizeStr)
|
||||
|
||||
db, err := sql.Open("sqlite3", "assets/main.db")
|
||||
CheckErr(err)
|
||||
defer db.Close()
|
||||
db.SetMaxOpenConns(1)
|
||||
|
||||
tDifficultyId := playScoreReq.LiveDifficultyID
|
||||
difficultyId, err := strconv.Atoi(tDifficultyId)
|
||||
CheckErr(err)
|
||||
@@ -319,15 +303,10 @@ func PlayScoreHandler(ctx *gin.Context) {
|
||||
// Song type: normal / special
|
||||
// sqlite3 doesn't support FULL OUTER JOIN so use UNION ALL here.
|
||||
sql := `SELECT notes_setting_asset,c_rank_score,b_rank_score,a_rank_score,s_rank_score,ac_flag,swing_flag FROM live_setting_m WHERE live_setting_id IN (SELECT live_setting_id FROM normal_live_m WHERE live_difficulty_id = ? UNION ALL SELECT live_setting_id FROM special_live_m WHERE live_difficulty_id = ?)`
|
||||
rows, err := db.Query(sql, difficultyId, difficultyId)
|
||||
CheckErr(err)
|
||||
|
||||
var notes_setting_asset string
|
||||
var c_rank_score, b_rank_score, a_rank_score, s_rank_score, ac_flag, swing_flag int
|
||||
for rows.Next() {
|
||||
err = rows.Scan(¬es_setting_asset, &c_rank_score, &b_rank_score, &a_rank_score, &s_rank_score, &ac_flag, &swing_flag)
|
||||
CheckErr(err)
|
||||
}
|
||||
err = MainEng.DB().QueryRow(sql, difficultyId, difficultyId).Scan(¬es_setting_asset, &c_rank_score, &b_rank_score, &a_rank_score, &s_rank_score, &ac_flag, &swing_flag)
|
||||
CheckErr(err)
|
||||
|
||||
// fmt.Println(notes_setting_asset)
|
||||
// fmt.Println(c_rank_score, b_rank_score, a_rank_score, s_rank_score)
|
||||
@@ -446,24 +425,14 @@ func PlayRewardHandler(ctx *gin.Context) {
|
||||
newAuthorizeStr := fmt.Sprintf("consumerKey=lovelive_test&timeStamp=%d&version=1.1&token=%s&nonce=%d&user_id=%s&requestTimeStamp=%d", respTime, authToken, nonce, userId[0], reqTime)
|
||||
// fmt.Println(newAuthorizeStr)
|
||||
|
||||
db, err := sql.Open("sqlite3", "assets/main.db")
|
||||
CheckErr(err)
|
||||
defer db.Close()
|
||||
db.SetMaxOpenConns(1)
|
||||
|
||||
difficultyId := playRewardReq.LiveDifficultyID
|
||||
|
||||
// Song type: normal / special
|
||||
// sqlite3 doesn't support FULL OUTER JOIN so use UNION ALL here.
|
||||
sql := `SELECT c_rank_score,b_rank_score,a_rank_score,s_rank_score,c_rank_combo,b_rank_combo,a_rank_combo,s_rank_combo,ac_flag,swing_flag FROM live_setting_m WHERE live_setting_id IN (SELECT live_setting_id FROM normal_live_m WHERE live_difficulty_id = ? UNION ALL SELECT live_setting_id FROM special_live_m WHERE live_difficulty_id = ?)`
|
||||
rows, err := db.Query(sql, difficultyId, difficultyId)
|
||||
CheckErr(err)
|
||||
|
||||
var c_rank_score, b_rank_score, a_rank_score, s_rank_score, c_rank_combo, b_rank_combo, a_rank_combo, s_rank_combo, ac_flag, swing_flag int
|
||||
for rows.Next() {
|
||||
err = rows.Scan(&c_rank_score, &b_rank_score, &a_rank_score, &s_rank_score, &c_rank_combo, &b_rank_combo, &a_rank_combo, &s_rank_combo, &ac_flag, &swing_flag)
|
||||
CheckErr(err)
|
||||
}
|
||||
err = MainEng.DB().QueryRow(sql, difficultyId, difficultyId).Scan(&c_rank_score, &b_rank_score, &a_rank_score, &s_rank_score, &c_rank_combo, &b_rank_combo, &a_rank_combo, &s_rank_combo, &ac_flag, &swing_flag)
|
||||
CheckErr(err)
|
||||
|
||||
unitsList := []model.PlayRewardUnitList{}
|
||||
deck, err := database.LevelDb.Get([]byte("deck_info"))
|
||||
|
||||
+4
-11
@@ -1,7 +1,6 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -117,19 +116,13 @@ func LoginHandler(ctx *gin.Context) {
|
||||
}
|
||||
nonce++
|
||||
|
||||
db, err := sql.Open("sqlite3", "assets/account.db")
|
||||
stmt, err := UserEng.DB().Prepare("SELECT userid FROM user_key WHERE key = ?")
|
||||
CheckErr(err)
|
||||
defer db.Close()
|
||||
defer stmt.Close()
|
||||
|
||||
stmt, err := db.Prepare("SELECT userid FROM user_key WHERE key = ?")
|
||||
CheckErr(err)
|
||||
rows, err := stmt.Query(string(keyDescrypted))
|
||||
CheckErr(err)
|
||||
var userId int
|
||||
for rows.Next() {
|
||||
err = rows.Scan(&userId)
|
||||
CheckErr(err)
|
||||
}
|
||||
err = stmt.QueryRow(string(keyDescrypted)).Scan(&userId)
|
||||
CheckErr(err)
|
||||
|
||||
if userId == 0 {
|
||||
userId = 9999999
|
||||
|
||||
+31
-36
@@ -1,7 +1,6 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
@@ -222,19 +221,13 @@ func LoginAutoHandler(ctx *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
db, err := sql.Open("sqlite3", "assets/account.db")
|
||||
stmt, err := UserEng.DB().Prepare("SELECT userid,ticket AS ct FROM users WHERE autokey = ?")
|
||||
CheckErr(err)
|
||||
defer db.Close()
|
||||
defer stmt.Close()
|
||||
|
||||
stmt, err := db.Prepare("SELECT userid,ticket AS ct FROM users WHERE autokey = ?")
|
||||
CheckErr(err)
|
||||
rows, err := stmt.Query(autoKey)
|
||||
CheckErr(err)
|
||||
var userid, ticket string
|
||||
for rows.Next() {
|
||||
err = rows.Scan(&userid, &ticket)
|
||||
CheckErr(err)
|
||||
}
|
||||
err = stmt.QueryRow(autoKey).Scan(&userid, &ticket)
|
||||
CheckErr(err)
|
||||
|
||||
var resp string
|
||||
if userid != "" {
|
||||
@@ -320,62 +313,62 @@ func AccountLoginHandler(ctx *gin.Context) {
|
||||
// "userid" INTEGER,
|
||||
// "key" INTEGER
|
||||
// );`
|
||||
db, err := sql.Open("sqlite3", "assets/account.db")
|
||||
stmt, err := UserEng.DB().Prepare("SELECT password,autokey,ticket,userid FROM users WHERE phone = ?")
|
||||
CheckErr(err)
|
||||
defer db.Close()
|
||||
defer stmt.Close()
|
||||
|
||||
stmt, err := db.Prepare("SELECT password,autokey,ticket,userid FROM users WHERE phone = ?")
|
||||
CheckErr(err)
|
||||
rows, err := stmt.Query(phone)
|
||||
CheckErr(err)
|
||||
var pass, autokey, ticket, userid string
|
||||
for rows.Next() {
|
||||
err = rows.Scan(&pass, &autokey, &ticket, &userid)
|
||||
CheckErr(err)
|
||||
}
|
||||
err = stmt.QueryRow(phone).Scan(&pass, &autokey, &ticket, &userid)
|
||||
CheckErr(err)
|
||||
|
||||
loginResp := LoginResp{}
|
||||
loginCode := 0
|
||||
loginMsg := "ok"
|
||||
loginTime := time.Now().Unix()
|
||||
if pass == "" {
|
||||
// 未注册 - 自动注册
|
||||
trans, err := db.Begin()
|
||||
if err != nil {
|
||||
trans.Rollback()
|
||||
session := UserEng.NewSession()
|
||||
defer session.Close()
|
||||
|
||||
if err = session.Begin(); err != nil {
|
||||
session.Rollback()
|
||||
panic(err)
|
||||
}
|
||||
|
||||
pass = openssl.Md5ToString(password)
|
||||
autokey = "AUTO" + strings.ToUpper(utils.RandomStr(32))
|
||||
userid = strconv.Itoa(int(loginTime))
|
||||
ticket = "9999999" + userid + userid
|
||||
stmt, err = trans.Prepare("INSERT INTO users(phone,password,autokey,ticket,userid,last_login_time) VALUES (?,?,?,?,?,?)")
|
||||
userStmt, err := session.DB().Prepare("INSERT INTO users(phone,password,autokey,ticket,userid,last_login_time) VALUES (?,?,?,?,?,?)")
|
||||
if err != nil {
|
||||
trans.Rollback()
|
||||
session.Rollback()
|
||||
panic(err)
|
||||
}
|
||||
_, err = stmt.Exec(phone, pass, autokey, ticket, userid, loginTime)
|
||||
defer userStmt.Close()
|
||||
|
||||
_, err = userStmt.Exec(phone, pass, autokey, ticket, userid, loginTime)
|
||||
if err != nil {
|
||||
trans.Rollback()
|
||||
session.Rollback()
|
||||
panic(err)
|
||||
}
|
||||
// id, _ := res.LastInsertId()
|
||||
// fmt.Println("LastInsertId:", id)
|
||||
|
||||
stmt, err = trans.Prepare("INSERT INTO user_key(userid,key) VALUES(?,?)")
|
||||
keyStmt, err := session.DB().Prepare("INSERT INTO user_key(userid,key) VALUES(?,?)")
|
||||
if err != nil {
|
||||
trans.Rollback()
|
||||
session.Rollback()
|
||||
panic(err)
|
||||
}
|
||||
// 方便起见初始化 userid 和 key 一样
|
||||
// 注意:user_key 表中的 key 是上文生成的用于登录的 userid,而 userid 则是用于 Authorize Token 生成用的
|
||||
_, err = stmt.Exec(userid, userid)
|
||||
_, err = keyStmt.Exec(userid, userid)
|
||||
if err != nil {
|
||||
trans.Rollback()
|
||||
session.Rollback()
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err = trans.Commit(); err != nil {
|
||||
trans.Rollback()
|
||||
if err = session.Commit(); err != nil {
|
||||
session.Rollback()
|
||||
panic(err)
|
||||
}
|
||||
|
||||
@@ -401,9 +394,11 @@ func AccountLoginHandler(ctx *gin.Context) {
|
||||
loginResp.Userid = userid // 实际登录用的账号
|
||||
|
||||
// 更新信息
|
||||
stmt, err = db.Prepare("UPDATE users SET autokey=?,ticket=?,last_login_time=? WHERE userid=?")
|
||||
userStmt, err := UserEng.DB().Prepare("UPDATE users SET autokey=?,ticket=?,last_login_time=? WHERE userid=?")
|
||||
CheckErr(err)
|
||||
_, err := stmt.Exec(autokey, ticket, loginTime, userid)
|
||||
defer userStmt.Close()
|
||||
|
||||
_, err = userStmt.Exec(autokey, ticket, loginTime, userid)
|
||||
CheckErr(err)
|
||||
// aff, _ := res.RowsAffected()
|
||||
// fmt.Println("RowsAffected:", aff)
|
||||
|
||||
Reference in New Issue
Block a user