account_info_db.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. const logger = require('../logger')
  2. var { db_config } = require('../../config/config.js')
  3. const utils = require('../utils.js')
  4. var mysql = require('mysql');
  5. const redis = require("./redis_db") //导入 db.js
  6. var port = db_config.mysql.PORT
  7. var host = db_config.mysql.HOST
  8. var username = db_config.mysql.USERNAME
  9. var password = db_config.mysql.PASSWORD
  10. var database = db_config.mysql.DATABASE_MY_NODE
  11. var open_pool = db_config.mysql.OPEN_POOL
  12. var pool_size = db_config.mysql.POOL_SIZE
  13. var opts = {
  14. host: host,
  15. user: username,
  16. password: password,
  17. port: port,
  18. database: database,
  19. }
  20. var MYSQL_INSTANCE = null;
  21. //程序启动默认创建一个 mysql 连接
  22. createDefMysqlConnect();
  23. // 开始创建
  24. function createDefMysqlConnect() {
  25. disDefMysqlConnect();
  26. logger.log('createDefMysqlConnect', database)
  27. if (open_pool) {//创建连接池
  28. opts.connectionLimit = pool_size
  29. MYSQL_INSTANCE = mysql.createPool(opts);
  30. addConnEvent()
  31. } else {//创建单连接
  32. MYSQL_INSTANCE = mysql.createConnection(opts);
  33. addConnEvent()
  34. MYSQL_INSTANCE.connect();
  35. }
  36. return MYSQL_INSTANCE;
  37. }
  38. //关闭 mysql
  39. function disDefMysqlConnect() {
  40. if (MYSQL_INSTANCE) {
  41. if (open_pool) {
  42. MYSQL_INSTANCE.end();
  43. } else {
  44. MYSQL_INSTANCE.end();
  45. }
  46. MYSQL_INSTANCE = null;
  47. logger.debug('disDefMysqlConnect')
  48. }
  49. }
  50. function getMySqlInstance() {
  51. if (MYSQL_INSTANCE) return MYSQL_INSTANCE
  52. return createDefMysqlConnect();
  53. }
  54. function addConnEvent() {
  55. if (!MYSQL_INSTANCE) return
  56. if (open_pool) {
  57. MYSQL_INSTANCE.on('acquire', function (connection) {
  58. logger.log('Connection %d acquired', connection.threadId);
  59. });
  60. MYSQL_INSTANCE.on('connection', function (connection) {
  61. logger.log('mysql connection', connection.threadId);
  62. });
  63. MYSQL_INSTANCE.on('enqueue', function () {
  64. logger.log('Waiting for available connection slot');
  65. });
  66. MYSQL_INSTANCE.on('release', function (connection) {
  67. logger.log('Connection %d released', connection.threadId);
  68. });
  69. } else {
  70. // logger.log('connected to mysql ps=', db_config.mysql)
  71. MYSQL_INSTANCE.on('connect', () => {
  72. logger.log('connected to mysql')
  73. })
  74. MYSQL_INSTANCE.on('error', function (err) {
  75. logger.error('mysql Error =>', err);
  76. });
  77. MYSQL_INSTANCE.on('restart', function () {
  78. logger.error('mysql restart =>');
  79. });
  80. }
  81. }
  82. async function getAccountBalances_(opts) {
  83. logger.log('getAccountBalances', opts)
  84. var sql_main = 'select * from '
  85. var sql_table_name = ' user_balance '
  86. var sql_where = ' WHERE '
  87. var sql_where_name = ' usr_address=? AND chain=? ORDER BY update_tm DESC '
  88. var query_account_balances_params = [opts.address, opts.chain]
  89. if (opts.type == 'native') {
  90. sql_where_name = ' usr_address=? AND token_address=? AND chain=? ORDER BY update_tm DESC '
  91. query_account_balances_params = [opts.address, '0x0000000000000000000000000000000000000000', opts.chain]
  92. } else if (opts.type == 'token') {
  93. sql_where_name = ' usr_address=? AND token_address!=? AND chain=? ORDER BY update_tm DESC '
  94. query_account_balances_params = [opts.address, '0x0000000000000000000000000000000000000000', opts.chain]
  95. }
  96. var new_sql = sql_main.concat(sql_table_name, sql_where, sql_where_name);
  97. var query_account_balances_sql = new_sql
  98. return new Promise((resolve) => {
  99. getMySqlInstance().getConnection(function (err, connection) {
  100. if (err) {
  101. logger.error('getAccountBalances_ error', err)
  102. logger.error('getAccountBalances_ sql', create_withdraw_sql)
  103. resolve(null);
  104. return;
  105. }
  106. connection.query(
  107. query_account_balances_sql, query_account_balances_params,
  108. function selectCb(error, results) {
  109. if (error) {
  110. logger.error('getAccountBalances_', error, query_account_balances_sql, query_account_balances_params)
  111. resolve(null);
  112. return;
  113. }
  114. logger.log('getAccountBalances_ ret=', error, results);
  115. //用完当前连接需要释放,归还给连接池
  116. connection.release();
  117. resolve({
  118. results: results
  119. });
  120. }
  121. );
  122. })
  123. })
  124. }
  125. async function getAccountTransactions_(opts) {
  126. logger.log('getAccountTransactions', opts)
  127. var sql_main = 'select * from '
  128. var sql_table_name = ' user_transaction_log '
  129. var sql_where = ' WHERE '
  130. var sql_where_name = ' usr_to_address=? AND block_num>=? AND chain=? '
  131. var query_account_transactions_params = [opts.address, opts.from_block ? opts.from_block : 1, opts.chain]
  132. if (opts.type == 'native') {
  133. sql_where_name = ' usr_to_address=? AND block_num>=? AND token_address=? AND chain=? '
  134. query_account_transactions_params = [opts.address, opts.from_block ? opts.from_block : 1, '0x0000000000000000000000000000000000000000', opts.chain]
  135. } else if (opts.type == 'token') {
  136. sql_where_name = ' usr_to_address=? AND block_num>=? AND token_address!=? AND chain=? '
  137. query_account_transactions_params = [opts.address, opts.from_block ? opts.from_block : 1, '0x0000000000000000000000000000000000000000', opts.chain]
  138. } else if (opts.type == 'hash') {
  139. sql_where_name = ' trx_hash=? AND chain=? '
  140. query_account_transactions_params = [opts.transaction_hash, opts.chain]
  141. } else if (opts.type == 'only_hash') {
  142. sql_where_name = ' trx_hash=? '
  143. query_account_transactions_params = [opts.transaction_hash]
  144. }
  145. var new_sql = sql_main.concat(sql_table_name, sql_where, sql_where_name);
  146. var query_account_transactions_sql = new_sql
  147. logger.log('getAccountTransactions new_sql', new_sql)
  148. logger.log('getAccountTransactions query_account_transactions_params', query_account_transactions_params)
  149. return new Promise((resolve) => {
  150. getMySqlInstance().getConnection(function (err, connection) {
  151. if (err) {
  152. logger.error('getAccountTransactions_', err)
  153. logger.error('getAccountTransactions_', query_account_transactions_sql)
  154. resolve(null);
  155. return;
  156. }
  157. connection.query(
  158. query_account_transactions_sql, query_account_transactions_params,
  159. function selectCb(error, results) {
  160. if (error) {
  161. logger.error('getAccountTransactions_', error, query_account_transactions_sql, query_account_transactions_params)
  162. resolve(null);
  163. return;
  164. }
  165. //用完当前连接需要释放,归还给连接池
  166. connection.release();
  167. resolve({
  168. results: results
  169. });
  170. }
  171. );
  172. })
  173. })
  174. }
  175. async function getAccountBalances(opts) {
  176. var ret = await getAccountBalances_(opts);
  177. var results = []
  178. if (ret && ret.results) {
  179. if (ret.results && Array.isArray(ret.results) && ret.results.length > 0) {
  180. for (let index = 0; index < ret.results.length; index++) {
  181. const element = ret.results[index];
  182. if (element.token_address == '0x0000000000000000000000000000000000000000') {
  183. //
  184. results.push({
  185. type: 'native',
  186. balance: utils.scientificNotationToString(element.balance).toString(),
  187. responseType: 'yqcx'
  188. })
  189. } else {
  190. // {
  191. // token_address: '0x03716f32f72c692a0b355fa04639669e3341b94e',
  192. // name: 'BF_BSC_XXXXXX',
  193. // symbol: 'BSC_BF_6X',
  194. // logo: null,
  195. // thumbnail: null,
  196. // decimals: 18,
  197. // balance: '1000000000000000000000'
  198. // }
  199. var decimals = 1
  200. try {
  201. // decimals = await redis.readRedis('REDIS_ERC20_CONTRACT_DECIMALS_' + element.token_address.toLowerCase())
  202. decimals = await redis.readAppendRedis('REDIS_ERC20_CONTRACT_DECIMALS', opts.chain, element.token_address.toLowerCase())
  203. } catch (error) {
  204. }
  205. results.push({
  206. type: 'token',
  207. token_address: element.token_address,
  208. balance: utils.scientificNotationToString(element.balance).toString(),
  209. decimals: parseInt(decimals),
  210. responseType: 'yqcx'
  211. })
  212. }
  213. }
  214. }
  215. }
  216. return {
  217. code: 0,
  218. data: {
  219. total: results.length,
  220. results: results
  221. }
  222. }
  223. }
  224. async function getAccountTransactions(opts) {
  225. var ret = await getAccountTransactions_(opts);
  226. if (ret && ret.results) {
  227. if (ret.results && Array.isArray(ret.results) && ret.results.length > 0) {
  228. try {
  229. var results = []
  230. ret.results.forEach(element => {
  231. var isNativeTrans = element.token_address == '0x0000000000000000000000000000000000000000'
  232. element.type = isNativeTrans == true ? 'native' : 'token'
  233. element.gas = element.gas.toString()
  234. element.gas_price = element.gas_price.toString()
  235. try {
  236. element.value = utils.scientificNotationToString(element.value).toString()
  237. } catch (error) {
  238. element.value = element.value.toString();
  239. }
  240. logger.log('getAccountTransactions_ element:', element)
  241. results.push({
  242. type: isNativeTrans == true ? 'native' : 'token',
  243. from_address: element.usr_from_address,
  244. to_address: element.usr_to_address,
  245. token_address: isNativeTrans == false ? element.token_address : null,
  246. block_number: element.block_num.toString(),
  247. value: element.value,
  248. gas: element.gas,
  249. gas_price: element.gas_price,
  250. block_timestamp: utils.getTimestampToDate(element.block_tm * 1000),
  251. trx_hash: element.trx_hash,
  252. responseType: 'yqcx'
  253. })
  254. });
  255. ret.results = results
  256. } catch (error) {
  257. }
  258. logger.log('getAccountTransactions_ respose:', ret)
  259. return {
  260. code: 0,
  261. data: {
  262. total: ret.results.length,
  263. results: ret.results
  264. },
  265. errMsg: null,
  266. }
  267. }
  268. }
  269. return {
  270. code: 0,
  271. data: {
  272. total: 0,
  273. results: []
  274. },
  275. errMsg: null,
  276. }
  277. }
  278. module.exports = {
  279. getAccountBalances,
  280. getAccountTransactions,
  281. }