used cached resultset for reporting in places (wip)

This commit is contained in:
John Woodlock
2012-08-29 17:29:17 +10:00
parent 4e78e7e401
commit 64f55de032
4 changed files with 37 additions and 44 deletions
@@ -3,13 +3,13 @@ package org.mifosng.platform.noncore;
import java.sql.Connection; import java.sql.Connection;
import java.sql.Statement; import java.sql.Statement;
import org.mifosng.platform.api.data.GenericResultsetData; import javax.sql.rowset.CachedRowSet;
import com.sun.rowset.CachedRowSetImpl; import org.mifosng.platform.api.data.GenericResultsetData;
public interface GenericDataService { public interface GenericDataService {
public CachedRowSetImpl getCachedResultSet(String sql, String errorMsg); public CachedRowSet getCachedResultSet(String sql, String errorMsg);
GenericResultsetData fillGenericResultSet(final String sql); GenericResultsetData fillGenericResultSet(final String sql);
@@ -9,6 +9,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.sql.DataSource; import javax.sql.DataSource;
import javax.sql.rowset.CachedRowSet;
import org.mifosng.platform.api.data.GenericResultsetData; import org.mifosng.platform.api.data.GenericResultsetData;
import org.mifosng.platform.api.data.ResultsetColumnHeader; import org.mifosng.platform.api.data.ResultsetColumnHeader;
@@ -37,7 +38,7 @@ public class GenericDataServiceImpl implements GenericDataService {
} }
@Override @Override
public CachedRowSetImpl getCachedResultSet(String sql, String sqlErrorMsg) { public CachedRowSet getCachedResultSet(String sql, String sqlErrorMsg) {
Connection db_connection = null; Connection db_connection = null;
Statement db_statement = null; Statement db_statement = null;
@@ -46,8 +47,9 @@ public class GenericDataServiceImpl implements GenericDataService {
db_statement = db_connection.createStatement(); db_statement = db_connection.createStatement();
ResultSet rs = db_statement.executeQuery(sql); ResultSet rs = db_statement.executeQuery(sql);
CachedRowSetImpl crs = new CachedRowSetImpl(); CachedRowSet crs = new CachedRowSetImpl();
crs.populate(rs); crs.populate(rs);
//logger.info("RS Size: " + crs.size() + " getCachedResultSet sql: " + sql);
return crs; return crs;
} catch (SQLException e) { } catch (SQLException e) {
throw new PlatformDataIntegrityException("error.msg.sql.error", throw new PlatformDataIntegrityException("error.msg.sql.error",
@@ -62,15 +64,13 @@ public class GenericDataServiceImpl implements GenericDataService {
@Override @Override
public GenericResultsetData fillGenericResultSet(final String sql) { public GenericResultsetData fillGenericResultSet(final String sql) {
Connection db_connection = null; String sqlErrorMsg = "Sql: " + sql;
Statement db_statement = null; CachedRowSet rs = getCachedResultSet(sql, sqlErrorMsg);
try {
db_connection = dataSource.getConnection();
db_statement = db_connection.createStatement();
ResultSet rs = db_statement.executeQuery(sql);
List<ResultsetColumnHeader> columnHeaders = new ArrayList<ResultsetColumnHeader>(); List<ResultsetColumnHeader> columnHeaders = new ArrayList<ResultsetColumnHeader>();
List<ResultsetDataRow> resultsetDataRows = new ArrayList<ResultsetDataRow>(); List<ResultsetDataRow> resultsetDataRows = new ArrayList<ResultsetDataRow>();
try {
ResultSetMetaData rsmd = rs.getMetaData(); ResultSetMetaData rsmd = rs.getMetaData();
String columnName = null; String columnName = null;
@@ -98,9 +98,7 @@ public class GenericDataServiceImpl implements GenericDataService {
return new GenericResultsetData(columnHeaders, resultsetDataRows); return new GenericResultsetData(columnHeaders, resultsetDataRows);
} catch (SQLException e) { } catch (SQLException e) {
throw new PlatformDataIntegrityException("error.msg.sql.error", throw new PlatformDataIntegrityException("error.msg.sql.error",
e.getMessage(), "Sql: " + sql); e.getMessage(), sqlErrorMsg);
} finally {
dbClose(db_statement, db_connection);
} }
} }
@@ -15,6 +15,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.sql.DataSource; import javax.sql.DataSource;
import javax.sql.rowset.CachedRowSet;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput; import javax.ws.rs.core.StreamingOutput;
@@ -46,8 +47,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
public class ReadReportingServiceImpl implements public class ReadReportingServiceImpl implements ReadReportingService {
ReadReportingService {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
@@ -58,8 +58,7 @@ public class ReadReportingServiceImpl implements
private Boolean noPentaho = false; private Boolean noPentaho = false;
@Autowired @Autowired
public ReadReportingServiceImpl( public ReadReportingServiceImpl(final PlatformSecurityContext context,
final PlatformSecurityContext context,
final TenantAwareRoutingDataSource dataSource) { final TenantAwareRoutingDataSource dataSource) {
// kick off pentaho reports server // kick off pentaho reports server
ClassicEngineBoot.getInstance().start(); ClassicEngineBoot.getInstance().start();
@@ -231,41 +230,38 @@ public class ReadReportingServiceImpl implements
} }
private String getReportSql(String reportName) { private String getReportSql(String reportName) {
String sql = "select report_sql as the_sql from stretchy_report where report_name = '" // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7046875 - prevent
+ reportName + "'"; // Invalid Column Name bug in sun's CachedRowSetImpl where it doesn't
// pick up on label names, only column names
String sql = "select * from (select report_sql as the_sql from stretchy_report where report_name = '"
+ reportName + "') x";
return getSql(sql); return getSql(sql);
} }
private String getParameterSql(String parameterName) { private String getParameterSql(String parameterName) {
String sql = "select parameter_sql as the_sql from stretchy_parameter where parameter_name = '" String sql = "select * from (select parameter_sql as the_sql from stretchy_parameter where parameter_name = '"
+ parameterName + "'"; + parameterName + "') x";
return getSql(sql); return getSql(sql);
} }
private String getSql(String inputSql) { private String getSql(String inputSql) {
String sql = null; String sqlErrorMsg = "Sql: " + inputSql;
Connection db_connection = null; CachedRowSet rs = genericDataService.getCachedResultSet(inputSql,
Statement db_statement = null; sqlErrorMsg);
try {
db_connection = dataSource.getConnection();
db_statement = db_connection.createStatement();
ResultSet rs = db_statement.executeQuery(inputSql);
try {
if (rs.next()) { if (rs.next()) {
sql = rs.getString("the_sql"); return rs.getString("the_sql");
} else {
throw new ReportNotFoundException(inputSql);
} }
throw new ReportNotFoundException(inputSql);
} catch (SQLException e) { } catch (SQLException e) {
logger.info("msg: " + e.getMessage() + " sql: " + inputSql);
throw new PlatformDataIntegrityException("error.msg.sql.error", throw new PlatformDataIntegrityException("error.msg.sql.error",
e.getMessage(), "Input Sql: " + inputSql); e.getMessage(), sqlErrorMsg);
} finally {
genericDataService.dbClose(db_statement, db_connection);
} }
return sql;
} }
@Override @Override
@@ -10,6 +10,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.sql.DataSource; import javax.sql.DataSource;
import javax.sql.rowset.CachedRowSet;
import org.mifosng.platform.api.data.AdditionalFieldsSetData; import org.mifosng.platform.api.data.AdditionalFieldsSetData;
import org.mifosng.platform.api.data.GenericResultsetData; import org.mifosng.platform.api.data.GenericResultsetData;
@@ -25,8 +26,6 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.sun.rowset.CachedRowSetImpl;
@Service @Service
public class ReadWriteNonCoreDataServiceImpl implements public class ReadWriteNonCoreDataServiceImpl implements
ReadWriteNonCoreDataService { ReadWriteNonCoreDataService {
@@ -120,7 +119,7 @@ public class ReadWriteNonCoreDataServiceImpl implements
String sqlErrorMsg = "Additional Fields Type: " + type + " Set: " String sqlErrorMsg = "Additional Fields Type: " + type + " Set: "
+ set + " Id: " + id; + set + " Id: " + id;
CachedRowSetImpl rsmd = genericDataService.getCachedResultSet(sql, CachedRowSet rsmd = genericDataService.getCachedResultSet(sql,
sqlErrorMsg); sqlErrorMsg);
List<ResultsetColumnHeader> columnHeaders = getResultsetColumnHeaders( List<ResultsetColumnHeader> columnHeaders = getResultsetColumnHeaders(
@@ -157,7 +156,7 @@ public class ReadWriteNonCoreDataServiceImpl implements
} }
private List<ResultsetColumnHeader> getResultsetColumnHeaders( private List<ResultsetColumnHeader> getResultsetColumnHeaders(
CachedRowSetImpl rsmd, String sqlErrorMsg, String type, String set) { CachedRowSet rsmd, String sqlErrorMsg, String type, String set) {
List<ResultsetColumnHeader> columnHeaders = null; List<ResultsetColumnHeader> columnHeaders = null;
@@ -183,7 +182,7 @@ public class ReadWriteNonCoreDataServiceImpl implements
// rsch.getColumnName()); // rsch.getColumnName());
String sql = "select v.`name` from stretchydata_allowed_value v where allowed_list_id = " String sql = "select v.`name` from stretchydata_allowed_value v where allowed_list_id = "
+ allowedListId + " order by id"; + allowedListId + " order by id";
CachedRowSetImpl rsValues = genericDataService CachedRowSet rsValues = genericDataService
.getCachedResultSet(sql, sqlErrorMsg); .getCachedResultSet(sql, sqlErrorMsg);
while (rsValues.next()) { while (rsValues.next()) {
rsch.getColumnValues().add( rsch.getColumnValues().add(
@@ -209,7 +208,7 @@ public class ReadWriteNonCoreDataServiceImpl implements
String sqlErrorMsg, String type, Long id) { String sqlErrorMsg, String type, Long id) {
List<ResultsetDataRow> resultsetDataRows = null; List<ResultsetDataRow> resultsetDataRows = null;
CachedRowSetImpl rs = genericDataService.getCachedResultSet(sql, CachedRowSet rs = genericDataService.getCachedResultSet(sql,
sqlErrorMsg); sqlErrorMsg);
try { try {