Ticket #1798: oci_omnibus.2.patch
| File oci_omnibus.2.patch, 18.7 kB (added by anonymous, 3 years ago) |
|---|
-
test/base_test.rb
old new 571 571 572 572 def test_multiparameter_mass_assignment_protector 573 573 task = Task.new 574 time = Time.mktime( 0)574 time = Time.mktime(2000, 1, 1, 1) 575 575 task.starting = time 576 576 attributes = { "starting(1i)" => "2004", "starting(2i)" => "6", "starting(3i)" => "24" } 577 577 task.attributes = attributes -
test/fixtures/db_definitions/oci2.sql
old new 1 create sequence rails_sequence minvalue 10000;2 3 1 create table courses ( 4 2 id int not null primary key, 5 3 name varchar(255) not null 6 4 ); 5 6 create sequence courses_seq minvalue 10000; -
test/fixtures/db_definitions/oci2.drop.sql
old new 1 1 drop table courses; 2 drop sequence rails_sequence;2 drop sequence courses_seq; -
test/fixtures/db_definitions/oci.sql
old new 1 create sequence rails_sequence minvalue 10000;2 3 1 create table companies ( 4 2 id integer not null, 5 3 type varchar(50) default null, … … 12 10 primary key (id) 13 11 ); 14 12 13 -- non-standard sequence name used to test set_sequence_name 14 -- 15 create sequence companies_nonstd_seq minvalue 10000; 16 15 17 create table accounts ( 16 18 id integer not null, 17 19 firm_id integer default null references companies initially deferred disable, 18 20 credit_limit integer default null, 19 21 primary key (id) 20 22 ); 23 create sequence accounts_seq minvalue 10000; 21 24 22 25 create table topics ( 23 26 id integer not null, … … 50 53 type varchar(50) default null, 51 54 primary key (id) 52 55 ); 56 create sequence topics_seq minvalue 10000; 53 57 58 create synonym subjects for topics; 59 54 60 create table developers ( 55 61 id integer not null, 56 62 name varchar(100) default null, … … 59 65 updated_at timestamp default null, 60 66 primary key (id) 61 67 ); 68 create sequence developers_seq minvalue 10000; 62 69 63 70 create table projects ( 64 71 id integer not null, … … 66 73 type varchar(255) default null, 67 74 primary key (id) 68 75 ); 76 create sequence projects_seq minvalue 10000; 69 77 70 78 create table developers_projects ( 71 79 developer_id integer not null references developers initially deferred disable, … … 78 86 project_id integer not null references projects initially deferred disable, 79 87 joined_on date default null 80 88 ); 89 create sequence developers_projects_seq minvalue 10000; 81 90 82 91 create table customers ( 83 92 id integer not null, … … 89 98 gps_location varchar(100) default null, 90 99 primary key (id) 91 100 ); 101 create sequence customers_seq minvalue 10000; 92 102 93 103 create table movies ( 94 104 movieid integer not null, 95 105 name varchar(100) default null, 96 106 primary key (movieid) 97 107 ); 108 create sequence movies_seq minvalue 10000; 98 109 99 110 create table subscribers ( 100 111 nick varchar(100) not null, 101 112 name varchar(100) default null, 102 113 primary key (nick) 103 114 ); 115 create sequence subscribers_seq minvalue 10000; 104 116 105 117 create table booleantests ( 106 118 id integer not null, 107 119 value integer default null, 108 120 primary key (id) 109 121 ); 122 create sequence booleantests_seq minvalue 10000; 110 123 111 124 create table auto_id_tests ( 112 125 auto_id integer not null, 113 126 value integer default null, 114 127 primary key (auto_id) 115 128 ); 129 create sequence auto_id_tests_seq minvalue 10000; 116 130 117 131 create table entrants ( 118 132 id integer not null primary key, 119 133 name varchar(255) not null, 120 134 course_id integer not null 121 135 ); 136 create sequence entrants_seq minvalue 10000; 122 137 123 138 create table colnametests ( 124 139 id integer not null, 125 140 references integer not null, 126 141 primary key (id) 127 142 ); 143 create sequence colnametests_seq minvalue 10000; 128 144 129 145 create table mixins ( 130 146 id integer not null, … … 151 167 updated_at date default null, 152 168 primary key (id) 153 169 ); 170 create sequence mixins_seq minvalue 10000; 154 171 155 172 create table people ( 156 173 id integer not null, … … 158 175 lock_version integer default 0, 159 176 primary key (id) 160 177 ); 178 create sequence people_seq minvalue 10000; 161 179 162 180 create table binaries ( 163 181 id integer not null, 164 182 data blob null, 165 183 primary key (id) 166 184 ); 185 create sequence binaries_seq minvalue 10000; 167 186 168 187 create table computers ( 169 188 id integer not null primary key, 170 189 developer integer not null references developers initially deferred disable, 171 extendedWarrantyinteger not null190 "extendedWarranty" integer not null 172 191 ); 192 create sequence computers_seq minvalue 10000; 173 193 174 194 create table posts ( 175 195 id integer not null primary key, … … 178 198 type varchar(255) default null, 179 199 body varchar(3000) default null 180 200 ); 201 create sequence posts_seq minvalue 10000; 181 202 182 203 create table comments ( 183 204 id integer not null primary key, … … 185 206 type varchar(255) default null, 186 207 body varchar(3000) default null 187 208 ); 209 create sequence comments_seq minvalue 10000; 188 210 189 211 create table authors ( 190 212 id integer not null primary key, 191 213 name varchar(255) default null 192 214 ); 215 create sequence authors_seq minvalue 10000; 193 216 194 217 create table tasks ( 195 218 id integer not null primary key, 196 219 starting date default null, 197 220 ending date default null 198 221 ); 222 create sequence tasks_seq minvalue 10000; 199 223 200 224 create table categories ( 201 225 id integer not null primary key, 202 226 name varchar(255) default null, 203 227 type varchar(255) default null 204 228 ); 229 create sequence categories_seq minvalue 10000; 205 230 206 231 create table categories_posts ( 207 232 category_id integer not null references categories initially deferred disable, 208 233 post_id integer not null references posts initially deferred disable 209 234 ); 235 create sequence categories_posts_seq minvalue 10000; 210 236 211 237 create table fk_test_has_pk ( 212 238 id integer not null primary key 213 239 ); 240 create sequence fk_test_has_pk_seq minvalue 10000; 214 241 215 242 create table fk_test_has_fk ( 216 243 id integer not null primary key, 217 244 fk_id integer not null references fk_test_has_fk initially deferred disable 218 245 ); 246 create sequence fk_test_has_fk_seq minvalue 10000; -
test/fixtures/db_definitions/oci.drop.sql
old new 1 1 drop table accounts; 2 2 drop table companies; 3 3 drop table topics; 4 drop synonym subjects; 5 drop table developers_projects; 6 drop table computers; 4 7 drop table developers; 5 8 drop table projects; 6 drop table developers_projects;7 9 drop table customers; 8 10 drop table movies; 9 11 drop table subscribers; … … 14 16 drop table mixins; 15 17 drop table people; 16 18 drop table binaries; 17 drop table posts;18 19 drop table comments; 19 20 drop table authors; 20 drop table computers; 21 drop table tasks; 22 drop table categories_posts; 21 23 drop table categories; 22 drop table categories_posts; 23 drop sequence rails_sequence; 24 drop table posts; 25 drop table fk_test_has_pk; 26 drop table fk_test_has_fk; 27 drop sequence accounts_seq; 28 drop sequence companies_nonstd_seq; 29 drop sequence topics_seq; 30 drop sequence developers_seq; 31 drop sequence projects_seq; 32 drop sequence developers_projects_seq; 33 drop sequence customers_seq; 34 drop sequence movies_seq; 35 drop sequence subscribers_seq; 36 drop sequence booleantests_seq; 37 drop sequence auto_id_tests_seq; 38 drop sequence entrants_seq; 39 drop sequence colnametests_seq; 40 drop sequence mixins_seq; 41 drop sequence people_seq; 42 drop sequence binaries_seq; 43 drop sequence posts_seq; 44 drop sequence comments_seq; 45 drop sequence authors_seq; 46 drop sequence tasks_seq; 47 drop sequence computers_seq; 48 drop sequence categories_seq; 49 drop sequence categories_posts_seq; 50 drop sequence fk_test_has_pk_seq; 51 drop sequence fk_test_has_fk_seq; -
test/fixtures/company.rb
old new 1 1 class Company < ActiveRecord::Base 2 2 attr_protected :rating 3 set_sequence_name :companies_nonstd_seq 3 4 4 5 validates_presence_of :name 5 6 end -
lib/active_record/connection_adapters/sqlite_adapter.rb
old new 119 119 @connection.changes 120 120 end 121 121 122 def insert(sql, name = nil, pk = nil, id_value = nil )122 def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) 123 123 execute(sql, name = nil) 124 124 id_value || @connection.last_insert_row_id 125 125 end -
lib/active_record/connection_adapters/abstract_adapter.rb
old new 279 279 def columns(table_name, name = nil) end 280 280 281 281 # Returns the last auto-generated ID from the affected table. 282 def insert(sql, name = nil, pk = nil, id_value = nil ) end282 def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) end 283 283 284 284 # Executes the update statement and returns the number of rows affected. 285 285 def update(sql, name = nil) end -
lib/active_record/connection_adapters/postgresql_adapter.rb
old new 95 95 end 96 96 end 97 97 98 def insert(sql, name = nil, pk = nil, id_value = nil )98 def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) 99 99 execute(sql, name) 100 100 table = sql.split(" ", 4)[2] 101 101 return id_value || last_insert_id(table, pk) -
lib/active_record/connection_adapters/mysql_adapter.rb
old new 109 109 columns 110 110 end 111 111 112 def insert(sql, name = nil, pk = nil, id_value = nil )112 def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) 113 113 execute(sql, name = nil) 114 114 id_value || @connection.insert_id 115 115 end -
lib/active_record/connection_adapters/sqlserver_adapter.rb
old new 204 204 columns 205 205 end 206 206 207 def insert(sql, name = nil, pk = nil, id_value = nil )207 def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) 208 208 begin 209 209 table_name = get_table_name(sql) 210 210 col = get_identity_column(table_name) -
lib/active_record/connection_adapters/db2_adapter.rb
old new 44 44 select(sql, name).first 45 45 end 46 46 47 def insert(sql, name = nil, pk = nil, id_value = nil )47 def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) 48 48 execute(sql, name = nil) 49 49 id_value || last_insert_id 50 50 end -
lib/active_record/connection_adapters/oci_adapter.rb
old new 15 15 # Do what you want with this code, at your own peril, but if any significant portion of my code 16 16 # remains then please acknowledge my contribution. 17 17 # Copyright 2005 Graham Jenkins 18 # $Revision: 1.2 $ 18 19 19 require 'active_record/connection_adapters/abstract_adapter' 20 20 21 21 begin 22 22 require_library_or_gem 'oci8' unless self.class.const_defined? :OCI8 23 23 24 class String 25 26 # Oracle column names by default are case-insensitive, but treated as upcase; 27 # for neatness, we'll downcase within Rails. EXCEPT that folks CAN quote 28 # their column names when creating Oracle tables, which makes then case-sensitive. 29 # I don't know anybody who does this, but we'll handle the theoretical case of a 30 # camelCase column name. I imagine other dbs handle this different, since there's a 31 # unit test that's currently failing test_oci. 32 def oci_downcase 33 self =~ /[a-z]/ ? self : self.downcase 34 end 35 end 36 24 37 module ActiveRecord 25 38 module ConnectionAdapters #:nodoc: 26 39 class OCIColumn < Column #:nodoc: … … 77 90 # It has also been tested against a 9i database. 78 91 # 79 92 # Usage notes: 80 # * Key generation uses a sequence "rails_sequence" for all tables. (I couldn't find a simple 81 # and safe way of passing table-specific sequence information to the adapter.) 93 # * Key generation assumes a "${table_name}_seq" sequence is available for all tables. 82 94 # * Oracle uses DATE or TIMESTAMP datatypes for both dates and times. Consequently I have had to 83 95 # resort to some hacks to get data converted to Date or Time in Ruby. 84 96 # If the column_name ends in _time it's created as a Ruby Time. Else if the … … 117 129 end 118 130 end 119 131 132 # camelCase column names need to be quoted; not that anyone using Oracle 133 # would really do this, but handling this case means we pass the test... 134 def quote_column_name(name) 135 name =~ /[A-Z]/ ? "\"#{name}\"" : name 136 end 137 120 138 def select_all(sql, name = nil) 121 139 offset = sql =~ /OFFSET (\d+)$/ ? $1.to_i : 0 122 140 sql, limit = $1, $2.to_i if sql =~ /(.*)(?: LIMIT[= ](\d+))(\s*OFFSET \d+)?$/ … … 126 144 sql = "select * from (select raw_sql_.*, rownum raw_rnum_ from (#{sql}) raw_sql_) where raw_rnum_ > #{offset}" 127 145 end 128 146 cursor = log(sql, name) { @connection.exec sql } 129 cols = cursor.get_col_names.map { |x| x. downcase }147 cols = cursor.get_col_names.map { |x| x.oci_downcase } 130 148 rows = [] 131 149 while row = cursor.fetch 132 150 hash = Hash.new … … 155 173 def columns(table_name, name = nil) 156 174 cols = select_all(%Q{ 157 175 select column_name, data_type, data_default, data_length, data_scale 158 from user_tab_columns where table_name = '#{table_name.upcase}'} 176 from user_catalog cat, user_synonyms syn, all_tab_columns col 177 where cat.table_name = '#{table_name.upcase}' 178 and syn.synonym_name (+)= cat.table_name 179 and col.owner = nvl(syn.table_owner, user) 180 and col.table_name = nvl(syn.table_name, cat.table_name)} 159 181 ).map { |row| 160 OCIColumn.new row['column_name']. downcase, row['data_default'],182 OCIColumn.new row['column_name'].oci_downcase, row['data_default'], 161 183 row['data_length'], row['data_type'], row['data_scale'] 162 184 } 163 185 cols 164 186 end 165 187 166 def insert(sql, name = nil, pk = nil, id_value = nil )188 def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) 167 189 if pk.nil? # Who called us? What does the sql look like? No idea! 168 190 execute sql, name 169 191 elsif id_value # Pre-assigned id 170 192 log(sql, name) { @connection.exec sql } 171 193 else # Assume the sql contains a bind-variable for the id 172 id_value = select_one("select rails_sequence.nextval id from dual")['id']194 id_value = select_one("select #{sequence_name}.nextval id from dual")['id'] 173 195 log(sql, name) { @connection.exec sql, id_value } 174 196 end 175 197 id_value … … 233 255 def write_lobs() #:nodoc: 234 256 if connection.class == ConnectionAdapters::OCIAdapter 235 257 self.class.columns.select { |c| c.type == :binary }.each { |c| 236 break unless value = self[c.name] 258 #break unless value = self[c.name] 259 value = self[c.name] 260 next if value.nil? || (value == '') 237 261 lob = connection.select_one( 238 262 "select #{ c.name} from #{ self.class.table_name } WHERE #{ self.class.primary_key} = #{quote(id)}", 239 263 'Writable Large Object' -
lib/active_record/base.rb
old new 561 561 end 562 562 end 563 563 564 # Defines the sequence_name (for Oracle) -- can be overridden in subclasses. 565 def sequence_name 566 "#{table_name}_seq" 567 end 568 564 569 # Defines the column name for use with single table inheritance -- can be overridden in subclasses. 565 570 def inheritance_column 566 571 "type" … … 593 598 end 594 599 alias :primary_key= :set_primary_key 595 600 601 # Sets the name of the sequence to use when generating ids to the given 602 # value, or (if the value is nil or false) to the value returned by the 603 # given block. Currently useful only when using Oracle, which requires 604 # explicit sequences. 605 # 606 # Setting the sequence name when using other dbs will have no effect. 607 # If a sequence name is not explicitly set when using Oracle, it will 608 # default to the commonly used pattern of: #{table_name}_seq 609 # 610 # Example: 611 # 612 # class Project < ActiveRecord::Base 613 # set_sequence_name "projectseq" # default would have been "project_seq" 614 # end 615 def set_sequence_name( value=nil, &block ) 616 define_attr_method :sequence_name, value, &block 617 end 618 alias :sequence_name= :set_sequence_name 619 596 620 # Sets the name of the inheritance column to use to the given value, 597 621 # or (if the value # is nil or false) to the value returned by the 598 622 # given block. … … 1157 1181 "(#{quoted_column_names.join(', ')}) " + 1158 1182 "VALUES(#{attributes_with_quotes.values.join(', ')})", 1159 1183 "#{self.class.name} Create", 1160 self.class.primary_key, self.id 1184 self.class.primary_key, self.id, self.class.sequence_name 1161 1185 ) 1162 1186 1163 1187 @new_record = false