diff --git a/core/bootstrap/src/main/config/data/UssdManagement_ussdproperties.xml b/core/bootstrap/src/main/config/data/UssdManagement_ussdproperties.xml index fe0c2f17..2443913d 100644 --- a/core/bootstrap/src/main/config/data/UssdManagement_ussdproperties.xml +++ b/core/bootstrap/src/main/config/data/UssdManagement_ussdproperties.xml @@ -8,4 +8,9 @@ - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/core/domain/src/main/java/org/mobicents/ussdgateway/UssdPropertiesManagement.java b/core/domain/src/main/java/org/mobicents/ussdgateway/UssdPropertiesManagement.java index cc050eb3..c77f0c08 100644 --- a/core/domain/src/main/java/org/mobicents/ussdgateway/UssdPropertiesManagement.java +++ b/core/domain/src/main/java/org/mobicents/ussdgateway/UssdPropertiesManagement.java @@ -61,6 +61,11 @@ public class UssdPropertiesManagement implements UssdPropertiesManagementMBean { protected static final String HR_HLR_GT = "hrhlrgt"; protected static final String CDR_LOGGING_TO = "cdrloggingto"; protected static final String MAX_ACTIVITY_COUNT = "maxactivitycount"; + protected static final String DB_BACKUP_PRE_UPGRADE = "dbbackuppreupgrade"; + protected static final String DB_BACKUP_DIRECTORY = "dbbackupdirectory"; + protected static final String DB_LOGIN = "dblogin"; + protected static final String DB_PASSWORD = "dbpassword"; + protected static final String DB_SCHEMA_NAME = "dbschemaname"; private static final String TAB_INDENT = "\t"; private static final String CLASS_ATTRIBUTE = "type"; @@ -102,6 +107,13 @@ public class UssdPropertiesManagement implements UssdPropertiesManagementMBean { // max count of TCAP Dialogs that are possible at the same time private int maxActivityCount = 5000; + //db upgrade, backup properties + private boolean dbBackupFlag = false; + private String dbBackupDir; + private String dbLogin; + private String dbPassword; + private String dbSchemaName; + private UssdPropertiesManagement(String name) { this.name = name; binding.setClassAttribute(CLASS_ATTRIBUTE); @@ -278,6 +290,46 @@ public void setCdrLoggingTo(CdrLoggedType cdrLoggingTo) { this.store(); } + public String getDbBackupDir() { + return this.dbBackupDir; + } + + public void setDbBackupDir(String dbBackupDir) { + this.dbBackupDir = dbBackupDir; + } + + public String getDbLogin() { + return this.dbLogin; + } + + public void setDbLogin(String dbLogin) { + this.dbLogin = dbLogin; + } + + public String getDbPassword() { + return this.dbPassword; + } + + public void setDbPassword(String dbPassword) { + this.dbPassword = dbPassword; + } + + public String getDbSchemaName() { + return this.dbSchemaName; + } + + public void setDbSchemaName(String dbSchemaName) { + this.dbSchemaName = dbSchemaName; + } + + public boolean isDbBackup() { + return dbBackupFlag; + } + + public void setDbBackupFlag(boolean dbBackupFlag) { + this.dbBackupFlag = dbBackupFlag; + } + @Override public int getMaxActivityCount() { return maxActivityCount; @@ -353,6 +405,12 @@ public void store() { writer.write(this.maxActivityCount, MAX_ACTIVITY_COUNT, Integer.class); + writer.write(this.dbBackupFlag, DB_BACKUP_PRE_UPGRADE, Boolean.class); + writer.write(this.dbBackupDir, DB_BACKUP_DIRECTORY, String.class); + writer.write(this.dbLogin, DB_LOGIN, String.class); + writer.write(this.dbPassword, DB_PASSWORD, String.class); + writer.write(this.dbSchemaName, DB_SCHEMA_NAME, String.class); + writer.write(this.ussdGwGt, USSD_GT, String.class); writer.write(this.ussdGwSsn, USSD_SSN, Integer.class); writer.write(this.hlrSsn, HLR_SSN, Integer.class); @@ -421,6 +479,27 @@ public void load() throws FileNotFoundException { if (val != null) this.maxActivityCount = val; + Boolean backupFlag = reader.read(DB_BACKUP_PRE_UPGRADE, Boolean.class); + if (backupFlag != null) { + this.dbBackupFlag = backupFlag; + } + vals = reader.read(DB_BACKUP_DIRECTORY, String.class); + if (vals != null) { + this.dbBackupDir = vals; + } + vals = reader.read(DB_LOGIN, String.class); + if (vals != null) { + this.dbLogin = vals; + } + vals = reader.read(DB_PASSWORD, String.class); + if (vals != null) { + this.dbPassword = vals; + } + vals = reader.read(DB_SCHEMA_NAME, String.class); + if (vals != null) { + this.dbSchemaName = vals; + } + this.ussdGwGt = reader.read(USSD_GT, String.class); this.ussdGwSsn = reader.read(USSD_SSN, Integer.class); this.hlrSsn = reader.read(HLR_SSN, Integer.class); diff --git a/core/slee/sbbs/src/main/java/org/mobicents/ussdgateway/slee/cdr/jdbc/task/CDRTableCreateTask.java b/core/slee/sbbs/src/main/java/org/mobicents/ussdgateway/slee/cdr/jdbc/task/CDRTableCreateTask.java index 48477d70..8818947c 100644 --- a/core/slee/sbbs/src/main/java/org/mobicents/ussdgateway/slee/cdr/jdbc/task/CDRTableCreateTask.java +++ b/core/slee/sbbs/src/main/java/org/mobicents/ussdgateway/slee/cdr/jdbc/task/CDRTableCreateTask.java @@ -19,11 +19,14 @@ package org.mobicents.ussdgateway.slee.cdr.jdbc.task; +import java.io.IOException; +import java.sql.SQLException; import java.sql.Statement; import javax.slee.facilities.Tracer; import org.mobicents.slee.resource.jdbc.task.JdbcTaskContext; +import org.mobicents.ussdgateway.UssdPropertiesManagement; import org.mobicents.ussdgateway.slee.cdr.CDRCreateException; import org.mobicents.ussdgateway.slee.cdr.ChargeInterfaceParent; @@ -33,6 +36,8 @@ */ public class CDRTableCreateTask extends CDRTaskBase { + protected static final UssdPropertiesManagement ussdPropertiesManagement = UssdPropertiesManagement.getInstance(); + private final boolean reset; /** @@ -88,19 +93,19 @@ public Object executeSimple(JdbcTaskContext ctx) { } statement.execute(Schema._QUERY_CREATE); }else{ - //TODO:how to manage multiple schema updates/schema versioning? - boolean res; - res = statement.execute(Schema._QUERY_CHECK_VERSION_0_0_1); - - if(!res){ - statement.execute(Schema._QUERY_ALTER_0_0_1); - } - //FIXME: better to put the updates into a table/list - res = statement.execute(Schema._QUERY_CHECK_VERSION_0_0_2); - - if(!res){ - statement.execute(Schema._QUERY_ALTER_0_0_2); + int src = 0; + int dest = 0; + checkUpgradePath(statement, src, dest); + String backupFilename = "preupgrade_" + Schema.upgrades[src] + "_to_" + Schema.upgrades[dest] + ".bak"; + String backupDir = ussdPropertiesManagement.getDbBackupDir(); + String dbLogin = ussdPropertiesManagement.getDbLogin(); + String dbPassword = ussdPropertiesManagement.getDbPassword(); + String dbName = ussdPropertiesManagement.getDbSchemaName(); + // check flag + if(ussdPropertiesManagement.isDbBackup()) { + backupDatabase(backupDir + "/" + backupFilename, dbLogin, dbPassword, dbName); } + upgradeDatabase(statement, src, dest); } } catch (Exception e) { super.tracer.severe("Failed at execute!", e); @@ -109,4 +114,38 @@ public Object executeSimple(JdbcTaskContext ctx) { return this; } + private void upgradeDatabase(Statement statement, int src, int dest) + throws SQLException { + for (int i = src; i < dest; ++i) { + // FIXME: do savepoint + // FIXME: actually check and handle failure + statement.execute(Schema.upgradeModifications[i]); + } + } + + private void checkUpgradePath(Statement statement, int src, int dest) + throws SQLException { + for (int i = 0; i < Schema.upgradeChecks.length; ++i) { + // if check failed, means that the current db version is older than + // the current modification + // if check was successful, the db is already at the current loop + // iteration version + if (!statement.execute(Schema.upgradeChecks[i])) { + src = i; + break; + } + } + // TODO: will we ever want to do partial upgrade? + dest = Schema.upgradeChecks.length; + } + + // TODO: ideally we should split up the backup to schema and data + // TODO: currently this is mysql specific, we should create spi and have + // various implementations, mysql, hsqldb, etc + private void backupDatabase(String backupPath, String dbLogin, + String dbPassword, String dbName) throws IOException { + Runtime.getRuntime().exec( + "mysqldump -u " + dbLogin + " -p" + dbPassword + " " + dbName + + " > " + backupPath); + } } diff --git a/core/slee/sbbs/src/main/java/org/mobicents/ussdgateway/slee/cdr/jdbc/task/Schema.java b/core/slee/sbbs/src/main/java/org/mobicents/ussdgateway/slee/cdr/jdbc/task/Schema.java index 20284f32..4bdd5299 100644 --- a/core/slee/sbbs/src/main/java/org/mobicents/ussdgateway/slee/cdr/jdbc/task/Schema.java +++ b/core/slee/sbbs/src/main/java/org/mobicents/ussdgateway/slee/cdr/jdbc/task/Schema.java @@ -172,6 +172,20 @@ private Schema() { public static final String _QUERY_ALTER_0_0_2 = "ALTER TABLE "+_TABLE_NAME + " ADD COLUMN "+_COLUMN_USSD_STRING + " " + _TYPE_COLUMN_USSD_STRING; + //FIXME: we should populate this externally + public static final String[] upgrades = new String[] { + "0_0_1", + "0_0_2" + }; + public static final String[] upgradeChecks = new String[] { + _QUERY_CHECK_VERSION_0_0_1, + _QUERY_CHECK_VERSION_0_0_2 + }; + public static final String[] upgradeModifications = new String[] { + _QUERY_ALTER_0_0_1, + _QUERY_ALTER_0_0_2 + }; + public static final String _QUERY_INSERT ="INSERT INTO "+_TABLE_NAME +" ( " + _COLUMN_L_SPC+","+