Haifeng Ling

31 papers C 1Journal 21Unranked 9
YearRankTypeTitle / Venue / Authors
2026 J jnl
Scientometrics
Manru Xu, Jianshan Sun, Haifeng Ling, Thushari P. Silva, Jianmin He
2026 J jnl
Inf. Process. Manag.
YingQiu Xiong, Yezheng Liu, Yang Qian, Yuanchun Jiang, Yidong Chai, Haifeng Ling
2026 J jnl
Sci. China Inf. Sci.
Xiaoyan Liu, Youshan Gui, Zhou Wang, Pengcheng Zhou, Junyuan Chen, Tenglong Guo, Xin Zhang, Suo Zhang, Xian Wei, Jin Wang, Xiaojuan Lian, Xiang Wan, Nan He, Yan Gu, Er-Tao Hu, Qiang Chen, Haifeng Ling, Lei Wang
2026 J jnl
Signal Image Video Process.
Lin Zhu, Zhangjun Wu, Shiyuan Zheng, Haifeng Ling
2025 J jnl
Electron. Commer. Res.
Xinyu Liu, Yezheng Liu, Yang Qian, Yuanchun Jiang, Haifeng Ling
2024 J jnl
Eur. J. Oper. Res.
YingQiu Xiong, Yezheng Liu, Yang Qian, Yuanchun Jiang, Yidong Chai, Haifeng Ling
2023 J jnl
Appl. Intell.
Zhaolong Ling, Bo Li, Yiwen Zhang, Ying Li, Haifeng Ling
2023 J jnl
Intell. Autom. Soft Comput.
Bo Li, Zhaolong Ling, Yiwen Zhang, Yong Zhou, Yimin Hu, Haifeng Ling
2023 J jnl
Complex Syst. Model. Simul.
Ning Li, Zhenglian Su, Haifeng Ling, Mumtaz Karatas, Yujun Zheng
2022 J jnl
Inf. Process. Manag.
Yang Qian, Wang Xu, Xiao Liu, Haifeng Ling, Yuanchun Jiang, Yidong Chai, Ye-Zheng Liu
2021 J jnl
IEEE Access
Haifeng Ling, Yi Fu, Ming Hua, An Lu
2021 J jnl
Nat. Comput.
Haifeng Ling, Tao Zhu, Weixiong He, Zhanliang Zhang, Hongchuan Luo
2020 conf
CACRE
Haifeng Ling, Hongchuan Luo, Linyuan Bai, Tao Zhu, Qing Wang, Jiang Yi
2019 J jnl
Future Gener. Comput. Syst.
Yuanchun Jiang, Dandan Tao, Yezheng Liu, Jianshan Sun, Haifeng Ling
2019 J jnl
J. Inf. Sci.
Yezheng Liu, Qiang Xiong, Jianshan Sun, Yuanchun Jiang, Thushari P. Silva, Haifeng Ling
2019 C conf
ICIS
Zhao Kang, Haifeng Ling, Qing Wang, Hongchuan Luo, Tao Zhu
2018 conf
ICSI (2)
Tao Zhu, Weixiong He, Haifeng Ling, Zhanliang Zhang
2018 J jnl
Int. J. Geogr. Inf. Sci.
Weixiong He, Haifeng Ling, Zhanliang Zhang, Congcong Gong
2016 J jnl
IEEE Trans. Serv. Comput.
Yujun Zheng, Qingzhang Chen, Haifeng Ling, Jin-Yun Xue
2015 J jnl
IEEE Trans. Fuzzy Syst.
Yu-Jun Zheng, Haifeng Ling, Shengyong Chen, Jin-Yun Xue
2015 J jnl
IEEE Trans. Intell. Transp. Syst.
Yu-Jun Zheng, Min-Xia Zhang, Haifeng Ling, Shengyong Chen
2015 J jnl
Appl. Soft Comput.
Yu-Jun Zheng, Shengyong Chen, Haifeng Ling
2013 conf
ICSI (1)
Yujun Zheng, Xiaobei Wu, Haifeng Ling, Shengyong Chen
2013 J jnl
Optim. Lett.
Yujun Zheng, Shengyong Chen, Haifeng Ling
2013 J jnl
Soft Comput.
Yujun Zheng, Haifeng Ling
2011 conf
ICSI (2)
Haifeng Ling, Yujun Zheng, Ziqiu Zhang, Xianzhong Zhou
2010 conf
SOSE
Jun Yan, Liang Zhu, Zhenglian Su, Haifeng Ling
2010 conf
ICSS
Haifeng Ling, Xianzhong Zhou, Yujun Zheng
2009 conf
FCST
Haifeng Ling, Xianzhong Zhou, Yujun Zheng
2007 conf
ICNSC
Xianzhong Zhou, Zhaohan Sheng, Jiabao Zhao, Haifeng Ling, Yunzhang Hou
2004 conf
PACIS
Haifeng Ling, Yezheng Liu, Shanlin Yang
redb/s3_utils.py
← Index redb/s3_utils.py python
"""
S3 and file utility functions for REDB.

Contains MinIO/S3 client creation, S3 key generation,
file download, and archive extraction helpers.
"""
import os
import tempfile
from typing import Optional, List

from minio import Minio
from minio.error import S3Error


def get_minio_client():
    """Create and return a Minio client using credentials from .env file"""
    return Minio(
        endpoint=os.getenv("S3_ENDPOINT"),
        access_key=os.getenv("S3_ACCESS_KEY"),
        secret_key=os.getenv("S3_SECRET_KEY"),
        secure=os.getenv("S3_SECURE", "false").lower() == "true"
    )


def generate_s3_key_from_hash(sample_hash: str) -> str:
    """
    Generate S3 key from hash using sharding structure.
    Example: 09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c
    becomes: 09/f7/09f7d02a3c2382199458c98a62b045145ee54ab6aba86166aecf3d10c3c1444c.zip
    """
    if len(sample_hash) < 4:
        raise ValueError(f"Hash too short for sharding: {sample_hash}")

    # Create sharded path: first 2 chars / next 2 chars / full_hash.zip
    return f"{sample_hash[:2]}/{sample_hash[2:4]}/{sample_hash}.zip"


def download_s3_object(s3_bucket: str, s3_key: str, temp_dir: str, logger=None) -> Optional[str]:
    """
    Download an object from S3 to a local temporary directory and return the local path.
    If the .zip file is not found, automatically tries .7z as a fallback for legacy uploads.
    """
    try:
        minio_client = get_minio_client()
        local_path = os.path.join(temp_dir, os.path.basename(s3_key))

        # Download the file
        minio_client.fget_object(s3_bucket, s3_key, local_path)

        return local_path
    except S3Error as e:
        # If .zip not found and error is NoSuchKey, try .7z fallback
        if e.code == 'NoSuchKey' and s3_key.endswith('.zip'):
            s3_key_7z = s3_key[:-4] + '.7z'  # Replace .zip with .7z
            if logger:
                logger.info(f".zip not found, trying .7z fallback: {s3_key_7z}")
            try:
                local_path_7z = os.path.join(temp_dir, os.path.basename(s3_key_7z))
                minio_client.fget_object(s3_bucket, s3_key_7z, local_path_7z)
                if logger:
                    logger.info(f"Successfully downloaded .7z fallback: {s3_key_7z}")
                return local_path_7z
            except S3Error as e2:
                if logger:
                    logger.error(f"Failed to download S3 object {s3_key} (tried both .zip and .7z): {e2}")
                else:
                    print(f"[ERROR] Failed to download S3 object {s3_key} (tried both .zip and .7z): {e2}")
                return None
        else:
            if logger:
                logger.error(f"Failed to download S3 object {s3_key}: {e}")
            else:
                print(f"[ERROR] Failed to download S3 object {s3_key}: {e}")
            return None


def extract_fat_slices(macho, output_dir: str, logger) -> List[tuple]:
    """
    Extract slices from FAT Mach-O binary using machofile's dump_slices() API.

    Args:
        macho: Parsed machofile.UniversalMachO object
        output_dir: Directory to write slice files
        logger: Logger instance

    Returns:
        List of (arch_name, slice_path, slice_sha256, slice_md5, slice_sha1) tuples
    """
    result = []
    try:
        # Use machofile's dump_slices API (v2026.2.5+)
        slices = macho.dump_slices(output_dir=output_dir)
        logger.debug(f"Extracted {len(slices)} slices from FAT binary")

        for arch_name, slice_path in slices:
            # Get hash info for this slice from machofile
            general_info = macho.get_general_info(arch=arch_name)
            slice_sha256 = general_info.get('SHA256')
            slice_md5 = general_info.get('MD5')
            slice_sha1 = general_info.get('SHA1')
            result.append((arch_name, slice_path, slice_sha256, slice_md5, slice_sha1))
            logger.debug(f"Slice {arch_name}: {slice_sha256}")

    except Exception as e:
        logger.error(f"Error extracting FAT slices: {e}")

    return result