Usando funções da Oracle com HSQLDB
Essa é uma dica simples e rápida para quem usa o banco de dados HSQLDB
No meu caso específico, uso o HSQLDB para execução de testes funcionais e como a maioria desses projetos usam BD Oracle para desenvolvimento/produção, algumas queries acabam por conter funções específicas do Oracle, como: to_char, to_date, etc.
Antes de dar a dica, é preciso dizer que esse recurso só funciona para as versões > 2.x do HSQLDB, portanto caso tentem usá-lo na versão 1.8 por exemplo, não será possível. Inclusive tive esse problema no meu projeto, pois como estou usando Grails 1.3.7, o framework por si só já vem com a dependência do HSQLDB 1.8 incluída por padrão e a solução encontrada para contornar isso foi usar o arquivo BuildConfig.groovy, primeiro removendo a dependência da versão 1.8 e depois incluindo a dependência da versão 2.x. Segue:
grails.project.dependency.resolution = {
inherits("global") {
excludes([group: 'hsqldb', name: 'hsqldb', version:'1.8.0.10'])
}log "warn"repositories {// Repositorios para os plugins do grailsgrailsHome()
grailsRepo "http://plugins.grails.org"grailsRepo "http://svn.codehaus.org/grails/trunk/grails-plugins"// Repositorio necessario pois o maven baixa as dependencias e o grails as encontra no repositorio localmavenLocal()
// Repositorios da IdeaismavenRepo "http://intranet/archiva/repository/internal/"mavenRepo "http://intranet/archiva/repository/ideais/"mavenRepo "http://intranet/archiva/repository/ideais-snapshots/"mavenRepo "http://intranet/archiva/repository/thirdparty/"// Repositorio necessario para que o grails baixe suas proprias dependenciasmavenCentral()
}dependencies {runtime([group:'com.oracle', name:'ojdbc14', version:'10.2.0.3.0'],
)compile(//Lib para criptografia/descriptografia/mascaramento de numeros de cartao de credito[group:'com.b2w.billing', name:'jsitef', version:'1.0'],
//Lib para resolver a dependencia do JAXB em ambiente de producao[group:'xalan', name:'serializer', version:'2.7.1'],
//Libs para o spring-ws plugin[group:'org.springframework.ws',name:'spring-ws',version:'1.5.8', transitive: false],
[group:'javax.activation',name:'activation',version:'1.1.1', transitive: false],
[group:'com.russmiles.groovy.webservices',name:'client',version:'1.0-SNAPSHOT', transitive: false],
[group:'org.springframework.security', name:'spring-security-core', version:'2.0.4', transitive: false],
[group:'javax.xml.soap', name:'saaj-api', version:'1.3', transitive: false],
[group:'javax.xml.soap', name:'saaj-impl', version:'1.3.2', transitive: false],
[group:'org.bouncycastle', name:'bcprov-jdk14', version:'1.43', transitive: false],
[group:'stax', name:'stax-api', version:'1.0.2', transitive: false],
[group:'wsdl4j', name:'wsdl4j', version:'1.6.2', transitive: false],
[group:'org.apache.ws.security', name:'wss4j', version:'1.5.8', transitive: false],
[group:'org.apache.ws.commons.schema', name:'XmlSchema', version:'1.4.5', transitive: false],
[group:'xml-security', name:'xmlsec', version:'1.4.3', transitive: false],
//Libs para o export plugin[group:'com.lowagie',name:'itext',version:'2.1.4', transitive: false],
[group:'com.lowagie',name:'iTextAsian',version:'2.1.5', transitive: false],
[group:'com.lowagie',name:'itext-rtf',version:'2.1.5', transitive: false],
[group:'net.sourceforge.jexcelapi',name:'jxl',version:'ideais-commerce', transitive: false],
[group:'org.openoffice.odf',name:'odfdom',version:'ideais-commerce', transitive: false],
[group:'net.sf.opencsv',name:'opencsv',version:'1.8', transitive: false],
[group:'xerces',name:'xercesImpl',version:'ideais-commerce', transitive: false],
//Libs para o WSClient[group:'org.codehaus.groovy.modules',name:'groovyws',version:'0.5.1', transitive: false],
[group: 'org.apache.cxf', name: 'cxf-bundle', version: '2.2.4', transitive: false],
[group: 'com.sun.xml.fastinfoset', name: 'FastInfoset', version: '1.2.7', transitive: false],
[group: 'org.apache.geronimo.specs', name: 'geronimo-activation_1.1_spec', version: '1.0.2', transitive: false],
[group: 'org.apache.geronimo.specs', name: 'geronimo-annotation_1.0_spec', version: '1.1.1', transitive: false],
[group: 'org.apache.geronimo.specs', name: 'geronimo-javamail_1.4_spec', version: '1.6', transitive: false],
[group: 'org.apache.geronimo.specs', name: 'geronimo-jaxws_2.1_spec', version: '1.0', transitive: false],
[group: 'org.apache.geronimo.specs', name: 'geronimo-stax-api_1.0_spec', version: '1.0.1', transitive: false],
[group: 'org.apache.geronimo.specs', name: 'geronimo-ws-metadata_2.0_spec', version: '1.1.2', transitive: false],
[group: 'javax.xml', name: 'jaxb-api', version: '2.1', transitive: false],
[group: 'com.sun.xml.bind', name: 'jaxb-impl', version: '2.1.12', transitive: false],
[group: 'com.sun.xml.bind', name: 'jaxb-xjc', version: '2.1.12', transitive: false],
[group: 'jaxen', name: 'jaxen', version: '1.1', transitive: false],
[group: 'jdom', name: 'jdom', version: '1.1', transitive: false],
[group: 'org.apache.neethi', name: 'neethi', version: '2.0.4', transitive: false],
[group: 'woodstox', name: 'wstx-asl', version: '3.2.7', transitive: false],
[group: 'xml-resolver', name: 'xml-resolver', version: '1.2', transitive: false],
)test(//Libs para integracao do GEB com SPOCK e do GEB com Webdriver[group:"org.codehaus.geb", name:"geb-spock", version:"0.6.0"],
[group:'org.seleniumhq.selenium', name:'selenium-firefox-driver', version:'2.0.0'],
[group:'org.seleniumhq.selenium', name:'selenium-chrome-driver', version:'2.0.0'],
[group:'org.seleniumhq.selenium', name:'selenium-ie-driver', version:'2.0.0'],
[group:'org.hsqldb', name:'hsqldb', version:'2.2.4'],
)}}
Já para usar sintaxes do Oracle com o HSQLDB, basta incluir a seguinte instrução no início do script SQL:
SET DATABASE SQL SYNTAX ORA TRUE;
Para deixar isso automático, foi criado no arquivo BootStrap.groovy a seguite rotina:
def init = { servletContext ->
def envs = [Environment.DEVELOPMENT, Environment.TEST ]
if (Environment.current in envs) {
if(Environment.current == Environment.TEST) {
executeHSQLDBWithOracleQuerySyntax()
}}}def executeHSQLDBWithOracleQuerySyntax() {
def sqlString = "SET DATABASE SQL SYNTAX ORA TRUE;"
def sql = Sql.newInstance(
ConfigurationHolder.config.dataSource.url,
ConfigurationHolder.config.dataSource.username,
ConfigurationHolder.config.dataSource.password,
ConfigurationHolder.config.dataSource.driverClassName
)sql.execute(sqlString)
}
Simples assim, agora a todo start-up da aplicação, quando o escopo for de teste, o HSQLDB já estará pronto para aceitar funções inerentes ao banco de dados Oracle.
Se você gostou desse tópico, por favor considere deixar um comentário ou se inscreva no feed e tenha no futuro todos os tópicos entregues diretamente no seu agregador.







