Mercurial Hosting > nabble
diff src/nabble/model/DbGlobalUpdater.jmp @ 0:7ecd1a4ef557
add content
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 21 Mar 2019 19:15:52 -0600 |
parents | |
children | 442ace8fd8ed |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/nabble/model/DbGlobalUpdater.jmp Thu Mar 21 19:15:52 2019 -0600 @@ -0,0 +1,165 @@ +<% +package nabble.model; + +import fschmidt.db.DbDatabase; +import jdbcpgbackup.ZipBackup; +import nabble.utils.Log4j; + +import java.io.File; +import java.sql.SQLException; +import java.util.Collections; + + +public final class DbGlobalUpdater { + + private static final int version = 15; + + private static final boolean skipSlowSteps = Init.get("skipSlowSteps",false); + private static final File globalSchemaFile = new File("src/nabble/data/global.schema"); + + private static final String GLOBAL = "global"; + + private final DbUpdater up; + + private DbGlobalUpdater(DbDatabase dbGlobal) { + this.up = new DbUpdater(dbGlobal,GLOBAL); + } + + private void go() throws SQLException { + try { + update(); + if( up.databaseVersion() != version ) + throw new RuntimeException(); + } finally { + up.close(); + } + } + + public static boolean isValid() { + ZipBackup backup = new ZipBackup( globalSchemaFile, Db.completeUrl ); + return backup.compareTo(GLOBAL); + } + + public static void backupSchema(String filename) { + ZipBackup backup = new ZipBackup( new File(filename), Db.completeUrl ); + backup.dump( Collections.singleton(GLOBAL), SiteImpl.SCHEMA_DATA ); + } +// in beanshell, I do: +// DbGlobalUpdater.backupSchema("/Users/Franklin/hg/nabble/src/nabble/data/global.schema") + + public static void updateGlobal() throws SQLException { + DbDatabase dbGlobal; + try { + dbGlobal = Db.dbGlobal(); + } catch(Db.NoSchema e) { + if( !e.getMessage().equals(GLOBAL) ) + throw e; + DbDatabase db = Db.dbPostgres(); + db.beginTransaction(); + try { + DbSiteCreator.restoreSchema( globalSchemaFile, GLOBAL ); + db.commitTransaction(); + } finally { + db.endTransaction(); + } + dbGlobal = Db.dbGlobal(); + } + new DbGlobalUpdater(dbGlobal).go(); + } + + public static void main(String[] args) throws Exception { + Log4j.initForConsole(); + updateGlobal(); + } + + void execStepAsPostgres(String sql) + throws SQLException + { + up.begin(); + up.exec( %> + set role <%=Db.user%> + <% ); + up.exec(sql); + up.exec( %> + set role global + <% ); + up.commit(); + } + + void update() throws SQLException { + switch( up.dbVersion() ) { + case 0: + up.execStep( %> + insert into site_global (site_id) + select site_id from site + where not exists (select * from site_global where site_global.site_id=site.site_id) + <% ); + case 1: // again + up.execStep( %> + insert into site_global (site_id) + select site_id from site + where not exists (select * from site_global where site_global.site_id=site.site_id) + <% ); + case 2: + up.execStep( %> + alter table mailing_list_lookup + drop constraint mailing_list_lookup_site_id_fkey + <% ); + case 3: + up.execStep( %> + alter table mailing_list_lookup + ADD FOREIGN KEY (site_id) REFERENCES site_global(site_id) ON DELETE CASCADE + <% ); + case 4: + up.execStep( %> + alter table task + drop constraint task_site_id_fkey + <% ); + case 5: + up.execStep( %> + alter table task + ADD FOREIGN KEY (site_id) REFERENCES site_global(site_id) ON DELETE CASCADE + <% ); + case 6: + up.execStep(null); + case 7: + up.execStep(null); + case 8: + execStepAsPostgres( %> + alter schema public rename to pulic_old + <% ); + case 9: + up.execStep( %> + alter table global.site_global + add column remote_addr character varying; + <% ); + case 10: + up.execStep( %> + create table safety ( + url character varying primary key, + is_safe boolean not null, + content text not null + ) + <% ); + case 11: + up.execStep( %> + alter table site_global drop column owner_email + <% ); + case 12: + up.execStep( %> + delete from safety + <% ); + case 13: + up.execStep( %> + alter table site_global + add column user_views integer NOT NULL DEFAULT 0 + <% ); + case 14: + up.execStep( %> + drop table safety + <% ); + } + } + +} +%>