Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,9 @@
<ussdssn value="8"/>
<hlrssn value="6"/>
<mscssn value="8"/>
<maxmapv value="3"/>
<maxmapv value="3"/>
<dbbackuppreupgrade value="false"/>
<dbbackupdirectory value="/backup"/>
<dblogin value="root"/>
<dbpassword value="root"/>
<dbschemaname value="ussd"/>
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -33,6 +36,8 @@
*/
public class CDRTableCreateTask extends CDRTaskBase {

protected static final UssdPropertiesManagement ussdPropertiesManagement = UssdPropertiesManagement.getInstance();

private final boolean reset;

/**
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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+","+
Expand Down