Browse Source

[µWebSockets.js] Add database MySQL (#8952)

* [µWebSockets.js] add mariadb

* [µWebSockets.js] update dependencies and add mysql

* [µWebSockets.js] update README.md
Imam Fahrur Rofi 1 year ago
parent
commit
a7846fedd4

+ 4 - 1
frameworks/JavaScript/uwebsockets.js/README.md

@@ -10,12 +10,14 @@ The tests were run with:
 
 - [uWebSockets.js](https://github.com/uNetworking/uWebSockets.js/)
 - [postgres](https://github.com/porsager/postgres/)
+- [mariadb](https://github.com/mariadb-corporation/mariadb-connector-nodejs/)
 
 ## Database
 
 There are individual handlers for each DB approach. The logic for each of them are found here:
 
-- [PostgreSQL](database/postgres.js)
+- [PostgreSQL](src/database/postgres.js)
+- [MySQL](src/database/mysql.js)
 
 There are **no database endpoints** or drivers attached by default.
 
@@ -23,6 +25,7 @@ To initialize the application with one of these, run any _one_ of the following
 
 ```sh
 $ DATABASE=postgres npm start
+$ DATABASE=mysql npm start
 ```
 
 ## Test Endpoints

+ 21 - 0
frameworks/JavaScript/uwebsockets.js/benchmark_config.json

@@ -41,6 +41,27 @@
         "update_url": "/updates?queries=",
         "versus": "nodejs",
         "webserver": "None"
+      },
+      "mysql": {
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "MySQL",
+        "database_os": "Linux",
+        "db_url": "/db",
+        "display_name": "uWebSockets.js",
+        "flavor": "NodeJS",
+        "fortune_url": "/fortunes",
+        "framework": "uWebSockets.js",
+        "language": "JavaScript",
+        "notes": "",
+        "orm": "Raw",
+        "os": "Linux",
+        "platform": "None",
+        "port": 8080,
+        "query_url": "/queries?queries=",
+        "update_url": "/updates?queries=",
+        "versus": "nodejs",
+        "webserver": "None"
       }
     }
   ]

+ 74 - 5
frameworks/JavaScript/uwebsockets.js/package-lock.json

@@ -9,25 +9,94 @@
       "version": "0.0.1",
       "license": "MIT",
       "dependencies": {
-        "postgres": "^3.4.0",
+        "mariadb": "^3.3.0",
+        "postgres": "^3.4.4",
         "slow-json-stringify": "^2.0.1",
-        "uWebSockets.js": "uNetworking/uWebSockets.js#v20.32.0"
+        "uWebSockets.js": "uNetworking/uWebSockets.js#v20.43.0"
+      }
+    },
+    "node_modules/@types/geojson": {
+      "version": "7946.0.14",
+      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
+      "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg=="
+    },
+    "node_modules/@types/node": {
+      "version": "20.12.7",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
+      "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "node_modules/denque": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+      "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+      "engines": {
+        "node": "14 || >=16.14"
+      }
+    },
+    "node_modules/mariadb": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.3.0.tgz",
+      "integrity": "sha512-sAL4bJgbfCAtXcE8bXI+NAMzVaPNkIU8hRZUXYfgNFoWB9U57G3XQiMeCx/A6IrS6y7kGwBLylrwgsZQ8kUYlw==",
+      "dependencies": {
+        "@types/geojson": "^7946.0.14",
+        "@types/node": "^20.11.17",
+        "denque": "^2.1.0",
+        "iconv-lite": "^0.6.3",
+        "lru-cache": "^10.2.0"
+      },
+      "engines": {
+        "node": ">= 14"
       }
     },
     "node_modules/postgres": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.0.tgz",
-      "integrity": "sha512-d7UtSoCg4hUtzxM9aRi3J8BrM6t0h4bQmgAHG96cDCNpP9CnnWQRdRl7WWNvKs0oOaQU2InGoOi1jETmdZK02g==",
+      "version": "3.4.4",
+      "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.4.tgz",
+      "integrity": "sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==",
+      "engines": {
+        "node": ">=12"
+      },
       "funding": {
         "type": "individual",
         "url": "https://github.com/sponsors/porsager"
       }
     },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
     "node_modules/slow-json-stringify": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/slow-json-stringify/-/slow-json-stringify-2.0.1.tgz",
       "integrity": "sha512-jqyzIqTaSkRGcWdWqjmOLKHZgOGUT71ZCTsvQu1xGu9Mqaod7O26y5FJJEmaUQhaTWh0bkXv2qqN0i+EQsD1jQ=="
     },
+    "node_modules/undici-types": {
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+    },
     "node_modules/uWebSockets.js": {
       "version": "20.31.0",
       "resolved": "git+ssh://[email protected]/uNetworking/uWebSockets.js.git#809b99d2d7d12e2cbf89b7135041e9b41ff84084"

+ 4 - 3
frameworks/JavaScript/uwebsockets.js/package.json

@@ -1,8 +1,9 @@
 {
   "dependencies": {
-    "postgres": "^3.4.0",
-    "uWebSockets.js": "uNetworking/uWebSockets.js#v20.32.0",
-    "slow-json-stringify": "^2.0.1"
+    "mariadb": "^3.3.0",
+    "postgres": "^3.4.4",
+    "slow-json-stringify": "^2.0.1",
+    "uWebSockets.js": "uNetworking/uWebSockets.js#v20.43.0"
   },
   "license": "MIT",
   "main": "src/server.js",

+ 16 - 0
frameworks/JavaScript/uwebsockets.js/src/database/mysql.js

@@ -0,0 +1,16 @@
+import { createPool } from "mariadb";
+import os from "node:os";
+
+const pool = createPool({
+  host: "tfb-database",
+  user: "benchmarkdbuser",
+  password: "benchmarkdbpass",
+  database: "hello_world",
+  connectionLimit: os.availableParallelism()
+});
+
+export const fortunes = async () => await pool.execute("SELECT id, message FROM fortune");
+
+export const find = async (id) => await pool.execute("SELECT id, randomnumber FROM world WHERE id = ?", [id]).then((arr) => arr[0]);
+
+export const bulkUpdate = async (worlds) => await Promise.all(worlds.map(world => pool.execute("UPDATE world SET randomnumber = ? WHERE id = ?", [world.randomNumber, world.id])));

+ 12 - 0
frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile

@@ -0,0 +1,12 @@
+FROM node:20-slim
+
+COPY ./ ./
+
+RUN npm install
+
+ENV NODE_ENV production
+ENV DATABASE mysql
+
+EXPOSE 8080
+
+CMD ["npm", "start"]