September 28, 2009
New features in ActiveRecord Oracle enhanced adapter version 1.2.2
During the last months many new features have been implemented for ActiveRecord Oracle enhanced adapter which are now included in Oracle enhanced adapter version 1.2.2. You can find full list in change history file, here I will tell about the main ones.
Documentation
Now Oracle enhanced adapter has improved RDoc documentation for all public methods. So you can go to RDoc documentation of installed gem or go and view published documentation on-line.
Schema definition
There are many new features in schema definition methods that you can use in migration files:
- When you use
add_index
then ActiveRecord is automatically generating index name using format index_table_name_on_column1_and_column2_… which previously could cause Oracle errors as Oracle identifiers should be up to 30 characters long. Now default index names are automatically shortened down to 30 or less characters (of course you can always use also:name
option to specify shortened version by yourself). - Now adapter is ignoring
:limit
option for:text
and:binary
columns (as in Oracle you cannot specify limit for CLOB and BLOB data types). Previously it could cause errors if you tried to migrate Rails application from e.g. MySQL where:text
and:binary
columns could have:limit
in schema definition. - If you define
:string
column with*:limit
option then it will defineVARCHAR2
column with size in characters and not in bytes (this makes difference if you use UTF-8 with language where one character might be stored as several bytes). This is expected behavior from ActiveRecord that you define maximum string size in UTF-8 characters. - Now you can use
add_foreign_key
andremove_foreign_key
to define foreign key constraints in migrations (see RDoc documentation for details). Syntax and some implemenatation for foreign key definition was taken from foreigner Rails plugin as well as some ideas taken from active_record_oracle_extensions plugin. add_foreign_key
definitions will be also extracted in schema.rb byrake db:schema:dump
task. Therefore they will be also present in test database when you will recreate it from schema.rb file.- Foreign keys are also safe for loading of fixtures (in case you are still using them instead of factories :)).
disable_referential_integrity
method is implemented for Oracle enhanced adapter which is called by ActiveRecord before loading fixtures and which disables all currently active foreign key constraints during loading of fixtures. - You can use
add_synonym
andremove_synonym
to define database synonyms to other tables, views or sequences. add_synonym definitions will also be extracted in schema.rb file. - It is possible to create tables with primary key trigger. There will be no difference in terms how you would create new records in such table using ActiveRecord but in case you have also need to do direct INSERTs into the table then it will be easier as you can omit primary key from INSERT statement and primary key trigger will populate it automatically from corresponding sequence.
- ActiveRecord schema dumper is patched to work correctly when default table prefixes or suffixes are used – they are now removed from schema.rb dump to avoid duplicate prefixes and suffixes when recreating schema from schema.rb.
Legacy schema support
Some features which can support “weird” legacy database schemas:
- If you are using ActiveRecord with legacy schema which have tables with triggers that populate primary key triggers (and not using default Rails and Oracle enhanced adapter conventions) then you can use
set_sequence_name :autogenerated
in class definition to tell adapter to omit primary key value from INSERTs. - You can use ActiveRecord also with tables that you can access over database link. To do that you need to define local synonym to remote table (and also remote sequence if you want to insert records as well) and then use local synonym in set_table_name in class definition. Previously adapter could not get remote table columns, now it will get table columns also over database link.
But still you cannot specify remote table (like “table_name@db_link”) directly inset_table_name
as table_name will be used as column prefix in generated SQL statements where “@db_link” will not be valid syntax.
And when you define local synonyms then please use the newadd_synonym
feature :)
Connection options
cursor_sharing
option default value is changed from “similar” to “force” – please read explanation in discussion group post what it is and why the new default value is recommended choice.- When using JRuby and JDBC you can set TNS_ADMIN environment variable to tnsnames.ora directory and then use TNS database alias in database.yml file (specify just database: option and remove host: option). This might be useful for more complex TNS connection definitions, e.g. connection to load balanced Oracle RAC.
- Adapter will not raise error if it cannot locate ojdbc14.jar* file. So either put it in $JRUBY_HOME/lib or ensure that it will be loaded by application server. Would love to hear feedback from people who are using this adapter with JRuby to find out if this behaves well now :)
Logging
- Now you can get PL/SQL debugging information into your ActiveRecord log file. Use
dbms_output.put_line
in your PL/SQL procedures and functions (that are called from ActiveRecord models) and in your ActiveRecord model useconnection.enable_dbms_output
andconnection.disable_dbms_output
around your database calls to get dbms_output logging information into ActiveRecord log file. But please use it just in development environment with debug log level as in production it would add too much overhead for each database call. And this feature also requires that you install ruby-plsql gem.
As you see this probably is the largest “point” release that I have had :) Thanks also to other contributors which patches were included in this release.
As always you can install Oracle enhanced adapter on any Ruby platform (Ruby 1.8.6 / 1.8.7 or Ruby 1.9.1 or JRuby) with
gem install activerecord-oracle_enhanced-adapter
If you have any questions please use discussion group or post comments here.