activerecord-jdbc-adapter 1.0.0.beta1-java → 1.0.0.beta2-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
|