activerecord-sqlserver-adapter-schemas 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,15 +3,6 @@ module Schemas
3
3
  module ConnectionAdapters
4
4
 
5
5
  module SqlserverAdapter
6
-
7
- # When this module is included, the following methods are chained in order
8
- # to strip off the schema names if the schema is the default schema
9
- def self.included(base)
10
- base.alias_method_chain :columns, :default_schema_check
11
- base.alias_method_chain :table_exists?, :default_schema_check
12
- base.alias_method_chain :table_name_or_views_table_name, :default_schema_check
13
- end
14
-
15
6
  def default_schema
16
7
  unless sqlserver_2000?
17
8
  @default_schema ||= select_values("SELECT default_schema_name FROM sys.database_principals WHERE type = 'S' and name = '#{self.quote_string(@connection_options[:username])}'").first
@@ -20,21 +11,6 @@ module SqlserverAdapter
20
11
  end
21
12
  attr_writer :default_schema
22
13
 
23
- def table_name_or_views_table_name_with_default_schema_check(table_name)
24
- table_name = unqualify_table_name_if_default_schema(table_name)
25
- table_name_or_views_table_name_without_default_schema_check(table_name)
26
- end
27
-
28
- def table_exists_with_default_schema_check?(table_name)
29
- table_name = unqualify_table_name_if_default_schema(table_name)
30
- table_exists_without_default_schema_check?(table_name)
31
- end
32
-
33
- def columns_with_default_schema_check(table_name, column_name = nil)
34
- table_name = unqualify_table_name_if_default_schema(table_name) if table_name
35
- columns_without_default_schema_check(table_name, column_name)
36
- end
37
-
38
14
  def unqualify_schema_name(table_name)
39
15
  parts = table_name.to_s.split('.')
40
16
  parts.length == 1 || parts[parts.length - 2].blank? ? default_schema : parts[parts.length - 2].gsub(/[\[\]]/,'')
@@ -12,6 +12,16 @@ end
12
12
  class ActiveRecord::ConnectionAdapters::SQLServerAdapter
13
13
  include ActiveRecord::Schemas::ConnectionAdapters::SqlserverAdapter
14
14
 
15
+ def table_exists?(table_name)
16
+ table_name = unqualify_table_name_if_default_schema(table_name)
17
+ super(table_name) || tables.include?(table_name) || views.include?(table_name)
18
+ end
19
+
20
+ def table_name_or_views_table_name(table_name)
21
+ unquoted_table_name = unqualify_table_name_if_default_schema(table_name)
22
+ views.include?(unquoted_table_name) ? view_table_name(unquoted_table_name) : unquoted_table_name
23
+ end
24
+
15
25
  # This method is overridden to support linked servers
16
26
  def unqualify_db_name(table_name)
17
27
  table_names = table_name.to_s.split('.')
@@ -31,12 +41,20 @@ class ActiveRecord::ConnectionAdapters::SQLServerAdapter
31
41
  # This method is overridden to support schema names
32
42
  def views(name = nil)
33
43
  # return schema.view unless the schema is the default schema, in which case just return view
34
- @sqlserver_views_cache ||=
35
- info_schema_query do
36
- select_values("SELECT TABLE_SCHEMA + '.' + TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME NOT IN ('sysconstraints','syssegments')").collect do |view|
37
- default_schema && view.index("#{default_schema}.") == 0 ? view[default_schema.length + 1..view.length] : view
38
- end
39
- end
44
+ info_schema_query do
45
+ select_values("SELECT TABLE_SCHEMA + '.' + TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME NOT IN ('sysconstraints','syssegments')").collect do |view|
46
+ default_schema && view.index("#{default_schema}.") == 0 ? view[default_schema.length + 1..view.length] : view
47
+ end
48
+ end
49
+ end
50
+
51
+ def columns(table_name, name = nil)
52
+ return [] if table_name.blank?
53
+ cache_key = unqualify_table_name_if_default_schema(table_name)
54
+ @sqlserver_columns_cache[cache_key] ||= column_definitions(table_name).collect do |ci|
55
+ sqlserver_options = ci.except(:name,:default_value,:type,:null).merge(:database_year=>database_year)
56
+ ::ActiveRecord::ConnectionAdapters::SQLServerColumn.new ci[:name], ci[:default_value], ci[:type], ci[:null], sqlserver_options
57
+ end
40
58
  end
41
59
 
42
60
  # This method is overridden to support references such as database..table
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'active_record'
3
+ require 'activerecord-sqlserver-adapter'
4
+ require File.join(File.dirname(__FILE__), '..', '..', 'lib', 'activerecord-sqlserver-adapter-schemas')
5
+
6
+ ActiveRecord::Base.configurations = {
7
+ 'arunit' => {
8
+ :adapter => 'sqlserver',
9
+ :mode => 'ODBC',
10
+ :host => 'localhost',
11
+ :username => 'rails',
12
+ :dsn => ENV['ACTIVERECORD_UNITTEST_DSN'] || 'activerecord_unittest',
13
+ :database => 'activerecord_unittest'
14
+ }
15
+ }
16
+ ActiveRecord::Base.establish_connection 'arunit'
17
+ ActiveRecord::Base.connection.default_schema = 'dbo'
18
+
19
+ unless ActiveRecord::Base.connection.table_exists?('schema_checks')
20
+ ActiveRecord::Base.connection.create_table 'schema_checks' do |table|
21
+ table.string :name, :limit => 32
22
+ table.timestamps
23
+ end
24
+ end
25
+
26
+ unless ActiveRecord::Base.connection.table_exists?('schema_checks_view')
27
+ ActiveRecord::Base.connection.execute "create view schema_checks_view as select * from schema_checks"
28
+ end
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+ require 'test/unit'
3
+ require File.join(File.dirname(__FILE__), 'connection')
4
+
5
+ module Schemas
6
+
7
+ class Definitions < Test::Unit::TestCase
8
+ def setup
9
+ con.default_schema = 'dbo'
10
+ end
11
+
12
+ def test_column_definitions
13
+ assert con.column_definitions('schema_checks').length.nonzero?
14
+ assert con.column_definitions('dbo.schema_checks').length.nonzero?
15
+ assert con.column_definitions('activerecord_unittest..schema_checks').length.nonzero?
16
+ assert con.column_definitions('activerecord_unittest.dbo.schema_checks').length.nonzero?
17
+ assert con.column_definitions('foo.schema_checks').length.zero?
18
+
19
+ con.default_schema = 'foo'
20
+ assert con.column_definitions('schema_checks').length.zero?
21
+ assert con.column_definitions('dbo.schema_checks').length.nonzero?
22
+ assert con.column_definitions('activerecord_unittest..schema_checks').length.zero?
23
+ assert con.column_definitions('activerecord_unittest.dbo.schema_checks').length.nonzero?
24
+ assert con.column_definitions('activerecord_unittest.foo.schema_checks').length.zero?
25
+ end
26
+
27
+ def test_view_information
28
+ assert_nil con.view_information 'foo.schema_checks_view'
29
+ assert_not_nil con.view_information 'dbo.schema_checks_view'
30
+ assert_not_nil con.view_information 'schema_checks_view'
31
+ assert_not_nil con.view_information 'activerecord_unittest.dbo.schema_checks_view'
32
+ assert_not_nil con.view_information 'activerecord_unittest..schema_checks_view'
33
+ end
34
+
35
+ def test_columns
36
+ assert con.columns('schema_checks').length.nonzero?
37
+ assert con.columns('dbo.schema_checks').length.nonzero?
38
+ assert con.columns('foo.schema_checks').length.zero?
39
+ assert con.columns('activerecord_unittest..schema_checks').length.nonzero?
40
+ assert con.columns('activerecord_unittest.dbo.schema_checks').length.nonzero?
41
+ assert con.columns('activerecord_unittest.foo.schema_checks').length.zero?
42
+ end
43
+
44
+ def con
45
+ con = ActiveRecord::Base.connection
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ require 'test/unit'
3
+ require File.join(File.dirname(__FILE__), 'connection')
4
+
5
+ module Schemas
6
+
7
+ class Quoting < Test::Unit::TestCase
8
+ def setup
9
+ con.default_schema = 'dbo'
10
+ end
11
+
12
+ def test_quote_column_name
13
+ assert_equal con.quote_column_name('schema_checks'), '[schema_checks]'
14
+ assert_equal con.quote_column_name('dbo.schema_checks'), '[dbo].[schema_checks]'
15
+ assert_equal con.quote_column_name('activerecord_unittest..schema_checks'), '[activerecord_unittest]..[schema_checks]'
16
+ assert_equal con.quote_column_name('activerecord_unittest.dbo.schema_checks'), '[activerecord_unittest].[dbo].[schema_checks]'
17
+ end
18
+
19
+ def con
20
+ con = ActiveRecord::Base.connection
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env ruby
2
+ require 'test/unit'
3
+ require File.join(File.dirname(__FILE__), 'connection')
4
+
5
+ module Schemas
6
+
7
+ class TableChecks < Test::Unit::TestCase
8
+ def setup
9
+ con.default_schema = 'dbo'
10
+ end
11
+
12
+ def test_tables
13
+ # test that tables() prefixes the table name with the schema if the schema is not the default schema
14
+ assert_nil con.tables.find { |table| table.start_with?('dbo.') }
15
+ con.default_schema = 'foo'
16
+ assert_not_nil con.tables.find { |table| table.start_with?('dbo.') }
17
+ end
18
+
19
+ def test_views
20
+ # test that views() prefixes the table name with the schema if the schema is not the default schema
21
+ assert_nil con.views.find { |table| table.start_with?('dbo.') }
22
+ con.default_schema = 'foo'
23
+ assert_not_nil con.views.find { |table| table.start_with?('dbo.') }
24
+ end
25
+
26
+ def test_table_exists
27
+ assert con.table_exists?('dbo.schema_checks')
28
+ assert con.table_exists?('schema_checks')
29
+ assert !con.table_exists?('foo.schema_checks')
30
+
31
+ con.default_schema = 'foo'
32
+ assert con.table_exists?('dbo.schema_checks')
33
+ assert !con.table_exists?('schema_checks')
34
+ assert !con.table_exists?('foo.schema_checks')
35
+ end
36
+
37
+ def test_table_name_or_views_table_name
38
+ assert_equal con.table_name_or_views_table_name('schema_checks'), 'schema_checks'
39
+ assert_equal con.table_name_or_views_table_name('dbo.schema_checks'), 'schema_checks'
40
+ assert_equal con.table_name_or_views_table_name('activerecord_unittest.dbo.schema_checks'), 'schema_checks'
41
+ assert_equal con.table_name_or_views_table_name('activerecord_unittest..schema_checks'), 'schema_checks'
42
+ assert_equal con.table_name_or_views_table_name('activerecord_unittest.foo.schema_checks'), 'activerecord_unittest.foo.schema_checks'
43
+ assert_equal con.table_name_or_views_table_name('foo.schema_checks'), 'foo.schema_checks'
44
+
45
+ con.default_schema = 'foo'
46
+ assert_equal con.table_name_or_views_table_name('schema_checks'), 'schema_checks'
47
+ assert_equal con.table_name_or_views_table_name('dbo.schema_checks'), 'dbo.schema_checks'
48
+ assert_equal con.table_name_or_views_table_name('activerecord_unittest.dbo.schema_checks'), 'activerecord_unittest.dbo.schema_checks'
49
+ assert_equal con.table_name_or_views_table_name('activerecord_unittest..schema_checks'), 'schema_checks'
50
+ assert_equal con.table_name_or_views_table_name('activerecord_unittest.foo.schema_checks'), 'schema_checks'
51
+ assert_equal con.table_name_or_views_table_name('foo.schema_checks'), 'schema_checks'
52
+ end
53
+
54
+ def con
55
+ con = ActiveRecord::Base.connection
56
+ end
57
+ end
58
+
59
+ end
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+ require 'test/unit'
3
+ require File.join(File.dirname(__FILE__), 'connection')
4
+
5
+ module Schemas
6
+
7
+ class Unqualify < Test::Unit::TestCase
8
+ def setup
9
+ con.default_schema = 'dbo'
10
+ end
11
+
12
+ def test_unqualify_schema_name
13
+ assert_equal con.unqualify_schema_name('MyDatabase.foo.my_table'), 'foo'
14
+ assert_equal con.unqualify_schema_name('MyDatabase..my_table'), 'dbo'
15
+ assert_equal con.unqualify_schema_name('foo.MyTable'), 'foo'
16
+ assert_equal con.unqualify_schema_name('MyTable'), 'dbo'
17
+ assert_equal con.unqualify_schema_name('LinkedServer.MyDatabase.foo.my_table'), 'foo'
18
+ end
19
+
20
+ def test_unqualify_table_name_if_default_schema
21
+ assert_equal con.unqualify_table_name_if_default_schema('my_table'), 'my_table'
22
+
23
+ assert_equal con.unqualify_table_name_if_default_schema('dbo.my_table'), 'my_table'
24
+ assert_equal con.unqualify_table_name_if_default_schema('foo.my_table'), 'foo.my_table'
25
+
26
+ # Are these next 3 tests really the correct behavior?
27
+ assert_equal con.unqualify_table_name_if_default_schema('MyDatabase..my_table'), 'my_table'
28
+ assert_equal con.unqualify_table_name_if_default_schema('LinkedServer.MyDatabase.dbo.my_table'), 'my_table'
29
+ assert_equal con.unqualify_table_name_if_default_schema('LinkedServer.MyDatabase.foo.my_table'), 'LinkedServer.MyDatabase.foo.my_table'
30
+ end
31
+
32
+ def test_unqualify_db_name
33
+ assert_equal con.unqualify_db_name('LinkedServer.MyDatabase.dbo.my_table'), 'LinkedServer.MyDatabase'
34
+ assert_equal con.unqualify_db_name('MyDatabase.dbo.my_table'), 'MyDatabase'
35
+ assert_equal con.unqualify_db_name('MyDatabase..my_table'), 'MyDatabase'
36
+ end
37
+
38
+ def con
39
+ con = ActiveRecord::Base.connection
40
+ end
41
+ end
42
+
43
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-sqlserver-adapter-schemas
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Airlite Plastics
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-07-08 00:00:00 -05:00
12
+ date: 2010-07-09 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -36,6 +36,11 @@ files:
36
36
  - lib/activerecord-sqlserver-adapter-schemas.rb
37
37
  - lib/active_record/schemas/base.rb
38
38
  - lib/active_record/schemas/connection_adapters/sqlserver_adapter.rb
39
+ - test/schemas/connection.rb
40
+ - test/schemas/definitions.rb
41
+ - test/schemas/quoting.rb
42
+ - test/schemas/table_checks.rb
43
+ - test/schemas/unqualify.rb
39
44
  has_rdoc: true
40
45
  homepage:
41
46
  licenses: []