mm_os
Version:
MM_OS服务端架构,用于快速构建应用程序,支持网站建设、小程序后台、AI应用、物联网(IOT/AIOT)、游戏服务端等多种场景。
243 lines (230 loc) • 5.86 kB
JavaScript
const Manager = require('mm_machine').Manager;
const Drive = require('./drive');
/**
* 数据库帮助类
* @augments {Manager}
* @class
*/
class Db extends Manager {
/**
* 配置参数
* @type {object}
*/
static config = {
/**
* 名称
* @type {string}
*/
name: '',
/**
* 标题
* @type {string}
*/
title: '数据库管理',
/**
* 描述
* @type {string}
*/
description: '这是数据库管理器',
/**
* 检索文件名
* @type {string}
*/
filename: 'db.json',
/**
* 模板目录
* @type {string}
*/
tpl_dir: __dirname,
/**
* 基础目录
* @type {string}
*/
base_dir: '../common/db'.fullname(__dirname),
/**
* 自定义目录,加载项目自定义资源
* @type {string}
*/
dir: './app'.fullname(),
/**
* 搜索模式 dir按目录搜索 | file按文件名搜索
* @type {string}
*/
search_way: 'file',
/**
* 是否懒加载
* @type {boolean}
*/
lazy_load: true,
/**
* 模式
* 1.生产模式,改变文件不会重新加载
* 2.热更新模式,改变配置文件会重新加载配置,不重新加载脚本
* 3.热重载模式,改变配置文件都会加载配置和脚本
* 4.重载模式,执行完后重新加载脚本,避免变量污染
* 5.热更新+重载模式,改变配置文件重新加载配置和脚本,执行完后重新加载脚本
* @type {number}
*/
mode: 3
};
/**
* 构造函数
* @param {object} config 配置参数
* @param {object} parent 父级模块
*/
constructor(config, parent) {
super({ ...Db.config, ...config }, parent);
}
}
/**
* 数据库驱动类
* @type {Drive}
*/
Db.prototype.Drive = Drive;
/**
* 加载配置
* @param {string} path 加载的路径
*/
Db.prototype.updateConfigAll = async function (path) {
var ph = path || './app/';
// 获取所有应用路径
var search_dir;
var _this = this;
if (this.scope && this.scope !== $.val.scope) {
search_dir = this.type + '_' + this.scope;
var list_scope = $.dir.getAll(ph, search_dir);
for (var i = 0, o; o = list_scope[i++];) {
// 获取所有配置文件
var list_file = $.file.getAll(o, '*' + _this.type + '.json');
await _this.loadList(list_file);
}
} else {
// 获取所有配置文件
var list_file = $.file.getAll(ph, '*' + _this.type + '.json');
await _this.loadList(list_file);
}
};
/**
* 获取驱动项
* @param {string} table 表
* @returns {object} 返回驱动项
*/
Db.prototype.getObj = function (table) {
var obj;
var mods = this.getMods();
for (var k in mods) {
var o = mods[k];
if (o.config.table === table) {
obj = o;
break;
}
}
return obj;
};
/**
* 通过数据库更新配置
* @param {object} db 数据库管理器
* @param {string} name 要更新的配置名
* @param {string} table 表名关键词, 支持*table后缀匹配、table*前缀匹配、*table*包含匹配
* @param {boolean} cover 是否覆盖文件
* @returns {string} 更新成功返回null, 失败返回错误提示
*/
Db.prototype.updateFile = async function (db, name, table, cover = true) {
if (name) {
var o = this.getMod(name);
if (o) {
await o.call('updateFile', db, cover);
} else {
return '该配置不存在';
}
} else {
var list = await db.tables(table);
var len = list.length;
if (len > 0) {
for (var i = 0; i < len; i++) {
var te = list[i];
var obj = this.getObj(te);
if (obj) {
await obj.call('updateFile', db, cover);
} else {
var drive = new this.Drive({
scope: this.config.name
});
drive.config.table = te;
await drive.call('updateFile', db, cover);
this.setMod(drive.config.table, drive);
}
}
} else {
return '没有找到相关的数据表';
}
}
return null;
};
/**
* 通过配置修改数据库
* @param {object} db 数据库管理器
* @param {string} name 要更新的配置名
* @param {string} table 表名关键词, 支持*table后缀匹配、table*前缀匹配、*table*包含匹配
* @param {boolean} all 是否更新全部表,true为是,false为否
* @returns {string} 更新成功返回null, 失败返回错误提示
*/
Db.prototype.updateDb = async function (db, name, table, all) {
var ret;
if (name) {
var o = this.getMod(name);
if (o) {
ret = await o.call('updateDb', db);
} else {
ret = '该配置不存在';
}
} else {
var mods = this.getMods();
if (table) {
for (var k in mods) {
var o = mods[k];
if (o.config.table === table) {
ret = await o.call('updateDb', db);
break;
}
}
} else if (all) {
for (var k in mods) {
var o = mods[k];
await o.call('updateDb', db);
}
}
}
return ret;
};
exports.Db = Db;
/**
* Db数据库池
*/
if (!$.pool.db) {
$.pool.db = {};
}
/**
* Db数据库管理器,用于创建缓存
* @param {string} scope 作用域
* @param {string} title 标题
* @returns {object} 返回一个缓存类
*/
function dbAdmin(scope, title) {
var sc = scope || $.val.scope + '';
var obj = $.pool.db[sc];
if (!obj) {
$.pool.db[sc] = new Db({
scope: sc,
title: title
});
obj = $.pool.db[sc];
}
return obj;
}
/**
* @module 导出db管理器
*/
if ($.admin) {
$.admin.db = dbAdmin;
}