Rails on Oracle 2011

Post on 10-May-2015

14.913 views 2 download

Tags:

description

RailsConf 2011 BoF session "Rails on Oracle" slides

Transcript of Rails on Oracle 2011

Rails on Oracle

Raimonds Simanovskis

github.com/rsim

@rsim

Self-promotion :) eazybi.com

How to contribute to ActiveRecord

Oracle enhancedadapter

Main componentsRails 3.x

ActiveRecord Arel

Arel::Visitors::OracleSQL

ActiveRecord::ConnectionAdapters::

AbstractAdapter

OracleEnhancedAdapter

execute

results

build query

What Oracle Enhanced adapter does

database connection

value quoting

column type mapping

results type mapping

schema definition stmts

schema dump

structure dump

metadata queries

custom CUD procedures

custom schema stmts

context index creation

AR patches

Oracle Data TypesRuby Rails Oracle

Fixnum :integer NUMBERFloat :float NUMBER

BigDecimal :decimal NUMBER, DECIMALTime :datetime DATETime :time DATEDate :date DATEString :string VARCHAR2String :text CLOBString :binary BLOB

True/FalseClass :boolean NUMBER(1), CHAR(1)

Latest additionRuby Rails OracleString :raw RAW

Legacy schemas

class Employee < ActiveRecord::Base set_table_name "hr_employees" set_primary_key "employee_id" set_sequence_name "hr_employee_s"

set_date_columns :hired_on, :birth_date_on set_datetime_columns :last_login_time

set_boolean_columns :manager, :active

ignore_table_columns :attribute1, :attribute2end

ActiveRecordwith

PL/SQLCRUD

procedures

class Employee < ActiveRecord::Base set_create_method do plsql.employees_pkg.create_employee( :p_first_name => first_name, :p_last_name => last_name, :p_employee_id => nil )[:p_employee_id] end set_update_method do plsql.employees_pkg.update_employee( :p_employee_id => id, :p_first_name => first_name, :p_last_name => last_name ) end set_delete_method do plsql.employees_pkg.delete_employee( :p_employee_id => id ) endend

Full-text indexesadd_context_index :posts, [:title, :body, # specify aliases always with AS keyword "SELECT comments.author AS comment_author, " + "comments.body AS comment_body " + "FROM comments WHERE comments.post_id = :id" ], :name => 'post_and_comments_index', :index_column => :all_text, :index_column_trigger_on => [:updated_at, :comments_count], :sync => 'ON COMMIT'

Post.contains(:all_text, "hello")Post.contains(:all_text, "{first} within title")Post.contains(:all_text, "{first} AND {post}")

Gemfile

gem “ruby-oci8”, “~>2.0.4”gem “activerecord-oracle_enhanced-adapter”, “~>1.3.2”

gem “activerecord-oracle_enhanced-adapter”,:git=> “git://github.com/rsim/oracle-enhanced.git”

Currently testing on ActiveRecord versions

2.3.x3.0.x

3.1.beta

Currently testing on Oracle versions

10.2.0.4

11gR2 should be OK :)

Currently testing on Ruby platforms

Ruby 1.8.7 Ruby 1.9.2 JRuby 1.6

ruby-oci8 2.0.4 ruby-oci8 2.0.4 ojdbc6.jar

oracle_enhanced adapter

Reporting issues

Where?

http://groups.google.com/group/oracle-enhanced

http://github.com/rsim/oracle-enhanced/issues

How?Provide full example

require "rubygems"gem "activerecord", "3.0.5"gem "activerecord-oracle_enhanced-adapter", "1.3.2"require "active_record"

ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced", :database => "orcl", :username => "hr", :password => "hr")

ActiveRecord::Base.connection.instance_eval do drop_table :test_categories rescue nil create_table :test_categories, :force => true do |t| t.string :name t.string :category_code endend

class TestCategory < ActiveRecord::Baseend

category = TestCategory.new(:name=>"hl", :category_code=>"hd")category.id = 1category.save!

p category

IdeallyGithub pull request

Other libraries

ruby-plsql gemplsql.connect! "hr","hr","xe"

plsql.test_uppercase('xxx') # => "XXX"plsql.test_uppercase(:p_string => 'xxx') # => "XXX"plsql.test_copy("abc", nil, nil) # => { :p_to => "abc", # :p_to_double => "abcabc" }plsql.test_copy(:p_from => "abc", :p_to => nil, :p_to_double => nil) # => { :p_to => "abc", # :p_to_double => "abcabc" }plsql.hr.test_uppercase('xxx') # => "XXX"plsql.test_package.test_uppercase('xxx') # => 'XXX'plsql.hr.test_package.test_uppercase('xxx') # => 'XXX'

plsql.logoff

ruby-plsql-specideal languagefor writing tests

powerful testing toolswith “readable” syntax

library for callingPL/SQL procedures

from Ruby

RSpec

ruby-plsql

More information

http://blog.rayapps.com

http://github.com/rsim/oracle-enhanced

http://groups.google.com/group/oracle-enhanced