activerecord-jdbc-alt-adapter 50.3.0-java

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.
Files changed (198) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +100 -0
  4. data/.yardopts +4 -0
  5. data/CONTRIBUTING.md +50 -0
  6. data/Gemfile +92 -0
  7. data/History.md +1191 -0
  8. data/LICENSE.txt +26 -0
  9. data/README.md +240 -0
  10. data/RUNNING_TESTS.md +127 -0
  11. data/Rakefile +336 -0
  12. data/Rakefile.jdbc +20 -0
  13. data/activerecord-jdbc-adapter.gemspec +55 -0
  14. data/activerecord-jdbc-alt-adapter.gemspec +56 -0
  15. data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
  16. data/lib/active_record/connection_adapters/db2_adapter.rb +1 -0
  17. data/lib/active_record/connection_adapters/derby_adapter.rb +1 -0
  18. data/lib/active_record/connection_adapters/firebird_adapter.rb +1 -0
  19. data/lib/active_record/connection_adapters/h2_adapter.rb +1 -0
  20. data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -0
  21. data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
  22. data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -0
  23. data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
  24. data/lib/active_record/connection_adapters/mariadb_adapter.rb +1 -0
  25. data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
  26. data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -0
  27. data/lib/active_record/connection_adapters/mysql_adapter.rb +1 -0
  28. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -0
  29. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -0
  30. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
  31. data/lib/activerecord-jdbc-adapter.rb +1 -0
  32. data/lib/arel/visitors/compat.rb +60 -0
  33. data/lib/arel/visitors/db2.rb +137 -0
  34. data/lib/arel/visitors/derby.rb +112 -0
  35. data/lib/arel/visitors/firebird.rb +79 -0
  36. data/lib/arel/visitors/h2.rb +25 -0
  37. data/lib/arel/visitors/hsqldb.rb +32 -0
  38. data/lib/arel/visitors/postgresql_jdbc.rb +6 -0
  39. data/lib/arel/visitors/sql_server.rb +225 -0
  40. data/lib/arel/visitors/sql_server/ng42.rb +294 -0
  41. data/lib/arel/visitors/sqlserver.rb +214 -0
  42. data/lib/arjdbc.rb +19 -0
  43. data/lib/arjdbc/abstract/connection_management.rb +35 -0
  44. data/lib/arjdbc/abstract/core.rb +74 -0
  45. data/lib/arjdbc/abstract/database_statements.rb +64 -0
  46. data/lib/arjdbc/abstract/statement_cache.rb +58 -0
  47. data/lib/arjdbc/abstract/transaction_support.rb +86 -0
  48. data/lib/arjdbc/db2.rb +4 -0
  49. data/lib/arjdbc/db2/adapter.rb +789 -0
  50. data/lib/arjdbc/db2/as400.rb +130 -0
  51. data/lib/arjdbc/db2/column.rb +167 -0
  52. data/lib/arjdbc/db2/connection_methods.rb +44 -0
  53. data/lib/arjdbc/derby.rb +3 -0
  54. data/lib/arjdbc/derby/active_record_patch.rb +13 -0
  55. data/lib/arjdbc/derby/adapter.rb +540 -0
  56. data/lib/arjdbc/derby/connection_methods.rb +20 -0
  57. data/lib/arjdbc/derby/schema_creation.rb +15 -0
  58. data/lib/arjdbc/discover.rb +104 -0
  59. data/lib/arjdbc/firebird.rb +4 -0
  60. data/lib/arjdbc/firebird/adapter.rb +434 -0
  61. data/lib/arjdbc/firebird/connection_methods.rb +23 -0
  62. data/lib/arjdbc/h2.rb +3 -0
  63. data/lib/arjdbc/h2/adapter.rb +303 -0
  64. data/lib/arjdbc/h2/connection_methods.rb +27 -0
  65. data/lib/arjdbc/hsqldb.rb +3 -0
  66. data/lib/arjdbc/hsqldb/adapter.rb +297 -0
  67. data/lib/arjdbc/hsqldb/connection_methods.rb +28 -0
  68. data/lib/arjdbc/hsqldb/explain_support.rb +35 -0
  69. data/lib/arjdbc/hsqldb/schema_creation.rb +11 -0
  70. data/lib/arjdbc/informix.rb +5 -0
  71. data/lib/arjdbc/informix/adapter.rb +162 -0
  72. data/lib/arjdbc/informix/connection_methods.rb +9 -0
  73. data/lib/arjdbc/jdbc.rb +59 -0
  74. data/lib/arjdbc/jdbc/adapter.rb +475 -0
  75. data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
  76. data/lib/arjdbc/jdbc/base_ext.rb +15 -0
  77. data/lib/arjdbc/jdbc/callbacks.rb +53 -0
  78. data/lib/arjdbc/jdbc/column.rb +97 -0
  79. data/lib/arjdbc/jdbc/connection.rb +14 -0
  80. data/lib/arjdbc/jdbc/connection_methods.rb +37 -0
  81. data/lib/arjdbc/jdbc/error.rb +65 -0
  82. data/lib/arjdbc/jdbc/extension.rb +59 -0
  83. data/lib/arjdbc/jdbc/java.rb +13 -0
  84. data/lib/arjdbc/jdbc/railtie.rb +2 -0
  85. data/lib/arjdbc/jdbc/rake_tasks.rb +3 -0
  86. data/lib/arjdbc/jdbc/serialized_attributes_helper.rb +3 -0
  87. data/lib/arjdbc/jdbc/type_cast.rb +166 -0
  88. data/lib/arjdbc/jdbc/type_converter.rb +142 -0
  89. data/lib/arjdbc/mssql.rb +7 -0
  90. data/lib/arjdbc/mssql/adapter.rb +384 -0
  91. data/lib/arjdbc/mssql/column.rb +29 -0
  92. data/lib/arjdbc/mssql/connection_methods.rb +79 -0
  93. data/lib/arjdbc/mssql/database_statements.rb +134 -0
  94. data/lib/arjdbc/mssql/errors.rb +6 -0
  95. data/lib/arjdbc/mssql/explain_support.rb +129 -0
  96. data/lib/arjdbc/mssql/extensions.rb +36 -0
  97. data/lib/arjdbc/mssql/limit_helpers.rb +231 -0
  98. data/lib/arjdbc/mssql/lock_methods.rb +77 -0
  99. data/lib/arjdbc/mssql/old_adapter.rb +804 -0
  100. data/lib/arjdbc/mssql/old_column.rb +200 -0
  101. data/lib/arjdbc/mssql/quoting.rb +101 -0
  102. data/lib/arjdbc/mssql/schema_creation.rb +31 -0
  103. data/lib/arjdbc/mssql/schema_definitions.rb +74 -0
  104. data/lib/arjdbc/mssql/schema_statements.rb +329 -0
  105. data/lib/arjdbc/mssql/transaction.rb +69 -0
  106. data/lib/arjdbc/mssql/types.rb +52 -0
  107. data/lib/arjdbc/mssql/types/binary_types.rb +33 -0
  108. data/lib/arjdbc/mssql/types/date_and_time_types.rb +134 -0
  109. data/lib/arjdbc/mssql/types/deprecated_types.rb +40 -0
  110. data/lib/arjdbc/mssql/types/numeric_types.rb +71 -0
  111. data/lib/arjdbc/mssql/types/string_types.rb +56 -0
  112. data/lib/arjdbc/mssql/utils.rb +66 -0
  113. data/lib/arjdbc/mysql.rb +3 -0
  114. data/lib/arjdbc/mysql/adapter.rb +140 -0
  115. data/lib/arjdbc/mysql/connection_methods.rb +166 -0
  116. data/lib/arjdbc/oracle/adapter.rb +863 -0
  117. data/lib/arjdbc/postgresql.rb +3 -0
  118. data/lib/arjdbc/postgresql/adapter.rb +687 -0
  119. data/lib/arjdbc/postgresql/base/array_decoder.rb +26 -0
  120. data/lib/arjdbc/postgresql/base/array_encoder.rb +25 -0
  121. data/lib/arjdbc/postgresql/base/array_parser.rb +95 -0
  122. data/lib/arjdbc/postgresql/base/pgconn.rb +11 -0
  123. data/lib/arjdbc/postgresql/column.rb +51 -0
  124. data/lib/arjdbc/postgresql/connection_methods.rb +67 -0
  125. data/lib/arjdbc/postgresql/name.rb +24 -0
  126. data/lib/arjdbc/postgresql/oid_types.rb +266 -0
  127. data/lib/arjdbc/railtie.rb +11 -0
  128. data/lib/arjdbc/sqlite3.rb +3 -0
  129. data/lib/arjdbc/sqlite3/adapter.rb +678 -0
  130. data/lib/arjdbc/sqlite3/connection_methods.rb +59 -0
  131. data/lib/arjdbc/sybase.rb +2 -0
  132. data/lib/arjdbc/sybase/adapter.rb +47 -0
  133. data/lib/arjdbc/tasks.rb +13 -0
  134. data/lib/arjdbc/tasks/database_tasks.rb +31 -0
  135. data/lib/arjdbc/tasks/databases.rake +48 -0
  136. data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
  137. data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
  138. data/lib/arjdbc/tasks/h2_database_tasks.rb +31 -0
  139. data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
  140. data/lib/arjdbc/tasks/jdbc_database_tasks.rb +169 -0
  141. data/lib/arjdbc/tasks/mssql_database_tasks.rb +46 -0
  142. data/lib/arjdbc/util/quoted_cache.rb +60 -0
  143. data/lib/arjdbc/util/serialized_attributes.rb +98 -0
  144. data/lib/arjdbc/util/table_copier.rb +110 -0
  145. data/lib/arjdbc/version.rb +3 -0
  146. data/lib/generators/jdbc/USAGE +9 -0
  147. data/lib/generators/jdbc/jdbc_generator.rb +17 -0
  148. data/lib/jdbc_adapter.rb +2 -0
  149. data/lib/jdbc_adapter/rake_tasks.rb +4 -0
  150. data/lib/jdbc_adapter/version.rb +4 -0
  151. data/pom.xml +114 -0
  152. data/rails_generators/jdbc_generator.rb +15 -0
  153. data/rails_generators/templates/config/initializers/jdbc.rb +10 -0
  154. data/rails_generators/templates/lib/tasks/jdbc.rake +11 -0
  155. data/rakelib/01-tomcat.rake +51 -0
  156. data/rakelib/02-test.rake +132 -0
  157. data/rakelib/bundler_ext.rb +11 -0
  158. data/rakelib/db.rake +75 -0
  159. data/rakelib/rails.rake +223 -0
  160. data/src/java/arjdbc/ArJdbcModule.java +276 -0
  161. data/src/java/arjdbc/db2/DB2Module.java +76 -0
  162. data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +126 -0
  163. data/src/java/arjdbc/derby/DerbyModule.java +178 -0
  164. data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +152 -0
  165. data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +174 -0
  166. data/src/java/arjdbc/h2/H2Module.java +50 -0
  167. data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +85 -0
  168. data/src/java/arjdbc/hsqldb/HSQLDBModule.java +73 -0
  169. data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +75 -0
  170. data/src/java/arjdbc/jdbc/AdapterJavaService.java +43 -0
  171. data/src/java/arjdbc/jdbc/Callable.java +44 -0
  172. data/src/java/arjdbc/jdbc/ConnectionFactory.java +45 -0
  173. data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +156 -0
  174. data/src/java/arjdbc/jdbc/DriverConnectionFactory.java +63 -0
  175. data/src/java/arjdbc/jdbc/DriverWrapper.java +119 -0
  176. data/src/java/arjdbc/jdbc/JdbcResult.java +130 -0
  177. data/src/java/arjdbc/jdbc/RubyConnectionFactory.java +61 -0
  178. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +3979 -0
  179. data/src/java/arjdbc/mssql/MSSQLModule.java +90 -0
  180. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +508 -0
  181. data/src/java/arjdbc/mysql/MySQLModule.java +152 -0
  182. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +294 -0
  183. data/src/java/arjdbc/oracle/OracleModule.java +80 -0
  184. data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +455 -0
  185. data/src/java/arjdbc/postgresql/ByteaUtils.java +157 -0
  186. data/src/java/arjdbc/postgresql/PgDateTimeUtils.java +52 -0
  187. data/src/java/arjdbc/postgresql/PostgreSQLModule.java +77 -0
  188. data/src/java/arjdbc/postgresql/PostgreSQLResult.java +192 -0
  189. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +948 -0
  190. data/src/java/arjdbc/sqlite3/SQLite3Module.java +73 -0
  191. data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +525 -0
  192. data/src/java/arjdbc/util/CallResultSet.java +826 -0
  193. data/src/java/arjdbc/util/DateTimeUtils.java +699 -0
  194. data/src/java/arjdbc/util/ObjectSupport.java +65 -0
  195. data/src/java/arjdbc/util/QuotingUtils.java +137 -0
  196. data/src/java/arjdbc/util/StringCache.java +63 -0
  197. data/src/java/arjdbc/util/StringHelper.java +145 -0
  198. metadata +269 -0
@@ -0,0 +1,20 @@
1
+ ArJdbc::ConnectionMethods.module_eval do
2
+ def derby_connection(config)
3
+ config[:adapter_spec] ||= ::ArJdbc::Derby
4
+
5
+ return jndi_connection(config) if jndi_config?(config)
6
+
7
+ begin
8
+ require 'jdbc/derby'
9
+ ::Jdbc::Derby.load_driver(:require) if defined?(::Jdbc::Derby.load_driver)
10
+ rescue LoadError # assuming driver.jar is on the class-path
11
+ end
12
+
13
+ config[:url] ||= "jdbc:derby:#{config[:database]};create=true"
14
+ config[:driver] ||= defined?(::Jdbc::Derby.driver_name) ?
15
+ ::Jdbc::Derby.driver_name : 'org.apache.derby.jdbc.EmbeddedDriver'
16
+
17
+ embedded_driver(config)
18
+ end
19
+ alias_method :jdbcderby_connection, :derby_connection
20
+ end
@@ -0,0 +1,15 @@
1
+ module ArJdbc
2
+ module Derby
3
+ # @private
4
+ class SchemaCreation < ::ActiveRecord::ConnectionAdapters::AbstractAdapter::SchemaCreation
5
+
6
+ private
7
+
8
+ end
9
+ end
10
+
11
+ def schema_creation
12
+ SchemaCreation.new self
13
+ end
14
+
15
+ end if ::ActiveRecord::ConnectionAdapters::AbstractAdapter.const_defined? :SchemaCreation
@@ -0,0 +1,104 @@
1
+ # this file is discovered by the extension mechanism
2
+ # @see {ArJdbc#discover_extensions}
3
+
4
+ module ArJdbc
5
+
6
+ require 'arjdbc/jdbc/adapter_require'
7
+
8
+ # Adapters built-in to AR :
9
+
10
+ require 'arjdbc/mysql' if Java::JavaLang::Boolean.getBoolean('arjdbc.mysql.eager_load')
11
+ require 'arjdbc/postgresql' if Java::JavaLang::Boolean.getBoolean('arjdbc.postgresql.eager_load')
12
+ require 'arjdbc/sqlite3' if Java::JavaLang::Boolean.getBoolean('arjdbc.sqlite3.eager_load')
13
+
14
+ extension :MySQL do |name|
15
+ require('arjdbc/mysql') || true if name =~ /mysql/i
16
+ end
17
+
18
+ extension :PostgreSQL do |name|
19
+ require('arjdbc/postgresql') || true if name =~ /postgre/i
20
+ end
21
+
22
+ extension :SQLite3 do |name|
23
+ require('arjdbc/sqlite3') || true if name =~ /sqlite/i
24
+ end
25
+
26
+ # Other supported adapters :
27
+
28
+ extension :Derby do |name, config|
29
+ if name =~ /derby/i
30
+ require 'arjdbc/derby'
31
+
32
+ if config && config[:username].nil? # set the database schema name (:username) :
33
+ begin
34
+ ArJdbc.with_meta_data_from_data_source_if_any(config) do
35
+ |meta_data| config[:username] = meta_data.getUserName
36
+ end
37
+ rescue => e
38
+ ArJdbc.warn("failed to set :username from (Derby) database meda-data: #{e.inspect}")
39
+ end
40
+ end
41
+
42
+ true
43
+ end
44
+ end
45
+
46
+ extension :H2 do |name|
47
+ require('arjdbc/h2') || true if name =~ /\.h2\./i
48
+ end
49
+
50
+ extension :HSQLDB do |name|
51
+ require('arjdbc/hsqldb') || true if name =~ /hsqldb/i
52
+ end
53
+
54
+ extension :MSSQL do |name|
55
+ require('arjdbc/mssql') || true if name =~ /sqlserver|tds|Microsoft SQL/i
56
+ end
57
+
58
+ extension :DB2 do |name, config|
59
+ if name =~ /db2/i && name !~ /as\/?400/i && config[:url] !~ /^jdbc:derby:net:/
60
+ require 'arjdbc/db2'
61
+ true
62
+ end
63
+ end
64
+
65
+ extension :AS400 do |name, config|
66
+ # The native JDBC driver always returns "DB2 UDB for AS/400"
67
+ if name =~ /as\/?400/i
68
+ require 'arjdbc/db2'
69
+ require 'arjdbc/db2/as400'
70
+ true
71
+ end
72
+ end
73
+
74
+ # NOTE: following ones are likely getting deprecated :
75
+
76
+ extension :FireBird do |name|
77
+ if name =~ /firebird/i
78
+ require 'arjdbc/firebird'
79
+ true
80
+ end
81
+ end
82
+
83
+ extension :Sybase do |name|
84
+ if name =~ /sybase|tds/i
85
+ require 'arjdbc/sybase'
86
+ true
87
+ end
88
+ end
89
+
90
+ extension :Informix do |name|
91
+ if name =~ /informix/i
92
+ require 'arjdbc/informix'
93
+ true
94
+ end
95
+ end
96
+
97
+ extension :Mimer do |name|
98
+ if name =~ /mimer/i
99
+ require 'arjdbc/mimer'
100
+ true
101
+ end
102
+ end
103
+
104
+ end
@@ -0,0 +1,4 @@
1
+ require 'arjdbc'
2
+ require 'arjdbc/firebird/adapter'
3
+ require 'arjdbc/firebird/connection_methods'
4
+ ArJdbc.warn_unsupported_adapter 'firebird', [4, 2] # warns on AR >= 4.2
@@ -0,0 +1,434 @@
1
+ ArJdbc.load_java_part :Firebird
2
+
3
+ require 'arel/visitors/firebird'
4
+
5
+ module ArJdbc
6
+ module Firebird
7
+
8
+ # @private
9
+ def self.extended(adapter); initialize!; end
10
+
11
+ # @private
12
+ @@_initialized = nil
13
+
14
+ # @private
15
+ def self.initialize!
16
+ return if @@_initialized; @@_initialized = true
17
+
18
+ require 'arjdbc/util/serialized_attributes'
19
+ Util::SerializedAttributes.setup /blob/i
20
+ end
21
+
22
+ # @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
23
+ def self.jdbc_connection_class
24
+ ::ActiveRecord::ConnectionAdapters::FirebirdJdbcConnection
25
+ end
26
+
27
+ # @see ActiveRecord::ConnectionAdapters::JdbcColumn#column_types
28
+ def self.column_selector
29
+ [ /firebird/i, lambda { |cfg, column| column.extend(Column) } ]
30
+ end
31
+
32
+ # @see ActiveRecord::ConnectionAdapters::JdbcColumn
33
+ module Column
34
+
35
+ def default_value(value)
36
+ return nil unless value
37
+ if value =~ /^\s*DEFAULT\s+(.*)\s*$/i
38
+ return $1 unless $1.upcase == 'NULL'
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def simplified_type(field_type)
45
+ case field_type
46
+ when /timestamp/i then :datetime
47
+ when /^smallint/i then :integer
48
+ when /^bigint|int/i then :integer
49
+ when /^double/i then :float # double precision
50
+ when /^decimal/i then
51
+ extract_scale(field_type) == 0 ? :integer : :decimal
52
+ when /^char\(1\)$/i then Firebird.emulate_booleans? ? :boolean : :string
53
+ when /^char/i then :string
54
+ when /^blob\ssub_type\s(\d)/i
55
+ return :binary if $1 == '0'
56
+ return :text if $1 == '1'
57
+ else
58
+ super
59
+ end
60
+ end
61
+
62
+ end
63
+
64
+ # @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_column_class
65
+ def jdbc_column_class; ::ActiveRecord::ConnectionAdapters::FirebirdColumn end
66
+
67
+ # @private
68
+ @@emulate_booleans = true
69
+
70
+ # Boolean emulation can be disabled using :
71
+ #
72
+ # ArJdbc::Firebird.emulate_booleans = false
73
+ #
74
+ def self.emulate_booleans?; @@emulate_booleans; end
75
+ # @deprecated Use {#emulate_booleans?} instead.
76
+ def self.emulate_booleans; @@emulate_booleans; end
77
+ # @see #emulate_booleans?
78
+ def self.emulate_booleans=(emulate); @@emulate_booleans = emulate; end
79
+
80
+
81
+ @@update_lob_values = true
82
+
83
+ # Updating records with LOB values (binary/text columns) in a separate
84
+ # statement can be disabled using :
85
+ #
86
+ # ArJdbc::Firebird.update_lob_values = false
87
+ def self.update_lob_values?; @@update_lob_values; end
88
+ # @see #update_lob_values?
89
+ def self.update_lob_values=(update); @@update_lob_values = update; end
90
+
91
+ # @see #update_lob_values?
92
+ def update_lob_values?; Firebird.update_lob_values?; end
93
+
94
+ # @see #quote
95
+ # @private
96
+ BLOB_VALUE_MARKER = "''"
97
+
98
+ ADAPTER_NAME = 'Firebird'.freeze
99
+
100
+ def adapter_name
101
+ ADAPTER_NAME
102
+ end
103
+
104
+ NATIVE_DATABASE_TYPES = {
105
+ :primary_key => "integer not null primary key",
106
+ :string => { :name => "varchar", :limit => 255 },
107
+ :text => { :name => "blob sub_type text" },
108
+ :integer => { :name => "integer" },
109
+ :float => { :name => "float" },
110
+ :datetime => { :name => "timestamp" },
111
+ :timestamp => { :name => "timestamp" },
112
+ :time => { :name => "time" },
113
+ :date => { :name => "date" },
114
+ :binary => { :name => "blob" },
115
+ :boolean => { :name => 'char', :limit => 1 },
116
+ :numeric => { :name => "numeric" },
117
+ :decimal => { :name => "decimal" },
118
+ :char => { :name => "char" },
119
+ }
120
+
121
+ def native_database_types
122
+ NATIVE_DATABASE_TYPES
123
+ end
124
+
125
+ def initialize_type_map(m)
126
+ register_class_with_limit m, %r(binary)i, ActiveRecord::Type::Binary
127
+ register_class_with_limit m, %r(text)i, ActiveRecord::Type::Text
128
+
129
+ register_class_with_limit m, %r(date(?:\(.*?\))?$)i, DateType
130
+ register_class_with_limit m, %r(time(?:\(.*?\))?$)i, ActiveRecord::Type::Time
131
+
132
+ register_class_with_limit m, %r(float)i, ActiveRecord::Type::Float
133
+ register_class_with_limit m, %r(int)i, ActiveRecord::Type::Integer
134
+
135
+ m.alias_type %r(blob)i, 'binary'
136
+ m.alias_type %r(clob)i, 'text'
137
+ m.alias_type %r(double)i, 'float'
138
+
139
+ m.register_type(%r(decimal)i) do |sql_type|
140
+ scale = extract_scale(sql_type)
141
+ precision = extract_precision(sql_type)
142
+ if scale == 0
143
+ ActiveRecord::Type::Integer.new(precision: precision)
144
+ else
145
+ ActiveRecord::Type::Decimal.new(precision: precision, scale: scale)
146
+ end
147
+ end
148
+ m.alias_type %r(numeric)i, 'decimal'
149
+
150
+ register_class_with_limit m, %r(varchar)i, ActiveRecord::Type::String
151
+
152
+ m.register_type(%r(^char)i) do |sql_type|
153
+ precision = extract_precision(sql_type)
154
+ if Firebird.emulate_booleans? && precision == 1
155
+ ActiveRecord::Type::Boolean.new
156
+ else
157
+ ActiveRecord::Type::String.new(:precision => precision)
158
+ end
159
+ end
160
+
161
+ register_class_with_limit m, %r(datetime)i, ActiveRecord::Type::DateTime
162
+ register_class_with_limit m, %r(timestamp)i, TimestampType
163
+ end if AR42
164
+
165
+ def clear_cache!
166
+ super
167
+ reload_type_map
168
+ end if AR42
169
+
170
+ # @private
171
+ class DateType < ActiveRecord::Type::Date
172
+ # NOTE: quote still gets called ...
173
+ #def type_cast_for_database(value)
174
+ # if value.acts_like?(:date)
175
+ # "'#{value.strftime("%Y-%m-%d")}'"
176
+ # else
177
+ # super
178
+ # end
179
+ #end
180
+ end if AR42
181
+
182
+ # @private
183
+ class TimestampType < ActiveRecord::Type::DateTime
184
+ def type; :timestamp end
185
+ end if AR42
186
+
187
+ def type_to_sql(type, limit = nil, precision = nil, scale = nil)
188
+ case type
189
+ when :integer
190
+ case limit
191
+ when nil then 'integer'
192
+ when 1..2 then 'smallint'
193
+ when 3..4 then 'integer'
194
+ when 5..8 then 'bigint'
195
+ else raise(ActiveRecordError, "No integer type has byte size #{limit}. "<<
196
+ "Use a NUMERIC with PRECISION 0 instead.")
197
+ end
198
+ when :float
199
+ if limit.nil? || limit <= 4
200
+ 'float'
201
+ else
202
+ 'double precision'
203
+ end
204
+ else super
205
+ end
206
+ end
207
+
208
+ # Does this adapter support migrations?
209
+ def supports_migrations?
210
+ true
211
+ end
212
+
213
+ # Can this adapter determine the primary key for tables not attached
214
+ # to an Active Record class, such as join tables?
215
+ def supports_primary_key?
216
+ true
217
+ end
218
+
219
+ # Does this adapter support DDL rollbacks in transactions? That is, would
220
+ # CREATE TABLE or ALTER TABLE get rolled back by a transaction? PostgreSQL,
221
+ # SQL Server, and others support this. MySQL and others do not.
222
+ def supports_ddl_transactions?
223
+ false
224
+ end
225
+
226
+ # Does this adapter restrict the number of IDs you can use in a list.
227
+ # Oracle has a limit of 1000.
228
+ def ids_in_list_limit
229
+ 1499
230
+ end
231
+
232
+ def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
233
+ execute(sql, name, binds)
234
+ id_value
235
+ end
236
+
237
+ def add_limit_offset!(sql, options)
238
+ if limit = options[:limit]
239
+ insert_limit_offset!(sql, limit, options[:offset])
240
+ end
241
+ end
242
+
243
+ # @private
244
+ SELECT_RE = /\A(\s*SELECT\s)/i
245
+
246
+ def insert_limit_offset!(sql, limit, offset)
247
+ lim_off = ''
248
+ lim_off << "FIRST #{limit}" if limit
249
+ lim_off << " SKIP #{offset}" if offset
250
+ lim_off.strip!
251
+
252
+ sql.sub!(SELECT_RE, "\\&#{lim_off} ") unless lim_off.empty?
253
+ end
254
+
255
+ # Should primary key values be selected from their corresponding
256
+ # sequence before the insert statement?
257
+ # @see #next_sequence_value
258
+ # @override
259
+ def prefetch_primary_key?(table_name = nil)
260
+ return true if table_name.nil?
261
+ primary_keys(table_name.to_s).size == 1
262
+ # columns(table_name).count { |column| column.primary } == 1
263
+ end
264
+
265
+ IDENTIFIER_LENGTH = 31 # usual DB meta-identifier: 31 chars maximum
266
+
267
+ def table_alias_length; IDENTIFIER_LENGTH; end
268
+ def table_name_length; IDENTIFIER_LENGTH; end
269
+ def index_name_length; IDENTIFIER_LENGTH; end
270
+ def column_name_length; IDENTIFIER_LENGTH; end
271
+
272
+ def default_sequence_name(table_name, column = nil)
273
+ len = IDENTIFIER_LENGTH - 4
274
+ table_name.to_s.gsub (/(^|\.)([\w$-]{1,#{len}})([\w$-]*)$/), '\1\2_seq'
275
+ end
276
+
277
+ # Set the sequence to the max value of the table's column.
278
+ def reset_sequence!(table, column, sequence = nil)
279
+ max_id = select_value("SELECT max(#{column}) FROM #{table}")
280
+ execute("ALTER SEQUENCE #{default_sequence_name(table, column)} RESTART WITH #{max_id}")
281
+ end
282
+
283
+ def next_sequence_value(sequence_name)
284
+ select_one("SELECT GEN_ID(#{sequence_name}, 1 ) FROM RDB$DATABASE;")["gen_id"]
285
+ end
286
+
287
+ def create_table(name, options = {})
288
+ super(name, options)
289
+ execute "CREATE GENERATOR #{default_sequence_name(name)}"
290
+ end
291
+
292
+ def rename_table(name, new_name)
293
+ execute "RENAME #{name} TO #{new_name}"
294
+ name_seq, new_name_seq = default_sequence_name(name), default_sequence_name(new_name)
295
+ execute_quietly "UPDATE RDB$GENERATORS SET RDB$GENERATOR_NAME='#{new_name_seq}' WHERE RDB$GENERATOR_NAME='#{name_seq}'"
296
+ end
297
+
298
+ def drop_table(name, options = {})
299
+ super(name)
300
+ execute_quietly "DROP GENERATOR #{default_sequence_name(name)}"
301
+ end
302
+
303
+ def change_column(table_name, column_name, type, options = {})
304
+ execute "ALTER TABLE #{table_name} ALTER #{column_name} TYPE #{type_to_sql(type, options[:limit])}"
305
+ end
306
+
307
+ def rename_column(table_name, column_name, new_column_name)
308
+ execute "ALTER TABLE #{table_name} ALTER #{column_name} TO #{new_column_name}"
309
+ end
310
+
311
+ def remove_index(table_name, options)
312
+ execute "DROP INDEX #{index_name(table_name, options)}"
313
+ end
314
+
315
+ # @override
316
+ def quote(value, column = nil)
317
+ return value.quoted_id if value.respond_to?(:quoted_id)
318
+ return value if sql_literal?(value)
319
+
320
+ type = column && column.type
321
+
322
+ # BLOBs are updated separately by an after_save trigger.
323
+ if type == :binary || type == :text
324
+ if update_lob_values?
325
+ return value.nil? ? "NULL" : BLOB_VALUE_MARKER
326
+ else
327
+ return "'#{quote_string(value)}'"
328
+ end
329
+ end
330
+
331
+ case value
332
+ when String, ActiveSupport::Multibyte::Chars
333
+ value = value.to_s
334
+ if type == :integer
335
+ value.to_i.to_s
336
+ elsif type == :float
337
+ value.to_f.to_s
338
+ else
339
+ "'#{quote_string(value)}'"
340
+ end
341
+ when NilClass then 'NULL'
342
+ when TrueClass then (type == :integer ? '1' : quoted_true)
343
+ when FalseClass then (type == :integer ? '0' : quoted_false)
344
+ when Float, Fixnum, Bignum then value.to_s
345
+ # BigDecimals need to be output in a non-normalized form and quoted.
346
+ when BigDecimal then value.to_s('F')
347
+ when Symbol then "'#{quote_string(value.to_s)}'"
348
+ else
349
+ if type == :time && value.acts_like?(:time)
350
+ return "'#{get_time(value).strftime("%H:%M:%S")}'"
351
+ end
352
+ if type == :date && value.acts_like?(:date)
353
+ return "'#{value.strftime("%Y-%m-%d")}'"
354
+ end
355
+ super
356
+ end
357
+ end
358
+
359
+ # @override
360
+ def quoted_date(value)
361
+ if value.acts_like?(:time) && value.respond_to?(:usec)
362
+ usec = sprintf "%04d", (value.usec / 100.0).round
363
+ value = ::ActiveRecord::Base.default_timezone == :utc ? value.getutc : value.getlocal
364
+ "#{value.strftime("%Y-%m-%d %H:%M:%S")}.#{usec}"
365
+ else
366
+ super
367
+ end
368
+ end if ::ActiveRecord::VERSION::MAJOR >= 3
369
+
370
+ # @override
371
+ def quote_string(string)
372
+ string.gsub(/'/, "''")
373
+ end
374
+
375
+ # @override
376
+ def quoted_true
377
+ quote(1)
378
+ end
379
+
380
+ # @override
381
+ def quoted_false
382
+ quote(0)
383
+ end
384
+
385
+ # @override
386
+ def quote_table_name_for_assignment(table, attr)
387
+ quote_column_name(attr)
388
+ end if ::ActiveRecord::VERSION::MAJOR >= 4
389
+
390
+ # @override
391
+ def quote_column_name(column_name)
392
+ column_name = column_name.to_s
393
+ %Q("#{column_name =~ /[[:upper:]]/ ? column_name : column_name.upcase}")
394
+ end
395
+
396
+ end
397
+ FireBird = Firebird
398
+ end
399
+
400
+ require 'arjdbc/util/quoted_cache'
401
+
402
+ module ActiveRecord::ConnectionAdapters
403
+
404
+ remove_const(:FirebirdAdapter) if const_defined?(:FirebirdAdapter)
405
+
406
+ class FirebirdAdapter < JdbcAdapter
407
+ include ::ArJdbc::Firebird
408
+ include ::ArJdbc::Util::QuotedCache
409
+
410
+ # By default, the FirebirdAdapter will consider all columns of type
411
+ # <tt>char(1)</tt> as boolean. If you wish to disable this :
412
+ #
413
+ # ActiveRecord::ConnectionAdapters::FirebirdAdapter.emulate_booleans = false
414
+ #
415
+ def self.emulate_booleans?; ::ArJdbc::Firebird.emulate_booleans?; end
416
+ def self.emulate_booleans; ::ArJdbc::Firebird.emulate_booleans?; end
417
+ def self.emulate_booleans=(emulate); ::ArJdbc::Firebird.emulate_booleans = emulate; end
418
+
419
+ def initialize(*args)
420
+ ::ArJdbc::Firebird.initialize!
421
+ super
422
+ end
423
+
424
+ def arel_visitor
425
+ Arel::Visitors::Firebird.new(self)
426
+ end
427
+
428
+ end
429
+
430
+ class FirebirdColumn < JdbcColumn
431
+ include ::ArJdbc::Firebird::Column
432
+ end
433
+
434
+ end