You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.7 KiB

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/5/21 16:49
# @Author : old tom
# @File : metadata_compare_task.py
# @Project : futool-tiny-datahub
# @Desc : 版本比较任务管理
from common.futool.core.fu_lang import str_md5
from datahub.local_db_conf import local_conn
from datahub.log_conf import log
from dataclasses import dataclass
from datahub.metadata.metaversion.versiondao.metadata_task_dao import MetaTaskDao
@dataclass
class MetadataCompareTask(object):
# 版本号1
version_code_1: int
# 版本号2
version_code_2: int
# 版本号1对应的数据源ID
source_id_1: str
# 版本号2对应的数据源ID
source_id_2: str = None
# 比较任务类型
compare_task_type: str = 'same' if source_id_2 is None else 'diff'
def compare_id_gen(self) -> str:
"""
生成任务ID
:return:
"""
return str_md5(''.join([str(getattr(self, x)) for x in self.__dict__.keys()]))
class MetadataCompareTaskManage(object):
class MetadataCompareTaskError(Exception):
"""
自定义异常
"""
def __init__(self, msg=''):
Exception.__init__(self, msg)
"""
版本比较任务管理
"""
def __init__(self):
self.dao = MetaTaskDao(local_conn)
def create_task(self, task: MetadataCompareTask) -> bool:
"""
创建任务
:return:
"""
compare_id = task.compare_id_gen()
self._check_task_exist(compare_id)
return self.dao.create_task(compare_id, task.version_code_1, task.version_code_2, task.source_id_1,
task.source_id_2, task.compare_task_type)
def finish_task(self, compare_id):
"""
结束任务
:return:
"""
self._check_task_not_exist(compare_id)
return self.dao.finish_task(compare_id)
def has_finished(self, compare_id):
"""
判断任务是否结束
:param compare_id:
:return:
"""
self._check_task_not_exist(compare_id)
return self.dao.check_task_status(compare_id)
def _check_task_exist(self, compare_id):
"""
校验任务是否存在
:param compare_id:
:return:
"""
if self.dao.task_exists(compare_id):
log.error(f'版本比较任务已存在,任务ID={compare_id}')
raise self.MetadataCompareTaskError()
def _check_task_not_exist(self, compare_id):
"""
校验任务是否不存在
:param compare_id:
:return:
"""
if not self.dao.task_exists(compare_id):
log.error(f'版本比较任务不存在,请先创建任务')
raise self.MetadataCompareTaskError()