'use strict'; const { Service } = require('ee-core'); const Storage = require('ee-core/storage'); const _ = require('lodash'); const path = require('path'); /** * 数据存储 * @class */ class StorageService extends Service { constructor (ctx) { super(ctx); // jsondb数据库 this.systemDB = Storage.connection('system'); let jsondbOptions = { driver: 'jsondb' } this.demoDB = Storage.connection('demo', jsondbOptions); this.demoDBKey = { test_data: 'test_data' }; // sqlite数据库 this.sqliteFile = 'sqlite-demo.db'; let sqliteOptions = { driver: 'sqlite', default: { timeout: 6000, verbose: console.log // 打印sql语法 } } this.demoSqliteDB = Storage.connection(this.sqliteFile, sqliteOptions); } /* * 增 Test data */ async addTestData(user) { const key = this.demoDBKey.test_data; if (!this.demoDB.db.has(key).value()) { this.demoDB.db.set(key, []).write(); } const data = this.demoDB.db .get(key) .push(user) .write(); return data; } /* * 删 Test data */ async delTestData(name = '') { const key = this.demoDBKey.test_data; const data = this.demoDB.db .get(key) .remove({name: name}) .write(); return data; } /* * 改 Test data */ async updateTestData(name= '', age = 0) { const key = this.demoDBKey.test_data; const data = this.demoDB.db .get(key) .find({name: name}) // 修改找到的第一个数据,貌似无法批量修改 todo .assign({age: age}) .write(); return data; } /* * 查 Test data */ async getTestData(age = 0) { const key = this.demoDBKey.test_data; let data = this.demoDB.db .get(key) //.find({age: age}) 查找单个 .filter(function(o) { let isHas = true; isHas = age === o.age ? true : false; return isHas; }) //.orderBy(['age'], ['name']) 排序 //.slice(0, 10) 分页 .value(); if (_.isEmpty(data)) { data = [] } return data; } /* * all Test data */ async getAllTestData() { const key = this.demoDBKey.test_data; if (!this.demoDB.db.has(key).value()) { this.demoDB.db.set(key, []).write(); } let data = this.demoDB.db .get(key) .value(); if (_.isEmpty(data)) { data = [] } return data; } /* * 检查并创建表 (sqlite) */ async checkAndCreateTableSqlite(tableName = '') { if (_.isEmpty(tableName)) { throw new Error(`table name is required`); } // 检查表是否存在 const userTable = this.demoSqliteDB.db.prepare('SELECT * FROM sqlite_master WHERE type=? AND name = ?'); const result = userTable.get('table', tableName); //console.log('result:', result); if (result) { return; } // 创建表 const create_table_user = `CREATE TABLE ${tableName} ( id INTEGER PRIMARY KEY AUTOINCREMENT, name CHAR(50) NOT NULL, age INT );` this.demoSqliteDB.db.exec(create_table_user); } /* * 增 Test data (sqlite) */ async addTestDataSqlite(data) { //console.log("add data:", data); let table = 'user'; await this.checkAndCreateTableSqlite(table); const insert = this.demoSqliteDB.db.prepare(`INSERT INTO ${table} (name, age) VALUES (@name, @age)`); insert.run(data); return true; } /* * 删 Test data (sqlite) */ async delTestDataSqlite(name = '') { //console.log("delete name:", name); let table = 'user'; await this.checkAndCreateTableSqlite(table); const delUser = this.demoSqliteDB.db.prepare(`DELETE FROM ${table} WHERE name = ?`); delUser.run(name); return true; } /* * 改 Test data (sqlite) */ async updateTestDataSqlite(name= '', age = 0) { //console.log("update :", {name, age}); let table = 'user'; await this.checkAndCreateTableSqlite(table); const updateUser = this.demoSqliteDB.db.prepare(`UPDATE ${table} SET age = ? WHERE name = ?`); updateUser.run(age, name); return true; } /* * 查 Test data (sqlite) */ async getTestDataSqlite(age = 0) { //console.log("select :", {age}); let table = 'user'; await this.checkAndCreateTableSqlite(table); const selectUser = this.demoSqliteDB.db.prepare(`SELECT * FROM ${table} WHERE age = @age`); const users = selectUser.all({age: age}); //console.log("select users:", users); return users; } /* * all Test data (sqlite) */ async getAllTestDataSqlite() { //console.log("select all user"); let table = 'user'; await this.checkAndCreateTableSqlite(table); const selectAllUser = this.demoSqliteDB.db.prepare(`SELECT * FROM ${table} `); const allUser = selectAllUser.all(); //console.log("select allUser:", allUser); return allUser; } /* * get data dir (sqlite) */ async getDataDir() { const dir = this.demoSqliteDB.getStorageDir(); return dir; } /* * set custom data dir (sqlite) */ async setCustomDataDir(dir) { if (_.isEmpty(dir)) { return; } // the absolute path of the db file const dbFile = path.join(dir, this.sqliteFile); const sqliteOptions = { driver: 'sqlite', default: { timeout: 6000, verbose: console.log } } this.demoSqliteDB = Storage.connection(dbFile, sqliteOptions); return; } } StorageService.toString = () => '[class StorageService]'; module.exports = StorageService;