account_info_db.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  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. }
  142. var new_sql = sql_main.concat(sql_table_name, sql_where, sql_where_name);
  143. var query_account_transactions_sql = new_sql
  144. logger.log('getAccountTransactions new_sql', new_sql)
  145. logger.log('getAccountTransactions query_account_transactions_params', query_account_transactions_params)
  146. return new Promise((resolve) => {
  147. getMySqlInstance().getConnection(function (err, connection) {
  148. if (err) {
  149. logger.error('getAccountTransactions_', err)
  150. logger.error('getAccountTransactions_', query_account_transactions_sql)
  151. resolve(null);
  152. return;
  153. }
  154. connection.query(
  155. query_account_transactions_sql, query_account_transactions_params,
  156. function selectCb(error, results) {
  157. if (error) {
  158. logger.error('getAccountTransactions_', error, query_account_transactions_sql, query_account_transactions_params)
  159. resolve(null);
  160. return;
  161. }
  162. //用完当前连接需要释放,归还给连接池
  163. connection.release();
  164. resolve({
  165. results: results
  166. });
  167. }
  168. );
  169. })
  170. })
  171. }
  172. async function getAccountBalances(opts) {
  173. var ret = await getAccountBalances_(opts);
  174. var results = []
  175. if (ret && ret.results) {
  176. if (ret.results && Array.isArray(ret.results) && ret.results.length > 0) {
  177. for (let index = 0; index < ret.results.length; index++) {
  178. const element = ret.results[index];
  179. if (element.token_address == '0x0000000000000000000000000000000000000000') {
  180. //
  181. results.push({
  182. type: 'native',
  183. balance: utils.scientificNotationToString(element.balance).toString(),
  184. responseType: 'yqcx'
  185. })
  186. } else {
  187. // {
  188. // token_address: '0x03716f32f72c692a0b355fa04639669e3341b94e',
  189. // name: 'BF_BSC_XXXXXX',
  190. // symbol: 'BSC_BF_6X',
  191. // logo: null,
  192. // thumbnail: null,
  193. // decimals: 18,
  194. // balance: '1000000000000000000000'
  195. // }
  196. var decimals = 1
  197. try {
  198. // decimals = await redis.readRedis('REDIS_ERC20_CONTRACT_DECIMALS_' + element.token_address.toLowerCase())
  199. decimals = await redis.readAppendRedis('REDIS_ERC20_CONTRACT_DECIMALS',opts.chain,element.token_address.toLowerCase())
  200. } catch (error) {
  201. }
  202. results.push({
  203. type: 'token',
  204. token_address: element.token_address,
  205. balance: utils.scientificNotationToString(element.balance).toString(),
  206. decimals: parseInt(decimals),
  207. responseType: 'yqcx'
  208. })
  209. }
  210. }
  211. }
  212. }
  213. return {
  214. code: 0,
  215. data: {
  216. total: results.length,
  217. results: results
  218. }
  219. }
  220. }
  221. async function getAccountTransactions(opts) {
  222. var ret = await getAccountTransactions_(opts);
  223. if (ret && ret.results) {
  224. if (ret.results && Array.isArray(ret.results) && ret.results.length > 0) {
  225. try {
  226. var results = []
  227. ret.results.forEach(element => {
  228. var isNativeTrans = element.token_address == '0x0000000000000000000000000000000000000000'
  229. element.type = isNativeTrans == true ? 'native' : 'token'
  230. element.gas = element.gas.toString()
  231. element.gas_price = element.gas_price.toString()
  232. try {
  233. element.value = utils.scientificNotationToString(element.value).toString()
  234. } catch (error) {
  235. element.value = element.value.toString();
  236. }
  237. logger.log('getAccountTransactions_ element:', element)
  238. results.push({
  239. type: isNativeTrans == true ? 'native' : 'token',
  240. from_address: element.usr_from_address,
  241. to_address: element.usr_to_address,
  242. token_address: isNativeTrans == false ? element.token_address : null,
  243. block_number: element.block_num.toString(),
  244. value: element.value,
  245. gas: element.gas,
  246. gas_price: element.gas_price,
  247. block_timestamp: utils.getTimestampToDate(element.block_tm * 1000),
  248. trx_hash: element.trx_hash,
  249. responseType: 'yqcx'
  250. })
  251. });
  252. ret.results = results
  253. } catch (error) {
  254. }
  255. logger.log('getAccountTransactions_ respose:', ret)
  256. return {
  257. code: 0,
  258. data: {
  259. total: ret.results.length,
  260. results: ret.results
  261. },
  262. errMsg: null,
  263. }
  264. }
  265. }
  266. return {
  267. code: 0,
  268. data: {
  269. total: 0,
  270. results: []
  271. },
  272. errMsg: null,
  273. }
  274. }
  275. module.exports = {
  276. getAccountBalances,
  277. getAccountTransactions,
  278. }