ruby-plsql 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ == 0.4.3 2010-03-25
2
+
3
+ * Improvements
4
+ * plsql.connection.database_version will return also update and patch components of version number
5
+ * :column => :is_null and :column => :is_not_null conditions in table select operations
6
+ * Bug fixes
7
+ * Bugfix for calling procedure with table of records type (defined inside package) output parameter
8
+ * Use subprogram_id column in all_arguments view only if database version is >= 10.2.0.2
9
+ * Support partial list of named arguments for overloaded procedures (assuming that missing arguments will have default value)
10
+
1
11
  == 0.4.2 2010-02-26
2
12
 
3
13
  * New features
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.4.3
@@ -492,7 +492,17 @@ module PLSQL
492
492
  end
493
493
 
494
494
  def database_version
495
- @database_version ||= (md = raw_connection.getMetaData) && [md.getDatabaseMajorVersion, md.getDatabaseMinorVersion]
495
+ @database_version ||= if md = raw_connection.getMetaData
496
+ major = md.getDatabaseMajorVersion
497
+ minor = md.getDatabaseMinorVersion
498
+ if md.getDatabaseProductVersion =~ /#{major}\.#{minor}\.(\d+)\.(\d+)/
499
+ update = $1.to_i
500
+ patch = $2.to_i
501
+ else
502
+ update = patch = 0
503
+ end
504
+ [major, minor, update, patch]
505
+ end
496
506
  end
497
507
 
498
508
  private
@@ -282,7 +282,8 @@ module PLSQL
282
282
  end
283
283
 
284
284
  def database_version
285
- @database_version ||= (version = raw_connection.oracle_server_version) && [version.major, version.minor]
285
+ @database_version ||= (version = raw_connection.oracle_server_version) &&
286
+ [version.major, version.minor, version.update, version.patch]
286
287
  end
287
288
 
288
289
  private
@@ -82,7 +82,7 @@ module PLSQL
82
82
  @tmp_tables_created = {}
83
83
 
84
84
  # subprogram_id column is available just from version 10g
85
- subprogram_id_column = (@schema.connection.database_version <=> [10, 2]) >= 0 ? 'subprogram_id' : 'NULL'
85
+ subprogram_id_column = (@schema.connection.database_version <=> [10, 2, 0, 2]) >= 0 ? 'subprogram_id' : 'NULL'
86
86
 
87
87
  @schema.select_all(
88
88
  "SELECT #{subprogram_id_column}, object_name, TO_NUMBER(overload), argument_name, position, data_level,
@@ -49,12 +49,19 @@ module PLSQL
49
49
  args_keys = args[0].keys
50
50
  # implicit SELF argument for object instance procedures
51
51
  args_keys << :self if @self && !args_keys.include?(:self)
52
- args_keys = args_keys.sort_by{|k| k.to_s}
53
52
  number_of_args = args_keys.size
54
- overload = overload_argument_list.keys.detect do |ov|
55
- overload_argument_list[ov].size == number_of_args &&
56
- overload_arguments[ov].keys.sort_by{|k| k.to_s} == args_keys
53
+ matching_overloads = [] # overloads with exact or smaller number of matching named arguments
54
+ overload_argument_list.keys.each do |ov|
55
+ # assume that missing arguments have default value
56
+ missing_arguments_count = overload_argument_list[ov].size - number_of_args
57
+ if missing_arguments_count >= 0 &&
58
+ args_keys.all?{|k| overload_argument_list[ov].include?(k)}
59
+ matching_overloads << [ov, missing_arguments_count]
60
+ end
57
61
  end
62
+ # pick first matching overload with smallest missing arguments count
63
+ # (hoping that missing arguments will be defaulted - cannot find default value from all_arguments)
64
+ overload = matching_overloads.sort_by{|ov, score| score}[0][0]
58
65
  # otherwise try matching by sequential arguments count and types
59
66
  else
60
67
  number_of_args = args.size
@@ -69,7 +76,7 @@ module PLSQL
69
76
  matching_types << matching_oracle_types_for_ruby_value(arg)
70
77
  end
71
78
  exact_overloads = [] # overloads with exact number of matching arguments
72
- smaller_overloads = [] # overloads with exact number of matching arguments
79
+ smaller_overloads = [] # overloads with smaller number of matching arguments
73
80
  # overload = overload_argument_list.keys.detect do |ov|
74
81
  # overload_argument_list[ov].size == number_of_args
75
82
  # end
@@ -399,7 +406,7 @@ module PLSQL
399
406
  case argument_metadata[:element][:data_type]
400
407
  when 'PL/SQL RECORD'
401
408
  field_names = record_fields_sorted_by_position(argument_metadata[:element][:fields])
402
- values_string = field_names.map{|f| "l_return(i__).#{f}"}.join(', ')
409
+ values_string = field_names.map{|f| "l_#{argument}(i__).#{f}"}.join(', ')
403
410
  @return_sql << "INSERT INTO #{argument_metadata[:tmp_table_name]} VALUES (#{values_string}, i__);\n"
404
411
  return_fields_string = is_index_by_table ? '*' : field_names.join(', ')
405
412
  else
@@ -534,7 +541,7 @@ module PLSQL
534
541
  if @dbms_output_stream
535
542
  dbms_output_enable_sql = "DBMS_OUTPUT.ENABLE(#{@schema.dbms_output_buffer_size});\n"
536
543
  # if database version is at least 10.2 then use DBMS_OUTPUT.GET_LINES with SYS.DBMSOUTPUT_LINESARRAY
537
- if (@schema.connection.database_version <=> [10, 2]) >= 0
544
+ if (@schema.connection.database_version <=> [10, 2, 0, 0]) >= 0
538
545
  @declare_sql << "l_dbms_output_numlines INTEGER := #{Schema::DBMS_OUTPUT_MAX_LINES};\n"
539
546
  dbms_output_get_sql = "DBMS_OUTPUT.GET_LINES(:dbms_output_lines, l_dbms_output_numlines);\n"
540
547
  @bind_values[:dbms_output_lines] = nil
data/lib/plsql/table.rb CHANGED
@@ -105,8 +105,10 @@ module PLSQL
105
105
  sql_params.each do |k,v|
106
106
  if k == :order_by
107
107
  order_by_sql = " ORDER BY #{v} "
108
- elsif v.nil?
108
+ elsif v.nil? || v == :is_null
109
109
  where_sqls << "#{k} IS NULL"
110
+ elsif v == :is_not_null
111
+ where_sqls << "#{k} IS NOT NULL"
110
112
  else
111
113
  where_sqls << "#{k} = :#{k}"
112
114
  bindvars << v
@@ -407,7 +407,7 @@ describe "Connection" do
407
407
  describe "session information" do
408
408
  it "should get database version" do
409
409
  # using Oracle version 10.2.0.4 for unit tests
410
- @conn.database_version.should == [10, 2]
410
+ @conn.database_version.should == [10, 2, 0, 4]
411
411
  end
412
412
 
413
413
  it "should get session ID" do
@@ -282,6 +282,10 @@ describe "Parameter type mapping /" do
282
282
  ;
283
283
  FUNCTION test_procedure2 ( p_string VARCHAR2 )
284
284
  RETURN VARCHAR2;
285
+ FUNCTION test_function ( p_string VARCHAR2, p_string2 VARCHAR2 DEFAULT ' ')
286
+ RETURN VARCHAR2;
287
+ FUNCTION test_function ( p_number NUMBER, p_number2 NUMBER DEFAULT 1 )
288
+ RETURN NUMBER;
285
289
  END;
286
290
  SQL
287
291
  plsql.execute <<-SQL
@@ -308,6 +312,18 @@ describe "Parameter type mapping /" do
308
312
  BEGIN
309
313
  RETURN UPPER(p_string);
310
314
  END test_procedure2;
315
+ FUNCTION test_function ( p_string VARCHAR2, p_string2 VARCHAR2)
316
+ RETURN VARCHAR2
317
+ IS
318
+ BEGIN
319
+ RETURN p_string||p_string2;
320
+ END;
321
+ FUNCTION test_function ( p_number NUMBER, p_number2 NUMBER)
322
+ RETURN NUMBER
323
+ IS
324
+ BEGIN
325
+ RETURN p_number + p_number2;
326
+ END;
311
327
  END;
312
328
  SQL
313
329
 
@@ -355,6 +371,11 @@ describe "Parameter type mapping /" do
355
371
  plsql.test_package2.test_procedure(:p_number => 111, :p_result => nil).should == {:p_result => '111'}
356
372
  end
357
373
 
374
+ it "should find matching procedure based on partial list of named arguments" do
375
+ plsql.test_package2.test_function(:p_string => 'xxx').should == 'xxx '
376
+ plsql.test_package2.test_function(:p_number => 1).should == 2
377
+ end
378
+
358
379
  end
359
380
 
360
381
  describe "Function with output parameters" do
@@ -1097,6 +1118,7 @@ describe "Parameter type mapping /" do
1097
1118
  INDEX BY BINARY_INTEGER;
1098
1119
  FUNCTION test_employees (p_employees IN OUT t_employees)
1099
1120
  RETURN t_employees;
1121
+ PROCEDURE test_employees_prc (p_employees IN OUT t_employees);
1100
1122
  PROCEDURE insert_employees(p_employees IN t_employees);
1101
1123
  END;
1102
1124
  SQL
@@ -1133,6 +1155,11 @@ describe "Parameter type mapping /" do
1133
1155
  BEGIN
1134
1156
  RETURN p_employees;
1135
1157
  END;
1158
+ PROCEDURE test_employees_prc (p_employees IN OUT t_employees)
1159
+ IS
1160
+ BEGIN
1161
+ NULL;
1162
+ END;
1136
1163
  PROCEDURE insert_employees(p_employees IN t_employees) IS
1137
1164
  BEGIN
1138
1165
  FORALL i IN p_employees.FIRST..p_employees.LAST
@@ -1181,6 +1208,10 @@ describe "Parameter type mapping /" do
1181
1208
  plsql.test_collections.test_employees(@employees).should == [@employees, {:p_employees => @employees}]
1182
1209
  end
1183
1210
 
1211
+ it "should execute procedure with index-by table of records type (defined inside package) parameter" do
1212
+ plsql.test_collections.test_employees_prc(@employees).should == {:p_employees => @employees}
1213
+ end
1214
+
1184
1215
  it "should create temporary tables in autonomous transaction" do
1185
1216
  old_autocommit = plsql.connection.autocommit?
1186
1217
  plsql.connection.autocommit = false
@@ -1196,7 +1227,7 @@ describe "Parameter type mapping /" do
1196
1227
  before(:all) do
1197
1228
  # simulate Oracle 9.2 connection
1198
1229
  plsql(:oracle_9).connection = get_connection
1199
- plsql(:oracle_9).connection.stub!(:database_version).and_return([9, 2])
1230
+ plsql(:oracle_9).connection.stub!(:database_version).and_return([9, 2, 0, 0])
1200
1231
  end
1201
1232
 
1202
1233
  after(:all) do
@@ -269,7 +269,7 @@ describe "DBMS_OUTPUT logging" do
269
269
  end
270
270
 
271
271
  it "should log output when database version is less than 10.2" do
272
- plsql.connection.stub!(:database_version).and_return([9, 2])
272
+ plsql.connection.stub!(:database_version).and_return([9, 2, 0, 0])
273
273
  times = 2_000
274
274
  plsql.test_dbms_output_large("1234567890", times)
275
275
  @buffer.string.should == "DBMS_OUTPUT: 1234567890\n" * times
@@ -272,12 +272,12 @@ describe "Table" do
272
272
  plsql.test_employees.first(:employee_id => @employees.first[:employee_id]).should == @employees.first
273
273
  end
274
274
 
275
- it "should select records in table using WHERE condition and ORBER BY sorting" do
275
+ it "should select records in table using WHERE condition and ORDER BY sorting" do
276
276
  plsql.test_employees.all(:employee_id => @employees.first[:employee_id], :order_by => :employee_id).should == [@employees.first]
277
277
  end
278
278
 
279
279
  it "should select record in table using :column => nil condition" do
280
- employee = @employees.last
280
+ employee = @employees.last.dup
281
281
  employee[:employee_id] = employee[:employee_id] + 1
282
282
  employee[:hire_date] = nil
283
283
  plsql.test_employees.insert employee
@@ -285,6 +285,22 @@ describe "Table" do
285
285
  plsql.test_employees.first(:hire_date => nil).should == employee
286
286
  end
287
287
 
288
+ it "should select record in table using :column => :is_null condition" do
289
+ employee = @employees.last.dup
290
+ employee[:employee_id] = employee[:employee_id] + 1
291
+ employee[:hire_date] = nil
292
+ plsql.test_employees.insert employee
293
+ plsql.test_employees.first(:hire_date => :is_null).should == employee
294
+ end
295
+
296
+ it "should select record in table using :column => :is_not_null condition" do
297
+ employee = @employees.last.dup
298
+ employee[:employee_id] = employee[:employee_id] + 1
299
+ employee[:hire_date] = nil
300
+ plsql.test_employees.insert employee
301
+ plsql.test_employees.all(:hire_date => :is_not_null, :order_by => :employee_id).should == @employees
302
+ end
303
+
288
304
  it "should count records in table" do
289
305
  plsql.test_employees.select(:count).should == @employees.size
290
306
  plsql.test_employees.count.should == @employees.size
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-plsql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 4
8
+ - 3
9
+ version: 0.4.3
5
10
  platform: ruby
6
11
  authors:
7
12
  - Raimonds Simanovskis
@@ -9,39 +14,51 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-26 00:00:00 +02:00
17
+ date: 2010-03-25 00:00:00 +02:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: rspec
17
- type: :development
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 2
30
+ - 9
23
31
  version: 1.2.9
24
- version:
32
+ type: :development
33
+ version_requirements: *id001
25
34
  - !ruby/object:Gem::Dependency
26
35
  name: activerecord
27
- type: :development
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
30
38
  requirements:
31
39
  - - "="
32
40
  - !ruby/object:Gem::Version
41
+ segments:
42
+ - 2
43
+ - 3
44
+ - 5
33
45
  version: 2.3.5
34
- version:
46
+ type: :development
47
+ version_requirements: *id002
35
48
  - !ruby/object:Gem::Dependency
36
49
  name: activerecord-oracle_enhanced-adapter
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
40
52
  requirements:
41
53
  - - ">="
42
54
  - !ruby/object:Gem::Version
55
+ segments:
56
+ - 1
57
+ - 2
58
+ - 4
43
59
  version: 1.2.4
44
- version:
60
+ type: :development
61
+ version_requirements: *id003
45
62
  description: |
46
63
  ruby-plsql gem provides simple Ruby API for calling Oracle PL/SQL procedures.
47
64
  It could be used both for accessing Oracle PL/SQL API procedures in legacy applications
@@ -105,18 +122,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
122
  requirements:
106
123
  - - ">="
107
124
  - !ruby/object:Gem::Version
125
+ segments:
126
+ - 0
108
127
  version: "0"
109
- version:
110
128
  required_rubygems_version: !ruby/object:Gem::Requirement
111
129
  requirements:
112
130
  - - ">="
113
131
  - !ruby/object:Gem::Version
132
+ segments:
133
+ - 0
114
134
  version: "0"
115
- version:
116
135
  requirements: []
117
136
 
118
137
  rubyforge_project:
119
- rubygems_version: 1.3.5
138
+ rubygems_version: 1.3.6
120
139
  signing_key:
121
140
  specification_version: 3
122
141
  summary: Ruby API for calling Oracle PL/SQL procedures.