oracle_enhanced_plus_xmltype 0.0.1

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/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in oracle_enhanced_plus_xmltype.gemspec
4
+ gemspec
5
+
6
+ gem 'rails', '3.1.0.rc4'
7
+ gem 'ruby-oci8', '2.0.6'
8
+ #gem 'activerecord-oracle_enhanced-adapter', '1.3.2'
9
+ gem 'activerecord-oracle_enhanced-adapter', :git => "https://github.com/rsim/oracle-enhanced.git"
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,35 @@
1
+ # define railtie which will be executed in Rails 3
2
+ require "oracle_enhanced_plus_xmltype/oracle_enhanced_adapter_with_xmltype"
3
+ require "oracle_enhanced_plus_xmltype/oracle_enhanced_column_with_xmltype"
4
+ require "oracle_enhanced_plus_xmltype/oracle_enhanced_oci_connection_with_xmltype"
5
+ require "oracle_enhanced_plus_xmltype/oracle_enhanced_schema_definitions_with_xmltype"
6
+
7
+ if defined?(::Rails::Railtie)
8
+
9
+ module ActiveRecord
10
+ module ConnectionAdapters
11
+ class OracleEnhancedPlusXMLTypeRailtie < ::Rails::Railtie
12
+
13
+ ActiveSupport.on_load(:active_record) do
14
+ ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do
15
+ self.send :include, ::OracleEnhancedAdapterPlusXmltype
16
+ end
17
+ ActiveRecord::ConnectionAdapters::OracleEnhancedColumn.class_eval do
18
+ self.send :include, ::OracleEnhancedColumnWithXmltype
19
+ end
20
+
21
+ ActiveRecord::ConnectionAdapters::OracleEnhancedOCIConnection.class_eval do
22
+ self.send :include, ::OracleEnhancedOCIConnectionWithXmltype
23
+ end
24
+
25
+ ActiveRecord::ConnectionAdapters::TableDefinition.class_eval do
26
+ self.send :include, ::OracleEnhancedSchemaDefinitionsPlusXmltype
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,107 @@
1
+ module OracleEnhancedAdapterPlusXmltype
2
+ module ClassMethods
3
+
4
+ end
5
+
6
+ module InstanceMethods
7
+
8
+ def quote_xml(value, quoted = true)
9
+ case value
10
+ when Hash
11
+ quoted ? "'#{value.to_xml}'" : value.to_xml
12
+ else
13
+ raise ArgumentError, "XMLTYPE column must be of type Hash"
14
+ end
15
+
16
+ end
17
+
18
+
19
+ def quote(value, column = nil) #:nodoc:
20
+ if value && column
21
+ case column.type
22
+ when :xmltype
23
+ quote_xml(value)
24
+ when :text, :binary
25
+ %Q{empty_#{ column.sql_type.downcase rescue 'blob' }()}
26
+ # NLS_DATE_FORMAT independent TIMESTAMP support
27
+ when :timestamp
28
+ quote_timestamp_with_to_timestamp(value)
29
+ # NLS_DATE_FORMAT independent DATE support
30
+ when :date, :time, :datetime
31
+ quote_date_with_to_date(value)
32
+ when :raw
33
+ quote_raw(value)
34
+ when :string
35
+ # NCHAR and NVARCHAR2 literals should be quoted with N'...'.
36
+ # Read directly instance variable as otherwise migrations with table column default values are failing
37
+ # as migrations pass ColumnDefinition object to this method.
38
+ # Check if instance variable is defined to avoid warnings about accessing undefined instance variable.
39
+ column.instance_variable_defined?('@nchar') && column.instance_variable_get('@nchar') ? 'N' << super : super
40
+ else
41
+ super
42
+ end
43
+ elsif value.acts_like?(:date)
44
+ quote_date_with_to_date(value)
45
+ elsif value.acts_like?(:time)
46
+ value.to_i == value.to_f ? quote_date_with_to_date(value) : quote_timestamp_with_to_timestamp(value)
47
+ else
48
+ super
49
+ end
50
+ end
51
+
52
+ def type_cast(value, column)
53
+ case value
54
+ when true, false
55
+ if emulate_booleans_from_strings || column && column.type == :string
56
+ self.class.boolean_to_string(value)
57
+ else
58
+ value ? 1 : 0
59
+ end
60
+ when Date, Time
61
+ if value.acts_like?(:time)
62
+ zone_conversion_method = ActiveRecord::Base.default_timezone == :utc ? :getutc : :getlocal
63
+ value.respond_to?(zone_conversion_method) ? value.send(zone_conversion_method) : value
64
+ else
65
+ value
66
+ end
67
+ else
68
+ if column.type == :xmltype
69
+ quote_xml(value, false)
70
+ else
71
+ super
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ def self.included(receiver)
78
+ receiver.extend ClassMethods
79
+ receiver.send :include, InstanceMethods
80
+ receiver.class_eval do
81
+ self.send :remove_const, "NATIVE_DATABASE_TYPES"
82
+ self.send :remove_const, "NATIVE_DATABASE_TYPES_BOOLEAN_STRINGS"
83
+ self.const_set("NATIVE_DATABASE_TYPES", {
84
+ :primary_key => "NUMBER(38) NOT NULL PRIMARY KEY",
85
+ :string => { :name => "VARCHAR2", :limit => 255 },
86
+ :text => { :name => "CLOB" },
87
+ :xmltype => { :name => "XMLTYPE" },
88
+ :integer => { :name => "NUMBER", :limit => 38 },
89
+ :float => { :name => "NUMBER" },
90
+ :decimal => { :name => "DECIMAL" },
91
+ :datetime => { :name => "DATE" },
92
+ # changed to native TIMESTAMP type
93
+ # :timestamp => { :name => "DATE" },
94
+ :timestamp => { :name => "TIMESTAMP" },
95
+ :time => { :name => "DATE" },
96
+ :date => { :name => "DATE" },
97
+ :binary => { :name => "BLOB" },
98
+ :boolean => { :name => "NUMBER", :limit => 1 },
99
+ :raw => { :name => "RAW", :limit => 2000 }
100
+ }
101
+ )
102
+ self.const_set("NATIVE_DATABASE_TYPES_BOOLEAN_STRINGS", self.const_get("NATIVE_DATABASE_TYPES").dup.merge(
103
+ :boolean => { :name => "VARCHAR2", :limit => 1 }
104
+ ))
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,53 @@
1
+ module OracleEnhancedColumnWithXmltype
2
+ module ClassMethods
3
+
4
+ end
5
+
6
+ module InstanceMethods
7
+ def simplified_type(field_type)
8
+ forced_column_type ||
9
+ case field_type
10
+ when /decimal|numeric|number/i
11
+ if OracleEnhancedAdapter.emulate_booleans && field_type == 'NUMBER(1)'
12
+ :boolean
13
+ elsif extract_scale(field_type) == 0 ||
14
+ # if column name is ID or ends with _ID
15
+ OracleEnhancedAdapter.emulate_integers_by_column_name && OracleEnhancedAdapter.is_integer_column?(name, table_name)
16
+ :integer
17
+ else
18
+ :decimal
19
+ end
20
+ when /raw/i
21
+ :raw
22
+ when /char/i
23
+ if OracleEnhancedAdapter.emulate_booleans_from_strings &&
24
+ OracleEnhancedAdapter.is_boolean_column?(name, field_type, table_name)
25
+ :boolean
26
+ else
27
+ :string
28
+ end
29
+ when /date/i
30
+ if OracleEnhancedAdapter.emulate_dates_by_column_name && OracleEnhancedAdapter.is_date_column?(name, table_name)
31
+ :date
32
+ else
33
+ :datetime
34
+ end
35
+ when /timestamp/i
36
+ :timestamp
37
+ when /time/i
38
+ :datetime
39
+ when /xmltype/i
40
+ :xmltype
41
+ else
42
+ super
43
+ end
44
+ end
45
+
46
+
47
+ end
48
+
49
+ def self.included(receiver)
50
+ receiver.extend ClassMethods
51
+ receiver.send :include, InstanceMethods
52
+ end
53
+ end
@@ -0,0 +1,57 @@
1
+ module OracleEnhancedOCIConnectionWithXmltype
2
+ module ClassMethods
3
+
4
+ end
5
+
6
+ module InstanceMethods
7
+ def typecast_result_value(value, get_lob_value)
8
+ case value
9
+ when Fixnum, Bignum
10
+ value
11
+ when String
12
+ if value.match(/\<\?xml/i)
13
+ Hash.from_xml(value)
14
+ else
15
+ value
16
+ end
17
+ when Float, BigDecimal
18
+ # return Fixnum or Bignum if value is integer (to avoid issues with _before_type_cast values for id attributes)
19
+ value == (v_to_i = value.to_i) ? v_to_i : value
20
+ when OraNumber
21
+ # change OraNumber value (returned in early versions of ruby-oci8 2.0.x) to BigDecimal
22
+ value == (v_to_i = value.to_i) ? v_to_i : BigDecimal.new(value.to_s)
23
+ when OCI8::LOB
24
+ if get_lob_value
25
+ data = value.read || "" # if value.read returns nil, then we have an empty_clob() i.e. an empty string
26
+ # In Ruby 1.9.1 always change encoding to ASCII-8BIT for binaries
27
+ data.force_encoding('ASCII-8BIT') if data.respond_to?(:force_encoding) && value.is_a?(OCI8::BLOB)
28
+ data
29
+ else
30
+ value
31
+ end
32
+ # ruby-oci8 1.0 returns OraDate
33
+ # ruby-oci8 2.0 returns Time or DateTime
34
+ when OraDate, Time, DateTime
35
+ if ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates && date_without_time?(value)
36
+ value.to_date
37
+ else
38
+ create_time_with_default_timezone(value)
39
+ end
40
+ when OraDate, Time, DateTime
41
+ if ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates && date_without_time?(value)
42
+ value.to_date
43
+ else
44
+ create_time_with_default_timezone(value)
45
+ end
46
+ else
47
+ value
48
+ end
49
+ end
50
+ end
51
+
52
+ def self.included(receiver)
53
+ receiver.send :remove_method, :typecast_result_value
54
+ receiver.extend ClassMethods
55
+ receiver.send :include, InstanceMethods
56
+ end
57
+ end
@@ -0,0 +1,17 @@
1
+ module OracleEnhancedSchemaDefinitionsPlusXmltype
2
+ module ClassMethods
3
+
4
+ end
5
+
6
+ module InstanceMethods
7
+ def xmltype(*args)
8
+ options = args.extract_options!
9
+ column(args[0], 'xmltype', options)
10
+ end
11
+ end
12
+
13
+ def self.included(receiver)
14
+ receiver.extend ClassMethods
15
+ receiver.send :include, InstanceMethods
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module OracleEnhancedPlusXmltype
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "oracle_enhanced_plus_xmltype/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "oracle_enhanced_plus_xmltype"
7
+ s.version = OracleEnhancedPlusXmltype::VERSION
8
+ s.authors = ["Jake Varghese"]
9
+ s.email = ["jake3030@yahoo.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{add XMLTYPE to active record oracle adapter}
12
+ s.description = %q{add XMLTYPE to active record oracle adapter}
13
+ s.add_development_dependency "rspec", ">= 2.6.0"
14
+ s.rubyforge_project = "oracle_enhanced_plus_xmltype"
15
+ s.add_dependency "rails", ">= 3.0.0"
16
+ #s.add_dependency "activerecord-oracle_enhanced-adapter", ">= 1.3.2"
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: oracle_enhanced_plus_xmltype
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Jake Varghese
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-07-28 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rspec
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 23
30
+ segments:
31
+ - 2
32
+ - 6
33
+ - 0
34
+ version: 2.6.0
35
+ type: :development
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rails
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 7
46
+ segments:
47
+ - 3
48
+ - 0
49
+ - 0
50
+ version: 3.0.0
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ description: add XMLTYPE to active record oracle adapter
54
+ email:
55
+ - jake3030@yahoo.com
56
+ executables: []
57
+
58
+ extensions: []
59
+
60
+ extra_rdoc_files: []
61
+
62
+ files:
63
+ - .gitignore
64
+ - Gemfile
65
+ - Rakefile
66
+ - lib/oracle_enhanced_plus_xmltype.rb
67
+ - lib/oracle_enhanced_plus_xmltype/oracle_enhanced_adapter_with_xmltype.rb
68
+ - lib/oracle_enhanced_plus_xmltype/oracle_enhanced_column_with_xmltype.rb
69
+ - lib/oracle_enhanced_plus_xmltype/oracle_enhanced_oci_connection_with_xmltype.rb
70
+ - lib/oracle_enhanced_plus_xmltype/oracle_enhanced_schema_definitions_with_xmltype.rb
71
+ - lib/oracle_enhanced_plus_xmltype/version.rb
72
+ - oracle_enhanced_plus_xmltype.gemspec
73
+ has_rdoc: true
74
+ homepage: ""
75
+ licenses: []
76
+
77
+ post_install_message:
78
+ rdoc_options: []
79
+
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ hash: 3
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ requirements: []
101
+
102
+ rubyforge_project: oracle_enhanced_plus_xmltype
103
+ rubygems_version: 1.3.7
104
+ signing_key:
105
+ specification_version: 3
106
+ summary: add XMLTYPE to active record oracle adapter
107
+ test_files: []
108
+