164 lines
3.6 KiB
JavaScript
164 lines
3.6 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
const { Service } = require('ee-core');
|
||
|
|
const Storage = require('ee-core/storage');
|
||
|
|
const _ = require('lodash');
|
||
|
|
const path = require('path');
|
||
|
|
|
||
|
|
/**
|
||
|
|
* sqlite数据存储
|
||
|
|
* @class
|
||
|
|
*/
|
||
|
|
class SqlitedbService extends Service {
|
||
|
|
|
||
|
|
constructor (ctx) {
|
||
|
|
super(ctx);
|
||
|
|
|
||
|
|
this.sqliteFile = 'sqlite-demo.db';
|
||
|
|
let sqliteOptions = {
|
||
|
|
driver: 'sqlite',
|
||
|
|
default: {
|
||
|
|
timeout: 6000,
|
||
|
|
verbose: console.log // 打印sql语法
|
||
|
|
}
|
||
|
|
}
|
||
|
|
this.demoSqliteDB = Storage.connection(this.sqliteFile, sqliteOptions);
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* 检查并创建表 (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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
SqlitedbService.toString = () => '[class SqlitedbService]';
|
||
|
|
module.exports = SqlitedbService;
|