mysql-raw.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. const h = require('../helper');
  2. const async = require('async');
  3. const mysql = require('mysql');
  4. const connection = mysql.createConnection({
  5. host : 'TFB-database',
  6. user : 'benchmarkdbuser',
  7. password : 'benchmarkdbpass',
  8. database : 'hello_world'
  9. });
  10. const NodeCache = require( "node-cache" );
  11. const myCache = new NodeCache( { stdTTL: 0, checkperiod: 0 } );
  12. let cachePopulated = false;
  13. connection.connect();
  14. const queries = {
  15. GET_RANDOM_WORLD: () => "SELECT * FROM world WHERE id = " + h.randomTfbNumber(),
  16. ALL_FORTUNES: "SELECT * FROM fortune",
  17. ALL_WORLDS: "SELECT * FROM world",
  18. UPDATE_WORLD: (rows) => {
  19. return [
  20. "UPDATE world SET randomNumber = ", rows[0].randomNumber,
  21. " WHERE id = ", rows[0]['id']
  22. ].join('');
  23. }
  24. };
  25. const populateCache = (callback) => {
  26. if (cachePopulated) return callback();
  27. connection.query(queries.ALL_WORLDS, (err, rows) => {
  28. rows.forEach(r =>
  29. myCache.set(r.id, { id: r.id, randomNumber: r.randomNumber }));
  30. cachePopulated = true;
  31. callback();
  32. });
  33. };
  34. const mysqlRandomWorld = (callback) =>
  35. connection.query(queries.GET_RANDOM_WORLD(), (err, rows, fields) => {
  36. callback(err, rows[0]);
  37. });
  38. const mysqlGetAllFortunes = (callback) =>
  39. connection.query(queries.ALL_FORTUNES, (err, rows, fields) => {
  40. callback(err, rows);
  41. });
  42. const mysqlUpdateQuery = (callback) =>
  43. connection.query(queries.GET_RANDOM_WORLD(), (err, rows, fields) => {
  44. if (err) { return process.exit(1); }
  45. rows[0].randomNumber = h.randomTfbNumber();
  46. const updateQuery = queries.UPDATE_WORLD(rows);
  47. connection.query(updateQuery, (err, result) => {
  48. callback(err, rows[0]);
  49. });
  50. });
  51. module.exports = {
  52. SingleQuery: (req, res) => {
  53. mysqlRandomWorld((err, result) => {
  54. if (err) { return process.exit(1); }
  55. h.addTfbHeaders(res, 'json');
  56. res.end(JSON.stringify(result));
  57. });
  58. },
  59. MultipleQueries: (queries, req, res) => {
  60. const queryFunctions = h.fillArray(mysqlRandomWorld, queries);
  61. async.parallel(queryFunctions, (err, results) => {
  62. if (err) { return process.exit(1); }
  63. h.addTfbHeaders(res, 'json');
  64. res.end(JSON.stringify(results));
  65. });
  66. },
  67. CachedQueries: (queries, req, res) => {
  68. populateCache(() => {
  69. let worlds = [];
  70. for (let i = 0; i < queries; i++) {
  71. const key = h.randomTfbNumber() + '';
  72. worlds.push(myCache.get(key));
  73. }
  74. h.addTfbHeaders(res, 'json');
  75. res.end(JSON.stringify(worlds));
  76. });
  77. },
  78. Fortunes: (req, res) => {
  79. mysqlGetAllFortunes((err, fortunes) => {
  80. if (err) { return process.exit(1); }
  81. fortunes.push(h.additionalFortune());
  82. fortunes.sort((a, b) => a.message.localeCompare(b.message));
  83. h.addTfbHeaders(res, 'html');
  84. res.end(h.fortunesTemplate({
  85. fortunes: fortunes
  86. }));
  87. });
  88. },
  89. Updates: (queries, req, res) => {
  90. const queryFunctions = h.fillArray(mysqlUpdateQuery, queries);
  91. async.parallel(queryFunctions, (err, results) => {
  92. if (err) { return process.exit(1); }
  93. h.addTfbHeaders(res, 'json');
  94. res.end(JSON.stringify(results));
  95. });
  96. }
  97. };