Mercurial Hosting > nabble
comparison src/nabble/model/DbSiteUpdater.jmp @ 0:7ecd1a4ef557
add content
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 21 Mar 2019 19:15:52 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:7ecd1a4ef557 |
---|---|
1 <% | |
2 package nabble.model; | |
3 | |
4 import fschmidt.db.DbDatabase; | |
5 import org.slf4j.Logger; | |
6 import org.slf4j.LoggerFactory; | |
7 | |
8 import java.sql.SQLException; | |
9 import java.util.HashMap; | |
10 import java.util.Map; | |
11 | |
12 | |
13 final class DbSiteUpdater { | |
14 private static final Logger logger = LoggerFactory.getLogger(DbSiteUpdater.class); | |
15 | |
16 // don't forget to update site.schema | |
17 static final int version = 167; | |
18 | |
19 private static class Result { | |
20 private static final long wait = 2000L; // 2 seconds | |
21 private final long waitUntil = System.currentTimeMillis() + wait; | |
22 private DbSiteUpdater updater; | |
23 private SQLException sqlException = null; | |
24 private RuntimeException runtimeException = null; | |
25 private Error error = null; | |
26 private final String user; | |
27 | |
28 private Result(DbDatabase db,String user) { | |
29 updater = new DbSiteUpdater(db,this,user); | |
30 this.user = user; | |
31 updater.start(); | |
32 } | |
33 | |
34 private synchronized void check() throws SQLException { | |
35 if( !isDone() ) { | |
36 long now = System.currentTimeMillis(); | |
37 if( now < waitUntil ) { | |
38 try { | |
39 wait( waitUntil - now ); | |
40 } catch(InterruptedException e) { | |
41 throw new RuntimeException(e); | |
42 } | |
43 } | |
44 if( !isDone() ) | |
45 throw new UpdatingException(user); | |
46 } | |
47 if( sqlException != null ) | |
48 throw sqlException; | |
49 if( runtimeException != null ) | |
50 throw runtimeException; | |
51 if( error != null ) | |
52 throw error; | |
53 } | |
54 | |
55 synchronized boolean isDone() { | |
56 return updater==null; | |
57 } | |
58 | |
59 synchronized void done(Throwable e) { | |
60 updater = null; | |
61 if( e != null ) { | |
62 if( e instanceof SQLException ) { | |
63 sqlException = (SQLException)e; | |
64 } else if( e instanceof RuntimeException ) { | |
65 runtimeException = (RuntimeException)e; | |
66 } else if( e instanceof Error ) { | |
67 error = (Error)e; | |
68 } else { | |
69 runtimeException = new RuntimeException("invalid exception type",e); | |
70 } | |
71 } | |
72 notifyAll(); | |
73 } | |
74 } | |
75 | |
76 private static final Map<String,Result> userResults = new HashMap<String,Result>(); | |
77 private static final Object lock = new Object(); | |
78 | |
79 static void update(String user,DbDatabase db) throws SQLException { | |
80 if( user.equals("global") ) | |
81 return; // done from command line | |
82 getResult(user,db).check(); | |
83 } | |
84 | |
85 private static Result getResult(String user,DbDatabase db) throws SQLException { | |
86 synchronized(lock) { | |
87 Result result = userResults.get(user); | |
88 if( result == null ) { | |
89 result = new Result(db,user); | |
90 userResults.put(user,result); | |
91 } | |
92 return result; | |
93 } | |
94 } | |
95 | |
96 // for shell | |
97 public static void clearResult(long siteId) { | |
98 String user = SiteKey.getInstance(siteId).schema(); | |
99 synchronized(lock) { | |
100 userResults.remove(user); | |
101 } | |
102 } | |
103 | |
104 | |
105 | |
106 | |
107 private final Result result; | |
108 private final DbUpdater up; | |
109 | |
110 private DbSiteUpdater(DbDatabase db,Result result,String schema) { | |
111 this.up = new DbUpdater(db,schema); | |
112 this.result = result; | |
113 } | |
114 | |
115 private void start() { | |
116 try { // needed for site creation because version is only up to date in current transaction | |
117 if( up.dbVersion() == version ) { | |
118 result.done(null); | |
119 return; | |
120 } | |
121 } catch(RuntimeException e) { | |
122 result.done(e); | |
123 return; | |
124 } catch(Error e) { | |
125 result.done(e); | |
126 return; | |
127 } | |
128 Executors.executeNow(new Runnable(){public void run(){ | |
129 try { | |
130 go(); | |
131 result.done(null); | |
132 } catch(SQLException e) { | |
133 result.done(e); | |
134 } catch(RuntimeException e) { | |
135 result.done(e); | |
136 } catch(Error e) { | |
137 result.done(e); | |
138 } finally { | |
139 if( !result.isDone() ) | |
140 logger.error("result isn't done"); | |
141 } | |
142 }}); | |
143 } | |
144 | |
145 void go() throws SQLException { | |
146 try { | |
147 update(); | |
148 if( up.databaseVersion() != version ) | |
149 throw new RuntimeException(); | |
150 } finally { | |
151 up.close(); | |
152 } | |
153 } | |
154 | |
155 @Override public String toString() { | |
156 return "DbSiteUpdater-" + up.schema; | |
157 } | |
158 | |
159 private void execCatching(String sql,String exStr) throws SQLException { | |
160 up.begin(); | |
161 try { | |
162 up.exec(sql); | |
163 } catch(SQLException e) { | |
164 if( !e.getMessage().contains(exStr) ) | |
165 throw e; | |
166 logger.info(e.toString()); | |
167 up.exec("rollback"); | |
168 } | |
169 up.commit(); | |
170 } | |
171 | |
172 void update() throws SQLException { | |
173 switch( up.dbVersion() ) { | |
174 case 0: | |
175 up.execStep( %> | |
176 create index embed_key_site_idx on embed_key(site_id) | |
177 <% ); | |
178 case 1: | |
179 up.execStep( %> | |
180 create index file_avatar_site_idx on file_avatar(site_id) | |
181 <% ); | |
182 case 2: | |
183 up.execStep( %> | |
184 create index file_node_site_idx on file_node(site_id) | |
185 <% ); | |
186 case 3: | |
187 up.execStep( %> | |
188 create index file_temp_site_idx on file_temp(site_id) | |
189 <% ); | |
190 case 4: | |
191 up.execStep( %> | |
192 create index mailing_list_site_idx on mailing_list(site_id) | |
193 <% ); | |
194 case 5: | |
195 up.execStep( %> | |
196 create index node_msg_site_idx on node_msg(site_id) | |
197 <% ); | |
198 case 6: | |
199 up.execStep( %> | |
200 create index node_property_site_idx on node_property(site_id) | |
201 <% ); | |
202 case 7: | |
203 up.execStep( %> | |
204 create index paid_site_idx on paid(site_id) | |
205 <% ); | |
206 case 8: | |
207 up.execStep( %> | |
208 create index registration_site_idx on registration(site_id) | |
209 <% ); | |
210 case 9: | |
211 up.execStep( %> | |
212 create index subscription_site_idx on subscription(site_id) | |
213 <% ); | |
214 case 10: | |
215 up.execStep( %> | |
216 create index user_property_site_idx on user_property(site_id) | |
217 <% ); | |
218 case 11: | |
219 up.execStep( %> | |
220 create index view_count_site_idx on view_count(site_id) | |
221 <% ); | |
222 case 12: | |
223 up.execStep( %> | |
224 create index visited_site_idx on visited(site_id) | |
225 <% ); | |
226 | |
227 case 13: | |
228 up.execStep( %> | |
229 create index tag_node_idx on tag(node_id) | |
230 <% ); | |
231 case 14: | |
232 up.execStep( %> | |
233 create index tag_user_idx on tag(user_id) | |
234 <% ); | |
235 case 15: | |
236 up.execStep( %> | |
237 create index embed_key_node_idx on embed_key(node_id) | |
238 <% ); | |
239 case 16: | |
240 up.execStep( %> | |
241 create index visited_node_idx on visited(node_id) | |
242 <% ); | |
243 case 17: | |
244 up.execStep( %> | |
245 create index visited_last_node_idx on visited(last_node_id) | |
246 <% ); | |
247 case 18: | |
248 up.execStep( %> | |
249 alter table node add column poll_option_count integer default null | |
250 <% ); | |
251 case 19: | |
252 up.execStep( %> | |
253 alter table configuration drop column site_id | |
254 <% ); | |
255 case 20: | |
256 up.execStep( %> | |
257 alter table configuration ADD PRIMARY KEY (name) | |
258 <% ); | |
259 case 21: | |
260 up.execStep( %> | |
261 alter table embed_key drop column site_id | |
262 <% ); | |
263 case 22: | |
264 up.execStep( %> | |
265 alter table file_avatar drop column site_id | |
266 <% ); | |
267 case 23: | |
268 up.execStep( %> | |
269 alter table file_node drop column site_id | |
270 <% ); | |
271 case 24: | |
272 up.execStep( %> | |
273 alter table file_temp drop column site_id | |
274 <% ); | |
275 case 25: | |
276 up.execStep( %> | |
277 alter table mailing_list drop column site_id | |
278 <% ); | |
279 case 26: | |
280 up.execStep( %> | |
281 alter table node_msg drop column site_id | |
282 <% ); | |
283 case 27: | |
284 up.execStep( %> | |
285 alter table node_property drop column site_id | |
286 <% ); | |
287 case 28: | |
288 up.execStep( %> | |
289 alter table paid drop column site_id | |
290 <% ); | |
291 case 29: | |
292 up.execStep( %> | |
293 alter table registration drop column site_id | |
294 <% ); | |
295 case 30: | |
296 up.execStep( %> | |
297 alter table subscription drop column site_id | |
298 <% ); | |
299 case 31: | |
300 up.execStep( %> | |
301 alter table user_property drop column site_id | |
302 <% ); | |
303 case 32: | |
304 up.execStep( %> | |
305 alter table view_count drop column site_id | |
306 <% ); | |
307 case 33: | |
308 up.execStep( %> | |
309 alter table visited drop column site_id | |
310 <% ); | |
311 case 34: | |
312 up.execStep( %> | |
313 alter table file_site drop column site_id | |
314 <% ); | |
315 case 35: | |
316 up.execStep( %> | |
317 alter table file_site ADD PRIMARY KEY (name) | |
318 <% ); | |
319 case 36: | |
320 up.execStep( %> | |
321 alter table module drop column site_id | |
322 <% ); | |
323 case 37: | |
324 up.execStep( %> | |
325 alter table module ADD PRIMARY KEY (module_name) | |
326 <% ); | |
327 case 38: | |
328 up.execStep( %> | |
329 alter table site_property drop column site_id | |
330 <% ); | |
331 case 39: | |
332 up.execStep( %> | |
333 alter table site_property ADD PRIMARY KEY (key) | |
334 <% ); | |
335 case 40: | |
336 up.execStep( %> | |
337 alter table tweak drop column site_id | |
338 <% ); | |
339 case 41: | |
340 up.execStep( %> | |
341 alter table tweak ADD PRIMARY KEY (tweak_name) | |
342 <% ); | |
343 case 42: | |
344 up.execStep( %> | |
345 alter table tag drop column site_id | |
346 <% ); | |
347 case 43: | |
348 up.execStep( %> | |
349 CREATE UNIQUE INDEX tag_idx | |
350 ON tag (node_id, user_id, label); | |
351 <% ); | |
352 case 44: | |
353 up.execStep( %> | |
354 drop index tag_node_idx | |
355 <% ); | |
356 case 45: | |
357 up.execStep( %> | |
358 alter table user_ drop column site_id | |
359 <% ); | |
360 case 46: | |
361 up.execStep( %> | |
362 CREATE UNIQUE INDEX user_email_idx | |
363 ON user_ (lower(email)); | |
364 <% ); | |
365 case 47: | |
366 up.execStep( %> | |
367 CREATE UNIQUE INDEX user_name_idx | |
368 ON user_ (lower(name)); | |
369 <% ); | |
370 case 48: | |
371 up.execStep( %> | |
372 alter table node drop column site_id | |
373 <% ); | |
374 case 49: | |
375 up.execStep( %> | |
376 CREATE INDEX node_cookie_idx | |
377 ON node (cookie) | |
378 WHERE cookie IS NOT NULL; | |
379 <% ); | |
380 case 50: | |
381 up.execStep( %> | |
382 CREATE INDEX node_message_id_idx | |
383 ON node (lower(message_id)) | |
384 WHERE message_id IS NOT NULL; | |
385 <% ); | |
386 case 51: | |
387 up.execStep( %> | |
388 drop table embed_key | |
389 <% ); | |
390 case 52: | |
391 up.execStep( %> | |
392 delete from site_property where key = '__embedding_warning' | |
393 <% ); | |
394 case 53: | |
395 up.execStep( %> | |
396 alter table site drop column site_id | |
397 <% ); | |
398 case 54: | |
399 up.execStep( %> | |
400 alter table site add column one integer default 1 not null | |
401 <% ); | |
402 case 55: | |
403 up.execStep( %> | |
404 alter table site ADD PRIMARY KEY (one) | |
405 <% ); | |
406 case 56: | |
407 up.execStep( %> | |
408 alter table site add column content_type character varying; | |
409 <% ); | |
410 case 57: | |
411 up.execStep( %> | |
412 update configuration set naml=E'<override_macro name="site_style">\n\t<n.overridden/>\n\t#search-box { text-align:left; }\n</override_macro>' where name='searchBoxAlignment'; | |
413 <% ); | |
414 case 58: | |
415 up.execStep( %> | |
416 update site set ad_type=null where ad_type='ADBRITE' or ad_type='ADSENSE' | |
417 <% ); | |
418 | |
419 case 59: | |
420 up.execStep( %> | |
421 alter table node | |
422 add column unsafe character varying default 'new', | |
423 add column safe_version integer | |
424 <% ); | |
425 case 60: | |
426 up.execStep( %> | |
427 alter table user_ | |
428 add column unsafe character varying default 'new', | |
429 add column safe_version integer | |
430 <% ); | |
431 | |
432 case 61: | |
433 up.execStep( %> | |
434 update site set ad_type='HOPELESS' where ad_type='COPYRIGHTED' | |
435 <% ); | |
436 case 62: | |
437 up.execStep( %> | |
438 update site set ad_type='HOPELESS' where ad_type='OURS' | |
439 <% ); | |
440 case 63: | |
441 up.execStep( %> | |
442 update site set ad_type=null, ad_free=<%=Integer.MAX_VALUE%> where ad_type='NONE' | |
443 <% ); | |
444 | |
445 case 64: | |
446 up.execStep( %> | |
447 alter table node | |
448 add column is_safe boolean | |
449 <% ); | |
450 case 65: | |
451 up.execStep( %> | |
452 alter table user_ | |
453 add column is_safe boolean | |
454 <% ); | |
455 case 66: | |
456 up.execStep( null ); | |
457 case 67: | |
458 up.execStep( null ); | |
459 case 68: | |
460 up.execStep( %> | |
461 delete from tag where label='hide_ads' | |
462 <% ); | |
463 case 69: | |
464 up.execStep( %> | |
465 update site set ad_type=null where ad_type='SOME_ADSENSE' | |
466 <% ); | |
467 case 70: | |
468 up.execStep( %> | |
469 update site set ad_type='ADULT' where ad_type='HACK' | |
470 <% ); | |
471 case 71: | |
472 up.execStep( %> | |
473 update site set content_type=null where content_type='FAMILY' | |
474 <% ); | |
475 case 72: | |
476 up.execStep( %> | |
477 drop index if exists node_is_safe_idx | |
478 <% ); | |
479 case 73: | |
480 up.execStep( %> | |
481 drop index if exists user_is_safe_idx | |
482 <% ); | |
483 case 74: | |
484 up.execStep( %> | |
485 create index node_unsafe_idx on node(unsafe) where unsafe is not null and unsafe!='new' | |
486 <% ); | |
487 case 75: | |
488 up.execStep( %> | |
489 create index user_unsafe_idx on user_(unsafe) where unsafe is not null and unsafe!='new' | |
490 <% ); | |
491 case 76: | |
492 up.execStep( %> | |
493 update site set content_type=ad_type where content_type is null and ad_type is not null and ad_type!='HOPELESS' | |
494 <% ); | |
495 case 77: | |
496 up.execStep( %> | |
497 update site set ad_type=content_type where content_type is not null and ad_type is null | |
498 <% ); | |
499 case 78: | |
500 up.execStep( %> | |
501 update site set ad_type='ADULT' where content_type='ADULT' and ad_type='PORN' | |
502 <% ); | |
503 | |
504 case 79: | |
505 up.execStep( %> | |
506 alter table user_ | |
507 drop column unsafe, | |
508 drop column safe_version, | |
509 drop column is_safe | |
510 <% ); | |
511 case 80: | |
512 up.execStep( null ); | |
513 case 81: | |
514 up.execStep( null ); | |
515 case 82: | |
516 up.begin(); | |
517 up.exec( %> | |
518 alter table node | |
519 drop column unsafe, | |
520 drop column safe_version, | |
521 drop column is_safe | |
522 <% ); | |
523 up.exec( %> | |
524 alter table node | |
525 add column unsafe character varying, | |
526 add column safe_version integer, | |
527 add column is_safe boolean | |
528 <% ); | |
529 up.commit(); | |
530 case 83: | |
531 up.execStep( %> | |
532 create index node_unsafe_idx on node(unsafe) where safe_version is not null | |
533 <% ); | |
534 case 84: | |
535 up.execStep( %> | |
536 delete from module where module_name = 'topic_ads'; | |
537 <% ); | |
538 case 85: | |
539 up.execStep( %> | |
540 alter table node | |
541 drop column unsafe, | |
542 drop column safe_version, | |
543 drop column is_safe | |
544 <% ); | |
545 case 86: | |
546 up.execStep( %> | |
547 alter table site | |
548 add column when_created timestamp with time zone NOT NULL DEFAULT now() | |
549 <% ); | |
550 case 87: | |
551 up.execStep( %> | |
552 update site | |
553 set when_created = node.when_created | |
554 from node | |
555 where node.node_id = site.root_node_id | |
556 <% ); | |
557 | |
558 case 88: | |
559 up.execStep( %> | |
560 alter table site | |
561 add column is_safe boolean NOT NULL DEFAULT true | |
562 <% ); | |
563 case 89: | |
564 up.execStep( %> | |
565 update site set is_safe = false where ad_type is not null | |
566 <% ); | |
567 case 90: | |
568 up.execStep( %> | |
569 update site set when_created = now() where not is_safe | |
570 <% ); | |
571 case 91: | |
572 up.execStep( %> | |
573 alter table site rename column ad_type to old_ad_type | |
574 <% ); | |
575 case 92: | |
576 up.execStep( %> | |
577 alter table site rename column content_type to old_content_type | |
578 <% ); | |
579 case 93: | |
580 up.execStep( %> | |
581 alter table site | |
582 add column ad_credits_for_users boolean NOT NULL DEFAULT false | |
583 <% ); | |
584 case 94: | |
585 up.execStep( %> | |
586 alter table site | |
587 add column monthly_views integer NOT NULL DEFAULT 0 | |
588 <% ); | |
589 case 95: | |
590 up.execStep( %> | |
591 delete from tag where label='group:Administrators' and node_id is null and user_id = (select user_id from user_ where email = 'pedro@nabble.com') | |
592 <% ); | |
593 | |
594 case 96: | |
595 execCatching( %> | |
596 alter table tweak ADD PRIMARY KEY (tweak_name) | |
597 <%, "multiple primary keys for table" ); | |
598 case 97: | |
599 execCatching( %> | |
600 alter table mailing_list ADD PRIMARY KEY (node_id) | |
601 <%, "multiple primary keys for table" ); | |
602 case 98: | |
603 /* | |
604 execCatching( %> | |
605 alter table mailing_list ADD CONSTRAINT mailing_list_node_id_fkey FOREIGN KEY (node_id) REFERENCES node (node_id) ON DELETE CASCADE | |
606 <%, "already exists" ); | |
607 */ | |
608 up.execStep( null ); | |
609 case 99: | |
610 execCatching( %> | |
611 CREATE INDEX forum_ml_idx ON mailing_list (lower(list_address)) | |
612 <%, "already exists" ); | |
613 case 100: | |
614 execCatching( %> | |
615 alter table node ADD PRIMARY KEY (node_id) | |
616 <%, "multiple primary keys for table" ); | |
617 case 101: | |
618 execCatching( %> | |
619 alter table configuration ADD PRIMARY KEY (name) | |
620 <%, "multiple primary keys for table" ); | |
621 case 102: | |
622 execCatching( %> | |
623 alter table file_avatar ADD PRIMARY KEY (user_id, name) | |
624 <%, "multiple primary keys for table" ); | |
625 case 103: | |
626 execCatching( %> | |
627 alter table file_node ADD PRIMARY KEY (node_id, name) | |
628 <%, "multiple primary keys for table" ); | |
629 case 104: | |
630 execCatching( %> | |
631 alter table file_site ADD PRIMARY KEY (name) | |
632 <%, "multiple primary keys for table" ); | |
633 case 105: | |
634 execCatching( %> | |
635 alter table file_temp ADD PRIMARY KEY (user_id, name) | |
636 <%, "multiple primary keys for table" ); | |
637 case 106: | |
638 execCatching( %> | |
639 CREATE INDEX file_temp_date_idx ON file_temp (date_) | |
640 <%, "already exists" ); | |
641 case 107: | |
642 execCatching( %> | |
643 alter table module ADD PRIMARY KEY (module_name) | |
644 <%, "multiple primary keys for table" ); | |
645 case 108: | |
646 execCatching( %> | |
647 CREATE INDEX node_cookie_idx ON node (cookie) WHERE cookie IS NOT NULL | |
648 <%, "already exists" ); | |
649 case 109: | |
650 execCatching( %> | |
651 CREATE INDEX node_export ON node (export_permalink) WHERE export_permalink IS NOT NULL | |
652 <%, "already exists" ); | |
653 case 110: | |
654 execCatching( %> | |
655 CREATE INDEX node_message_id_idx ON node (lower(message_id)) WHERE message_id IS NOT NULL | |
656 <%, "already exists" ); | |
657 case 111: | |
658 execCatching( %> | |
659 CREATE INDEX node_ml2_idx ON node (lower(parent_message_id)) WHERE lower(parent_message_id) IS NOT NULL | |
660 <%, "already exists" ); | |
661 case 112: | |
662 execCatching( %> | |
663 CREATE INDEX node_owner_idx ON node (owner_id, when_created) | |
664 <%, "already exists" ); | |
665 case 113: | |
666 execCatching( %> | |
667 CREATE UNIQUE INDEX node_parent2_idx ON node (parent_id, when_created, node_id) | |
668 <%, "already exists" ); | |
669 case 114: | |
670 execCatching( %> | |
671 CREATE UNIQUE INDEX node_parent_idx ON node (parent_id, last_node_date, node_id) | |
672 <%, "already exists" ); | |
673 case 115: | |
674 execCatching( %> | |
675 CREATE INDEX node_sent_idx ON node (when_sent) WHERE when_sent IS NOT NULL | |
676 <%, "already exists" ); | |
677 case 116: | |
678 execCatching( %> | |
679 CREATE UNIQUE INDEX pinned_node_idx ON node (parent_id, pin) WHERE pin IS NOT NULL | |
680 <%, "already exists" ); | |
681 case 117: | |
682 execCatching( %> | |
683 CREATE INDEX post_date ON node (when_created) | |
684 <%, "already exists" ); | |
685 case 118: | |
686 execCatching( %> | |
687 alter table node_msg ADD PRIMARY KEY (node_id) | |
688 <%, "multiple primary keys for table" ); | |
689 case 119: | |
690 execCatching( %> | |
691 alter table node_property ADD PRIMARY KEY (node_id, key) | |
692 <%, "multiple primary keys for table" ); | |
693 case 120: | |
694 execCatching( %> | |
695 alter table paid ADD PRIMARY KEY (user_id) | |
696 <%, "multiple primary keys for table" ); | |
697 case 121: | |
698 execCatching( %> | |
699 alter table registration ADD PRIMARY KEY (key_) | |
700 <%, "multiple primary keys for table" ); | |
701 case 122: | |
702 execCatching( %> | |
703 CREATE INDEX registration_date_idx ON registration (date_) | |
704 <%, "already exists" ); | |
705 case 123: | |
706 execCatching( %> | |
707 alter table site ADD PRIMARY KEY (one) | |
708 <%, "multiple primary keys for table" ); | |
709 case 124: | |
710 execCatching( %> | |
711 alter table site_property ADD PRIMARY KEY (key) | |
712 <%, "multiple primary keys for table" ); | |
713 case 125: | |
714 execCatching( %> | |
715 alter table subscription ADD PRIMARY KEY (user_id, node_id) | |
716 <%, "multiple primary keys for table" ); | |
717 case 126: | |
718 execCatching( %> | |
719 CREATE INDEX subscription_node_idx ON subscription (node_id) | |
720 <%, "already exists" ); | |
721 case 127: | |
722 execCatching( %> | |
723 CREATE UNIQUE INDEX tag_idx ON tag (node_id, user_id, label) | |
724 <%, "already exists" ); | |
725 case 128: | |
726 execCatching( %> | |
727 CREATE INDEX tag_user_idx ON tag (user_id) | |
728 <%, "already exists" ); | |
729 case 129: | |
730 execCatching( %> | |
731 alter table user_ ADD PRIMARY KEY (user_id) | |
732 <%, "multiple primary keys for table" ); | |
733 case 130: | |
734 execCatching( %> | |
735 CREATE UNIQUE INDEX user_email_idx ON user_ (lower(email)) | |
736 <%, "already exists" ); | |
737 case 131: | |
738 execCatching( %> | |
739 CREATE UNIQUE INDEX user_name_idx ON user_ (lower(name)) | |
740 <%, "already exists" ); | |
741 case 132: | |
742 execCatching( %> | |
743 alter table user_property ADD PRIMARY KEY (user_id, key) | |
744 <%, "multiple primary keys for table" ); | |
745 case 133: | |
746 execCatching( %> | |
747 alter table view_count ADD PRIMARY KEY (node_id) | |
748 <%, "multiple primary keys for table" ); | |
749 case 134: | |
750 execCatching( %> | |
751 alter table visited ADD PRIMARY KEY (user_id, node_id) | |
752 <%, "multiple primary keys for table" ); | |
753 case 135: | |
754 execCatching( %> | |
755 CREATE INDEX visited_last_node_idx ON visited (last_node_id) | |
756 <%, "already exists" ); | |
757 case 136: | |
758 execCatching( %> | |
759 CREATE INDEX visited_node_idx ON visited (node_id) | |
760 <%, "already exists" ); | |
761 | |
762 case 137: | |
763 execCatching( %> | |
764 ALTER TABLE ONLY file_avatar | |
765 ADD CONSTRAINT file_avatar_user_id_fkey FOREIGN KEY (user_id) REFERENCES user_(user_id) ON DELETE CASCADE | |
766 <%, "already exists" ); | |
767 case 138: | |
768 up.execStep( null ); | |
769 case 139: | |
770 execCatching( %> | |
771 ALTER TABLE ONLY file_temp | |
772 ADD CONSTRAINT file_temp_user_id_fkey FOREIGN KEY (user_id) REFERENCES user_(user_id) ON DELETE CASCADE | |
773 <%, "already exists" ); | |
774 case 140: | |
775 execCatching( %> | |
776 ALTER TABLE ONLY mailing_list | |
777 ADD CONSTRAINT mailing_list_node_id_fkey FOREIGN KEY (node_id) REFERENCES node(node_id) ON DELETE CASCADE | |
778 <%, "already exists" ); | |
779 case 141: | |
780 up.execStep( null ); | |
781 case 142: | |
782 execCatching( %> | |
783 ALTER TABLE ONLY node | |
784 ADD CONSTRAINT node_new_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES user_(user_id) | |
785 <%, "already exists" ); | |
786 case 143: | |
787 execCatching( %> | |
788 ALTER TABLE ONLY node | |
789 ADD CONSTRAINT node_node_id_fkey FOREIGN KEY (node_id) REFERENCES node_msg(node_id) DEFERRABLE INITIALLY DEFERRED | |
790 <%, "already exists" ); | |
791 case 144: | |
792 up.execStep( null ); | |
793 case 145: | |
794 up.execStep( null ); | |
795 case 146: | |
796 execCatching( %> | |
797 ALTER TABLE ONLY paid | |
798 ADD CONSTRAINT paid_user_id_fkey FOREIGN KEY (user_id) REFERENCES user_(user_id) ON DELETE CASCADE | |
799 <%, "already exists" ); | |
800 case 147: | |
801 execCatching( %> | |
802 ALTER TABLE ONLY site | |
803 ADD CONSTRAINT site_root_node_id_fkey FOREIGN KEY (root_node_id) REFERENCES node(node_id) DEFERRABLE INITIALLY DEFERRED | |
804 <%, "already exists" ); | |
805 case 148: | |
806 up.execStep( null ); | |
807 case 149: | |
808 execCatching( %> | |
809 ALTER TABLE ONLY subscription | |
810 ADD CONSTRAINT subscription_user_id_fkey FOREIGN KEY (user_id) REFERENCES user_(user_id) ON DELETE CASCADE | |
811 <%, "already exists" ); | |
812 case 150: | |
813 up.execStep( null ); | |
814 case 151: | |
815 execCatching( %> | |
816 ALTER TABLE ONLY tag | |
817 ADD CONSTRAINT tag_user_id_fkey FOREIGN KEY (user_id) REFERENCES user_(user_id) ON DELETE CASCADE | |
818 <%, "already exists" ); | |
819 case 152: | |
820 execCatching( %> | |
821 ALTER TABLE ONLY user_property | |
822 ADD CONSTRAINT user_property_user_id_fkey FOREIGN KEY (user_id) REFERENCES user_(user_id) ON DELETE CASCADE | |
823 <%, "already exists" ); | |
824 case 153: | |
825 up.execStep( null ); | |
826 case 154: | |
827 up.execStep( null ); | |
828 case 155: | |
829 up.execStep( null ); | |
830 case 156: | |
831 execCatching( %> | |
832 ALTER TABLE ONLY visited | |
833 ADD CONSTRAINT visited_user_id_fkey FOREIGN KEY (user_id) REFERENCES user_(user_id) ON DELETE CASCADE | |
834 <%, "already exists" ); | |
835 case 157: | |
836 up.execStep( null ); | |
837 | |
838 // problematic constraints | |
839 case 158: | |
840 execCatching( %> | |
841 ALTER TABLE ONLY file_node | |
842 ADD CONSTRAINT file_node_node_id_fkey FOREIGN KEY (node_id) REFERENCES node(node_id) ON DELETE CASCADE | |
843 <%, "already exists" ); | |
844 case 159: | |
845 execCatching( %> | |
846 ALTER TABLE ONLY node_msg | |
847 ADD CONSTRAINT node_msg_node_id_fkey FOREIGN KEY (node_id) REFERENCES node(node_id) ON DELETE CASCADE | |
848 <%, "already exists" ); | |
849 case 160: | |
850 execCatching( %> | |
851 ALTER TABLE ONLY node | |
852 ADD CONSTRAINT node_parent_id_fkey FOREIGN KEY (parent_id) REFERENCES node(node_id) ON DELETE CASCADE | |
853 <%, "already exists" ); | |
854 case 161: | |
855 execCatching( %> | |
856 ALTER TABLE ONLY node_property | |
857 ADD CONSTRAINT node_property_node_id_fkey FOREIGN KEY (node_id) REFERENCES node(node_id) ON DELETE CASCADE | |
858 <%, "already exists" ); | |
859 case 162: | |
860 execCatching( %> | |
861 ALTER TABLE ONLY subscription | |
862 ADD CONSTRAINT subscription_node_id_fkey FOREIGN KEY (node_id) REFERENCES node(node_id) ON DELETE CASCADE | |
863 <%, "already exists" ); | |
864 case 163: | |
865 execCatching( %> | |
866 ALTER TABLE ONLY tag | |
867 ADD CONSTRAINT tag_node_id_fkey FOREIGN KEY (node_id) REFERENCES node(node_id) ON DELETE CASCADE | |
868 <%, "already exists" ); | |
869 case 164: | |
870 execCatching( %> | |
871 ALTER TABLE ONLY view_count | |
872 ADD CONSTRAINT view_count_node_id_fkey FOREIGN KEY (node_id) REFERENCES node(node_id) ON DELETE CASCADE | |
873 <%, "already exists" ); | |
874 case 165: | |
875 execCatching( %> | |
876 ALTER TABLE ONLY visited | |
877 ADD CONSTRAINT visited_last_node_id_fkey FOREIGN KEY (last_node_id) REFERENCES node(node_id) ON DELETE CASCADE | |
878 <%, "already exists" ); | |
879 case 166: | |
880 execCatching( %> | |
881 ALTER TABLE ONLY visited | |
882 ADD CONSTRAINT visited_node_id_fkey FOREIGN KEY (node_id) REFERENCES node(node_id) ON DELETE CASCADE | |
883 <%, "already exists" ); | |
884 } | |
885 } | |
886 } | |
887 %> |