123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- const postgres = require("postgres");
- const NodeCache = require("node-cache");
- const h = require("../helper");
- const sql = postgres({
- host: "tfb-database",
- user: "benchmarkdbuser",
- password: "benchmarkdbpass",
- database: "hello_world",
- max: 1,
- });
- const dbfortunes = async () => await sql`SELECT id, message FROM fortune`;
- const dbfind = async (id) =>
- await sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then(
- (arr) => arr[0]
- );
- const dbbulkUpdate = async (worlds) => {
- const sorted = sql(worlds
- .map((world) => [world.id, world.randomNumber])
- .sort((a, b) => (a[0] < b[0] ? -1 : 1)));
- await sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int
- FROM (VALUES ${sorted}) AS update_data (id, randomNumber)
- WHERE world.id = (update_data.id)::int`;
- };
- const dbgetAllWorlds = async () => sql`SELECT id, randomNumber FROM world`;
- const extra = h.additionalFortune();
- const myCache = new NodeCache({ stdTTL: 0, checkperiod: 0 });
- let isCachePopulated = false;
- const populateCache = (callback) => {
- if (isCachePopulated) return callback();
- dbgetAllWorlds().then((worlds) => {
- for (let i = 0; i < worlds.length; i++) {
- myCache.set(worlds[i].id, worlds[i]);
- }
- isCachePopulated = true;
- callback();
- });
- };
- module.exports = {
- SingleQuery: async (req, res) => {
- const row = await dbfind(h.generateRandomNumber());
- h.writeResponse(res, h.worldObjectSerializer(row));
- },
- MultipleQueries: async (queries, req, res) => {
- const databaseJobs = new Array(queries);
- for (let i = 0; i < queries; i++) {
- databaseJobs[i] = dbfind(h.generateRandomNumber());
- }
- const worldObjects = await Promise.all(databaseJobs);
- h.writeResponse(res, JSON.stringify(worldObjects));
- },
- Fortunes: async (req, res) => {
- const rows = [extra, ...(await dbfortunes())];
- h.sortByMessage(rows);
- const n = rows.length;
- let html = "", i = 0;
- for (; i < n; i++) {
- html += `<tr><td>${rows[i].id}</td><td>${h.escapeHtmlFromText(rows[i].message)}</td></tr>`;
- }
- h.writeResponse(
- res,
- `<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>${html}</table></body></html>`,
- h.headerTypes["html"]
- );
- },
- Updates: async (queries, req, res) => {
- const databaseJobs = new Array(queries);
- for (let i = 0; i < queries; i++) {
- databaseJobs[i] = dbfind(h.generateRandomNumber());
- }
- const worldObjects = await Promise.all(databaseJobs);
- for (let i = 0; i < queries; i++) {
- worldObjects[i].randomNumber = h.generateRandomNumber();
- }
- await dbbulkUpdate(worldObjects);
- h.writeResponse(res, JSON.stringify(worldObjects));
- },
- CachedQueries: (queries, req, res) => {
- populateCache(() => {
- const worlds = new Array(queries);
- for (let i = 0; i < queries; i++) {
- worlds[i] = myCache.get(h.generateRandomNumber());
- }
- h.writeResponse(res, JSON.stringify(worlds));
- });
- },
- };
|