postgres.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. const postgres = require("postgres");
  2. const NodeCache = require("node-cache");
  3. const h = require("../helper");
  4. const sql = postgres({
  5. host: "tfb-database",
  6. user: "benchmarkdbuser",
  7. password: "benchmarkdbpass",
  8. database: "hello_world",
  9. max: 1,
  10. });
  11. const dbfortunes = async () => await sql`SELECT id, message FROM fortune`;
  12. const dbfind = async (id) =>
  13. await sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then(
  14. (arr) => arr[0]
  15. );
  16. const dbbulkUpdate = async (worlds) => {
  17. const sorted = sql(worlds
  18. .map((world) => [world.id, world.randomNumber])
  19. .sort((a, b) => (a[0] < b[0] ? -1 : 1)));
  20. await sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int
  21. FROM (VALUES ${sorted}) AS update_data (id, randomNumber)
  22. WHERE world.id = (update_data.id)::int`;
  23. };
  24. const dbgetAllWorlds = async () => sql`SELECT id, randomNumber FROM world`;
  25. const extra = h.additionalFortune();
  26. const myCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });
  27. let isCachePopulated = false;
  28. const populateCache = (callback) => {
  29. if (isCachePopulated) return callback();
  30. dbgetAllWorlds().then((worlds) => {
  31. for (let i = 0; i < worlds.length; i++) {
  32. myCache.set(worlds[i].id, worlds[i]);
  33. }
  34. isCachePopulated = true;
  35. callback();
  36. });
  37. };
  38. module.exports = {
  39. SingleQuery: async (req, res) => {
  40. const row = await dbfind(h.generateRandomNumber());
  41. h.writeResponse(res, h.worldObjectSerializer(row));
  42. },
  43. MultipleQueries: async (queries, req, res) => {
  44. const databaseJobs = new Array(queries);
  45. for (let i = 0; i < queries; i++) {
  46. databaseJobs[i] = dbfind(h.generateRandomNumber());
  47. }
  48. const worldObjects = await Promise.all(databaseJobs);
  49. h.writeResponse(res, JSON.stringify(worldObjects));
  50. },
  51. Fortunes: async (req, res) => {
  52. const rows = [extra, ...(await dbfortunes())];
  53. h.sortByMessage(rows);
  54. const n = rows.length;
  55. let html = "", i = 0;
  56. for (; i < n; i++) {
  57. html += `<tr><td>${rows[i].id}</td><td>${h.escapeHtmlFromText(rows[i].message)}</td></tr>`;
  58. }
  59. h.writeResponse(
  60. res,
  61. `<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>${html}</table></body></html>`,
  62. h.headerTypes["html"]
  63. );
  64. },
  65. Updates: async (queries, req, res) => {
  66. const databaseJobs = new Array(queries);
  67. for (let i = 0; i < queries; i++) {
  68. databaseJobs[i] = dbfind(h.generateRandomNumber());
  69. }
  70. const worldObjects = await Promise.all(databaseJobs);
  71. for (let i = 0; i < queries; i++) {
  72. worldObjects[i].randomNumber = h.generateRandomNumber();
  73. }
  74. await dbbulkUpdate(worldObjects);
  75. h.writeResponse(res, JSON.stringify(worldObjects));
  76. },
  77. CachedQueries: (queries, req, res) => {
  78. populateCache(() => {
  79. const worlds = new Array(queries);
  80. for (let i = 0; i < queries; i++) {
  81. worlds[i] = myCache.get(h.generateRandomNumber());
  82. }
  83. h.writeResponse(res, JSON.stringify(worlds));
  84. });
  85. },
  86. };