Skip to content

Commit

Permalink
Adds logic to choose between DBSCHEMA_SCHEMATA and MDSCHEMA_CUBES dep…
Browse files Browse the repository at this point in the history
…ending on the provider name.

git-svn-id: https://olap4j.svn.sourceforge.net/svnroot/olap4j/trunk@453 c6a108a4-781c-0410-a6c6-c2d559e19af0
  • Loading branch information
lucboudreau committed May 11, 2011
1 parent b64181a commit d2ece8b
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 22 deletions.
70 changes: 50 additions & 20 deletions src/org/olap4j/driver/xmla/XmlaOlap4jCatalog.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
*/
package org.olap4j.driver.xmla;

import java.sql.SQLException;

import org.olap4j.OlapDatabaseMetaData;
import org.olap4j.OlapException;
import org.olap4j.impl.Named;
Expand Down Expand Up @@ -59,31 +61,59 @@ class XmlaOlap4jCatalog implements Catalog, Named {
new XmlaOlap4jConnection.CatalogSchemaHandler(this.name),
null)
{
private boolean useSchemata = false;
@Override
protected void populateList(NamedList<XmlaOlap4jSchema> list)
throws OlapException
protected void populateList(
NamedList<XmlaOlap4jSchema> list)
throws OlapException
{
// First try DBSCHEMA_SCHEMATA
try {
super.populateList(list);
/*
* Some OLAP servers don't support DBSCHEMA_SCHEMATA
* so we fork the behavior here according to the
* database product name.
*/
if (XmlaOlap4jCatalog.this.olap4jDatabaseMetaData
.getDatabaseProductName().contains("Mondrian"))
{
this.useSchemata = true;
}
} catch (SQLException e1) {
throw new OlapException(
"Failed to obtain the database product name.",
e1);
}
try {
if (this.useSchemata) {
super.populateList(list);
return;
}
} catch (OlapException e) {
// Fallback to MDSCHEMA_CUBES trick
XmlaOlap4jConnection conn =
XmlaOlap4jCatalog.this
.olap4jDatabaseMetaData.olap4jConnection;
conn.populateList(
list,
new XmlaOlap4jConnection.Context(
conn,
conn.olap4jDatabaseMetaData,
XmlaOlap4jCatalog.this,
null, null, null, null, null),
XmlaOlap4jConnection.MetadataRequest
.MDSCHEMA_CUBES,
new XmlaOlap4jConnection.CatalogSchemaHandler(
XmlaOlap4jCatalog.this.name),
new Object[0]);
// no op. we know how to fallback.
useSchemata = false;
}
// Fallback to MDSCHEMA_CUBES trick
populateInternal(list);
}
private void populateInternal(
NamedList<XmlaOlap4jSchema> list)
throws OlapException
{
XmlaOlap4jConnection conn =
XmlaOlap4jCatalog.this
.olap4jDatabaseMetaData.olap4jConnection;
conn.populateList(
list,
new XmlaOlap4jConnection.Context(
conn,
conn.olap4jDatabaseMetaData,
XmlaOlap4jCatalog.this,
null, null, null, null, null),
XmlaOlap4jConnection.MetadataRequest
.MDSCHEMA_CUBES,
new XmlaOlap4jConnection.CatalogSchemaHandler(
XmlaOlap4jCatalog.this.name),
new Object[0]);
}
};
}
Expand Down
33 changes: 31 additions & 2 deletions src/org/olap4j/driver/xmla/XmlaOlap4jDatabaseMetaData.java
Original file line number Diff line number Diff line change
Expand Up @@ -221,11 +221,40 @@ public boolean nullsAreSortedAtEnd() throws SQLException {
}

public String getDatabaseProductName() throws SQLException {
throw Olap4jUtil.needToImplement(this);
final ResultSet rs =
this.getDatabaseProperties(null, null);
try {
while (rs.next()) {
if (rs.getString(
XmlaConstants.Literal.PROPERTY_NAME.name())
.equals("ProviderName"))
{
return
rs.getString("PROPERTY_VALUE");
}
}
return "";
} finally {
rs.close();
}
}

public String getDatabaseProductVersion() throws SQLException {
throw Olap4jUtil.needToImplement(this);
final ResultSet rs =
this.getDatabaseProperties(null, null);
try {
while (rs.next()) {
if (rs.getString(
XmlaConstants.Literal.PROPERTY_NAME.name())
.equals("ProviderVersion"))
{
return rs.getString("PROPERTY_VALUE");
}
}
return "";
} finally {
rs.close();
}
}

public String getDriverName() throws SQLException {
Expand Down

0 comments on commit d2ece8b

Please sign in to comment.