Commit 94a0677b authored by nanahira's avatar nanahira

migrate sqlite3 to sql.js

parent ed5a4d13
This diff is collapsed.
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
读取指定文件夹里所有卡组,得出卡片使用量,生成csv 读取指定文件夹里所有卡组,得出卡片使用量,生成csv
*/ */
var sqlite3 = require('sqlite3').verbose();
var fs = require('fs'); var fs = require('fs');
var initSqlJs = require('sql.js');
var loadJSON = require('load-json-file').sync; var loadJSON = require('load-json-file').sync;
var config = loadJSON('./config/deckstats.json'); //{ "deckpath": "../decks", "dbfile": "cards.cdb" } var config = loadJSON('./config/deckstats.json'); //{ "deckpath": "../decks", "dbfile": "cards.cdb" }
var constants = loadJSON('./data/constants.json'); var constants = loadJSON('./data/constants.json');
...@@ -16,6 +16,23 @@ var ALL_MAIN_CARDS={}; ...@@ -16,6 +16,23 @@ var ALL_MAIN_CARDS={};
var ALL_SIDE_CARDS={}; var ALL_SIDE_CARDS={};
var ALL_CARD_DATAS={}; var ALL_CARD_DATAS={};
var sqlJsPromise;
var SQL = null;
function ensureSqlJs() {
if (!sqlJsPromise) {
var wasmPath = require.resolve('sql.js/dist/sql-wasm.wasm');
sqlJsPromise = initSqlJs({
locateFile: function() {
return wasmPath;
}
}).then(function(SQLLib) {
SQL = SQLLib;
return SQLLib;
});
}
return sqlJsPromise;
}
function add_to_deck(deck,id) { function add_to_deck(deck,id) {
if (deck[id]) { if (deck[id]) {
deck[id]=deck[id]+1; deck[id]=deck[id]+1;
...@@ -70,15 +87,14 @@ function read_deck_file(filename) { ...@@ -70,15 +87,14 @@ function read_deck_file(filename) {
} }
function load_database(callback) { function load_database(callback) {
var db=new sqlite3.Database(config.dbfile); ensureSqlJs().then(function() {
db.each("select * from datas,texts where datas.id=texts.id", function (err,result) { var dbBuffer = fs.readFileSync(config.dbfile);
if (err) { var db = new SQL.Database(dbBuffer);
console.log(config.dbfile + ":" + err); var stmt = db.prepare("select * from datas,texts where datas.id=texts.id");
return; while (stmt.step()) {
} var result = stmt.getAsObject();
else {
if (result.type & constants.TYPES.TYPE_TOKEN) { if (result.type & constants.TYPES.TYPE_TOKEN) {
return; continue;
} }
var card={}; var card={};
...@@ -140,7 +156,17 @@ function load_database(callback) { ...@@ -140,7 +156,17 @@ function load_database(callback) {
ALL_CARD_DATAS[result.id]=card; ALL_CARD_DATAS[result.id]=card;
} }
}, callback); stmt.free();
db.close();
if (callback) {
callback();
}
}).catch(function(err) {
console.log(config.dbfile + ":" + err);
if (callback) {
callback(err);
}
});
} }
function read_decks() { function read_decks() {
...@@ -190,5 +216,8 @@ function output_csv(list,filename) { ...@@ -190,5 +216,8 @@ function output_csv(list,filename) {
} }
} }
load_database(read_decks); ensureSqlJs().then(function() {
load_database(read_decks);
}).catch(function(err) {
console.error("Failed to load sql.js: " + err);
});
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
*/ */
var http = require('http'); var http = require('http');
var https = require('https'); var https = require('https');
var sqlite3 = require('sqlite3').verbose();
var fs = require('fs'); var fs = require('fs');
var initSqlJs = require('sql.js');
var exec = require('child_process').exec; var exec = require('child_process').exec;
var execSync = require('child_process').execSync; var execSync = require('child_process').execSync;
var spawn = require('child_process').spawn; var spawn = require('child_process').spawn;
...@@ -36,6 +36,23 @@ var responder; ...@@ -36,6 +36,23 @@ var responder;
var dataver = moment().format("YYYYMMDDHHmmss"); var dataver = moment().format("YYYYMMDDHHmmss");
const _async = require("async"); const _async = require("async");
var sqlJsPromise;
var SQL = null;
function ensureSqlJs() {
if (!sqlJsPromise) {
var wasmPath = require.resolve('sql.js/dist/sql-wasm.wasm');
sqlJsPromise = initSqlJs({
locateFile: function() {
return wasmPath;
}
}).then(function(SQLLib) {
SQL = SQLLib;
return SQLLib;
});
}
return sqlJsPromise;
}
//输出反馈信息,如有http长连接则输出到http,否则输出到控制台 //输出反馈信息,如有http长连接则输出到http,否则输出到控制台
var sendResponse = function(text) { var sendResponse = function(text) {
text=""+text; text=""+text;
...@@ -50,18 +67,17 @@ var sendResponse = function(text) { ...@@ -50,18 +67,17 @@ var sendResponse = function(text) {
//读取数据库内内容到cardHTMLs,异步 //读取数据库内内容到cardHTMLs,异步
var loadDb = function(db_file, callback) { var loadDb = function(db_file, callback) {
var db = new sqlite3.Database(db_file); ensureSqlJs().then(function() {
var dbBuffer = fs.readFileSync(db_file);
db.each("select * from datas,texts where datas.id=texts.id", function (err,result) { var db = new SQL.Database(dbBuffer);
if (err) { var stmt = db.prepare("select * from datas,texts where datas.id=texts.id");
sendResponse(db_file + ":" + err); var num = 0;
return; while (stmt.step()) {
} var result = stmt.getAsObject();
else {
if (result.type & constants.TYPES.TYPE_TOKEN) { if (result.type & constants.TYPES.TYPE_TOKEN) {
return; continue;
} }
var cardHTML="<tr>"; var cardHTML="<tr>";
cardHTML+='<td><a href="'+ config.html_img_rel_path + result.id +'.jpg" target="_blank"><img data-original="'+config.html_img_rel_path+config.html_img_thumbnail+ result.id +'.jpg'+ config.html_img_thumbnail_suffix +'" alt="'+ result.name +'"></a></td>'; cardHTML+='<td><a href="'+ config.html_img_rel_path + result.id +'.jpg" target="_blank"><img data-original="'+config.html_img_rel_path+config.html_img_thumbnail+ result.id +'.jpg'+ config.html_img_thumbnail_suffix +'" alt="'+ result.name +'"></a></td>';
...@@ -191,16 +207,16 @@ var loadDb = function(db_file, callback) { ...@@ -191,16 +207,16 @@ var loadDb = function(db_file, callback) {
cardHTML+='</tr>'; cardHTML+='</tr>';
cardHTMLs.push(cardHTML); cardHTMLs.push(cardHTML);
num++;
} }
}, function(err, num) { stmt.free();
if(err) { db.close();
sendResponse(db_file + ":" + err); dataver = moment().format("YYYYMMDDHHmmss");
} sendResponse("已加载数据库"+db_file+",共"+num+"张卡。");
else { callback(null, num);
dataver = moment().format("YYYYMMDDHHmmss"); }).catch(function(err) {
sendResponse("已加载数据库"+db_file+",共"+num+"张卡。"); sendResponse(db_file + ":" + err);
} callback(err);
callback(err, num);
}); });
} }
...@@ -576,14 +592,20 @@ async function requestListener(req, res) { ...@@ -576,14 +592,20 @@ async function requestListener(req, res) {
} }
if (ssl_config.enabled) { function startServer() {
const ssl_cert = fs.readFileSync(ssl_config.cert); if (ssl_config.enabled) {
const ssl_key = fs.readFileSync(ssl_config.key); const ssl_cert = fs.readFileSync(ssl_config.cert);
const options = { const ssl_key = fs.readFileSync(ssl_config.key);
cert: ssl_cert, const options = {
key: ssl_key cert: ssl_cert,
key: ssl_key
}
https.createServer(options, requestListener).listen(config.port);
} else {
http.createServer(requestListener).listen(config.port);
} }
https.createServer(options, requestListener).listen(config.port);
} else {
http.createServer(requestListener).listen(config.port);
} }
ensureSqlJs().then(startServer).catch(function(err) {
console.error("Failed to load sql.js: " + err);
});
...@@ -9,8 +9,8 @@ ...@@ -9,8 +9,8 @@
*/ */
var http = require('http'); var http = require('http');
var https = require('https'); var https = require('https');
var sqlite3 = require('sqlite3').verbose();
var fs = require('fs'); var fs = require('fs');
var initSqlJs = require('sql.js');
var execSync = require('child_process').execSync; var execSync = require('child_process').execSync;
var spawn = require('child_process').spawn; var spawn = require('child_process').spawn;
var spawnSync = require('child_process').spawnSync; var spawnSync = require('child_process').spawnSync;
...@@ -34,6 +34,23 @@ var changelog=[]; ...@@ -34,6 +34,23 @@ var changelog=[];
//http长连接 //http长连接
var responder; var responder;
var sqlJsPromise;
var SQL = null;
function ensureSqlJs() {
if (!sqlJsPromise) {
var wasmPath = require.resolve('sql.js/dist/sql-wasm.wasm');
sqlJsPromise = initSqlJs({
locateFile: function() {
return wasmPath;
}
}).then(function(SQLLib) {
SQL = SQLLib;
return SQLLib;
});
}
return sqlJsPromise;
}
//输出反馈信息,如有http长连接则输出到http,否则输出到控制台 //输出反馈信息,如有http长连接则输出到http,否则输出到控制台
var sendResponse = function(text) { var sendResponse = function(text) {
text=""+text; text=""+text;
...@@ -48,23 +65,21 @@ var sendResponse = function(text) { ...@@ -48,23 +65,21 @@ var sendResponse = function(text) {
//读取数据库内内容到cardNames,异步 //读取数据库内内容到cardNames,异步
var loadDb = function(db_file) { var loadDb = function(db_file) {
var db = new sqlite3.Database(db_file); ensureSqlJs().then(function() {
var dbBuffer = fs.readFileSync(db_file);
db.each("select id,name from texts", function (err,result) { var db = new SQL.Database(dbBuffer);
if (err) { var stmt = db.prepare("select id,name from texts");
sendResponse(db_file + ":" + err); var num = 0;
return; while (stmt.step()) {
} var result = stmt.getAsObject();
else {
cardNames[result.id] = result.name; cardNames[result.id] = result.name;
num++;
} }
}, function(err, num) { stmt.free();
if(err) { db.close();
sendResponse(db_file + ":" + err); sendResponse("已加载数据库"+db_file+",共"+num+"张卡。");
} }).catch(function(err) {
else { sendResponse(db_file + ":" + err);
sendResponse("已加载数据库"+db_file+",共"+num+"张卡。");
}
}); });
} }
...@@ -294,14 +309,20 @@ async function requestListener(req, res) { ...@@ -294,14 +309,20 @@ async function requestListener(req, res) {
} }
if (ssl_config.enabled) { function startServer() {
const ssl_cert = fs.readFileSync(ssl_config.cert); if (ssl_config.enabled) {
const ssl_key = fs.readFileSync(ssl_config.key); const ssl_cert = fs.readFileSync(ssl_config.cert);
const options = { const ssl_key = fs.readFileSync(ssl_config.key);
cert: ssl_cert, const options = {
key: ssl_key cert: ssl_cert,
key: ssl_key
}
https.createServer(options, requestListener).listen(config.port);
} else {
http.createServer(requestListener).listen(config.port);
} }
https.createServer(options, requestListener).listen(config.port);
} else {
http.createServer(requestListener).listen(config.port);
} }
ensureSqlJs().then(startServer).catch(function(err) {
console.error("Failed to load sql.js: " + err);
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment