fix: update
This commit is contained in:
28
server/db.js
28
server/db.js
@@ -7,6 +7,8 @@ const fs = require('fs')
|
||||
|
||||
const dbPath = process.env.DB_PATH || path.join(__dirname, 'data.db')
|
||||
let _db = null
|
||||
/** sql.js 构造函数,initDb 时注入,供 reloadFromFile 使用 */
|
||||
let _sqlJs = null
|
||||
|
||||
function getDb() {
|
||||
if (!_db) throw new Error('DB not initialized. Call initDb() first.')
|
||||
@@ -239,6 +241,7 @@ function runMigrations(db) {
|
||||
async function initDb() {
|
||||
const initSqlJs = require('sql.js')
|
||||
const SQL = await initSqlJs()
|
||||
_sqlJs = SQL
|
||||
let data = new Uint8Array(0)
|
||||
if (fs.existsSync(dbPath)) {
|
||||
data = new Uint8Array(fs.readFileSync(dbPath))
|
||||
@@ -261,6 +264,30 @@ async function initDb() {
|
||||
return _db
|
||||
}
|
||||
|
||||
/**
|
||||
* 从磁盘重新加载 DB(爬虫写入同一文件后调用,使 Node 内存中的库与文件一致)
|
||||
*/
|
||||
function reloadFromFile() {
|
||||
if (!_sqlJs || !_db) throw new Error('DB not initialized. Call initDb() first.')
|
||||
let data = new Uint8Array(0)
|
||||
if (fs.existsSync(dbPath)) {
|
||||
data = new Uint8Array(fs.readFileSync(dbPath))
|
||||
}
|
||||
const nativeDb = new _sqlJs.Database(data)
|
||||
function persist() {
|
||||
try {
|
||||
const buf = nativeDb.export()
|
||||
fs.writeFileSync(dbPath, Buffer.from(buf))
|
||||
} catch (e) {
|
||||
console.error('[db] persist error:', e.message)
|
||||
}
|
||||
}
|
||||
nativeDb.run('PRAGMA journal_mode = WAL')
|
||||
const wrapped = wrapDatabase(nativeDb, persist)
|
||||
runMigrations(wrapped)
|
||||
_db = wrapped
|
||||
}
|
||||
|
||||
const proxy = {
|
||||
prepare(sql) {
|
||||
return getDb().prepare(sql)
|
||||
@@ -276,3 +303,4 @@ const proxy = {
|
||||
module.exports = proxy
|
||||
module.exports.initDb = initDb
|
||||
module.exports.getDb = getDb
|
||||
module.exports.reloadFromFile = reloadFromFile
|
||||
|
||||
Reference in New Issue
Block a user