Skip to content

添加 Python 补丁覆盖工具(Patch Override Tool)#410

Open
lycosa9527 wants to merge 2 commits intolionsoul2014:masterfrom
lycosa9527:master
Open

添加 Python 补丁覆盖工具(Patch Override Tool)#410
lycosa9527 wants to merge 2 commits intolionsoul2014:masterfrom
lycosa9527:master

Conversation

@lycosa9527
Copy link

📝 功能说明

本 PR 添加了一个轻量级的 Python 补丁覆盖工具,用于应用 ip2region 数据库补丁,无需修改原始的 xdb 数据库文件。

核心特性

  • 非破坏性补丁应用:通过 JSON 缓存文件实现补丁覆盖层,无需重建 xdb 数据库
  • 快速查询:使用二分查找算法,支持高效的 IP 地址补丁匹配
  • 零依赖:仅使用 Python 标准库,无需安装额外依赖
  • 编码兼容:支持 UTF-8、GBK/GB2312 等多种编码格式(Windows 友好)
  • 易于集成:提供简洁的 API 接口,可轻松集成到现有 IP 地理位置服务中

解决的问题

当前 ip2region 项目提供了 Java/Golang/C++ 等语言的制作工具,可以直接修改 xdb 文件。但在某些场景下,用户可能希望:

  1. 无需重建数据库即可应用补丁
  2. 将补丁与主数据库分离管理
  3. 在应用程序中将补丁用作覆盖层(优先级高于主数据库)
  4. 在提交数据库更改之前测试补丁效果

本工具提供了一种非破坏性的补丁应用方法,完美解决了上述需求。

文件结构

maker/python/patch_override/
├── patch_override.py      # 核心工具脚本
├── example_usage.py        # 使用示例
├── README_CN.md           # 中文文档
└── requirements.txt       # 依赖说明(仅标准库,实际为空)

使用示例

from patch_override import load_patch_cache, find_patch_for_ip

# 加载补丁缓存
cache = load_patch_cache(Path("patches_cache.json"))

# 查询 IP 地址
result = find_patch_for_ip("39.144.0.1", cache)
if result:
    print(f"省份: {result['province']}, 城市: {result['city']}")

与现有工具对比

功能 制作工具(Java/Golang/C++) 本工具
修改 xdb 文件 ✅ 是 ❌ 否
需要重建数据库 ✅ 是 ❌ 否
非破坏性 ❌ 否 ✅ 是
覆盖层架构 ❌ 否 ✅ 是
易于更新补丁 ❌ 否 ✅ 是
Python 支持 ❌ 否 ✅ 是

测试

  • ✅ 已通过基本功能测试
  • ✅ 支持从 data/fix 目录读取补丁文件
  • ✅ 支持自定义补丁目录和输出路径
  • ✅ 包含 IP 查找测试功能

文档

  • 提供完整的中文文档(README_CN.md)
  • 包含详细的使用说明和集成示例
  • 说明补丁文件格式和缓存文件结构

建议的放置位置

建议将本工具放置在 maker/python/patch_override/ 目录下,与现有的 Python xdb 生成工具(maker/python/)保持一致的目录结构。


相关 Issue

如有相关的 Issue,请在此处引用。


检查清单

  • 代码遵循项目代码规范
  • 已添加必要的文档
  • 已测试基本功能
  • 无外部依赖(仅使用 Python 标准库)
  • 提供使用示例

@lionsoul2014
Copy link
Owner

代码我仔细看了看,确实是一个不错的想法,用于紧急的临时数据修复或者数据验证,有两个问题看能否一起做了:
1,兼容 ipv6,因为目前 ip2region 是支持了双协议了,fix 的数据会存在 v4 和 v6 的。
2,尽量不要去解析地域数据为具体的字段,例如:国家/省份/城市 ,因为这个格式是默认的格式,使用者的数据大概率不一定是这个数据,保持程序的通用性。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants