'use strict';
|
|
const assert = require('assert');
|
const fs = require('fs');
|
const path = require('path');
|
const Database = require('better-sqlite3');
|
const Helper = require('../utils/helper');
|
const Ps = require('../ps');
|
|
class SqliteStorage {
|
constructor (name, opt = {}) {
|
assert(name, `db name ${name} Cannot be empty`);
|
|
this.name = name;
|
this.mode = this.getMode(name);
|
this.storageDir = this._createStorageDir();
|
this.fileName = this._formatFileName(name);
|
this.db = this._initDB(opt);
|
}
|
|
/**
|
* 初始化db
|
*/
|
_initDB (opt = {}) {
|
let options = Object.assign({
|
timeout: 5000,
|
}, opt);
|
|
// 存储类型:db文件、内存(:memory:)
|
let dbPath = this.name;
|
if (this.mode != 'memory') {
|
dbPath = this.getFilePath();
|
}
|
|
const db = new Database(dbPath, options);
|
|
// 如果是文件类型,判断文件是否创建成功
|
if (this.mode != 'memory') {
|
assert(fs.existsSync(dbPath), `error: storage ${dbPath} not exists`);
|
}
|
|
return db;
|
}
|
|
/**
|
* 获取文件名
|
*/
|
_formatFileName (name) {
|
let fileName = name;
|
if (this.mode != 'memory') {
|
fileName = path.basename(name);
|
}
|
|
return fileName;
|
}
|
|
/**
|
* 创建storage目录
|
*/
|
_createStorageDir () {
|
let storageDir = Ps.getStorageDir();
|
|
if (this.mode == 'absolute') {
|
storageDir = path.dirname(this.name);
|
}
|
|
if (!fs.existsSync(storageDir)) {
|
Helper.mkdir(storageDir);
|
Helper.chmodPath(storageDir, '777');
|
}
|
|
return storageDir;
|
}
|
|
/**
|
* 获取file path 模式
|
*/
|
getMode (name) {
|
let mode = '';
|
|
// 内存模式
|
if (name == ':memory:') {
|
mode = 'memory';
|
return mode;
|
}
|
|
assert(path.extname(name) == '.db', `error: storage ${name} file ext name must be .db`);
|
|
// 路径模式
|
name = name.replace(/[/\\]/g, '/');
|
if (name.indexOf('/') !== -1) {
|
const isAbsolute = path.isAbsolute(name);
|
if (isAbsolute) {
|
mode = 'absolute';
|
} else {
|
mode = 'relative';
|
}
|
return mode;
|
}
|
|
// 仅文件名
|
mode = 'onlyName';
|
|
return mode;
|
}
|
|
/**
|
* 获取storage目录
|
*/
|
getStorageDir () {
|
return this.storageDir;
|
}
|
|
/**
|
* 获取文件绝对路径
|
*/
|
getFilePath () {
|
const dbFile = path.join(this.storageDir, this.fileName);
|
|
return dbFile;
|
}
|
}
|
|
module.exports = SqliteStorage;
|