sequel_oracle_extensions 0.5.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ begin
11
11
  gem.homepage = "http://github.com/joekhoobyar/sequel_oracle_extensions"
12
12
  gem.authors = ["Joe Khoobyar"]
13
13
  gem.add_dependency "sequel", ">= 3.10.0"
14
- gem.add_development_dependency "rspec", ">= 2.0.0.beta.8"
14
+ gem.add_development_dependency "rspec", ">= 2.0.0"
15
15
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
16
  end
17
17
  Jeweler::GemcutterTasks.new
@@ -20,10 +20,10 @@ rescue LoadError
20
20
  end
21
21
 
22
22
  require 'rspec/core/rake_task'
23
- Rspec::Core::RakeTask.new(:rspec) do |spec|
23
+ RSpec::Core::RakeTask.new(:rspec) do |spec|
24
24
  spec.pattern = FileList['spec/**/*_spec.rb']
25
25
  end
26
- Rspec::Core::RakeTask.new(:rcov) do |spec|
26
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
27
27
  spec.pattern = 'spec/**/*_spec.rb'
28
28
  spec.rcov = true
29
29
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.1
1
+ 0.5.2
@@ -9,27 +9,28 @@ module Sequel
9
9
  SELECT_INDEXES_SQL = %q{
10
10
  SELECT i.index_name, i.status, i.uniqueness, ic.column_name
11
11
  FROM all_indexes i
12
- INNER JOIN all_ind_columns ic ON ic.index_owner = i.owner AND ic.index_name = i.index_name
13
- WHERE i.table_name = ? AND i.dropped = 'NO' AND NOT EXISTS (
14
- SELECT uc.index_name FROM all_constraints uc
15
- WHERE uc.index_name = i.index_name AND uc.owner = i.owner AND uc.constraint_type = 'P'
16
- )
12
+ INNER JOIN all_ind_columns ic
13
+ ON ic.index_owner = i.owner AND ic.index_name = i.index_name
14
+ WHERE i.table_name = ? AND i.dropped = 'NO'
17
15
  ORDER BY status DESC, index_name, ic.column_position
18
16
  }.freeze
19
17
 
20
- SELECT_PRIMARY_KEY_SQL = %q{
21
- SELECT c.constraint_name, c.index_name, c.status, cc.column_name
22
- FROM all_constraints c
23
- INNER JOIN all_cons_columns cc ON cc.owner = c.owner AND cc.constraint_name = c.constraint_name
24
- WHERE c.table_name = ? AND c.constraint_type = 'P'
25
- ORDER BY status DESC, constraint_name, cc.position
26
- }.freeze
27
-
28
- # Returns the indexes for the given table, excluding any primary keys.
29
- def indexes(table)
30
- m = output_identifier_meth
18
+ # Returns the indexes for the given table. By default, it does not return primary keys.
19
+ #
20
+ # * <tt>:all</tt> - Returns all indexes, even primary keys.
21
+ def indexes(table, options={})
22
+ sql, m = SELECT_INDEXES_SQL, output_identifier_meth
31
23
  table = m[table]
32
24
  ixs = Hash.new{|h,k| h[k] = {:table_name=>table, :columns=>[]}}
25
+
26
+ if options[:all]
27
+ sql = sql.sub /ORDER BY /, %q{ AND NOT EXISTS (
28
+ SELECT uc.index_name FROM all_constraints uc
29
+ WHERE uc.index_name = i.index_name AND uc.owner = i.owner AND uc.constraint_type = 'P'
30
+ )
31
+ ORDER BY }
32
+ end
33
+
33
34
  metadata_dataset.with_sql(SELECT_INDEXES_SQL, table.to_s.upcase).each do |r|
34
35
  r = Hash[ r.map{|k,v| [k, (k==:index_name || k==:column_name) ? m[v] : v]} ]
35
36
  ix = ixs[m.call r.delete(:index_name)]
@@ -40,40 +41,83 @@ ORDER BY status DESC, constraint_name, cc.position
40
41
  end
41
42
  ixs
42
43
  end
43
-
44
- # Returns the primary key for the given table, as a hash.
44
+
45
+ # Returns the primary key for the given +table+ (or +schema.table+), as a hash.
45
46
  #
46
47
  # * <tt>:enabled</tt> - Only look for keys that are enabled (true) or disabled (false). By default (nil),
47
- # looks for all matching keys.
48
- # * <tt>:all</tt> - Returns all matching keys. By default, returns the first matching key - provided
49
- # that either there is only one key or that only the key is enabled.
50
- # * <tt>:first</tt> - Returns the first matching key.
51
- def primary_key(table, options={})
52
- sql, m = SELECT_PRIMARY_KEY_SQL, output_identifier_meth
53
- table, pks = m[table], []
54
- pkh = Hash.new{|h,k| pks.push(h[k]=v={:table_name=>table, :columns=>[]}); v }
55
-
56
- unless (z = options[:enabled]).nil?
57
- sql = sql.sub /WHERE /, "WHERE c.status = #{z ? 'ENABLED' : 'DISABLED'}"
58
- end
59
-
60
- metadata_dataset.with_sql(sql, table.to_s.upcase).each do |r|
61
- if options[:first] && pks.length==1 && r[:constraint_name] != pks[:constraint_name]
62
- return pks.first
63
- end
64
-
65
- r = Hash[ r.map{|k,v| [k, (k==:status || v.nil? || v=='') ? v : m[v]]} ]
66
- pk = pkh[m.call r[:constraint_name]]
67
- pk[:enabled] = r.delete(:status)=='ENABLED'
68
- pk[:columns] << r.delete(:column_name)
69
- pk.update r
70
- end
48
+ # looks for any matching key.
49
+ # * <tt>:all</tt> - Return an array of matching keys, instead of the first matching key.
50
+ #
51
+ def primary_key(qualified_table, options={})
52
+ result = table_constraints(qualified_table, options) do |ds,table_name,x_cons|
53
+ ds.where(:c__constraint_type=>'P', :c__table_name=>table_name).
54
+ order(:status.desc, :index_name, :cc__position)
55
+ end
56
+ options[:all] ? result : result.first
57
+ end
71
58
 
72
- unless options[:all] or (pks.length>1 and pks[0][:enabled] != pks[1][:enabled])
73
- return pks.first
74
- end
75
- pks
59
+ # Returns the foreign keys defined on the given +table+ (or +schema.table+), as an array of hashes.
60
+ #
61
+ # * <tt>:enabled</tt> - Only look for keys that are enabled (true) or disabled (false). By default (nil),
62
+ # looks for all matching keys.
63
+ def foreign_keys(qualified_table, options={})
64
+ table_constraints(qualified_table, options) do |ds,table_name,x_cons|
65
+ ds.where(:c__constraint_type=>'R', :c__table_name=>table_name).
66
+ order(:table_name, :constraint_name, :cc__position)
67
+ end
68
+ end
69
+
70
+ # Returns foreign keys that refer to the given +table+ (or +schema.table+), as an array of hashes.
71
+ #
72
+ # * <tt>:enabled</tt> - Only look for keys that are enabled (true) or disabled (false). By default (nil),
73
+ # looks for all matching keys.
74
+ def references(qualified_table, options={})
75
+ table_constraints(qualified_table, options) do |ds,table_name,x_cons|
76
+ ds.join(:"#{x_cons}traints___t", [[:owner,:c__r_owner], [:constraint_name,:c__r_constraint_name]]).
77
+ where(:c__constraint_type=>'R', :t__constraint_type=>'P', :t__table_name=>table_name).
78
+ order(:table_name, :constraint_name, :cc__position)
79
+ end
76
80
  end
81
+
82
+ private
83
+
84
+ # Internal helper method for introspection of table constraints.
85
+ def table_constraints(qualified_table,options={})
86
+ ds, result = metadata_dataset, []
87
+ schema, table = ds.schema_and_table(qualified_table)
88
+ x_cons = schema.nil? ? 'user_cons' : 'all_cons'
89
+ inm = ds.identifier_input_method
90
+
91
+ # Build the dataset and apply filters for introspection of constraints.
92
+ # Also allows the caller to customize the dataset.
93
+ ds = ds.select(:c__constraint_name, :c__table_name, :c__rely, :c__status, :c__validated,
94
+ :cc__column_name, :c__index_name, :c__constraint_type).
95
+ from(:"#{x_cons}traints___c").
96
+ join(:"#{x_cons}_columns___cc", [[:owner,:owner], [:constraint_name,:constraint_name]])
97
+ unless schema.nil?
98
+ ds = ds.where :c__owner => schema.to_s.send(inm)
99
+ end
100
+ unless (z = options[:enabled]).nil?
101
+ ds = ds.where :status => (z ? 'ENABLED' : 'DISABLED')
102
+ end
103
+ ds = yield ds, table.to_s.send(inm), x_cons
104
+
105
+ # Return the table constraints as an array of hashes, including a column list.
106
+ hash = Hash.new do |h,k|
107
+ result.push :constraint_name=>ds.send(:output_identifier,k), :columns=>[]
108
+ h[k] = result.last
109
+ end
110
+ ds.each do |row|
111
+ ref = hash[row[:constraint_name]]
112
+ ref[:table_name]||= ds.send(:output_identifier,row.delete(:table_name))
113
+ ref[:columns] << ds.send(:output_identifier,row.delete(:column_name))
114
+ ref[:rely] ||= row.delete(:rely)=='RELY'
115
+ ref[:enabled] ||= row.delete(:status)=='ENABLED'
116
+ ref[:validated] ||= row.delete(:validated)=='VALIDATED'
117
+ ref[:index_name]||= ds.send(:output_identifier,row.delete(:index_name)) if row[:index_name]
118
+ end
119
+ result
120
+ end
77
121
  end
78
122
  end
79
123
  end
@@ -1,64 +1,56 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{sequel_oracle_extensions}
8
- s.version = "0.5.1"
8
+ s.version = "0.5.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Joe Khoobyar"]
12
- s.date = %q{2010-05-27}
12
+ s.date = %q{2011-08-16}
13
13
  s.description = %q{Oracle extensions for Sequel, including MERGE statements, optimizer hints, and schema extensions.}
14
14
  s.email = %q{joe@ankhcraft.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
- "README.rdoc"
17
+ "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
- ".gitignore",
22
- ".rspec",
23
- "LICENSE",
24
- "README.rdoc",
25
- "Rakefile",
26
- "VERSION",
27
- "lib/sequel/oracle_extensions.rb",
28
- "lib/sequel/oracle_extensions/hints.rb",
29
- "lib/sequel/oracle_extensions/merge.rb",
30
- "lib/sequel/oracle_extensions/schemata.rb",
31
- "lib/sequel_oracle_extensions.rb",
32
- "sequel_oracle_extensions.gemspec",
33
- "spec/sequel/oracle_extensions/hints_spec.rb",
34
- "spec/sequel/oracle_extensions/merge_spec.rb",
35
- "spec/spec_helper.rb"
21
+ ".rspec",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/sequel/oracle_extensions.rb",
27
+ "lib/sequel/oracle_extensions/hints.rb",
28
+ "lib/sequel/oracle_extensions/merge.rb",
29
+ "lib/sequel/oracle_extensions/schemata.rb",
30
+ "lib/sequel_oracle_extensions.rb",
31
+ "sequel_oracle_extensions.gemspec",
32
+ "spec/sequel/oracle_extensions/hints_spec.rb",
33
+ "spec/sequel/oracle_extensions/merge_spec.rb",
34
+ "spec/spec_helper.rb"
36
35
  ]
37
36
  s.homepage = %q{http://github.com/joekhoobyar/sequel_oracle_extensions}
38
- s.rdoc_options = ["--charset=UTF-8"]
39
37
  s.require_paths = ["lib"]
40
- s.rubygems_version = %q{1.3.6}
38
+ s.rubygems_version = %q{1.5.2}
41
39
  s.summary = %q{Oracle MERGE, optimizer hints, an schema extensions for Sequel}
42
- s.test_files = [
43
- "spec/sequel/oracle_extensions/hints_spec.rb",
44
- "spec/sequel/oracle_extensions/merge_spec.rb",
45
- "spec/spec_helper.rb"
46
- ]
47
40
 
48
41
  if s.respond_to? :specification_version then
49
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
42
  s.specification_version = 3
51
43
 
52
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
44
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
45
  s.add_runtime_dependency(%q<sequel>, [">= 3.10.0"])
54
- s.add_development_dependency(%q<rspec>, [">= 2.0.0.beta.8"])
46
+ s.add_development_dependency(%q<rspec>, [">= 2.0.0"])
55
47
  else
56
48
  s.add_dependency(%q<sequel>, [">= 3.10.0"])
57
- s.add_dependency(%q<rspec>, [">= 2.0.0.beta.8"])
49
+ s.add_dependency(%q<rspec>, [">= 2.0.0"])
58
50
  end
59
51
  else
60
52
  s.add_dependency(%q<sequel>, [">= 3.10.0"])
61
- s.add_dependency(%q<rspec>, [">= 2.0.0.beta.8"])
53
+ s.add_dependency(%q<rspec>, [">= 2.0.0"])
62
54
  end
63
55
  end
64
56
 
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel_oracle_extensions
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 15
5
+ prerelease:
5
6
  segments:
6
7
  - 0
7
8
  - 5
8
- - 1
9
- version: 0.5.1
9
+ - 2
10
+ version: 0.5.2
10
11
  platform: ruby
11
12
  authors:
12
13
  - Joe Khoobyar
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-05-27 00:00:00 -04:00
18
+ date: 2011-08-16 00:00:00 -04:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: sequel
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 47
27
30
  segments:
28
31
  - 3
29
32
  - 10
@@ -35,16 +38,16 @@ dependencies:
35
38
  name: rspec
36
39
  prerelease: false
37
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
38
42
  requirements:
39
43
  - - ">="
40
44
  - !ruby/object:Gem::Version
45
+ hash: 15
41
46
  segments:
42
47
  - 2
43
48
  - 0
44
49
  - 0
45
- - beta
46
- - 8
47
- version: 2.0.0.beta.8
50
+ version: 2.0.0
48
51
  type: :development
49
52
  version_requirements: *id002
50
53
  description: Oracle extensions for Sequel, including MERGE statements, optimizer hints, and schema extensions.
@@ -58,7 +61,6 @@ extra_rdoc_files:
58
61
  - README.rdoc
59
62
  files:
60
63
  - .document
61
- - .gitignore
62
64
  - .rspec
63
65
  - LICENSE
64
66
  - README.rdoc
@@ -78,32 +80,34 @@ homepage: http://github.com/joekhoobyar/sequel_oracle_extensions
78
80
  licenses: []
79
81
 
80
82
  post_install_message:
81
- rdoc_options:
82
- - --charset=UTF-8
83
+ rdoc_options: []
84
+
83
85
  require_paths:
84
86
  - lib
85
87
  required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
86
89
  requirements:
87
90
  - - ">="
88
91
  - !ruby/object:Gem::Version
92
+ hash: 3
89
93
  segments:
90
94
  - 0
91
95
  version: "0"
92
96
  required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
93
98
  requirements:
94
99
  - - ">="
95
100
  - !ruby/object:Gem::Version
101
+ hash: 3
96
102
  segments:
97
103
  - 0
98
104
  version: "0"
99
105
  requirements: []
100
106
 
101
107
  rubyforge_project:
102
- rubygems_version: 1.3.6
108
+ rubygems_version: 1.5.2
103
109
  signing_key:
104
110
  specification_version: 3
105
111
  summary: Oracle MERGE, optimizer hints, an schema extensions for Sequel
106
- test_files:
107
- - spec/sequel/oracle_extensions/hints_spec.rb
108
- - spec/sequel/oracle_extensions/merge_spec.rb
109
- - spec/spec_helper.rb
112
+ test_files: []
113
+
data/.gitignore DELETED
@@ -1,21 +0,0 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
-
21
- ## PROJECT::SPECIFIC