From 2c489e56c99bf6ace637e8eb22979e8c715e77c9 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Tue, 8 Dec 2015 17:58:18 +0100 Subject: [PATCH] Initial implementation of DB upgrader --- Zutil.jar | Bin 1178345 -> 1179892 bytes src/zutil/db/DBUpgradeHandler.java | 89 +++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100755 src/zutil/db/DBUpgradeHandler.java diff --git a/Zutil.jar b/Zutil.jar index 918aec7295a29473645faae0668a27cc7c125823..80d2ba28a2c73ec3dad603ee514318a115816ae8 100755 GIT binary patch delta 7748 zcmaJ_2{@Ho_s@GG!#VFcTZTh8ga)%Fr4r4BQc_AOZko&0bQ_UMDW!Np<_2zE5M*pL zeV|LppQfxdW2xgIP9iN-D9z|TC03J4Yz)h?jG}qU9o?YC z+1w?5%dP%c;^b)Ba1r0eh=TRvz?6lDdAoY(ZSyw`Jk52FQt4qv41^gf?0 zR!$rdQk<}$wy8n3;8$>brsad|sc+?H@5{<%&$_(7Y8NFP{z`R4L(PgWPrk%%Y#f?D z?9Q*RU2}Q`3ZELDsA^UXvf4iSi?L3QaIykhqh2zq{MgT;Q$^nc#s$x-ve|Y^VP>w! zu$rkKCUmN@wT!uP=Gm3iE1%97T(iyS;9AW=KE-Ej1g{Fu%N|}|@6>N+NdCv?p)xx` zTKci02}e)m%-7b|x*Zu}@G~@^O6nb8vEH*XIWI5Gs-aNheDv+N^NKBAxCAL)`n+C! zU%c#ac;Sw%AqQ3@`)=wL|HnQpmu+zYXXXs*Y9jJy8sj~l?$Z49qUwZ~;);2G3u`R= zcC9@Wli+<@r!{%fxq{06>*7Y8NuD!tXx;IbTO;?{-RZXVvgOYu)`uocwYSyrcv^hN z+-;hfp`xWvy1CIsUnBp0jowkYMW=4bgWlEM9yRpp!M^Zhjz;OS;(?zR z;_8&3lsHV^YGd+T-QCUi&o5lMDrxW7byW%bbxw|Son>okw5jUtl!qzj@)xEY_0=rT z^bWst%fpH7Z=qkC^{_xXF>HsQ{j+SHbp2`d_O(4-t5)7lxY){3%-Nutyv6Guoly14ZVw6g6w-X!Wn@koH!Rr`wGvm!?OYQL$|W$QdNcZX_LPYoE8Z`Nog zEiPzTW6{k_>O60OS={*0qWOdBGffj+Ooy*%c>a1#P|=a3lRxH`e&4_8XQuH5&#)

;oi}0a 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 delta 6416 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 diff --git a/src/zutil/db/DBUpgradeHandler.java b/src/zutil/db/DBUpgradeHandler.java new file mode 100755 index 0000000..fad6997 --- /dev/null +++ b/src/zutil/db/DBUpgradeHandler.java @@ -0,0 +1,89 @@ +package zutil.db; + +import zutil.db.handler.ListSQLResult; +import zutil.log.LogUtil; + +import java.sql.SQLException; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * This class will take a reference DB and alter + * the source DB to have the same structure. + * NOTE: only works with sqllite + * + * Created by Ziver + */ +public class DBUpgradeHandler { + private static final Logger logger = LogUtil.getLogger(); + + private DBConnection reference; + private DBConnection target; + + + public DBUpgradeHandler(DBConnection reference){ + this.reference = reference; + } + + public void setTargetDB(DBConnection db){ + this.target = db; + } + + public void upgrade() throws SQLException { + /* + - beginTransaction + - run a table creation with if not exists (we are doing an upgrade, so the table might not exists yet, it will fail alter and drop) + - put in a list the existing columns List columns = DBUtils.GetColumns(db, TableName); + - backup table (ALTER table " + TableName + " RENAME TO 'temp_" + TableName) + - create new table (the newest table creation schema) + - get the intersection with the new columns, this time columns taken from the upgraded table (columns.retainAll(DBUtils.GetColumns(db, TableName));) + - restore data (String cols = StringUtils.join(columns, ","); + db.execSQL(String.format( + "INSERT INTO %s (%s) SELECT %s from temp_%s", + TableName, cols, cols, TableName)); + ) + - remove backup table (DROP table 'temp_" + TableName) + - setTransactionSuccessful + */ + try { + target.exec("BEGIN IMMEDIATE TRANSACTION"); + + upgradeCreateTabels(); + upgradeAlterTables(); + upgradeDeleteTables(); + + target.exec("COMMIT TRANSACTION"); + } catch(SQLException e){ + try { + target.exec("ROLLBACK TRANSACTION"); + } catch (SQLException secondary_e) { + logger.log(Level.SEVERE, null, secondary_e); + } + throw e; + } + } + + + + private void upgradeCreateTabels() throws SQLException { + List refTables = reference.exec("SELECT name FROM sqlite_master WHERE type='table';", new ListSQLResult()); + List targetTables = reference.exec("SELECT name FROM sqlite_master WHERE type='table';", new ListSQLResult()); + + for(String table : refTables){ + if(!targetTables.contains(table)){ + logger.fine("Creating new table: "+ table); + + } + } + } + + private void upgradeAlterTables() throws SQLException { + logger.fine("Altering table: "); + //RAGMA table_info([tablename]); + } + + private void upgradeDeleteTables() throws SQLException { + logger.fine("Deleting table: "); + } +}