1
1
-- Add raw_size column to mk12 deals to calculate pieceCidV2
2
- ALTER TABLE market_mk12_deals
3
- ADD COLUMN raw_size BIGINT ;
2
+ DO $$
3
+ BEGIN
4
+ IF NOT EXISTS (
5
+ SELECT 1 FROM information_schema .columns
6
+ WHERE table_name = ' market_mk12_deals'
7
+ AND column_name = ' raw_size'
8
+ ) THEN
9
+ ALTER TABLE market_mk12_deals ADD COLUMN raw_size BIGINT ;
10
+ END IF;
11
+ END $$;
4
12
5
13
-- Add raw_size column to mk12-ddo deals to calculate pieceCidV2
6
- ALTER TABLE market_direct_deals
7
- ADD COLUMN raw_size BIGINT ;
14
+ DO $$
15
+ BEGIN
16
+ IF NOT EXISTS (
17
+ SELECT 1 FROM information_schema .columns
18
+ WHERE table_name = ' market_direct_deals'
19
+ AND column_name = ' raw_size'
20
+ ) THEN
21
+ ALTER TABLE market_direct_deals ADD COLUMN raw_size BIGINT ;
22
+ END IF;
23
+ END $$;
8
24
9
25
-- Drop the existing primary key constraint for market_piece_metadata
10
26
ALTER TABLE market_piece_metadata
11
- DROP CONSTRAINT market_piece_metadata_pkey;
27
+ DROP CONSTRAINT IF EXISTS market_piece_metadata_pkey;
12
28
13
29
-- Drop the redundant UNIQUE constraint if it exists for market_piece_metadata
14
30
ALTER TABLE market_piece_metadata
15
31
DROP CONSTRAINT IF EXISTS market_piece_meta_identity_key;
16
32
17
33
-- Add the new composite primary key for market_piece_metadata
18
- ALTER TABLE market_piece_metadata
19
- ADD PRIMARY KEY (piece_cid, piece_size);
34
+ DO $$
35
+ BEGIN
36
+ IF NOT EXISTS (
37
+ SELECT 1 FROM information_schema .table_constraints
38
+ WHERE table_name = ' market_piece_metadata'
39
+ AND constraint_type = ' PRIMARY KEY'
40
+ ) THEN
41
+ ALTER TABLE market_piece_metadata ADD PRIMARY KEY (piece_cid, piece_size);
42
+ END IF;
43
+ END $$;
20
44
21
45
-- Drop the current primary key for market_piece_deal
22
46
ALTER TABLE market_piece_deal
23
- DROP CONSTRAINT market_piece_deal_pkey;
47
+ DROP CONSTRAINT IF EXISTS market_piece_deal_pkey;
24
48
25
49
-- Drop the old UNIQUE constraint for market_piece_deal
26
50
ALTER TABLE market_piece_deal
27
51
DROP CONSTRAINT IF EXISTS market_piece_deal_identity_key;
28
52
29
53
-- Add the new composite primary key for market_piece_deal
30
- ALTER TABLE market_piece_deal
31
- ADD PRIMARY KEY (id, sp_id, piece_cid, piece_length);
54
+ DO $$
55
+ BEGIN
56
+ IF NOT EXISTS (
57
+ SELECT 1 FROM information_schema .table_constraints
58
+ WHERE table_name = ' market_piece_deal'
59
+ AND constraint_type = ' PRIMARY KEY'
60
+ ) THEN
61
+ ALTER TABLE market_piece_deal ADD PRIMARY KEY (id, sp_id, piece_cid, piece_length);
62
+ END IF;
63
+ END $$;
32
64
33
65
-- Add a column to relate a piece park piece to mk20 deal
34
- ALTER TABLE market_piece_deal
35
- ADD COLUMN piece_ref BIGINT ;
66
+ DO $$
67
+ BEGIN
68
+ IF NOT EXISTS (
69
+ SELECT 1 FROM information_schema .columns
70
+ WHERE table_name = ' market_piece_deal'
71
+ AND column_name = ' piece_ref'
72
+ ) THEN
73
+ ALTER TABLE market_piece_deal ADD COLUMN piece_ref BIGINT ;
74
+ END IF;
75
+ END $$;
36
76
37
77
-- Allow piece_offset to be null for PDP deals
38
78
ALTER TABLE market_piece_deal
39
79
ALTER COLUMN piece_offset DROP NOT NULL ;
40
80
41
81
-- Add column to skip scheduling piece_park. Used for upload pieces
42
- ALTER TABLE parked_pieces
43
- ADD COLUMN skip BOOLEAN NOT NULL DEFAULT FALSE;
82
+ DO $$
83
+ BEGIN
84
+ IF NOT EXISTS (
85
+ SELECT 1 FROM information_schema .columns
86
+ WHERE table_name = ' parked_pieces'
87
+ AND column_name = ' skip'
88
+ ) THEN
89
+ ALTER TABLE parked_pieces ADD COLUMN skip BOOLEAN NOT NULL DEFAULT FALSE;
90
+ END IF;
91
+ END $$;
44
92
45
93
-- Add column piece_cid_v2 to IPNI table
46
- ALTER TABLE ipni
47
- ADD COLUMN piece_cid_v2 TEXT ;
94
+ DO $$
95
+ BEGIN
96
+ IF NOT EXISTS (
97
+ SELECT 1 FROM information_schema .columns
98
+ WHERE table_name = ' ipni'
99
+ AND column_name = ' piece_cid_v2'
100
+ ) THEN
101
+ ALTER TABLE ipni ADD COLUMN piece_cid_v2 TEXT ;
102
+ END IF;
103
+ END $$;
48
104
49
105
-- Add metadata column to IPNI table which defaults to the binary of IpfsGatewayHttp
50
- ALTER TABLE ipni
51
- ADD COLUMN metadata BYTEA NOT NULL DEFAULT ' \x a01200' ;
106
+ DO $$
107
+ BEGIN
108
+ IF NOT EXISTS (
109
+ SELECT 1 FROM information_schema .columns
110
+ WHERE table_name = ' ipni'
111
+ AND column_name = ' metadata'
112
+ ) THEN
113
+ ALTER TABLE ipni ADD COLUMN metadata BYTEA NOT NULL DEFAULT ' \x a01200' ;
114
+ END IF;
115
+ END $$;
52
116
53
117
-- Add is_pdp column to the table to allow generating 2 sets of chunks per
54
118
-- piece cid. One for Payloads and another one for single CID chunks to announce a PDP piece.
55
- ALTER TABLE ipni_chunks
56
- ADD COLUMN is_pdp BOOLEAN NOT NULL DEFAULT FALSE;
119
+ DO $$
120
+ BEGIN
121
+ IF NOT EXISTS (
122
+ SELECT 1 FROM information_schema .columns
123
+ WHERE table_name = ' ipni_chunks'
124
+ AND column_name = ' is_pdp'
125
+ ) THEN
126
+ ALTER TABLE ipni_chunks ADD COLUMN is_pdp BOOLEAN NOT NULL DEFAULT FALSE;
127
+ END IF;
128
+ END $$;
57
129
58
130
-- Replace the old uniqueness (piece_cid, chunk_num) with the new one
59
131
ALTER TABLE ipni_chunks
60
- DROP CONSTRAINT ipni_chunks_piece_cid_chunk_num_key;
132
+ DROP CONSTRAINT IF EXISTS ipni_chunks_piece_cid_chunk_num_key;
61
133
62
- ALTER TABLE ipni_chunks
63
- ADD CONSTRAINT ipni_chunks_piece_cid_is_pdp_chunk_num_key
64
- UNIQUE (piece_cid, is_pdp, chunk_num);
134
+ DO $$
135
+ BEGIN
136
+ IF NOT EXISTS (
137
+ SELECT 1 FROM information_schema .table_constraints
138
+ WHERE table_name = ' ipni_chunks'
139
+ AND constraint_name = ' ipni_chunks_piece_cid_is_pdp_chunk_num_key'
140
+ ) THEN
141
+ ALTER TABLE ipni_chunks ADD CONSTRAINT ipni_chunks_piece_cid_is_pdp_chunk_num_key
142
+ UNIQUE (piece_cid, is_pdp, chunk_num);
143
+ END IF;
144
+ END $$;
65
145
66
146
-- The order_number column must be completely sequential
67
147
ALTER SEQUENCE ipni_order_number_seq CACHE 1 ;
@@ -106,8 +186,16 @@ END;
106
186
$$ LANGUAGE plpgsql;
107
187
108
188
-- Add ID column to ipni_task table
109
- ALTER TABLE ipni_task
110
- ADD COLUMN id TEXT ;
189
+ DO $$
190
+ BEGIN
191
+ IF NOT EXISTS (
192
+ SELECT 1 FROM information_schema .columns
193
+ WHERE table_name = ' ipni_task'
194
+ AND column_name = ' id'
195
+ ) THEN
196
+ ALTER TABLE ipni_task ADD COLUMN id TEXT ;
197
+ END IF;
198
+ END $$;
111
199
112
200
-- Function to create ipni tasks
113
201
CREATE OR REPLACE FUNCTION insert_ipni_task (
@@ -186,7 +274,7 @@ COMMIT;
186
274
187
275
-- This is main MK20 Deal table. Rows are added per deal and some
188
276
-- modification is allowed later
189
- CREATE TABLE market_mk20_deal (
277
+ CREATE TABLE IF NOT EXISTS market_mk20_deal (
190
278
created_at TIMESTAMPTZ NOT NULL DEFAULT TIMEZONE(' UTC' , NOW()),
191
279
id TEXT PRIMARY KEY ,
192
280
client TEXT NOT NULL ,
@@ -203,7 +291,7 @@ COMMENT ON COLUMN market_mk20_deal.id IS 'This is ULID TEXT';
203
291
COMMENT ON COLUMN market_mk20_deal.client IS ' Client must always be text as this can be a non Filecoin address like ed25519' ;
204
292
205
293
-- This is main pipeline table for PoRep processing of MK20 deals
206
- CREATE TABLE market_mk20_pipeline (
294
+ CREATE TABLE IF NOT EXISTS market_mk20_pipeline (
207
295
created_at TIMESTAMPTZ NOT NULL DEFAULT TIMEZONE(' UTC' , NOW()),
208
296
id TEXT NOT NULL ,
209
297
sp_id BIGINT NOT NULL ,
@@ -253,13 +341,13 @@ COMMENT ON COLUMN market_mk20_pipeline.deal_aggregation IS 'This is set when use
253
341
-- This table is used to hold MK20 deals waiting for PoRep pipeline
254
342
-- to process. This allows disconnecting the need to immediately process
255
343
-- deals as received and allow upload later strategy to work
256
- CREATE TABLE market_mk20_pipeline_waiting (
344
+ CREATE TABLE IF NOT EXISTS market_mk20_pipeline_waiting (
257
345
id TEXT PRIMARY KEY
258
346
);
259
347
260
348
-- This table is used to keep track of deals which need data upload.
261
349
-- A separate table helps easier status check, chunked+serial upload support
262
- CREATE TABLE market_mk20_upload_waiting (
350
+ CREATE TABLE IF NOT EXISTS market_mk20_upload_waiting (
263
351
id TEXT PRIMARY KEY ,
264
352
chunked BOOLEAN DEFAULT NULL ,
265
353
ref_id BIGINT DEFAULT NULL ,
@@ -270,7 +358,7 @@ CREATE TABLE market_mk20_upload_waiting (
270
358
-- It helps with allowing multiple downloads per deal i.e. server side aggregation.
271
359
-- This also allows us to reuse ongoing downloads within the same deal aggregation.
272
360
-- It also allows using a common download pipeline for both PoRep and PDP.
273
- CREATE TABLE market_mk20_download_pipeline (
361
+ CREATE TABLE IF NOT EXISTS market_mk20_download_pipeline (
274
362
id TEXT NOT NULL ,
275
363
product TEXT NOT NULL , -- This allows us to run multiple refs per product for easier lifecycle management
276
364
piece_cid_v2 TEXT NOT NULL ,
@@ -279,7 +367,7 @@ CREATE TABLE market_mk20_download_pipeline (
279
367
);
280
368
281
369
-- Offline URLs for PoRep deals.
282
- CREATE TABLE market_mk20_offline_urls (
370
+ CREATE TABLE IF NOT EXISTS market_mk20_offline_urls (
283
371
id TEXT NOT NULL ,
284
372
piece_cid_v2 TEXT NOT NULL ,
285
373
url TEXT NOT NULL ,
@@ -289,7 +377,7 @@ CREATE TABLE market_mk20_offline_urls (
289
377
290
378
-- This table tracks the chunk upload progress for a MK20 deal. Common for both
291
379
-- PoRep and PDP
292
- CREATE TABLE market_mk20_deal_chunk (
380
+ CREATE TABLE IF NOT EXISTS market_mk20_deal_chunk (
293
381
id TEXT not null ,
294
382
chunk INT not null ,
295
383
chunk_size BIGINT not null ,
@@ -302,25 +390,25 @@ CREATE TABLE market_mk20_deal_chunk (
302
390
);
303
391
304
392
-- MK20 product and their status table
305
- CREATE TABLE market_mk20_products (
393
+ CREATE TABLE IF NOT EXISTS market_mk20_products (
306
394
name TEXT PRIMARY KEY ,
307
395
enabled BOOLEAN DEFAULT TRUE
308
396
);
309
397
310
398
-- MK20 supported data sources and their status table
311
- CREATE TABLE market_mk20_data_source (
399
+ CREATE TABLE IF NOT EXISTS market_mk20_data_source (
312
400
name TEXT PRIMARY KEY ,
313
401
enabled BOOLEAN DEFAULT TRUE
314
402
);
315
403
316
404
-- Add products and data sources to table
317
- INSERT INTO market_mk20_products (name, enabled) VALUES (' ddo_v1' , TRUE);
318
- INSERT INTO market_mk20_products (name, enabled) VALUES (' retrieval_v1' , TRUE);
319
- INSERT INTO market_mk20_products (name, enabled) VALUES (' pdp_v1' , TRUE);
320
- INSERT INTO market_mk20_data_source (name, enabled) VALUES (' http' , TRUE);
321
- INSERT INTO market_mk20_data_source (name, enabled) VALUES (' aggregate' , TRUE);
322
- INSERT INTO market_mk20_data_source (name, enabled) VALUES (' offline' , TRUE);
323
- INSERT INTO market_mk20_data_source (name, enabled) VALUES (' put' , TRUE);
405
+ INSERT INTO market_mk20_products (name, enabled) VALUES (' ddo_v1' , TRUE) ON CONFLICT (name) DO NOTHING ;
406
+ INSERT INTO market_mk20_products (name, enabled) VALUES (' retrieval_v1' , TRUE) ON CONFLICT (name) DO NOTHING ;
407
+ INSERT INTO market_mk20_products (name, enabled) VALUES (' pdp_v1' , TRUE) ON CONFLICT (name) DO NOTHING ;
408
+ INSERT INTO market_mk20_data_source (name, enabled) VALUES (' http' , TRUE) ON CONFLICT (name) DO NOTHING ;
409
+ INSERT INTO market_mk20_data_source (name, enabled) VALUES (' aggregate' , TRUE) ON CONFLICT (name) DO NOTHING ;
410
+ INSERT INTO market_mk20_data_source (name, enabled) VALUES (' offline' , TRUE) ON CONFLICT (name) DO NOTHING ;
411
+ INSERT INTO market_mk20_data_source (name, enabled) VALUES (' put' , TRUE) ON CONFLICT (name) DO NOTHING ;
324
412
325
413
-- This function sets an upload completion time. It is used to removed
326
414
-- upload for deal which are not finalized in 1 hour so we don't waste space.
@@ -339,6 +427,7 @@ BEGIN
339
427
END;
340
428
$$ LANGUAGE plpgsql;
341
429
430
+ DROP TRIGGER IF EXISTS trg_ready_at_serial ON market_mk20_upload_waiting;
342
431
CREATE TRIGGER trg_ready_at_serial
343
432
BEFORE UPDATE OF ref_id, chunked ON market_mk20_upload_waiting
344
433
FOR EACH ROW
369
458
$$ LANGUAGE plpgsql;
370
459
371
460
461
+ DROP TRIGGER IF EXISTS trg_ready_at_chunks_update ON market_mk20_deal_chunk;
372
462
CREATE TRIGGER trg_ready_at_chunks_update
373
463
AFTER INSERT OR UPDATE OF complete ON market_mk20_deal_chunk
374
464
FOR EACH ROW
447
537
$$ LANGUAGE plpgsql;
448
538
449
539
-- Main DataSet table for PDP
450
- CREATE TABLE pdp_data_set (
540
+ CREATE TABLE IF NOT EXISTS pdp_data_set (
451
541
id BIGINT PRIMARY KEY , -- on-chain dataset id
452
542
client TEXT NOT NULL , -- client wallet which requested this dataset
453
543
@@ -487,7 +577,7 @@ CREATE TABLE pdp_data_set (
487
577
);
488
578
489
579
-- DataSet create table governs the DataSet create task
490
- CREATE TABLE pdp_data_set_create (
580
+ CREATE TABLE IF NOT EXISTS pdp_data_set_create (
491
581
id TEXT PRIMARY KEY , -- This is Market V2 Deal ID for lookup and response
492
582
client TEXT NOT NULL ,
493
583
@@ -499,7 +589,7 @@ CREATE TABLE pdp_data_set_create (
499
589
);
500
590
501
591
-- DataSet delete table governs the DataSet delete task
502
- CREATE TABLE pdp_data_set_delete (
592
+ CREATE TABLE IF NOT EXISTS pdp_data_set_delete (
503
593
id TEXT PRIMARY KEY , -- This is Market V2 Deal ID for lookup and response
504
594
client TEXT NOT NULL ,
505
595
@@ -511,7 +601,7 @@ CREATE TABLE pdp_data_set_delete (
511
601
);
512
602
513
603
-- This table governs the delete piece tasks
514
- CREATE TABLE pdp_piece_delete (
604
+ CREATE TABLE IF NOT EXISTS pdp_piece_delete (
515
605
id TEXT PRIMARY KEY , -- This is Market V2 Deal ID for lookup and response
516
606
client TEXT NOT NULL ,
517
607
@@ -524,7 +614,7 @@ CREATE TABLE pdp_piece_delete (
524
614
);
525
615
526
616
-- Main DataSet Piece table. Any and all pieces ever added by SP must be part of this table
527
- CREATE TABLE pdp_dataset_piece (
617
+ CREATE TABLE IF NOT EXISTS pdp_dataset_piece (
528
618
data_set_id BIGINT NOT NULL , -- pdp_data_sets.id
529
619
client TEXT NOT NULL ,
530
620
@@ -546,7 +636,7 @@ CREATE TABLE pdp_dataset_piece (
546
636
PRIMARY KEY (data_set_id, piece)
547
637
);
548
638
549
- CREATE TABLE pdp_pipeline (
639
+ CREATE TABLE IF NOT EXISTS pdp_pipeline (
550
640
created_at TIMESTAMPTZ NOT NULL DEFAULT TIMEZONE(' UTC' , NOW()),
551
641
552
642
id TEXT NOT NULL ,
@@ -660,12 +750,12 @@ begin
660
750
end;
661
751
$$;
662
752
663
- CREATE TABLE market_mk20_clients (
753
+ CREATE TABLE IF NOT EXISTS market_mk20_clients (
664
754
client TEXT PRIMARY KEY ,
665
755
allowed BOOLEAN DEFAULT TRUE
666
756
);
667
757
668
- CREATE TABLE pdp_proving_tasks (
758
+ CREATE TABLE IF NOT EXISTS pdp_proving_tasks (
669
759
data_set_id BIGINT NOT NULL , -- pdp_data_set.id
670
760
task_id BIGINT NOT NULL , -- harmony_task task ID
671
761
@@ -676,7 +766,7 @@ CREATE TABLE pdp_proving_tasks (
676
766
677
767
-- IPNI pipeline is kept separate from rest for robustness
678
768
-- and reuse. This allows for removing, recreating ads using CLI.
679
- CREATE TABLE pdp_ipni_task (
769
+ CREATE TABLE IF NOT EXISTS pdp_ipni_task (
680
770
context_id BYTEA NOT NULL ,
681
771
is_rm BOOLEAN NOT NULL ,
682
772
769
859
$$ LANGUAGE plpgsql;
770
860
771
861
772
- CREATE TABLE piece_cleanup (
862
+ CREATE TABLE IF NOT EXISTS piece_cleanup (
773
863
id TEXT NOT NULL ,
774
864
piece_cid_v2 TEXT NOT NULL ,
775
865
0 commit comments