diff --git a/bcutils.js b/bcutils.js index 924ad26..ed548f2 100644 --- a/bcutils.js +++ b/bcutils.js @@ -8,6 +8,10 @@ const BC_FUNC_BLIND_BOX = 5; const BC_FUNC_PRESENT = 6; const BC_MAX_TOKEN_IDX = 99999; +const BC_TRANSID_MAX_PARAMS_NUM = 3; +const BC_TRANSID_MAX_SEQID = 9999999; +const BC_TRANS_FUNC_ACTIVATE = 11; + const BC_EPOCH = 1643212800; const NONE_TYPE = 0; @@ -62,6 +66,35 @@ function isSameAddress(a, b) { return a.toLowerCase() == b.toLowerCase(); } +/* + max(uint64): 18446744073709551615 = len(20) + max(uint256): 115792089237316195423570985008687907853269984665640564039457584007913129639935 = len(78) + max(int32): 2147483648 = len(10) + len(tokenid) = 16 + transHead: funcId(2)|time(9)|seqId(7) = len(18) + */ + +function genTransId(funcId, time, seqId, params) { + let transId = + utils.pad(funcId, 2) + + utils.pad(toBcTime(time), 9) + + utils.pad(seqId % BC_TRANSID_MAX_SEQID, 7); + params.forEach + ( + (element) => { + transId += utils.pad(element, 20); + } + ); + for (let i = 0; i < BC_TRANSID_MAX_PARAMS_NUM - params.length; ++i) { + transId += utils.pad(0, 20); + } + return transId; +} + +function isValidTransId(transId) { + return utils.isPureNumberStr(transId.toString()) && transId.toString().length == 78; +} + exports.BC_BASE_GAME_ID = BC_BASE_GAME_ID; exports.BC_FUNC_CREATION = BC_FUNC_CREATION; exports.BC_FUNC_GUILD = BC_FUNC_GUILD; @@ -69,11 +102,13 @@ exports.BC_FUNC_BLIND_BOX = BC_FUNC_BLIND_BOX; exports.BC_FUNC_PRESENT = BC_FUNC_PRESENT; exports.BC_EPOCH = BC_EPOCH; exports.BC_MAX_TOKEN_IDX = BC_MAX_TOKEN_IDX; +exports.BC_TRANSID_MAX_PARAMS_NUM = BC_TRANSID_MAX_PARAMS_NUM; +exports.BC_TRANS_FUNC_ACTIVATE = BC_TRANS_FUNC_ACTIVATE; exports.NONE_TYPE = NONE_TYPE; -exports.HERO_TYPE = HERO_TYPE -exports.EQUIP_TYPE = EQUIP_TYPE -exports.CHIP_TYPE = CHIP_TYPE -exports.BLIND_BOX_TYPE = BLIND_BOX_TYPE +exports.HERO_TYPE = HERO_TYPE; +exports.EQUIP_TYPE = EQUIP_TYPE; +exports.CHIP_TYPE = CHIP_TYPE; +exports.BLIND_BOX_TYPE = BLIND_BOX_TYPE; exports.isValidBcGameId = isValidBcGameId; exports.isValidBcTime = isValidBcTime; exports.isValidBcFuncId = isValidBcFuncId; @@ -83,3 +118,5 @@ exports.toNormalAddress = toNormalAddress; exports.genTokenId = genTokenId; exports.isValidTokenId = isValidTokenId; exports.isSameAddress = isSameAddress; +exports.genTransId = genTransId; +exports.isValidTransId = isValidTransId; diff --git a/db.js b/db.js index fe10e5d..0d85eb3 100644 --- a/db.js +++ b/db.js @@ -117,6 +117,38 @@ class DB { return await this.execScript(sql, params); } + async insertEx(tblName, fieldList) { + const params = []; + let sql = 'INSERT INTO `' + tblName + '` ('; + + fieldList.forEach((item, index) => { + const suffix = (index + 1 < fieldList.length ? ',': ''); + sql += '`' + item[0] + '`' + suffix; + }); + + sql += ') VALUES ('; + fieldList.forEach((item, index) => { + const suffix = (index + 1 < fieldList.length ? ',': ''); + sql += '?' + suffix; + params.push(item[1]); + }); + sql += ')'; + + const ret = await this.execScript(sql, params); + ret['last_idx'] = 0; + const {err, row} = await this.execQueryOne( + 'SELECT LAST_INSERT_ID() AS lastId', + [ + ] + ); + if (err) { + ret['err'] = err; + } else { + ret['lastId'] = row['lastId']; + } + return ret; + } + async upsert(tblName, whereList, updateList, insertList, opts = null) { const params = []; let sql = 'SELECT * FROM `' + tblName + '` ';