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 +4 -0
- data/Gemfile +9 -0
- data/Rakefile +1 -0
- data/lib/oracle_enhanced_plus_xmltype.rb +35 -0
- data/lib/oracle_enhanced_plus_xmltype/oracle_enhanced_adapter_with_xmltype.rb +107 -0
- data/lib/oracle_enhanced_plus_xmltype/oracle_enhanced_column_with_xmltype.rb +53 -0
- data/lib/oracle_enhanced_plus_xmltype/oracle_enhanced_oci_connection_with_xmltype.rb +57 -0
- data/lib/oracle_enhanced_plus_xmltype/oracle_enhanced_schema_definitions_with_xmltype.rb +17 -0
- data/lib/oracle_enhanced_plus_xmltype/version.rb +3 -0
- data/oracle_enhanced_plus_xmltype.gemspec +21 -0
- metadata +108 -0
data/.gitignore
ADDED
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,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
|
+
|