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+","+