| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 | const h = require('../helper');const async = require('async');const mysql = require('mysql2');const connection = mysql.createConnection({  host: 'tfb-database',  user: 'benchmarkdbuser',  password: 'benchmarkdbpass',  database: 'hello_world'});const NodeCache = require("node-cache");const myCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });let cachePopulated = false;connection.connect();const queries = {  GET_RANDOM_WORLD: () => "SELECT * FROM world WHERE id = " + h.randomTfbNumber(),  ALL_FORTUNES: "SELECT * FROM fortune",  ALL_WORLDS: "SELECT * FROM world",  UPDATE_WORLD: (rows) => {    return [      "UPDATE world SET randomNumber = ", rows[0].randomNumber,      " WHERE id = ", rows[0]['id']    ].join('');  }};const populateCache = (callback) => {  if (cachePopulated) return callback();  connection.query(queries.ALL_WORLDS, (err, rows) => {    rows.forEach(r =>      myCache.set(r.id, { id: r.id, randomNumber: r.randomNumber }));    cachePopulated = true;    callback();  });};const mysqlRandomWorld = (callback) =>  connection.query(queries.GET_RANDOM_WORLD(), (err, rows, fields) => {    callback(err, rows[0]);  });const mysqlGetAllFortunes = (callback) =>  connection.query(queries.ALL_FORTUNES, (err, rows, fields) => {    callback(err, rows);  });const mysqlUpdateQuery = (callback) =>  connection.query(queries.GET_RANDOM_WORLD(), (err, rows, fields) => {    if (err) { return process.exit(1); }    rows[0].randomNumber = h.randomTfbNumber();    const updateQuery = queries.UPDATE_WORLD(rows);    connection.query(updateQuery, (err, result) => {      callback(err, rows[0]);    });  });module.exports = {  SingleQuery: (req, res) => {    mysqlRandomWorld((err, result) => {      if (err) { return process.exit(1); }      h.addTfbHeaders(res, 'json');      res.end(JSON.stringify(result));    });  },  MultipleQueries: (queries, req, res) => {    const queryFunctions = h.fillArray(mysqlRandomWorld, queries);    async.parallel(queryFunctions, (err, results) => {      if (err) { return process.exit(1); }      h.addTfbHeaders(res, 'json');      res.end(JSON.stringify(results));    });  },  CachedQueries: (queries, req, res) => {    populateCache(() => {      let worlds = [];      for (let i = 0; i < queries; i++) {        const key = h.randomTfbNumber() + '';        worlds.push(myCache.get(key));      }      h.addTfbHeaders(res, 'json');      res.end(JSON.stringify(worlds));    });  },  Fortunes: (req, res) => {    mysqlGetAllFortunes((err, fortunes) => {      if (err) { return process.exit(1); }      fortunes.push(h.additionalFortune());      fortunes.sort((a, b) => a.message.localeCompare(b.message));      h.addTfbHeaders(res, 'html');      res.end(h.fortunesTemplate({        fortunes: fortunes      }));    });  },  Updates: (queries, req, res) => {    const queryFunctions = h.fillArray(mysqlUpdateQuery, queries);    async.parallel(queryFunctions, (err, results) => {      if (err) { return process.exit(1); }      h.addTfbHeaders(res, 'json');      res.end(JSON.stringify(results));    });  }};
 |