Usar fb_adaptor con versiones viejas de Interbase

Como comenté en el update de post anterior respecto de como usar Firebird con JRuby , me era imposible insertar registros con sentencias sql, por lo que tuve que revisar otras opciones.

Intenté compilar el adaptador fb en JRuby sin éxito por tener dependencias nativas, por lo que decidí intentar con Ruby Enterprise Edition.

Si bien pude instalar las gemas fb y fb_adapter, me era imposible realizar consultas a la db. De ActiveRecord, fb_adapter.rb recibía el nombre de la tabla entre comillas, y al parecer a mi versión de db no le gustaba. 

Despues de mucho pelear, pude hacerlo editando el comportamiento de fb_adapter.rb, haciendo que omita las comillas en la sentencia.

El patch es:

  1. def translate(sql)
  2.  
  3. sql.gsub!(/\bIN\s+\(NULL\)/i, 'IS NULL')
  4. sql.sub!(/\bWHERE\s.*$/im) do |m|
  5. m.gsub(/\s=\s*NULL\b/i, ' IS NULL')
  6. end
  7. sql.gsub!(/\sIN\s+\([^\)]*\)/mi) do |m|
  8. m.gsub(/\(([^\)]*)\)/m) { |n| n.gsub(/\@(.*?)\@/m) { |n| "'#{quote_string(Base64.decode64(n[1..-1]))}'" } }
  9. end
  10. args = []
  11. sql.gsub!(/\@(.*?)\@/m) { |m| args << Base64.decode64(m[1..-1]); '?' }
  12. sql.gsub!(/"|'/, "") unless /rdb/.match(sql)
  13. yield(sql, args) if block_given?
  14. end

lo que agregué fue

  1. sql.gsub!(/"|'/, "") unless /rdb/.match(sql)

en donde elimino las comillas del nombre de tabla, a menos que estas formen parte del sql interno que se construye para obtener la metadata de las columnas (el patrón que más se repite es "rdb").
A partir de ahi, he podido acceder a la db firebird desde ActiveRecord sin problemas.
Agradezco a FreedomCoder por la ayuda con las expresiones regulares.
Saludos