activerecord-jdbc-adapter 1.0.0.beta1-java → 1.0.0.beta2-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.
- data/History.txt +37 -0
- data/Manifest.txt +8 -0
- data/README.txt +41 -88
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -0
- data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +9 -0
- data/lib/arel/engines/sql/compilers/mssql_compiler.rb +34 -0
- data/lib/arjdbc/db2/adapter.rb +232 -52
- data/lib/arjdbc/derby/adapter.rb +28 -1
- data/lib/arjdbc/derby/connection_methods.rb +1 -1
- data/lib/arjdbc/discover.rb +1 -1
- data/lib/arjdbc/firebird/adapter.rb +26 -0
- data/lib/arjdbc/h2/adapter.rb +13 -0
- data/lib/arjdbc/hsqldb/adapter.rb +8 -6
- data/lib/arjdbc/informix/adapter.rb +4 -0
- data/lib/arjdbc/jdbc/adapter.rb +27 -5
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/connection.rb +76 -45
- data/lib/arjdbc/jdbc/jdbc.rake +22 -20
- data/lib/arjdbc/jdbc/type_converter.rb +9 -2
- data/lib/arjdbc/mssql/adapter.rb +102 -24
- data/lib/arjdbc/mssql/connection_methods.rb +19 -2
- data/lib/arjdbc/mssql/tsql_helper.rb +1 -0
- data/lib/arjdbc/mysql/adapter.rb +6 -0
- data/lib/arjdbc/mysql/connection_methods.rb +8 -7
- data/lib/arjdbc/oracle/adapter.rb +8 -6
- data/lib/arjdbc/postgresql/adapter.rb +51 -19
- data/lib/arjdbc/version.rb +1 -1
- data/lib/jdbc_adapter/rake_tasks.rb +3 -0
- data/rails_generators/templates/lib/tasks/jdbc.rake +2 -2
- data/rakelib/package.rake +2 -0
- data/rakelib/test.rake +6 -3
- data/src/java/arjdbc/derby/DerbyModule.java +30 -1
- data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +74 -0
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +7 -3
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +45 -30
- data/src/java/arjdbc/mssql/MssqlRubyJdbcConnection.java +54 -1
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +85 -0
- data/test/abstract_db_create.rb +6 -1
- data/test/db/jndi_config.rb +20 -10
- data/test/db2_simple_test.rb +34 -1
- data/test/derby_simple_test.rb +78 -0
- data/test/generic_jdbc_connection_test.rb +21 -1
- data/test/jndi_callbacks_test.rb +2 -1
- data/test/jndi_test.rb +1 -11
- data/test/models/entry.rb +20 -0
- data/test/mssql_limit_offset_test.rb +28 -0
- data/test/mssql_simple_test.rb +7 -1
- data/test/mysql_info_test.rb +49 -6
- data/test/mysql_simple_test.rb +4 -0
- data/test/oracle_simple_test.rb +3 -47
- data/test/oracle_specific_test.rb +83 -0
- data/test/postgres_db_create_test.rb +6 -0
- data/test/postgres_drop_db_test.rb +16 -0
- data/test/postgres_simple_test.rb +17 -0
- data/test/postgres_table_alias_length_test.rb +15 -0
- data/test/simple.rb +17 -4
- metadata +33 -7
data/lib/arjdbc/derby/adapter.rb
CHANGED
@@ -215,6 +215,29 @@ module ::ArJdbc
|
|
215
215
|
super
|
216
216
|
end
|
217
217
|
|
218
|
+
# SELECT DISTINCT clause for a given set of columns and a given ORDER BY clause.
|
219
|
+
#
|
220
|
+
# Derby requires the ORDER BY columns in the select list for distinct queries, and
|
221
|
+
# requires that the ORDER BY include the distinct column.
|
222
|
+
#
|
223
|
+
# distinct("posts.id", "posts.created_at desc")
|
224
|
+
#
|
225
|
+
# Based on distinct method for PostgreSQL Adapter
|
226
|
+
def distinct(columns, order_by)
|
227
|
+
return "DISTINCT #{columns}" if order_by.blank?
|
228
|
+
|
229
|
+
# construct a clean list of column names from the ORDER BY clause, removing
|
230
|
+
# any asc/desc modifiers
|
231
|
+
order_columns = order_by.split(',').collect { |s| s.split.first }
|
232
|
+
order_columns.delete_if(&:blank?)
|
233
|
+
order_columns = order_columns.zip((0...order_columns.size).to_a).map { |s,i| "#{s} AS alias_#{i}" }
|
234
|
+
|
235
|
+
# return a DISTINCT clause that's distinct on the columns we want but includes
|
236
|
+
# all the required columns for the ORDER BY to work properly
|
237
|
+
sql = "DISTINCT #{columns}, #{order_columns * ', '}"
|
238
|
+
sql
|
239
|
+
end
|
240
|
+
|
218
241
|
# I don't think this method is ever called ??? (stepheneb)
|
219
242
|
def create_column(name, refid, colno)
|
220
243
|
stmt = COLUMN_TYPE_STMT % [refid, strip_quotes(name)]
|
@@ -400,7 +423,11 @@ module ::ArJdbc
|
|
400
423
|
private
|
401
424
|
# Derby appears to define schemas using the username
|
402
425
|
def derby_schema
|
403
|
-
@config
|
426
|
+
if @config.has_key?(:schema)
|
427
|
+
config[:schema]
|
428
|
+
else
|
429
|
+
(@config[:username] && @config[:username].to_s) || ''
|
430
|
+
end
|
404
431
|
end
|
405
432
|
end
|
406
433
|
end
|
@@ -5,7 +5,7 @@ module ActiveRecord
|
|
5
5
|
config[:url] ||= "jdbc:derby:#{config[:database]};create=true"
|
6
6
|
config[:driver] ||= "org.apache.derby.jdbc.EmbeddedDriver"
|
7
7
|
conn = embedded_driver(config)
|
8
|
-
md = conn.
|
8
|
+
md = conn.jdbc_connection.meta_data
|
9
9
|
if md.database_major_version < 10 || md.database_minor_version < 5
|
10
10
|
raise ::ActiveRecord::ConnectionFailed, "Derby adapter requires Derby 10.5 or later"
|
11
11
|
end
|
data/lib/arjdbc/discover.rb
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
module ::ArJdbc
|
2
2
|
module FireBird
|
3
|
+
|
4
|
+
def self.extended(mod)
|
5
|
+
unless @lob_callback_added
|
6
|
+
ActiveRecord::Base.class_eval do
|
7
|
+
def after_save_with_firebird_blob
|
8
|
+
self.class.columns.select { |c| c.sql_type =~ /blob/i }.each do |c|
|
9
|
+
value = self[c.name]
|
10
|
+
value = value.to_yaml if unserializable_attribute?(c.name, c)
|
11
|
+
next if value.nil?
|
12
|
+
connection.write_large_object(c.type == :binary, c.name, self.class.table_name, self.class.primary_key, quote_value(id), value)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
ActiveRecord::Base.after_save :after_save_with_firebird_blob
|
18
|
+
@lob_callback_added = true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def adapter_name
|
23
|
+
'Firebird'
|
24
|
+
end
|
25
|
+
|
3
26
|
def modify_types(tp)
|
4
27
|
tp[:primary_key] = 'INTEGER NOT NULL PRIMARY KEY'
|
5
28
|
tp[:string][:limit] = 252
|
@@ -62,6 +85,9 @@ module ::ArJdbc
|
|
62
85
|
def quote(value, column = nil) # :nodoc:
|
63
86
|
return value.quoted_id if value.respond_to?(:quoted_id)
|
64
87
|
|
88
|
+
# BLOBs are updated separately by an after_save trigger.
|
89
|
+
return value.nil? ? "NULL" : "'#{quote_string(value[0..1])}'" if column && [:binary, :text].include?(column.type)
|
90
|
+
|
65
91
|
if [Time, DateTime].include?(value.class)
|
66
92
|
"CAST('#{value.strftime("%Y-%m-%d %H:%M:%S")}' AS TIMESTAMP)"
|
67
93
|
else
|
data/lib/arjdbc/h2/adapter.rb
CHANGED
@@ -11,5 +11,18 @@ module ArJdbc
|
|
11
11
|
def h2_adapter
|
12
12
|
true
|
13
13
|
end
|
14
|
+
|
15
|
+
def tables
|
16
|
+
@connection.tables(nil, h2_schema)
|
17
|
+
end
|
18
|
+
|
19
|
+
def columns(table_name, name=nil)
|
20
|
+
@connection.columns_internal(table_name.to_s, name, h2_schema)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def h2_schema
|
25
|
+
@config[:schema] || ''
|
26
|
+
end
|
14
27
|
end
|
15
28
|
end
|
@@ -143,12 +143,14 @@ module ::ArJdbc
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def add_limit_offset!(sql, options) #:nodoc:
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
146
|
+
if sql =~ /^select/i
|
147
|
+
offset = options[:offset] || 0
|
148
|
+
bef = sql[7..-1]
|
149
|
+
if limit = options[:limit]
|
150
|
+
sql.replace "SELECT LIMIT #{offset} #{limit} #{bef}"
|
151
|
+
elsif offset > 0
|
152
|
+
sql.replace "SELECT LIMIT #{offset} 0 #{bef}"
|
153
|
+
end
|
152
154
|
end
|
153
155
|
end
|
154
156
|
|
@@ -36,6 +36,10 @@ module ::ArJdbc
|
|
36
36
|
lambda { |cfg, column| column.extend(::ArJdbc::Informix::Column) } ]
|
37
37
|
end
|
38
38
|
|
39
|
+
def self.jdbc_connection_class
|
40
|
+
::ActiveRecord::ConnectionAdapters::InformixJdbcConnection
|
41
|
+
end
|
42
|
+
|
39
43
|
module Column
|
40
44
|
private
|
41
45
|
# TODO: Test all Informix column types.
|
data/lib/arjdbc/jdbc/adapter.rb
CHANGED
@@ -46,13 +46,35 @@ module ActiveRecord
|
|
46
46
|
ActiveRecord::ConnectionAdapters::JdbcColumn
|
47
47
|
end
|
48
48
|
|
49
|
+
# Retrieve the raw java.sql.Connection object.
|
50
|
+
def jdbc_connection
|
51
|
+
raw_connection.connection
|
52
|
+
end
|
53
|
+
|
49
54
|
# Locate specialized adapter specification if one exists based on config data
|
50
55
|
def adapter_spec(config)
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
+
2.times do
|
57
|
+
dialect = (config[:dialect] || config[:driver]).to_s
|
58
|
+
::ArJdbc.constants.map { |name| ::ArJdbc.const_get name }.each do |constant|
|
59
|
+
if constant.respond_to? :adapter_matcher
|
60
|
+
spec = constant.adapter_matcher(dialect, config)
|
61
|
+
return spec if spec
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# If nothing matches and we're using jndi, try to automatically detect the database.
|
66
|
+
break unless config[:jndi] and !config[:dialect]
|
67
|
+
begin
|
68
|
+
conn = Java::javax.naming.InitialContext.new.lookup(config[:jndi]).getConnection
|
69
|
+
config[:dialect] = conn.getMetaData.getClass.getName.downcase
|
70
|
+
|
71
|
+
# Derby-specific hack
|
72
|
+
if ::ArJdbc::Derby.adapter_matcher(config[:dialect], config)
|
73
|
+
# Needed to set the correct database schema name
|
74
|
+
config[:username] ||= conn.getMetaData.getUserName
|
75
|
+
end
|
76
|
+
rescue
|
77
|
+
conn.close
|
56
78
|
end
|
57
79
|
end
|
58
80
|
nil
|
Binary file
|
@@ -1,6 +1,76 @@
|
|
1
1
|
module ActiveRecord
|
2
2
|
module ConnectionAdapters
|
3
3
|
class JdbcConnection
|
4
|
+
module ConfigHelper
|
5
|
+
attr_reader :config
|
6
|
+
|
7
|
+
def config=(config)
|
8
|
+
@config = config.symbolize_keys!
|
9
|
+
end
|
10
|
+
|
11
|
+
def configure_connection
|
12
|
+
config[:retry_count] ||= 5
|
13
|
+
config[:connection_alive_sql] ||= "select 1"
|
14
|
+
@jndi_connection = false
|
15
|
+
@connection = nil
|
16
|
+
if config[:jndi]
|
17
|
+
begin
|
18
|
+
configure_jndi
|
19
|
+
rescue => e
|
20
|
+
warn "JNDI data source unavailable: #{e.message}; trying straight JDBC"
|
21
|
+
configure_jdbc
|
22
|
+
end
|
23
|
+
else
|
24
|
+
configure_jdbc
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def configure_jndi
|
29
|
+
jndi = config[:jndi].to_s
|
30
|
+
ctx = javax.naming.InitialContext.new
|
31
|
+
ds = ctx.lookup(jndi)
|
32
|
+
@connection_factory = JdbcConnectionFactory.impl do
|
33
|
+
ds.connection
|
34
|
+
end
|
35
|
+
unless config[:driver]
|
36
|
+
config[:driver] = connection.meta_data.connection.java_class.name
|
37
|
+
end
|
38
|
+
@jndi_connection = true
|
39
|
+
end
|
40
|
+
|
41
|
+
def configure_url
|
42
|
+
url = config[:url].to_s
|
43
|
+
if Hash === config[:options]
|
44
|
+
options = ''
|
45
|
+
config[:options].each do |k,v|
|
46
|
+
options << '&' unless options.empty?
|
47
|
+
options << "#{k}=#{v}"
|
48
|
+
end
|
49
|
+
url = url['?'] ? "#{url}&#{options}" : "#{url}?#{options}" unless options.empty?
|
50
|
+
config[:url] = url
|
51
|
+
config[:options] = nil
|
52
|
+
end
|
53
|
+
url
|
54
|
+
end
|
55
|
+
|
56
|
+
def configure_jdbc
|
57
|
+
unless config[:driver] && config[:url]
|
58
|
+
raise ::ActiveRecord::ConnectionNotEstablished, "jdbc adapter requires driver class and url"
|
59
|
+
end
|
60
|
+
|
61
|
+
driver = config[:driver].to_s
|
62
|
+
user = config[:username].to_s
|
63
|
+
pass = config[:password].to_s
|
64
|
+
url = configure_url
|
65
|
+
|
66
|
+
jdbc_driver = JdbcDriver.new(driver)
|
67
|
+
jdbc_driver.load
|
68
|
+
@connection_factory = JdbcConnectionFactory.impl do
|
69
|
+
jdbc_driver.connection(url, user, pass)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
4
74
|
attr_reader :adapter, :connection_factory
|
5
75
|
|
6
76
|
# @native_database_types - setup properly by adapter= versus set_native_database_types.
|
@@ -12,26 +82,15 @@ module ActiveRecord
|
|
12
82
|
# then this is used as a base to be tweaked by each adapter to create @native_database_types
|
13
83
|
|
14
84
|
def initialize(config)
|
15
|
-
|
16
|
-
|
17
|
-
@config[:connection_alive_sql] ||= "select 1"
|
18
|
-
@jndi_connection = false
|
19
|
-
@connection = nil
|
20
|
-
if @config[:jndi]
|
21
|
-
begin
|
22
|
-
configure_jndi
|
23
|
-
rescue => e
|
24
|
-
warn "JNDI data source unavailable: #{e.message}; trying straight JDBC"
|
25
|
-
configure_jdbc
|
26
|
-
end
|
27
|
-
else
|
28
|
-
configure_jdbc
|
29
|
-
end
|
85
|
+
self.config = config
|
86
|
+
configure_connection
|
30
87
|
connection # force the connection to load
|
31
88
|
set_native_database_types
|
32
89
|
@stmts = {}
|
90
|
+
rescue ::ActiveRecord::ActiveRecordError
|
91
|
+
raise
|
33
92
|
rescue Exception => e
|
34
|
-
raise "The driver encountered an error: #{e}"
|
93
|
+
raise "The driver encountered an unknown error: #{e}"
|
35
94
|
end
|
36
95
|
|
37
96
|
def adapter=(adapter)
|
@@ -63,35 +122,7 @@ module ActiveRecord
|
|
63
122
|
end
|
64
123
|
|
65
124
|
private
|
66
|
-
|
67
|
-
jndi = @config[:jndi].to_s
|
68
|
-
ctx = javax.naming.InitialContext.new
|
69
|
-
ds = ctx.lookup(jndi)
|
70
|
-
@connection_factory = JdbcConnectionFactory.impl do
|
71
|
-
ds.connection
|
72
|
-
end
|
73
|
-
unless @config[:driver]
|
74
|
-
@config[:driver] = connection.meta_data.connection.java_class.name
|
75
|
-
end
|
76
|
-
@jndi_connection = true
|
77
|
-
end
|
78
|
-
|
79
|
-
def configure_jdbc
|
80
|
-
driver = @config[:driver].to_s
|
81
|
-
user = @config[:username].to_s
|
82
|
-
pass = @config[:password].to_s
|
83
|
-
url = @config[:url].to_s
|
84
|
-
|
85
|
-
unless driver && url
|
86
|
-
raise ::ActiveRecord::ConnectionFailed, "jdbc adapter requires driver class and url"
|
87
|
-
end
|
88
|
-
|
89
|
-
jdbc_driver = JdbcDriver.new(driver)
|
90
|
-
jdbc_driver.load
|
91
|
-
@connection_factory = JdbcConnectionFactory.impl do
|
92
|
-
jdbc_driver.connection(url, user, pass)
|
93
|
-
end
|
94
|
-
end
|
125
|
+
include ConfigHelper
|
95
126
|
end
|
96
127
|
end
|
97
128
|
end
|
data/lib/arjdbc/jdbc/jdbc.rake
CHANGED
@@ -20,7 +20,7 @@ def rails_env
|
|
20
20
|
end
|
21
21
|
|
22
22
|
namespace :db do
|
23
|
-
redefine_task :create => :
|
23
|
+
redefine_task :create => :rails_env do
|
24
24
|
create_database(ActiveRecord::Base.configurations[rails_env])
|
25
25
|
end
|
26
26
|
task :create => :load_config if Rake.application.lookup(:load_config)
|
@@ -28,9 +28,7 @@ namespace :db do
|
|
28
28
|
redefine_task :drop => :environment do
|
29
29
|
config = ActiveRecord::Base.configurations[rails_env]
|
30
30
|
begin
|
31
|
-
ActiveRecord::Base.
|
32
|
-
db = ActiveRecord::Base.connection.database_name
|
33
|
-
ActiveRecord::Base.connection.drop_database(db)
|
31
|
+
ActiveRecord::Base.connection.drop_database(find_database_name(config))
|
34
32
|
rescue
|
35
33
|
drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
|
36
34
|
end
|
@@ -38,7 +36,7 @@ namespace :db do
|
|
38
36
|
task :drop => :load_config if Rake.application.lookup(:load_config)
|
39
37
|
|
40
38
|
namespace :create do
|
41
|
-
task :all => :
|
39
|
+
task :all => :rails_env
|
42
40
|
end
|
43
41
|
|
44
42
|
namespace :drop do
|
@@ -50,6 +48,24 @@ namespace :db do
|
|
50
48
|
alias_method :previous_drop_database, :drop_database
|
51
49
|
end
|
52
50
|
|
51
|
+
def find_database_name(config)
|
52
|
+
if config['adapter'] =~ /postgresql/i
|
53
|
+
config = config.dup
|
54
|
+
if config['url']
|
55
|
+
db = config['url'][/\/([^\/]*)$/, 1]
|
56
|
+
config['url'][/\/([^\/]*)$/, 1] = 'postgres' if db
|
57
|
+
else
|
58
|
+
db = config['database']
|
59
|
+
config['database'] = 'postgres'
|
60
|
+
end
|
61
|
+
ActiveRecord::Base.establish_connection(config)
|
62
|
+
else
|
63
|
+
ActiveRecord::Base.establish_connection(config)
|
64
|
+
db = ActiveRecord::Base.connection.database_name
|
65
|
+
end
|
66
|
+
db
|
67
|
+
end
|
68
|
+
|
53
69
|
def create_database(config)
|
54
70
|
begin
|
55
71
|
ActiveRecord::Base.establish_connection(config)
|
@@ -102,21 +118,7 @@ namespace :db do
|
|
102
118
|
|
103
119
|
redefine_task :purge => :environment do
|
104
120
|
abcs = ActiveRecord::Base.configurations
|
105
|
-
|
106
|
-
if config['adapter'] =~ /postgresql/i
|
107
|
-
if config['url']
|
108
|
-
db = config['url'][/\/([^\/]*)$/, 1]
|
109
|
-
config['url'][/\/([^\/]*)$/, 1] = 'postgres' if db
|
110
|
-
else
|
111
|
-
db = config['database']
|
112
|
-
config['database'] = 'postgres'
|
113
|
-
end
|
114
|
-
ActiveRecord::Base.establish_connection(config)
|
115
|
-
else
|
116
|
-
ActiveRecord::Base.establish_connection(config)
|
117
|
-
db = ActiveRecord::Base.connection.database_name
|
118
|
-
end
|
119
|
-
ActiveRecord::Base.connection.recreate_database(db)
|
121
|
+
ActiveRecord::Base.connection.recreate_database(find_database_name(abcs['test']))
|
120
122
|
end
|
121
123
|
end
|
122
124
|
end
|
@@ -20,6 +20,7 @@ module ActiveRecord
|
|
20
20
|
lambda {|r| r['type_name'] =~ /varying/i}],
|
21
21
|
:text => [ lambda {|r| [Jdbc::Types::LONGVARCHAR, Jdbc::Types::CLOB].include?(r['data_type'].to_i)},
|
22
22
|
lambda {|r| r['type_name'] =~ /^text$/i}, # For Informix
|
23
|
+
lambda {|r| r['type_name'] =~ /sub_type 1$/i}, # For FireBird
|
23
24
|
lambda {|r| r['type_name'] =~ /^(text|clob)$/i},
|
24
25
|
lambda {|r| r['type_name'] =~ /^character large object$/i},
|
25
26
|
lambda {|r| r['sql_data_type'] == 2005}],
|
@@ -83,7 +84,7 @@ module ActiveRecord
|
|
83
84
|
name = row['type_name'].downcase
|
84
85
|
k = name.to_sym
|
85
86
|
type_map[k] = { :name => name }
|
86
|
-
type_map[k]
|
87
|
+
set_limit_to_nonzero_precision(type_map[k], row)
|
87
88
|
end
|
88
89
|
|
89
90
|
AR_TO_JDBC_TYPES.keys.each do |k|
|
@@ -91,7 +92,7 @@ module ActiveRecord
|
|
91
92
|
type_map[k] = { :name => typerow['type_name'].downcase }
|
92
93
|
case k
|
93
94
|
when :integer, :string, :decimal
|
94
|
-
type_map[k]
|
95
|
+
set_limit_to_nonzero_precision(type_map[k], typerow)
|
95
96
|
when :boolean
|
96
97
|
type_map[k][:limit] = 1
|
97
98
|
end
|
@@ -114,6 +115,12 @@ module ActiveRecord
|
|
114
115
|
end
|
115
116
|
raise "unable to choose type for #{ar_type} from:\n#{types.collect{|t| t['type_name']}.inspect}"
|
116
117
|
end
|
118
|
+
|
119
|
+
def set_limit_to_nonzero_precision(map, row)
|
120
|
+
if row['precision'] && row['precision'].to_i > 0
|
121
|
+
map[:limit] = row['precision'].to_i
|
122
|
+
end
|
123
|
+
end
|
117
124
|
end
|
118
125
|
end
|
119
126
|
end
|