blob: d4ecb30247413f065c67d6e1761a7ca575f38eb5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
--
-- This file is part of TALER
-- Copyright (C) 2014--2022 Taler Systems SA
--
-- TALER is free software; you can redistribute it and/or modify it under the
-- terms of the GNU General Public License as published by the Free Software
-- Foundation; either version 3, or (at your option) any later version.
--
-- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License along with
-- TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
--
CREATE OR REPLACE PROCEDURE exchange_do_gc(
IN in_ancient_date INT8,
IN in_now INT8)
LANGUAGE plpgsql
AS $$
DECLARE
reserve_uuid_min INT8; -- minimum reserve UUID still alive
melt_min INT8; -- minimum melt still alive
coin_min INT8; -- minimum known_coin still alive
batch_deposit_min INT8; -- minimum deposit still alive
reserve_out_min INT8; -- minimum reserve_out still alive
denom_min INT8; -- minimum denomination still alive
BEGIN
DELETE FROM prewire
WHERE finished=TRUE;
DELETE FROM wire_fee
WHERE end_date < in_ancient_date;
-- FIXME: use closing fee as threshold?
DELETE FROM reserves
WHERE gc_date < in_now
AND current_balance = (0, 0);
SELECT
reserve_out_serial_id
INTO
reserve_out_min
FROM reserves_out
ORDER BY reserve_out_serial_id ASC
LIMIT 1;
DELETE FROM recoup
WHERE reserve_out_serial_id < reserve_out_min;
SELECT
reserve_uuid
INTO
reserve_uuid_min
FROM reserves
ORDER BY reserve_uuid ASC
LIMIT 1;
DELETE FROM reserves_out
WHERE reserve_uuid < reserve_uuid_min;
-- FIXME: this query will be horribly slow;
-- need to find another way to formulate it...
DELETE FROM denominations
WHERE expire_legal < in_now
AND denominations_serial NOT IN
(SELECT DISTINCT denominations_serial
FROM reserves_out)
AND denominations_serial NOT IN
(SELECT DISTINCT denominations_serial
FROM known_coins
WHERE coin_pub IN
(SELECT DISTINCT coin_pub
FROM recoup))
AND denominations_serial NOT IN
(SELECT DISTINCT denominations_serial
FROM known_coins
WHERE coin_pub IN
(SELECT DISTINCT coin_pub
FROM recoup_refresh));
SELECT
melt_serial_id
INTO
melt_min
FROM refresh_commitments
ORDER BY melt_serial_id ASC
LIMIT 1;
DELETE FROM refresh_revealed_coins
WHERE melt_serial_id < melt_min;
DELETE FROM refresh_transfer_keys
WHERE melt_serial_id < melt_min;
SELECT
known_coin_id
INTO
coin_min
FROM known_coins
ORDER BY known_coin_id ASC
LIMIT 1;
DELETE FROM recoup_refresh
WHERE known_coin_id < coin_min;
DELETE FROM batch_deposits
WHERE wire_deadline < in_ancient_date;
SELECT
batch_deposit_serial_id
INTO
batch_deposit_min
FROM coin_deposits
ORDER BY batch_deposit_serial_id ASC
LIMIT 1;
DELETE FROM refunds
WHERE batch_deposit_serial_id < batch_deposit_min;
DELETE FROM aggregation_tracking
WHERE batch_deposit_serial_id < batch_deposit_min;
DELETE FROM coin_deposits
WHERE batch_deposit_serial_id < batch_deposit_min;
SELECT
denominations_serial
INTO
denom_min
FROM denominations
ORDER BY denominations_serial ASC
LIMIT 1;
DELETE FROM cs_nonce_locks
WHERE max_denomination_serial <= denom_min;
END $$;
|