MCPcopy Create free account
hub / github.com/0xUnixIO/pulse / Cleanup

Method Cleanup

internal/store/postgres/postgres.go:68–119  ·  view source on GitHub ↗

Cleanup 清理数据库中所有孤立记录,返回各表删除数量。 所有删除在同一事务中执行,保证原子性。

()

Source from the content-addressed store, hash-verified

66// Cleanup 清理数据库中所有孤立记录,返回各表删除数量。
67// 所有删除在同一事务中执行,保证原子性。
68func (db *DB) Cleanup() (CleanupResult, error) {
69 var r CleanupResult
70 ctx := context.Background()
71
72 tx, err := db.conn.Begin(ctx)
73 if err != nil {
74 return r, fmt.Errorf("cleanup begin tx: %w", err)
75 }
76 defer tx.Rollback(ctx) //nolint:errcheck
77
78 steps := []struct {
79 sql string
80 dest *int64
81 }{
82 {`DELETE FROM user_inbounds WHERE user_id NOT IN (SELECT id FROM users)`, &r.UserInboundsByUser},
83 {`DELETE FROM user_inbounds WHERE inbound_id != '' AND inbound_id NOT IN (SELECT id FROM inbounds)`, &r.UserInboundsByInbound},
84 {`DELETE FROM hosts WHERE inbound_id NOT IN (SELECT id FROM inbounds)`, &r.HostsByInbound},
85 {`DELETE FROM inbounds WHERE node_id NOT IN (SELECT id FROM nodes)`, &r.InboundsByNode},
86 {`DELETE FROM node_daily_usage WHERE node_id NOT IN (SELECT id FROM nodes)`, &r.DailyUsageByNode},
87 {`DELETE FROM sub_access_logs WHERE user_id NOT IN (SELECT id FROM users)`, &r.SubAccessLogsByUser},
88 {`DELETE FROM user_node_daily_usage WHERE user_id NOT IN (SELECT id FROM users)`, &r.UserNodeUsageByUser},
89 {`DELETE FROM user_node_daily_usage WHERE node_id NOT IN (SELECT id FROM nodes)`, &r.UserNodeUsageByNode},
90 {`DELETE FROM node_uptime_log WHERE node_id NOT IN (SELECT id FROM nodes)`, &r.NodeUptimeByNode},
91 {`DELETE FROM node_speedtest WHERE node_id NOT IN (SELECT id FROM nodes)`, &r.NodeSpeedtestByNode},
92 {`DELETE FROM node_check_results WHERE node_id NOT IN (SELECT id FROM nodes)`, &r.NodeCheckResultsByNode},
93 {`DELETE FROM traceroute_snapshots WHERE node_id NOT IN (SELECT id FROM nodes)`, &r.TracerouteByNode},
94 {`DELETE FROM node_domains WHERE node_id NOT IN (SELECT id FROM nodes)`, &r.NodeDomainsByNode},
95 {`DELETE FROM ip_sentinel_configs WHERE node_id NOT IN (SELECT id FROM nodes)`, &r.IPSentinelConfigByNode},
96 {`DELETE FROM ip_sentinel_runs WHERE node_id NOT IN (SELECT id FROM nodes)`, &r.IPSentinelRunsByNode},
97 {`DELETE FROM ticket_messages WHERE ticket_id NOT IN (SELECT id FROM tickets)`, &r.TicketMessagesByTicket},
98 {`DELETE FROM ticket_images WHERE ticket_id NOT IN (SELECT id FROM tickets)`, &r.TicketImagesByTicket},
99 {`DELETE FROM user_host_exclusions WHERE user_id NOT IN (SELECT id FROM users)`, &r.HostExclusionsByUser},
100 {`DELETE FROM user_host_exclusions WHERE host_id NOT IN (SELECT id FROM hosts)`, &r.HostExclusionsByHost},
101 {`DELETE FROM user_group_members WHERE user_id NOT IN (SELECT id FROM users)`, &r.UserGroupMembersByUser},
102 {`DELETE FROM user_group_members WHERE group_id NOT IN (SELECT id FROM user_groups)`, &r.UserGroupMembersByGroup},
103 }
104
105 for _, step := range steps {
106 res, err := tx.Exec(ctx, step.sql)
107 if err != nil {
108 return r, fmt.Errorf("cleanup: %w", err)
109 }
110 n := res.RowsAffected()
111 *step.dest = n
112 r.Total += n
113 }
114
115 if err := tx.Commit(ctx); err != nil {
116 return r, fmt.Errorf("cleanup commit: %w", err)
117 }
118 return r, nil
119}
120
121func (db *DB) NodeStore() *NodeStore {
122 return &NodeStore{db: db.conn}

Callers 15

TestE2E_EnrollAndConnectFunction · 0.80
TestE2E_DispatchRPCFunction · 0.80
TestE2E_StreamLogsCancelFunction · 0.80
TestE2E_UsagePushAckFunction · 0.80
TestE2E_ReconnectBackoffFunction · 0.80
newTestManagerFunction · 0.80
newTestEnvFunction · 0.80
dialMethod · 0.80
RunFunction · 0.80

Calls 1

ExecMethod · 0.80

Tested by 15

TestE2E_EnrollAndConnectFunction · 0.64
TestE2E_DispatchRPCFunction · 0.64
TestE2E_StreamLogsCancelFunction · 0.64
TestE2E_UsagePushAckFunction · 0.64
TestE2E_ReconnectBackoffFunction · 0.64
newTestManagerFunction · 0.64
newTestEnvFunction · 0.64
dialMethod · 0.64