storage.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. 'use strict';
  2. const { Service } = require('ee-core');
  3. const Storage = require('ee-core/storage');
  4. const _ = require('lodash');
  5. const path = require('path');
  6. /**
  7. * 数据存储
  8. * @class
  9. */
  10. class StorageService extends Service {
  11. constructor (ctx) {
  12. super(ctx);
  13. // jsondb数据库
  14. this.systemDB = Storage.connection('system');
  15. let jsondbOptions = {
  16. driver: 'jsondb'
  17. }
  18. this.demoDB = Storage.connection('demo', jsondbOptions);
  19. this.demoDBKey = {
  20. test_data: 'test_data'
  21. };
  22. // sqlite数据库
  23. this.sqliteFile = 'sqlite-demo.db';
  24. let sqliteOptions = {
  25. driver: 'sqlite',
  26. default: {
  27. timeout: 6000,
  28. verbose: console.log // 打印sql语法
  29. }
  30. }
  31. this.demoSqliteDB = Storage.connection(this.sqliteFile, sqliteOptions);
  32. }
  33. /*
  34. * 增 Test data
  35. */
  36. async addTestData(user) {
  37. const key = this.demoDBKey.test_data;
  38. if (!this.demoDB.db.has(key).value()) {
  39. this.demoDB.db.set(key, []).write();
  40. }
  41. const data = this.demoDB.db
  42. .get(key)
  43. .push(user)
  44. .write();
  45. return data;
  46. }
  47. /*
  48. * 删 Test data
  49. */
  50. async delTestData(name = '') {
  51. const key = this.demoDBKey.test_data;
  52. const data = this.demoDB.db
  53. .get(key)
  54. .remove({name: name})
  55. .write();
  56. return data;
  57. }
  58. /*
  59. * 改 Test data
  60. */
  61. async updateTestData(name= '', age = 0) {
  62. const key = this.demoDBKey.test_data;
  63. const data = this.demoDB.db
  64. .get(key)
  65. .find({name: name}) // 修改找到的第一个数据,貌似无法批量修改 todo
  66. .assign({age: age})
  67. .write();
  68. return data;
  69. }
  70. /*
  71. * 查 Test data
  72. */
  73. async getTestData(age = 0) {
  74. const key = this.demoDBKey.test_data;
  75. let data = this.demoDB.db
  76. .get(key)
  77. //.find({age: age}) 查找单个
  78. .filter(function(o) {
  79. let isHas = true;
  80. isHas = age === o.age ? true : false;
  81. return isHas;
  82. })
  83. //.orderBy(['age'], ['name']) 排序
  84. //.slice(0, 10) 分页
  85. .value();
  86. if (_.isEmpty(data)) {
  87. data = []
  88. }
  89. return data;
  90. }
  91. /*
  92. * all Test data
  93. */
  94. async getAllTestData() {
  95. const key = this.demoDBKey.test_data;
  96. if (!this.demoDB.db.has(key).value()) {
  97. this.demoDB.db.set(key, []).write();
  98. }
  99. let data = this.demoDB.db
  100. .get(key)
  101. .value();
  102. if (_.isEmpty(data)) {
  103. data = []
  104. }
  105. return data;
  106. }
  107. /*
  108. * 检查并创建表 (sqlite)
  109. */
  110. async checkAndCreateTableSqlite(tableName = '') {
  111. if (_.isEmpty(tableName)) {
  112. throw new Error(`table name is required`);
  113. }
  114. // 检查表是否存在
  115. const userTable = this.demoSqliteDB.db.prepare('SELECT * FROM sqlite_master WHERE type=? AND name = ?');
  116. const result = userTable.get('table', tableName);
  117. //console.log('result:', result);
  118. if (result) {
  119. return;
  120. }
  121. // 创建表
  122. const create_table_user =
  123. `CREATE TABLE ${tableName}
  124. (
  125. id INTEGER PRIMARY KEY AUTOINCREMENT,
  126. name CHAR(50) NOT NULL,
  127. age INT
  128. );`
  129. this.demoSqliteDB.db.exec(create_table_user);
  130. }
  131. /*
  132. * 增 Test data (sqlite)
  133. */
  134. async addTestDataSqlite(data) {
  135. //console.log("add data:", data);
  136. let table = 'user';
  137. await this.checkAndCreateTableSqlite(table);
  138. const insert = this.demoSqliteDB.db.prepare(`INSERT INTO ${table} (name, age) VALUES (@name, @age)`);
  139. insert.run(data);
  140. return true;
  141. }
  142. /*
  143. * 删 Test data (sqlite)
  144. */
  145. async delTestDataSqlite(name = '') {
  146. //console.log("delete name:", name);
  147. let table = 'user';
  148. await this.checkAndCreateTableSqlite(table);
  149. const delUser = this.demoSqliteDB.db.prepare(`DELETE FROM ${table} WHERE name = ?`);
  150. delUser.run(name);
  151. return true;
  152. }
  153. /*
  154. * 改 Test data (sqlite)
  155. */
  156. async updateTestDataSqlite(name= '', age = 0) {
  157. //console.log("update :", {name, age});
  158. let table = 'user';
  159. await this.checkAndCreateTableSqlite(table);
  160. const updateUser = this.demoSqliteDB.db.prepare(`UPDATE ${table} SET age = ? WHERE name = ?`);
  161. updateUser.run(age, name);
  162. return true;
  163. }
  164. /*
  165. * 查 Test data (sqlite)
  166. */
  167. async getTestDataSqlite(age = 0) {
  168. //console.log("select :", {age});
  169. let table = 'user';
  170. await this.checkAndCreateTableSqlite(table);
  171. const selectUser = this.demoSqliteDB.db.prepare(`SELECT * FROM ${table} WHERE age = @age`);
  172. const users = selectUser.all({age: age});
  173. //console.log("select users:", users);
  174. return users;
  175. }
  176. /*
  177. * all Test data (sqlite)
  178. */
  179. async getAllTestDataSqlite() {
  180. //console.log("select all user");
  181. let table = 'user';
  182. await this.checkAndCreateTableSqlite(table);
  183. const selectAllUser = this.demoSqliteDB.db.prepare(`SELECT * FROM ${table} `);
  184. const allUser = selectAllUser.all();
  185. //console.log("select allUser:", allUser);
  186. return allUser;
  187. }
  188. /*
  189. * get data dir (sqlite)
  190. */
  191. async getDataDir() {
  192. const dir = this.demoSqliteDB.getStorageDir();
  193. return dir;
  194. }
  195. /*
  196. * set custom data dir (sqlite)
  197. */
  198. async setCustomDataDir(dir) {
  199. if (_.isEmpty(dir)) {
  200. return;
  201. }
  202. // the absolute path of the db file
  203. const dbFile = path.join(dir, this.sqliteFile);
  204. const sqliteOptions = {
  205. driver: 'sqlite',
  206. default: {
  207. timeout: 6000,
  208. verbose: console.log
  209. }
  210. }
  211. this.demoSqliteDB = Storage.connection(dbFile, sqliteOptions);
  212. return;
  213. }
  214. }
  215. StorageService.toString = () => '[class StorageService]';
  216. module.exports = StorageService;