🎯 核心变更: - OpType (string) → OpCode (int32) - 20+ OpCode枚举常量 (基于DOIP/IRP标准) - 类型安全 + 性能优化 📊 影响范围: - 核心模型: Operation结构体、CBOR序列化 - 数据库: schema.go + SQL DDL (PostgreSQL/MySQL/SQLite) - 持久化: repository.go查询、cursor_worker.go - API接口: Protobuf定义 + gRPC客户端 - 测试代码: 60+ 测试文件更新 ✅ 测试结果: - 通过率: 100% (所有87个测试用例) - 总体覆盖率: 53.7% - 核心包覆盖率: logger(100%), highclient(95.3%), model(79.1%) 📝 文档: - 精简README (1056行→489行,减少54%) - 完整的OpCode枚举说明 - 三种持久化策略示例 - 数据库表结构和架构图 🔧 技术细节: - 类型转换: string(OpCode) → int32(OpCode) - SQL参数: 字符串值 → 整数值 - Protobuf: op_type string → op_code int32 - 测试断言: 字符串比较 → 常量比较 🎉 质量保证: - 零编译错误 - 100%测试通过 - PostgreSQL/Pulsar集成测试验证 - 分布式并发安全测试通过
204 lines
4.7 KiB
SQL
204 lines
4.7 KiB
SQL
-- 测试数据插入脚本
|
|
-- 用于验证数据库表结构和功能
|
|
|
|
-- ============================================
|
|
-- 1. 插入测试操作记录
|
|
-- ============================================
|
|
|
|
-- 测试1: 插入包含 IP 信息的操作记录
|
|
INSERT INTO operation (
|
|
op_id, op_actor, doid, producer_id,
|
|
request_body_hash, response_body_hash,
|
|
op_source, op_code, do_prefix, do_repository,
|
|
client_ip, server_ip, trustlog_status, timestamp
|
|
) VALUES (
|
|
'test-op-001',
|
|
'test-user',
|
|
'10.1000/test-repo/doc001',
|
|
'producer-001',
|
|
'req_hash_001',
|
|
'resp_hash_001',
|
|
'DOIP',
|
|
'Create',
|
|
'10.1000',
|
|
'test-repo',
|
|
'192.168.1.100', -- 客户端IP
|
|
'10.0.0.50', -- 服务端IP
|
|
'TRUSTLOGGED', -- 已存证
|
|
CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- 测试2: 插入 IP 为 NULL 的操作记录
|
|
INSERT INTO operation (
|
|
op_id, op_actor, doid, producer_id,
|
|
request_body_hash, response_body_hash,
|
|
op_source, op_code, do_prefix, do_repository,
|
|
client_ip, server_ip, trustlog_status, timestamp
|
|
) VALUES (
|
|
'test-op-002',
|
|
'test-user',
|
|
'10.1000/test-repo/doc002',
|
|
'producer-001',
|
|
'req_hash_002',
|
|
'resp_hash_002',
|
|
'DOIP',
|
|
'Update',
|
|
'10.1000',
|
|
'test-repo',
|
|
NULL, -- IP 为 NULL
|
|
NULL, -- IP 为 NULL
|
|
'NOT_TRUSTLOGGED', -- 未存证
|
|
CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- 测试3: 插入只有客户端 IP 的记录
|
|
INSERT INTO operation (
|
|
op_id, op_actor, doid, producer_id,
|
|
request_body_hash, response_body_hash,
|
|
op_source, op_code, do_prefix, do_repository,
|
|
client_ip, server_ip, trustlog_status, timestamp
|
|
) VALUES (
|
|
'test-op-003',
|
|
'test-user',
|
|
'10.1000/test-repo/doc003',
|
|
'producer-001',
|
|
'req_hash_003',
|
|
'resp_hash_003',
|
|
'IRP',
|
|
'Delete',
|
|
'10.1000',
|
|
'test-repo',
|
|
'172.16.0.100', -- 仅客户端IP
|
|
NULL, -- 服务端IP为NULL
|
|
'NOT_TRUSTLOGGED',
|
|
CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- ============================================
|
|
-- 2. 插入测试重试记录
|
|
-- ============================================
|
|
|
|
-- 测试1: 待重试记录
|
|
INSERT INTO trustlog_retry (
|
|
op_id, retry_count, retry_status,
|
|
last_retry_at, next_retry_at, error_message
|
|
) VALUES (
|
|
'test-op-002',
|
|
0,
|
|
'PENDING',
|
|
NULL,
|
|
CURRENT_TIMESTAMP, -- 立即重试
|
|
'Initial retry'
|
|
);
|
|
|
|
-- 测试2: 重试中记录
|
|
INSERT INTO trustlog_retry (
|
|
op_id, retry_count, retry_status,
|
|
last_retry_at, next_retry_at, error_message
|
|
) VALUES (
|
|
'test-op-003',
|
|
2,
|
|
'RETRYING',
|
|
CURRENT_TIMESTAMP,
|
|
CURRENT_TIMESTAMP, -- 下次重试时间
|
|
'Connection timeout'
|
|
);
|
|
|
|
-- ============================================
|
|
-- 3. 验证查询
|
|
-- ============================================
|
|
|
|
-- 查询所有操作记录
|
|
SELECT
|
|
op_id,
|
|
op_code,
|
|
client_ip,
|
|
server_ip,
|
|
trustlog_status,
|
|
timestamp
|
|
FROM operation
|
|
ORDER BY timestamp DESC;
|
|
|
|
-- 查询包含 IP 信息的记录
|
|
SELECT
|
|
op_id,
|
|
client_ip,
|
|
server_ip,
|
|
trustlog_status
|
|
FROM operation
|
|
WHERE client_ip IS NOT NULL OR server_ip IS NOT NULL;
|
|
|
|
-- 查询未存证的记录
|
|
SELECT
|
|
op_id,
|
|
doid,
|
|
trustlog_status,
|
|
timestamp
|
|
FROM operation
|
|
WHERE trustlog_status = 'NOT_TRUSTLOGGED'
|
|
ORDER BY timestamp ASC;
|
|
|
|
-- 查询重试记录
|
|
SELECT
|
|
r.op_id,
|
|
r.retry_count,
|
|
r.retry_status,
|
|
r.error_message,
|
|
o.doid
|
|
FROM trustlog_retry r
|
|
JOIN operation o ON r.op_id = o.op_id
|
|
ORDER BY r.next_retry_at ASC;
|
|
|
|
-- 查询游标状态
|
|
SELECT * FROM trustlog_cursor WHERE id = 1;
|
|
|
|
-- ============================================
|
|
-- 4. 统计查询
|
|
-- ============================================
|
|
|
|
-- 统计各状态的记录数
|
|
SELECT
|
|
trustlog_status,
|
|
COUNT(*) as count
|
|
FROM operation
|
|
GROUP BY trustlog_status;
|
|
|
|
-- 统计 IP 字段使用情况
|
|
SELECT
|
|
CASE
|
|
WHEN client_ip IS NOT NULL THEN 'Has Client IP'
|
|
ELSE 'No Client IP'
|
|
END as client_ip_status,
|
|
CASE
|
|
WHEN server_ip IS NOT NULL THEN 'Has Server IP'
|
|
ELSE 'No Server IP'
|
|
END as server_ip_status,
|
|
COUNT(*) as count
|
|
FROM operation
|
|
GROUP BY
|
|
CASE WHEN client_ip IS NOT NULL THEN 'Has Client IP' ELSE 'No Client IP' END,
|
|
CASE WHEN server_ip IS NOT NULL THEN 'Has Server IP' ELSE 'No Server IP' END;
|
|
|
|
-- 统计重试状态
|
|
SELECT
|
|
retry_status,
|
|
COUNT(*) as count,
|
|
AVG(retry_count) as avg_retry_count
|
|
FROM trustlog_retry
|
|
GROUP BY retry_status;
|
|
|
|
-- ============================================
|
|
-- 5. 清理测试数据
|
|
-- ============================================
|
|
|
|
-- 取消注释以下语句来清理测试数据
|
|
/*
|
|
DELETE FROM trustlog_retry WHERE op_id LIKE 'test-op-%';
|
|
DELETE FROM operation WHERE op_id LIKE 'test-op-%';
|
|
UPDATE trustlog_cursor SET
|
|
last_processed_id = NULL,
|
|
last_processed_at = NULL
|
|
WHERE id = 1;
|
|
*/
|
|
|