| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- '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;
|