storage.js 5.4 KB

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