From 22f370322412074174cde20ecfd14ec03657ab63 Mon Sep 17 00:00:00 2001 From: lyg <1543117173@qq.com> Date: 星期一, 07 七月 2025 16:20:25 +0800 Subject: [PATCH] 生成数据库 --- knowledgebase/db/db_helper.py | 314 +++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 224 insertions(+), 90 deletions(-) diff --git a/knowledgebase/db/db_helper.py b/knowledgebase/db/db_helper.py index cf94ba0..0a14bdc 100644 --- a/knowledgebase/db/db_helper.py +++ b/knowledgebase/db/db_helper.py @@ -1,20 +1,40 @@ import uuid +from enum import Enum +from threading import RLock from sqlalchemy.orm import sessionmaker, scoped_session -from knowledgebase.db.models import engine, TProject, TDevice, TDataStream, TDevStream, TRule, TRuleEnc, TPropertyEnc, \ +from knowledgebase.db.models import get_engine, TProject, TDevice, TDataStream, TDevStream, TRule, TRuleEnc, TPropertyEnc, \ TPropertyLinear, TRuleStream, TEncLinear, TRuleLinear, TParameter, TParameterType, TExtendInfo, TRulekeyInfo, \ TInsFormat from hashlib import md5 -# 鍒涘缓涓�涓細璇濆伐鍘� -session_factory = sessionmaker(bind=engine) -# 鍒涘缓涓�涓細璇濆璞� -Session = scoped_session(session_factory) -session = Session() +_session = None _para_id_map = {} + +db_lock = RLock() + +def get_session(): + global _session + return _session + +def init_db_helper(): + # 鍒涘缓涓�涓細璇濆伐鍘� + session_factory = sessionmaker(bind=get_engine()) + # 鍒涘缓涓�涓細璇濆璞� + Session = scoped_session(session_factory) + global _session + _session = Session() + +def th_safe(func): + def wrapper(*args, **kwargs): + with db_lock: + result = func(*args, **kwargs) + return result + + return wrapper def get_pk(): @@ -23,12 +43,13 @@ return pk +@th_safe def create_project(sat_id, sat_name, proj_code, proj_name, desc, date_time, ) -> TProject: """ 鍒涘缓project :param sat_id: - :param sat_name: - :param proj_code: + :param sat_name: + :param proj_code: :param proj_name: :param desc: :param date_time: @@ -38,11 +59,12 @@ C_DESCRIPTION=desc, C_HASH=uuid.uuid4().int & 0xffffffff, C_PROJECT_NAME=proj_name, C_DATETIME=date_time, C_CREATEOR='') - session.add(project) - session.commit() + _session.add(project) + _session.commit() return project +@th_safe def create_device(device_id, device_name, device_type, dll, project_pk): """ 鍒涘缓device @@ -55,11 +77,12 @@ """ device = TDevice(C_DEV_PK=get_pk(), C_DEV_ID=device_id, C_DEV_NAME=device_name, C_DEV_TYPE=device_type, C_DLL=dll, C_PROJECT_PK=project_pk) - session.add(device) - session.commit() + _session.add(device) + _session.commit() return device +@th_safe def create_extend_info(proj_pk, prop_id, prop_name, val, fk): ext_info = TExtendInfo( C_PK=get_pk(), @@ -69,10 +92,11 @@ C_VAL=val, C_FOREIGN_PK=fk ) - session.add(ext_info) - session.commit() + _session.add(ext_info) + _session.commit() +@th_safe def create_data_stream(proj_pk, dev_pk, name, code, data_ty, direct, rule_id, rule_ty, rule_pk=None): """ 鍒涘缓data_stream @@ -95,33 +119,38 @@ C_DESCRIPTION='', C_RULE_ID=rule_id, C_RULE_TYPE=rule_ty) - session.add(ds) + _session.add(ds) link = TDevStream(C_PK=get_pk(), C_DEV_PK=dev_pk, C_STREAM_PK=ds.C_STREAM_PK, C_PROJECT_PK=proj_pk) - session.add(link) + _session.add(link) rule_enc = None # 鍒涘缓瑙f瀽瑙勫垯 if rule_pk is None: rule_pk = get_pk() if rule_ty == '001': # 灏佽鍖� - rule_enc = create_rule_enc(proj_pk, rule_pk, rule_id, rule_id) + rule_enc = _create_rule_enc(proj_pk, rule_pk, rule_id, rule_id) - rule = create_rule(proj_pk, ds.C_STREAM_PK, rule_id, name, None, None, '0') - rule = create_rule(proj_pk, rule_pk, rule_id, rule_id, None, ds.C_STREAM_PK, '1') + rule = _create_rule(proj_pk, ds.C_STREAM_PK, rule_id, name, None, None, '0') + rule = _create_rule(proj_pk, rule_pk, rule_id, rule_id, None, ds.C_STREAM_PK, '1') # rule stream - rule_stream = create_rule_stream(proj_pk, - rule_pk, - ds.C_STREAM_PK, - ds.C_STREAM_ID, - ds.C_NAME, - ds.C_STREAM_DIR, - f"{ds.C_NAME}/{rule_id}/") - session.add(rule_stream) - session.commit() + rule_stream = _create_rule_stream(proj_pk, + rule_pk, + ds.C_STREAM_PK, + ds.C_STREAM_ID, + ds.C_NAME, + ds.C_STREAM_DIR, + f"{ds.C_NAME}/{rule_id}/") + _session.add(rule_stream) + _session.commit() return ds, rule_stream, rule_enc +@th_safe def create_rule(proj_pk, rule_pk, rule_id, rule_name, rule_len, parent_pk, flag, actual_parent_pk=None): + return _create_rule(proj_pk, rule_pk, rule_id, rule_name, rule_len, parent_pk, flag, actual_parent_pk) + + +def _create_rule(proj_pk, rule_pk, rule_id, rule_name, rule_len, parent_pk, flag, actual_parent_pk=None): rule = TRule( C_PK=get_pk(), C_PROJECT_PK=proj_pk, @@ -133,16 +162,22 @@ C_FLAG=flag, C_ACTUAL_PARENT_PK=actual_parent_pk ) - session.add(rule) - session.commit() + _session.add(rule) + _session.commit() return rule +@th_safe def find_rule_by_rule_id(rule_id): - return session.query(TRule).filter(TRule.C_RULE_ID == rule_id).first() + return _session.query(TRule).filter(TRule.C_RULE_ID == rule_id).first() +@th_safe def create_rule_stream(proj_pk, rule_pk, stream_pk, stream_id, stream_name, stream_dir, _path): + return _create_rule_stream(proj_pk, rule_pk, stream_pk, stream_id, stream_name, stream_dir, _path) + + +def _create_rule_stream(proj_pk, rule_pk, stream_pk, stream_id, stream_name, stream_dir, _path): rule_stream = TRuleStream( C_PK=get_pk(), C_PROJECT_PK=proj_pk, @@ -153,22 +188,28 @@ C_STREAM_DIR=stream_dir, C_PATH=_path ) - session.add(rule_stream) - session.commit() + _session.add(rule_stream) + _session.commit() return rule_stream +@th_safe def create_ref_ds_rule_stream(proj_pk, stream_pk, stream_id, stream_name, stream_dir, target_stream_pk): - items: list = session.query(TRuleStream).filter(TRuleStream.C_STREAM_PK == target_stream_pk).all() + items: list = _session.query(TRuleStream).filter(TRuleStream.C_STREAM_PK == target_stream_pk).all() for it in items: _path = it.C_PATH if len(_path.split('/')) == 3: continue _path = f'{stream_name}/{stream_id}/'.join(_path.split('/')[2:]) + '/' - create_rule_stream(proj_pk, it.C_RULE_PK, stream_pk, stream_id, stream_name, stream_dir, _path) + _create_rule_stream(proj_pk, it.C_RULE_PK, stream_pk, stream_id, stream_name, stream_dir, _path) +@th_safe def create_rule_enc(proj_pk, enc_pk, enc_id, name, content=None): + return _create_rule_enc(proj_pk, enc_pk, enc_id, name, content) + + +def _create_rule_enc(proj_pk, enc_pk, enc_id, name, content=None): rule_enc = TRuleEnc( C_ENC_PK=enc_pk, C_PROJECT_PK=proj_pk, @@ -176,11 +217,12 @@ C_NAME=name, C_CONTENT=content, ) - session.add(rule_enc) - session.commit() + _session.add(rule_enc) + _session.commit() return rule_enc +@th_safe def create_rule_linear(proj_pk, linear_pk, linear_id, name, length, content): rule_linear = TRuleLinear( C_LINEAR_PK=linear_pk, @@ -192,11 +234,12 @@ C_REL_LINEAR_PK=None, C_CONTENT=content ) - session.add(rule_linear) - session.commit() + _session.add(rule_linear) + _session.commit() return rule_linear +@th_safe def create_property_enc(proj_pk, enc_pk, segment_id, name, ty, content, offset, length, msb_first, mask, cond, seq, rel_enc_item_pk, para_id): property_enc = TPropertyEnc( @@ -217,7 +260,7 @@ C_REL_ENCITEM_PK=rel_enc_item_pk, C_PAR_ID=para_id ) - session.add(property_enc) + _session.add(property_enc) para = TParameter( C_PAR_PK=get_pk(), C_PROJECT_PK=proj_pk, @@ -234,7 +277,7 @@ C_REG_PK=None, C_METHOD_PK=None ) - session.add(para) + _session.add(para) if ty == 'ENUM' and content: items: list = content.split(' ') for item in items: @@ -249,8 +292,8 @@ C_PAR_PK=para.C_PAR_PK, C_PROJECT_PK=proj_pk ) - session.add(pt) - session.commit() + _session.add(pt) + _session.commit() return property_enc @@ -263,8 +306,16 @@ return _para_id +para_id_pk_map = {} + + +@th_safe def create_property_linear(proj_pk, linear_pk, para_id, name, ty, content, offset, length, msb_first, mask, cond, calc_expr, simuval, reg_par, params, seq): + + par_pk = get_pk() + if para_id in para_id_pk_map: + par_pk = para_id_pk_map[para_id] property_linear = TPropertyLinear( C_PK=get_pk(), C_LINEAR_PK=linear_pk, @@ -277,7 +328,7 @@ C_MASK=mask, C_CONDITION=cond, C_CALC_EXPR=calc_expr, - C_PAR_PK=get_pk(), + C_PAR_PK=par_pk, C_SIMUVAL=simuval, C_REG_PAR=reg_par, C_PARAMS=params, @@ -285,45 +336,47 @@ C_SEQ=seq, C_REL_PK=None ) - session.add(property_linear) - if para_id in _para_id_map: - get_para_id(para_id) - para = TParameter( - C_PAR_PK=property_linear.C_PAR_PK, - C_PROJECT_PK=proj_pk, - C_PAR_CODE=para_id, - C_PAR_NAME=name, - C_SUBSYS=None, - C_TYPE=None, - C_UNIT=None, - C_VALUE_RANGE=None, - C_DIS_REQUIRE=None, - C_MODULUS=None, - C_PARAMS=None, - C_PRECISION='0', - C_REG_PK=None, - C_METHOD_PK=None - ) - session.add(para) - if ty == 'ENUM' and content: - items: list = content.split(' ') - for item in items: - idx = items.index(item) - name, val = item.split(',') - pt = TParameterType( - C_PK=get_pk(), - C_TYPE_ID=f'{idx}', - C_TYPE_NAME=name, - C_VALUE=val, - C_DATA_TYPE=None, - C_PAR_PK=para.C_PAR_PK, - C_PROJECT_PK=proj_pk - ) - session.add(pt) - session.commit() + _session.add(property_linear) + if para_id not in para_id_pk_map: + if para_id in _para_id_map: + get_para_id(para_id) + para = TParameter( + C_PAR_PK=property_linear.C_PAR_PK, + C_PROJECT_PK=proj_pk, + C_PAR_CODE=para_id, + C_PAR_NAME=name, + C_SUBSYS=None, + C_TYPE=None, + C_UNIT=None, + C_VALUE_RANGE=None, + C_DIS_REQUIRE=None, + C_MODULUS=None, + C_PARAMS=None, + C_PRECISION='0', + C_REG_PK=None, + C_METHOD_PK=None + ) + _session.add(para) + if ty == 'ENUM' and content: + items: list = content.split(' ') + for item in items: + idx = items.index(item) + name, val = item.split(',') + pt = TParameterType( + C_PK=get_pk(), + C_TYPE_ID=f'{idx}', + C_TYPE_NAME=name, + C_VALUE=val, + C_DATA_TYPE=None, + C_PAR_PK=para.C_PAR_PK, + C_PROJECT_PK=proj_pk + ) + _session.add(pt) + _session.commit() return property_linear +@th_safe def create_enc_linear(proj_pk, enc_item_pk, ty, vals=None, linear_pk=None): """ 鍒涘缓 t_enc_linear @@ -344,19 +397,21 @@ C_TYPE=ty, C_FOLDER_PK=None ) - session.add(enc_linear) - session.commit() + _session.add(enc_linear) + _session.commit() return enc_linear +@th_safe def update_rule_enc(rule_enc): # 鏇存柊 - session.query(TRuleEnc).filter(TRuleEnc.C_ENC_PK == rule_enc.C_ENC_PK).update({ + _session.query(TRuleEnc).filter(TRuleEnc.C_ENC_PK == rule_enc.C_ENC_PK).update({ TRuleEnc.C_KEY: rule_enc.C_KEY }) - session.commit() + _session.commit() +@th_safe def create_rulekey_info(proj_pk, rule_pk, rule_id, rule_name, key_pk, key_id, key_name, key_val): info = TRulekeyInfo( C_PK=get_pk(), @@ -369,8 +424,8 @@ C_KEY_NAME=key_name, C_KEY_VAL=key_val ) - session.add(info) - session.commit() + _session.add(info) + _session.commit() ins_ty = { @@ -379,11 +434,90 @@ "combPkt": 12, "const": 15, "length": 17, - "enum": 26, + "enum": 18, + "sendFlag": 26, "checkSum": 20, + "insUnit": 4, + "insUnitList": 11, + "input": 19, + "pktSeqCnt": 25, + "variableLength": 14 } +class BinaryType(Enum): + Integer = 0 # 鏁村瀷 + Float = 1 # 娴偣鍨� + Ascii = 2 # ASCII + + +class NumberDataType(Enum): + Unsigned = 0 # 鏃犵鍙锋暣鍨� + SignInteger = 1 # 鏈夌鍙锋暣鍨� + Phy = 2 # 鐗╃悊閲� + Bytes = 3 # 澶氬瓧鑺傜爜 + + +class InputFormat(Enum): + Binary = 0 # 浜岃繘鍒� + Decimal = 1 # 鍗佽繘鍒� + Hex = 2 # 鍗佸叚杩涘埗 + + +class ProcessMethod(Enum): + Dirct = 0 # 鐩磋 + Equivalent = 1 # 褰撻噺 + Formula = 2 # 鍏紡 + Script = 3 # 鑴氭湰 + + +class ExpressionType(Enum): + Count = 0 # 涓暟璁$畻 + Formula = 1 # 鏁板�艰绠� + + +class EnumType(Enum): + NameValue = 0 # 鍚嶅�煎鏋氫妇 + Range = 1 # 鑼冨洿鏋氫妇 + Classify = 2 # 澶氱骇鍒嗙被 + InsCategory = 3 # 鎸囦护绫诲埆鏋氫妇 + InsUnit = 4 # 鎸囦护鍗曞厓鏋氫妇 + InsFormat = 5 # 鎸囦护鏍煎紡鏋氫妇 + + +def make_attr(field: dict): + """ + 鑾峰彇瀛楁瀹氫箟鐨凙TTR銆� + + 浣嶆帺鐮侊紝鐢ㄤ簬鏍囪瘑鑺傜偣绫诲瀷銆� + 绫诲瀷锛�0~2 BinaryType; + 3~5 DataType; + 6~8: InputFormat; + 9 : IsSubPackage; + 10: IsSendFlag锛� + 11~13: ProcessMethod锛� + 14~16: ExpressionType锛� + 17~19: EnumType + + :param field: 瀛楁淇℃伅 + :return: + """ + attr = 0 + # 鍗虫椂杈撳叆锛屾棤绗﹀彿鏁存暟锛屽崄杩涘埗锛岀洿璇� + if field['type'] == ins_ty['input']: + attr |= (NumberDataType.Unsigned.value << 3) | (InputFormat.Decimal.value << 6) | ( + ProcessMethod.Dirct.value << 11) + # 鏄惁鏄瓙鍖� + attr |= (1 << 9) if field['type'] == ins_ty['subPkt'] else 0 + # 鏄惁鏄彂閫佹爣璁� + attr |= (1 << 10) if field['type'] == ins_ty['sendFlag'] else 0 + # 璁$畻绫诲瀷 + # 鏋氫妇绫诲瀷 + + return attr + + +@th_safe def create_ins_format(proj_pk: str, parent_pk: str, info: dict) -> TInsFormat: ins_format = TInsFormat( C_INS_FORMAT_PK=get_pk(), @@ -395,7 +529,7 @@ C_CODE=info['code'] if 'code' in info else '', C_TYPE=ins_ty[info['type']] if 'type' in info else 0, C_DEF=info['def'] if 'def' in info else None, - C_BIT_WIDTH=info['bitWidth'] if 'bitWidth' in info else 0, + C_BIT_WIDTH=info['bitWidth'] if 'bitWidth' in info else None, C_BIT_ORDER=info['bitOrder'] if 'bitOrder' in info else 0, C_ATTR=info['attr'] if 'attr' in info else 0, C_RANGE=info['range'] if 'range' in info else None, @@ -403,6 +537,6 @@ C_FORMULA=info['formula'] if 'formula' in info else '', C_NUMBER='', ) - session.add(ins_format) - session.commit() + _session.add(ins_format) + _session.commit() return ins_format -- Gitblit v1.9.1