From 8677cdd045835d135b5f652cd021f0453610c860 Mon Sep 17 00:00:00 2001 From: Hafiz Muhammad Basit Date: Wed, 26 Jul 2023 19:02:49 +0500 Subject: [PATCH 1/3] WIP: Integrating SQL.js --- package.json | 2 ++ src/init/utils.ts | 1 + src/settings.ts | 5 ++++- src/utils/setup_utils.ts | 32 ++++++++++++++++++++++++++++++++ yarn.lock | 18 ++++++++++++++++++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d061ae1b..b22aefa1 100644 --- a/package.json +++ b/package.json @@ -313,6 +313,7 @@ "@types/node-fetch": "^2.5.12", "@types/proper-lockfile": "^4.1.4", "@types/run-parallel": "^1.1.2", + "@types/sql.js": "^1.4.4", "@types/string-similarity": "^4.0.0", "cors": "^2.8.5", "current-git-branch": "^1.1.0", @@ -333,6 +334,7 @@ "node-fetch": "^3.3.2", "proper-lockfile": "^4.1.2", "run-parallel": "^1.2.0", + "sql.js": "^1.8.0", "string-similarity": "^4.0.4", "untildify": "^5.0.0", "websocket": "^1.0.34" diff --git a/src/init/utils.ts b/src/init/utils.ts index 6a6d531a..4a0dbd0d 100644 --- a/src/init/utils.ts +++ b/src/init/utils.ts @@ -137,6 +137,7 @@ export class initUtils { const filePathAndURLs = uploadResponse.urls; const uploaderUtils = new s3UploaderUtils(); uploaderUtils.saveURLs(this.repoPath, branch, filePathAndURLs); + CodeSyncLogger.debug(`Saved s3 URLs, branch=${branch} repo=${this.repoPath}`); // Reset state values CodeSyncState.set(syncingBranchKey, false); CodeSyncState.set(CODESYNC_STATES.IS_SYNCING_BRANCH, false); diff --git a/src/settings.ts b/src/settings.ts index 7d1c5f1a..92e8f351 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -90,12 +90,15 @@ export const generateSettings = () => { ALERTS: path.join(rootRepo, "alerts.yml") }; + const DATABASE_FILE_PATH = path.join(rootRepo, "codesyncdb.db"); + return { ...systemDirectories, ...lockFiles, ...alerts, deprecatedFiles: [ systemDirectories.SEQUENCE_TOKEN_PATH - ] + ], + DATABASE_FILE_PATH }; }; diff --git a/src/utils/setup_utils.ts b/src/utils/setup_utils.ts index aab89854..4c669bfc 100644 --- a/src/utils/setup_utils.ts +++ b/src/utils/setup_utils.ts @@ -1,6 +1,9 @@ import fs from 'fs'; +import path from 'path'; import yaml from 'js-yaml'; import vscode, { Extension } from 'vscode'; +import initSqlJs from 'sql.js'; + import { COMMAND, contextVariables, @@ -139,7 +142,12 @@ export const generateRandomNumber = (min = 0, max = 100) => { export const setupCodeSync = async (repoPath: string) => { const settings = createSystemDirectories(); +<<<<<<< HEAD new RepoState(repoPath).setSubDirState(); +======= + // Setup Database + await setupDatabase(); +>>>>>>> 87aa4ab (WIP: Integrating SQL.js) await createOrUpdateSyncignore(); await addPluginUser(); const userFilePath = settings.USER_PATH; @@ -305,3 +313,27 @@ export const uuidv4 = () => { return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); }); }; + +export const setupDatabase = async () => { + const settings = generateSettings(); + if (!fs.existsSync(settings.DATABASE_FILE_PATH)) { + console.log("Creating DB"); + fs.openSync(settings.DATABASE_FILE_PATH, "w+"); + } + const filebuffer = fs.readFileSync(settings.DATABASE_FILE_PATH); + const SQL = await initSqlJs({ + // Required to load the wasm binary asynchronously. Of course, you can host it wherever you want + // You can omit locateFile completely when running in node + locateFile: file => path.join(__dirname, ".." , `node_modules/sql.js/dist/${file}`) + }); + console.log("db", 1); + const db = new SQL.Database(filebuffer); + console.log("db", 2); + try { + const res = db.exec("SELECT * FROM hello"); + } catch (e) { + console.log("Creating table"); + // Testing a comment with Latest Sanic version on Server + // How about now with intermediate changes + } +}; diff --git a/yarn.lock b/yarn.lock index 4e311bbc..b3381211 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2423,6 +2423,11 @@ resolved "https://registry.yarnpkg.com/@types/diff-match-patch/-/diff-match-patch-1.0.32.tgz#d9c3b8c914aa8229485351db4865328337a3d09f" integrity sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A== +"@types/emscripten@*": + version "1.39.6" + resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.39.6.tgz#698b90fe60d44acf93c31064218fbea93fbfd85a" + integrity sha512-H90aoynNhhkQP6DRweEjJp5vfUVdIj7tdPLsu7pq89vODD/lcugKfZOsfgwpvM6XUewEp2N5dCg1Uf3Qe55Dcg== + "@types/express-serve-static-core@^4.17.33": version "4.17.35" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" @@ -2573,6 +2578,14 @@ "@types/mime" "*" "@types/node" "*" +"@types/sql.js@^1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@types/sql.js/-/sql.js-1.4.4.tgz#1c4df5045f08a518d48cda6bbb4f5dacc44c503c" + integrity sha512-6EWU2wfiBtzgTy18WQoXZAGTreBjhZcBCfD8CDvyI1Nj0a4KNDDt41IYeAZ40cRUdfqWHb7VGx7t6nK0yBOI5A== + dependencies: + "@types/emscripten" "*" + "@types/node" "*" + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -5633,6 +5646,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +sql.js@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/sql.js/-/sql.js-1.8.0.tgz#cb45d957e17a2239662fe2f614c9b678990867a6" + integrity sha512-3HD8pSkZL+5YvYUI8nlvNILs61ALqq34xgmF+BHpqxe68yZIJ1H+sIVIODvni25+CcxHUxDyrTJUL0lE/m7afw== + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" From dd12bbf47f1f2f01105f6b7ab150880a1e8427fe Mon Sep 17 00:00:00 2001 From: Hafiz Muhammad Basit Date: Fri, 19 Apr 2024 10:36:38 +0500 Subject: [PATCH 2/3] Upgraded sql.js version --- package.json | 4 ++-- src/utils/setup_utils.ts | 3 --- yarn.lock | 16 ++++++++-------- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index b22aefa1..ba996a90 100644 --- a/package.json +++ b/package.json @@ -313,7 +313,7 @@ "@types/node-fetch": "^2.5.12", "@types/proper-lockfile": "^4.1.4", "@types/run-parallel": "^1.1.2", - "@types/sql.js": "^1.4.4", + "@types/sql.js": "^1.4.9", "@types/string-similarity": "^4.0.0", "cors": "^2.8.5", "current-git-branch": "^1.1.0", @@ -334,7 +334,7 @@ "node-fetch": "^3.3.2", "proper-lockfile": "^4.1.2", "run-parallel": "^1.2.0", - "sql.js": "^1.8.0", + "sql.js": "^1.10.3", "string-similarity": "^4.0.4", "untildify": "^5.0.0", "websocket": "^1.0.34" diff --git a/src/utils/setup_utils.ts b/src/utils/setup_utils.ts index 4c669bfc..c01c01ec 100644 --- a/src/utils/setup_utils.ts +++ b/src/utils/setup_utils.ts @@ -142,12 +142,9 @@ export const generateRandomNumber = (min = 0, max = 100) => { export const setupCodeSync = async (repoPath: string) => { const settings = createSystemDirectories(); -<<<<<<< HEAD new RepoState(repoPath).setSubDirState(); -======= // Setup Database await setupDatabase(); ->>>>>>> 87aa4ab (WIP: Integrating SQL.js) await createOrUpdateSyncignore(); await addPluginUser(); const userFilePath = settings.USER_PATH; diff --git a/yarn.lock b/yarn.lock index b3381211..45aadeb6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2578,10 +2578,10 @@ "@types/mime" "*" "@types/node" "*" -"@types/sql.js@^1.4.4": - version "1.4.4" - resolved "https://registry.yarnpkg.com/@types/sql.js/-/sql.js-1.4.4.tgz#1c4df5045f08a518d48cda6bbb4f5dacc44c503c" - integrity sha512-6EWU2wfiBtzgTy18WQoXZAGTreBjhZcBCfD8CDvyI1Nj0a4KNDDt41IYeAZ40cRUdfqWHb7VGx7t6nK0yBOI5A== +"@types/sql.js@^1.4.9": + version "1.4.9" + resolved "https://registry.yarnpkg.com/@types/sql.js/-/sql.js-1.4.9.tgz#31d2bed39aa63e56ada7a4469aa6f19ee2c74b94" + integrity sha512-ep8b36RKHlgWPqjNG9ToUrPiwkhwh0AEzy883mO5Xnd+cL6VBH1EvSjBAAuxLUFF2Vn/moE3Me6v9E1Lo+48GQ== dependencies: "@types/emscripten" "*" "@types/node" "*" @@ -5646,10 +5646,10 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sql.js@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/sql.js/-/sql.js-1.8.0.tgz#cb45d957e17a2239662fe2f614c9b678990867a6" - integrity sha512-3HD8pSkZL+5YvYUI8nlvNILs61ALqq34xgmF+BHpqxe68yZIJ1H+sIVIODvni25+CcxHUxDyrTJUL0lE/m7afw== +sql.js@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/sql.js/-/sql.js-1.10.3.tgz#cd05043a9e2667010cd0520180577c90df8dd990" + integrity sha512-H46aWtQkdyjZwFQgraUruy5h/DyJBbAK3EA/WEMqiqF6PGPfKBSKBj/er3dVyYqVIoYfRf5TFM/loEjtQIrqJg== stack-utils@^2.0.3: version "2.0.6" From 02dc2b08a84378813d8ead3cf17b5dda8f035e5a Mon Sep 17 00:00:00 2001 From: Hafiz Muhammad Basit Date: Fri, 26 Apr 2024 11:36:19 +0500 Subject: [PATCH 3/3] WIP: Trying SQL.js --- src/database/sqlite_connection.ts | 54 +++++++++++++++++++++++++++++++ src/server/server.ts | 8 ++--- src/settings.ts | 2 +- src/utils/notifications.ts | 2 +- src/utils/setup_utils.ts | 24 ++++++++++---- 5 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 src/database/sqlite_connection.ts diff --git a/src/database/sqlite_connection.ts b/src/database/sqlite_connection.ts new file mode 100644 index 00000000..912db1ec --- /dev/null +++ b/src/database/sqlite_connection.ts @@ -0,0 +1,54 @@ +import fs from 'fs'; +import path from 'path'; +import initSqlJs, { Database } from 'sql.js'; +import { generateSettings } from '../settings'; + +class SQLiteConnection { + filebuffer: any; + db: any; + + constructor() { + try { + const settings = generateSettings(); + if (!fs.existsSync(settings.DATABASE_FILE_PATH)) { + fs.openSync(settings.DATABASE_FILE_PATH, "w+"); + } + this.filebuffer = fs.readFileSync(settings.DATABASE_FILE_PATH); + + } catch (err) { + console.error("Error initializing SQLite database:", err); + } + } + + async setup() { + const SQL = await initSqlJs({ + // Required to load the wasm binary asynchronously. Of course, you can host it wherever you want + // You can omit locateFile completely when running in node + locateFile: file => path.join(__dirname, ".." , `node_modules/sql.js/dist/${file}`) + }); + this.db = new SQL.Database(this.filebuffer); + } + + // static getInstance() { + // if (!SQLiteConnection.instance) { + // SQLiteConnection.instance = new SQLiteConnection(); + // } + // return SQLiteConnection.instance; + // } + + getDatabase() { + return this.db; + } + + disconnect() { + try { + if (this.db) { + this.db.close(); + } + } catch (err) { + console.error("Error disconnecting SQLite database:", err); + } + } +} + +module.exports = SQLiteConnection; diff --git a/src/server/server.ts b/src/server/server.ts index bec5f724..587dc3fb 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -13,7 +13,7 @@ import { CodeSyncLogger } from "../logger"; import { CODESYNC_STATES, CodeSyncState } from "../utils/state_utils"; import { createUserWithApi } from "../utils/api_utils"; import { UserState } from "../utils/user_utils"; -import { createRedirectUri } from "../utils/url_utils"; +import { WEB_APP_URL } from "../settings"; export const initExpressServer = () => { const msgs = { @@ -36,6 +36,7 @@ export const initExpressServer = () => { // define a route handler for the authorization callback expressApp.get(Auth0URLs.LOGIN_CALLBACK_PATH, async (req: any, res: any) => { + if (!req.query.access_token || !req.query.id_token) return; try { await createUser(req.query.access_token, req.query.id_token); } catch (e) { @@ -43,13 +44,12 @@ export const initExpressServer = () => { // @ts-ignore CodeSyncLogger.critical("Login callback failed", e.stack); } - res.send("OK"); + res.redirect(WEB_APP_URL); }); expressApp.get(Auth0URLs.LOGOUT_CALLBACK_PATH, async (req: any, res: any) => { postSuccessLogout(); - const login_callback = createRedirectUri(Auth0URLs.LOGIN_CALLBACK_PATH); - res.send(JSON.stringify({login_callback})); + res.redirect(WEB_APP_URL); }); // define a route handler for the default home page diff --git a/src/settings.ts b/src/settings.ts index 92e8f351..a10da2e3 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -90,7 +90,7 @@ export const generateSettings = () => { ALERTS: path.join(rootRepo, "alerts.yml") }; - const DATABASE_FILE_PATH = path.join(rootRepo, "codesyncdb.db"); + const DATABASE_FILE_PATH = path.join(rootRepo, "codesync-v1-vscode.db"); return { ...systemDirectories, diff --git a/src/utils/notifications.ts b/src/utils/notifications.ts index defe1fc1..2328b6ed 100644 --- a/src/utils/notifications.ts +++ b/src/utils/notifications.ts @@ -12,7 +12,7 @@ export const showSignUpButtons = () => { NOTIFICATION.WELCOME_MSG, ...[ NOTIFICATION.LOGIN, NOTIFICATION.IGNORE - ]).then(async selection => { + ]).then(selection => { if (selection === NOTIFICATION.LOGIN) { authHandler(); } diff --git a/src/utils/setup_utils.ts b/src/utils/setup_utils.ts index c01c01ec..b0f43a4f 100644 --- a/src/utils/setup_utils.ts +++ b/src/utils/setup_utils.ts @@ -2,7 +2,7 @@ import fs from 'fs'; import path from 'path'; import yaml from 'js-yaml'; import vscode, { Extension } from 'vscode'; -import initSqlJs from 'sql.js'; +import initSqlJs, { Database } from 'sql.js'; import { COMMAND, @@ -314,7 +314,6 @@ export const uuidv4 = () => { export const setupDatabase = async () => { const settings = generateSettings(); if (!fs.existsSync(settings.DATABASE_FILE_PATH)) { - console.log("Creating DB"); fs.openSync(settings.DATABASE_FILE_PATH, "w+"); } const filebuffer = fs.readFileSync(settings.DATABASE_FILE_PATH); @@ -323,14 +322,27 @@ export const setupDatabase = async () => { // You can omit locateFile completely when running in node locateFile: file => path.join(__dirname, ".." , `node_modules/sql.js/dist/${file}`) }); - console.log("db", 1); const db = new SQL.Database(filebuffer); - console.log("db", 2); + try { - const res = db.exec("SELECT * FROM hello"); + // const res = db.exec("SELECT * FROM hello"); + db.run('BEGIN TRANSACTION'); + db.run("CREATE TABLE IF NOT EXISTS test1 (col1, col2);"); + // Commit the transaction + db.run('COMMIT'); + console.log("Commiting to DB"); + // writeToDB(db); } catch (e) { - console.log("Creating table"); + console.log("error", e); // Testing a comment with Latest Sanic version on Server // How about now with intermediate changes } }; + + +const writeToDB = (db: Database) => { + const settings = generateSettings(); + const data = db.export(); + const buffer = Buffer.from(data); + fs.writeFileSync(settings.DATABASE_FILE_PATH, buffer); +};