From 5ad36c5fd07367a00ebed8b760d55539069ee448 Mon Sep 17 00:00:00 2001 From: Eason010212 <1371033826@qq.com> Date: Tue, 7 Mar 2023 00:38:25 +0800 Subject: [PATCH] MySQL (experimental) --- pkg_tools/linux-arm64-pkg.sh | 8 +- pkg_tools/win-x64-pkg.sh | 4 + src/config.json | 8 +- src/loader.js | 182 ++++++++++++++++++++++++++++++++--- src/package.json | 1 + 5 files changed, 183 insertions(+), 20 deletions(-) diff --git a/pkg_tools/linux-arm64-pkg.sh b/pkg_tools/linux-arm64-pkg.sh index c6e37bd..aa6de43 100644 --- a/pkg_tools/linux-arm64-pkg.sh +++ b/pkg_tools/linux-arm64-pkg.sh @@ -15,16 +15,12 @@ mkdir logs cd ../ chmod -R 777 mixio cd mixio -if [ ! -d "node_modules" ]; then - npm install -fi +npm install cd node_modules/cliff/node_modules/winston/lib/winston find -name 'common.js' | xargs perl -pi -e 's|target.padLevels|false|g' cd ../../../../../../ cd src -if [ ! -d "node_modules" ]; then - npm install -fi +npm install pkg -t node16-linux-arm64 package.json mv -f loader ../../mixio_linux_arm64/src/loader cp -r certs ../../mixio_linux_arm64/src diff --git a/pkg_tools/win-x64-pkg.sh b/pkg_tools/win-x64-pkg.sh index 6419586..479463b 100644 --- a/pkg_tools/win-x64-pkg.sh +++ b/pkg_tools/win-x64-pkg.sh @@ -1,3 +1,5 @@ +curpath=$(cd "$(dirname "$0")"; pwd) +cd ${curpath} version="{ \"version\":\"1.9.6\", \"platform\":\"win-x64\", @@ -13,10 +15,12 @@ mkdir logs cd ../ chmod -R 777 mixio cd mixio +npm install cd node_modules/cliff/node_modules/winston/lib/winston find -name 'common.js' | xargs perl -pi -e 's|target.padLevels|false|g' cd ../../../../../../ cd src +npm install pkg -t node16-win-x64 package.json mv -f loader ../../mixio_win_x64/src/loader cp -r certs ../../mixio_win_x64/src diff --git a/src/config.json b/src/config.json index e7400e7..2c40842 100644 --- a/src/config.json +++ b/src/config.json @@ -12,5 +12,11 @@ "BAIDU_MAP_AK": "", "BAIDU_MAP_SERVER_AK": "", "ADMIN_USERNAME":"admin", - "ADMIN_PASSWORD":"public" + "ADMIN_PASSWORD":"public", + "STORAGE_ENGINE":"sqlite", + "MYSQL_HOST":"localhost", + "MYSQL_PORT":3306, + "MYSQL_USER":"", + "MYSQL_PASS":"", + "MYSQL_DB":"mixio" } \ No newline at end of file diff --git a/src/loader.js b/src/loader.js index cec0b36..911d423 100644 --- a/src/loader.js +++ b/src/loader.js @@ -29,6 +29,15 @@ if(!fs.existsSync(configPath)){ var configs = fs.readFileSync(configPath); configs = JSON.parse(configs.toString()); +var STORAGE_ENGINE = configs["STORAGE_ENGINE"] + + +var mysql = require('mysql8'); +var MYSQL_HOST = configs["MYSQL_HOST"] +var MYSQL_USER = configs["MYSQL_USER"] +var MYSQL_PASS = configs["MYSQL_PASS"] +var MYSQL_DB = configs["MYSQL_DB"] +var MYSQL_PORT = configs["MYSQL_PORT"] var MAX_MESSAGE_PER_USER = configs["MAX_MESSAGE_PER_USER"] var MAX_MESSAGE_PER_SECOND = configs["MAX_MESSAGE_PER_SECOND"] @@ -547,7 +556,10 @@ var mixioServer = function() { var payload = String(packet.payload) if (topic.length == 3) { if (topic[2] == 'b640a0ce465fa2a4150c36b305c1c11b') { - db.run("insert or ignore into devices (userName, clientid) values (?,?)", [topic[0], payload]) + if(STORAGE_ENGINE == "sqlite") + db.run("insert or ignore into devices (userName, clientid) values (?,?)", [topic[0], payload]) + else if(STORAGE_ENGINE == "mysql") + db.run("insert ignore into devices (userName, clientid) values (?,?)", [topic[0], payload]) } else if (topic[2] == '9d634e1a156dc0c1611eb4c3cff57276') { db.run("delete from devices where userName = ? and clientid = ?", [topic[0], payload]) delete globalConnectionControl[client.id] @@ -1569,22 +1581,89 @@ var mixioServer = function() { if(fs.existsSync(mixlyPath)){ app.use('/mixly', express.static(mixlyPath)); } - - var dbPath = "./mixio.db" - if(!fs.existsSync(dbPath)) { - dbPath = path.join(__dirname,'./mixio.db') + + if(STORAGE_ENGINE == 'sqlite'){ + var dbPath = "./mixio.db" + if(!fs.existsSync(dbPath)) { + dbPath = path.join(__dirname,'./mixio.db') + } + db = new sqlite3.Database( + dbPath, + sqlite3.OPEN_READWRITE, + function(err) { + if (err) { + console.log(err.message) + } + db.run('delete from devices') + console.log('[INFO] Storage Engine: SQLite') + console.log('[INFO] Database Connected!') + } + ) } - db = new sqlite3.Database( - dbPath, - sqlite3.OPEN_READWRITE, - function(err) { + else if(STORAGE_ENGINE == 'mysql'){ + db = mysql.createConnection({ + host: MYSQL_HOST, + port: MYSQL_PORT, + user: MYSQL_USER, + password: MYSQL_PASS + }) + + db.get = function(sql, params, callback) { + db.query(sql, params, function(err, rows) { + if (err) { + callback(err, null) + } else { + callback(null, rows[0]) + } + }) + } + db.run = function(sql, params, callback) { + db.query(sql, params, function(err, result) { + if(err) + { + if(callback) + { + callback(err) + } + } + else if(callback) + callback() + }) + } + db.all = function(sql, params, callback) { + db.query(sql, params, function(err, rows) { + if (err) { + callback(err, null) + } else { + callback(null, rows) + } + }) + } + // create database if not exists + db.query('create database if not exists ' + MYSQL_DB, function(err) { if (err) { console.log(err.message) } - db.run('delete from devices') - console.log('[INFO] Database Connected!') - } - ) + db.query('use ' + MYSQL_DB, function(err) { + if (err) { + console.log(err.message) + } + init_mysql(function(status,reason){ + if(status == "error") + console.log(reason) + else if(status == "success") + { + console.log("[INFO] Database Initialized!") + + db.query('delete from devices') + console.log('[INFO] Storage Engine: MySQL (' + MYSQL_HOST + ')') + console.log('[INFO] Database Connected!') + } + }) + }) + }) + + } reserveDBs = [] for (var i = 1; i <= 8; i = i + 1) { @@ -1654,6 +1733,83 @@ var mixioServer = function() { } +function init_mysql(cb){ + db.query(`CREATE TABLE IF NOT EXISTS devices ( + userName VARCHAR(255), + clientid VARCHAR(255), + timestamp timestamp DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY(clientid) + )`, function(err, result) { + if (err) { + cb("error", err) + } + else { + db.query(`CREATE TABLE IF NOT EXISTS project ( + projectName VARCHAR(255), + userName VARCHAR(255), + projectLayout MEDIUMTEXT, + dataStorage MEDIUMTEXT, + logicStorage MEDIUMTEXT, + timestamp timestamp DEFAULT CURRENT_TIMESTAMP, + projectType INTEGER + )`, function(err, result) { + if (err) { + cb("error", err) + } + else { + db.query(`CREATE TABLE IF NOT EXISTS share ( + shareid VARCHAR(255), + userName VARCHAR(255), + projectName VARCHAR(255), + projectLayout MEDIUMTEXT, + dataStorage MEDIUMTEXT, + logicStorage MEDIUMTEXT, + timeStamp timestamp DEFAULT CURRENT_TIMESTAMP, + status INTEGER DEFAULT 1, + shareCount INTEGER DEFAULT 0 + )`, function(err, result) { + if (err) { + cb("error", err) + } + else { + db.query(`CREATE TABLE IF NOT EXISTS share_key ( + userName VARCHAR(255), + projectPass VARCHAR(255), + projectName VARCHAR(255), + share_key VARCHAR(255) + )`, function(err, result) { + if (err) { + cb("error", err) + } + else { + db.query(`CREATE TABLE IF NOT EXISTS user ( + id INTEGER AUTO_INCREMENT, + username VARCHAR(255), + password VARCHAR(255), + salt VARCHAR(255), + is_superuser INTEGER DEFAULT 0, + verified INTEGER DEFAULT 1, + question VARCHAR(255), + answer VARCHAR(255), + PRIMARY KEY(id) + )`, function(err, result) { + if(err){ + cb("error", err) + } + else{ + cb("success", null) + } + }) + } + }) + } + }) + } + }) + } + }) +} + daemon_start() async function startOnce() { mixio = await mixioServer() diff --git a/src/package.json b/src/package.json index 0add7a9..3471b3d 100644 --- a/src/package.json +++ b/src/package.json @@ -9,6 +9,7 @@ "js-md5": "^0.7.3", "jsdom": "^19.0.0", "mqtt": "^4.3.7", + "mysql8": "^2.17.3", "net": "^1.0.2", "sqlite3": "^5.0.2", "websocket-stream": "^5.5.2"