コード例 #1
0
ファイル: outputerbase.py プロジェクト: Octoberr/sspywork
    def _get_single_bs(
            cls,
            data: OutputData,
            datastd: OutputDataConfig,
            stm: io.RawIOBase,
            enc: str = "utf-8",
    ) -> bytes:
        """输出带文件体的数据类型"""
        res: bytes = None
        try:
            if not isinstance(data,
                              OutputData) or stm is None or not stm.readable():
                cls._logger.error(
                    "Invalid OutputData object or stream for output single")
                return res

            for seg in data.get_output_segs():
                # seg: OutputDataSeg = data.get_output_segs()
                fields: dict = cls._parse_fields(seg, datastd)
                if not isinstance(fields, dict) or len(fields) < 1:
                    cls._logger.error(
                        "Invalid fields after check output segment fields:\nplatform:{}\ndatatype:{}"
                        .format(data._platform, data._datatype.name))
                    return res
                bs: bytes = cls._fields_to_bytes(fields, enc)
                if bs is None or not any(bs):
                    return res

                res = bs
                return res

        except Exception:
            res = None
            cls._logger.error(
                "Output single data segment error:\nplatform:{}\ndatatype:{}\nerror:{}"
                .format(data._platform, data._datatype.name,
                        traceback.format_exc()))
コード例 #2
0
ファイル: outputerbase.py プロジェクト: Octoberr/sspywork
    def _get_mutiple_bs(
            cls,
            data: OutputData,
            datastd: OutputDataConfig,
            enc: str = "utf-8",
            maxsegcount: int = 1000,
    ) -> iter:
        """输出多段类型数据,返回bytes迭代器"""
        res: bool = True
        segcount = 0
        segbs: bytes = bytes()
        try:
            if not datastd._enable:
                cls._logger.debug(
                    "Data standard '{}' in platform '{}' is not enabled, data won't output"
                    .format(datastd._datatype.name, datastd.owner._platform))
                return res
            for seg in data.get_output_segs():
                try:
                    # 构建输出bytes
                    try:
                        if not isinstance(seg, OutputDataSeg):
                            cls._logger.error(
                                "Invalid OutputDataSeg object: {}".format(seg))
                            res = False
                            return res
                        seg: OutputDataSeg = seg
                        # 检查输出数据字段有效性
                        fields = cls._parse_fields(seg, datastd)
                        if not isinstance(fields, dict) or len(fields) < 1:
                            continue
                        bs = cls._fields_to_bytes(fields, enc)
                        if bs is None or not any(bs):
                            continue

                        segbs += bs
                        segcount += 1
                    except Exception:
                        res = False
                        cls._logger.error(
                            "Check segment fields validation failed:\nplatform:{}\ndatatype:{}\nerror:{}"
                            .format(
                                data._platform,
                                data._datatype.name,
                                traceback.format_exc(),
                            ))

                    if segcount < maxsegcount:
                        continue

                    # 达到segment段落数量上限输出
                    try:
                        yield segbs
                    except Exception:
                        cls._logger.error(
                            "Output mutiple segments error: {}".format(
                                traceback.format_exc()))
                    finally:
                        segbs = bytes()
                        segcount = 0

                except Exception:
                    res = False
                    cls._logger.error(
                        "Check output data segment failed:\nplatform:{}\ndatatype:{}\nerror:{}"
                        .format(data._platform, data._datatype.name,
                                traceback.format_exc()))

            # 或者遍历所有seg完成时输出
            if not segbs is None and any(segbs):
                yield segbs

        except Exception:
            res = False
            cls._logger.error(
                "Output mutiple data segment error:\nplatform:{}\ndatatype:{}\nerror:{}"
                .format(data._platform, data._datatype.name,
                        traceback.format_exc()))