mariadb-connector.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. 'use strict';
  2. import mariadb from 'mariadb';
  3. const JOJOAPPS_SERVER_DB='localhost';
  4. // const JOJOAPPS_SERVER_DB_PORT= 1986;
  5. const JOJOAPPS_SERVER_DB_SOCKET= '/run/mysqld/mysqld.sock';
  6. const DATABASE_NAME='twelve_heroes';
  7. export default class MariadbConnector {
  8. constructor() {
  9. let host = process.env.DB || JOJOAPPS_SERVER_DB;
  10. let port = process.env.DB_PORT || 0;
  11. let database = process.env.DB_NAME || DATABASE_NAME;
  12. console.log('DB server : ' + host);
  13. console.log('DB database : ' + database);
  14. let mariaDbConfig={
  15. host,
  16. user: 'node',
  17. password: 'nodejs1234',
  18. database,
  19. connectionLimit: 5
  20. };
  21. if (port === 0) {
  22. mariaDbConfig.socketPath = JOJOAPPS_SERVER_DB_SOCKET;
  23. console.log('Will use DB UNIX socket : ' + mariaDbConfig.socketPath);
  24. } else {
  25. mariaDbConfig.port=port;
  26. console.log('Will use DB port : ' + port);
  27. }
  28. this.pool = mariadb.createPool(mariaDbConfig);
  29. }
  30. async getUsernames() {
  31. let conn;
  32. let players = [];
  33. try {
  34. conn = await this.pool.getConnection();
  35. const rows_players = await conn.query("SELECT username FROM players");
  36. for (const { username: u } of rows_players) {
  37. players.push(u);
  38. }
  39. } finally {
  40. if (conn && conn !== null) {
  41. conn.end();
  42. }
  43. }
  44. return players;
  45. }
  46. async addPlayer(username) {
  47. console.log('mariadb add player : ', username);
  48. let conn;
  49. try {
  50. conn = await this.pool.getConnection();
  51. const val = await conn.query("INSERT INTO players value (?, NOW(),NULL)", [username]);
  52. console.log('OK removing player : ', val);
  53. return val;
  54. } catch (err) {
  55. console.log('error adding player : ', err);
  56. throw err;
  57. } finally {
  58. if (conn && conn !== null) {
  59. conn.end();
  60. }
  61. }
  62. }
  63. async removePlayer(username) {
  64. console.log('mariadb remove player : ', username);
  65. let conn;
  66. try {
  67. conn = await this.pool.getConnection();
  68. const val = await conn.query("DELETE FROM players WHERE username=?", [username]);
  69. console.log('OK removing player : ', val);
  70. return val;
  71. } catch (err) {
  72. console.log('error removing player : ', err);
  73. throw err;
  74. } finally {
  75. if (conn && conn !== null) {
  76. conn.end();
  77. }
  78. }
  79. }
  80. async addNewGame(game) {
  81. let conn;
  82. try {
  83. conn = await this.pool.getConnection();
  84. const val = await conn.query("INSERT INTO games values (NULL,?,?,?,?,?,?,NOW())",
  85. [game.player1,
  86. game.player2,
  87. game.deck,
  88. convertAdvRulesToString(game.advRules),
  89. game.status,
  90. game.data]);
  91. console.log('OK adding game : ', val);
  92. return val.insertId;
  93. } catch (err) {
  94. console.log('error adding game : ', err);
  95. throw err;
  96. } finally {
  97. if (conn && conn !== null) {
  98. conn.end();
  99. }
  100. }
  101. }
  102. removeGameById(gameId) {
  103. return this.removeGame("DELETE FROM games WHERE id=?", [gameId]);
  104. }
  105. removeGamesByPlayer1(player1Name) {
  106. return this.removeGame("DELETE FROM games WHERE player1=?", [player1Name]);
  107. }
  108. removeGamesByPlayerAny(playerName) {
  109. return this.removeGame("DELETE FROM games WHERE player1=? OR player2=?", [playerName, playerName]);
  110. }
  111. removeGamesByStatus(status) {
  112. return this.removeGame("DELETE FROM games WHERE status=?", [status]);
  113. }
  114. removeGamesByDays(days) {
  115. return this.removeGame("DELETE FROM games WHERE datediff(NOW(),last_played) > ?", [days]);
  116. }
  117. removeFinishedGamesByDays(days) {
  118. return this.removeGame("DELETE FROM games WHERE status='FINISHED' AND datediff(NOW(),last_played) > ?", [days]);
  119. }
  120. async removeGame(queryStr, queryArgs) {
  121. console.log('mariadb remove game : ', queryStr);
  122. let conn;
  123. try {
  124. conn = await this.pool.getConnection();
  125. const val = await conn.query(queryStr, queryArgs);
  126. console.log('OK removing game : ', val);
  127. return val;
  128. } catch (err) {
  129. console.log('error removing game : ', err);
  130. throw err;
  131. } finally {
  132. if (conn && conn !== null) {
  133. conn.end();
  134. }
  135. }
  136. }
  137. async getNonFinishedGamesForPlayer(username) {
  138. let conn;
  139. let games = [];
  140. try {
  141. conn = await this.pool.getConnection();
  142. const res = await conn.query(
  143. "SELECT * FROM`games` WHERE status != 'FINISHED' AND(player1 = ? OR player2 = '' OR player2 = ?)",
  144. [username,username]);
  145. for (const { player1,player2,deck,adv_rules } of res) {
  146. games.push({player1,player2,deck,adv_rules});
  147. }
  148. console.log(`returning for ${username} : `, games);
  149. } finally {
  150. if (conn && conn !== null) {
  151. conn.end();
  152. }
  153. }
  154. return games;
  155. }
  156. }
  157. let convertAdvRulesToString = function (advRulesArray) {
  158. let advRulestStr = '';
  159. let last = advRulesArray.length - 1;
  160. advRulesArray.forEach((rule, index) => {
  161. advRulestStr += rule;
  162. if (index < last) {
  163. advRulestStr += ',';
  164. }
  165. });
  166. return advRulestStr;
  167. };