|
|
@ -46,8 +46,9 @@ async function handleTask(app, task) { |
|
|
|
}//目录树下库只会存在一个 判断是否有库类型元数据 没有则新增库和表元数据 有库数据则比较更新表类型元数据 全量更新字段索引数据
|
|
|
|
}) |
|
|
|
let databaseId = databaseFind ? databaseFind.id : null; |
|
|
|
|
|
|
|
const newTableNames = [] |
|
|
|
if (databaseFind) { //更新表类型元数据
|
|
|
|
const newTableNames = [] |
|
|
|
Object.keys(tables).forEach(key => { newTableNames.push(key) }); |
|
|
|
|
|
|
|
//删除不存在表元数据
|
|
|
@ -108,45 +109,74 @@ async function handleTask(app, task) { |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
//字段/索引/外键全量更新 先删除之前的字段 再录入新的数据
|
|
|
|
await models.MetadataDatabase.destroy({ |
|
|
|
//字段索引外键上一次存储集合
|
|
|
|
const tableChildrens = await models.MetadataDatabase.findAll({ |
|
|
|
where: { |
|
|
|
type: { $in: ['字段', '索引', '外键'] }, |
|
|
|
catalog: dataSource.mountPath, |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
const fieldBodys = [] |
|
|
|
for (let table of metaDatabaseTables) { |
|
|
|
Object.keys(tables[table.name].structures).forEach(key => { |
|
|
|
dataToSave.parent = table.id; |
|
|
|
dataToSave.name = tables[table.name].structures[key].comment || key; |
|
|
|
dataToSave.code = key; |
|
|
|
dataToSave.type = '字段'; |
|
|
|
const tableObj = { ...dataToSave } |
|
|
|
fieldBodys.push(tableObj) |
|
|
|
let fieldBodys = [] |
|
|
|
let fieldRslt = null; |
|
|
|
if (tableChildrens.length == 0) { //首次执行定时任务新增
|
|
|
|
for (let table of metaDatabaseTables) { |
|
|
|
const children = handleAddTableChildren(dataToSave, tables, table); |
|
|
|
fieldBodys = fieldBodys.concat(children) |
|
|
|
} |
|
|
|
fieldRslt = await models.MetadataDatabase.bulkCreate(fieldBodys); |
|
|
|
} else {//更新数据
|
|
|
|
const deleteIds = [];//字段索引外键删除id集合
|
|
|
|
const deleteParentIds = [];//删除表集合
|
|
|
|
tableChildrens.forEach(s => { |
|
|
|
let table = metaDatabaseTables.find(x => x.id == s.parent) |
|
|
|
if (table) { |
|
|
|
if (s.type == '字段' && !tables[table.name].structures[s.code]) { |
|
|
|
deleteIds.push(s.id) |
|
|
|
} |
|
|
|
if (s.type == '外键' && !tables[table.name].foreignKeys.find(x => x.columnName == s.code)) { |
|
|
|
deleteIds.push(s.id) |
|
|
|
} |
|
|
|
if (s.type == '索引' && !tables[table.name].indexes.find(x => x.name == s.code)) { |
|
|
|
deleteIds.push(s.id) |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (!deleteParentIds.find(n => n == s.parent)) deleteParentIds.push(s.parent) |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
tables[table.name].foreignKeys.forEach(v => { |
|
|
|
dataToSave.parent = table.id; |
|
|
|
dataToSave.name = v.columnName; |
|
|
|
dataToSave.code = v.columnName; |
|
|
|
dataToSave.type = '外键'; |
|
|
|
const tableObj = { ...dataToSave } |
|
|
|
fieldBodys.push(tableObj) |
|
|
|
//判断新增- 新增表 新增表字段
|
|
|
|
Object.keys(tables).forEach(key => { |
|
|
|
const table = metaDatabaseTables.find(s => s.code == key) |
|
|
|
if (tableChildrens.find(s => s.parent == table.id)) { |
|
|
|
const children = handleAddTableChildren(dataToSave, tables, table, tableChildrens); |
|
|
|
fieldBodys = fieldBodys.concat(children) |
|
|
|
} else { |
|
|
|
const children = handleAddTableChildren(dataToSave, tables, table); |
|
|
|
fieldBodys = fieldBodys.concat(children) |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
tables[table.name].indexes.forEach(v => { |
|
|
|
dataToSave.parent = table.id; |
|
|
|
dataToSave.name = v.name; |
|
|
|
dataToSave.code = v.name; |
|
|
|
dataToSave.type = '索引'; |
|
|
|
const tableObj = { ...dataToSave } |
|
|
|
fieldBodys.push(tableObj) |
|
|
|
//删除不存在的字段索引 外键
|
|
|
|
await models.MetadataDatabase.destroy({ |
|
|
|
where: { |
|
|
|
type: { $in: ['字段', '索引', '外键'] }, |
|
|
|
catalog: dataSource.mountPath, |
|
|
|
$or: [ |
|
|
|
{ parent: { $in: deleteParentIds } }, |
|
|
|
{ id: { $in: deleteIds } } |
|
|
|
] |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
//增加新增的字段索引外键
|
|
|
|
if (fieldBodys.length > 0) { |
|
|
|
fieldRslt = await models.MetadataDatabase.bulkCreate(fieldBodys); |
|
|
|
} else { |
|
|
|
fieldRslt = true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
const fieldRslt = await models.MetadataDatabase.bulkCreate(fieldBodys); |
|
|
|
if (fieldRslt) { |
|
|
|
const endTime = moment() |
|
|
|
const logBody = { |
|
|
@ -168,10 +198,18 @@ async function handleTask(app, task) { |
|
|
|
} catch (error) { |
|
|
|
// await transaction.rollback();
|
|
|
|
const endTime = moment() |
|
|
|
let message = error.message ? error.message : error |
|
|
|
//空表auto-sequelize会抛出异常 提示信息处理
|
|
|
|
if (error.message && error.message.indexOf('No description found for') > -1) { |
|
|
|
if (error.message.split('.') && error.message.split('.').length > 0) { |
|
|
|
message = error.message.split('.')[0].split('"')[1] + '未定义任何字段' |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
const logBody = { |
|
|
|
task: task.id, |
|
|
|
success: false, |
|
|
|
details: '采集失败' + JSON.stringify(error).substring(0, 248), |
|
|
|
details: '采集失败:' + JSON.stringify(message).substring(0, 247), |
|
|
|
startTime: startTime, |
|
|
|
endTime: endTime |
|
|
|
} |
|
|
@ -181,12 +219,52 @@ async function handleTask(app, task) { |
|
|
|
if (task.retried && task.retryCount && task.retryTime && taskRetryIndex[task.id] < task.retryCount) { |
|
|
|
setTimeout(() => { |
|
|
|
handleTask(app, task) |
|
|
|
}, 1000 * 60 * task.retryCount); |
|
|
|
}, 1000 * 60 * task.retryTime); |
|
|
|
} |
|
|
|
app.fs.logger.error(`sechedule: handleTask, error: ${error}`); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//处理字段 索引 外键 新增body
|
|
|
|
function handleAddTableChildren(dataToSave, tables, table, tableChildrens) { |
|
|
|
const fieldBodys = []; |
|
|
|
Object.keys(tables[table.name].structures).forEach(key => { |
|
|
|
if (!tableChildrens || !tableChildrens.find(s => s.code == key)) { |
|
|
|
dataToSave.parent = table.id; |
|
|
|
dataToSave.name = tables[table.name].structures[key].comment || key; |
|
|
|
dataToSave.code = key; |
|
|
|
dataToSave.type = '字段'; |
|
|
|
const tableObj = { ...dataToSave } |
|
|
|
fieldBodys.push(tableObj) |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
tables[table.name].foreignKeys.forEach(v => { |
|
|
|
if (!tableChildrens || !tableChildrens.find(s => s.code == v.columnName)) { |
|
|
|
dataToSave.parent = table.id; |
|
|
|
dataToSave.name = v.columnName; |
|
|
|
dataToSave.code = v.columnName; |
|
|
|
dataToSave.type = '外键'; |
|
|
|
const tableObj = { ...dataToSave } |
|
|
|
fieldBodys.push(tableObj) |
|
|
|
} |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
tables[table.name].indexes.forEach(v => { |
|
|
|
if (!tableChildrens || !tableChildrens.find(s => s.code == v.name)) { |
|
|
|
dataToSave.parent = table.id; |
|
|
|
dataToSave.name = v.name; |
|
|
|
dataToSave.code = v.name; |
|
|
|
dataToSave.type = '索引'; |
|
|
|
const tableObj = { ...dataToSave } |
|
|
|
fieldBodys.push(tableObj) |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
return fieldBodys; |
|
|
|
} |
|
|
|
|
|
|
|
function createDbOptions(params) { |
|
|
|
const dbOptions = { |
|
|
|
database: params.database, |
|
|
|