activerecord-jdbc-adapter 1.0.1-java → 1.0.2-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,9 @@
1
+ == 1.0.2
2
+
3
+ - ACTIVERECORD_JDBC-134: Fix conflicting adapter/column superclasses
4
+ - ACTIVERECORD_JDBC-135: Fix regression on PG with boolean and :limit
5
+ - Slew of Derby fixes courtesy of Denis Odorcic
6
+
1
7
  == 1.0.1
2
8
 
3
9
  - Fix db:test:purge issue affecting all adapters in 1.0.0 due to
@@ -129,11 +129,16 @@ module ArJdbc
129
129
  def modify_types(tp)
130
130
  tp[:primary_key] = 'int not null generated by default as identity (start with 1) primary key'
131
131
  tp[:string][:limit] = 255
132
- tp[:integer] = {:limit => nil}
132
+ tp[:integer][:limit] = nil
133
133
  tp[:boolean] = {:name => "smallint"}
134
134
  tp
135
135
  end
136
136
 
137
+ def type_to_sql(type, limit = nil, precision = nil, scale = nil)
138
+ limit = nil if type.to_sym == :integer
139
+ super(type, limit, precision, scale)
140
+ end
141
+
137
142
  def adapter_name
138
143
  'DB2'
139
144
  end
@@ -61,10 +61,14 @@ module ::ArJdbc
61
61
  128
62
62
  end
63
63
 
64
- # Convert the speficied column type to a SQL string. In Derby, :integers cannot specify
65
- # a limit.
64
+ # Convert the specified column type to a SQL string.
65
+ # In Derby, the following cannot specify a limit:
66
+ # - integer
67
+ # - boolean (smallint)
68
+ # - timestamp
69
+ # - date
66
70
  def type_to_sql(type, limit = nil, precision = nil, scale = nil) #:nodoc:
67
- return super unless type == :integer
71
+ return super unless [:integer, :boolean, :timestamp, :date].include? type
68
72
 
69
73
  native = native_database_types[type.to_s.downcase.to_sym]
70
74
  native.is_a?(Hash) ? native[:name] : native
@@ -72,9 +76,11 @@ module ::ArJdbc
72
76
 
73
77
  def modify_types(tp)
74
78
  tp[:primary_key] = "int generated by default as identity NOT NULL PRIMARY KEY"
75
- tp[:integer][:limit] = nil
76
79
  tp[:string][:limit] = 256
80
+ tp[:integer][:limit] = nil
77
81
  tp[:boolean] = {:name => "smallint"}
82
+ tp[:timestamp][:limit] = nil
83
+ tp[:date][:limit] = nil
78
84
  tp
79
85
  end
80
86
 
@@ -82,6 +88,7 @@ module ::ArJdbc
82
88
  def add_column_options!(sql, options)
83
89
  options.delete(:default) if options.has_key?(:default) && options[:default].nil?
84
90
  options.delete(:null) if options.has_key?(:null) && (options[:null].nil? || options[:null] == true)
91
+ sql << " DEFAULT #{quote(options.delete(:default))}" if options.has_key?(:default)
85
92
  super
86
93
  end
87
94
 
@@ -109,14 +116,9 @@ module ::ArJdbc
109
116
  end
110
117
 
111
118
  def rename_table(name, new_name)
112
- execute "RENAME TABLE #{name} TO #{new_name}"
119
+ execute "RENAME TABLE #{quote_table_name(name)} TO #{quote_table_name(new_name)}"
113
120
  end
114
121
 
115
- COLUMN_INFO_STMT = "SELECT C.COLUMNNAME, C.REFERENCEID, C.COLUMNNUMBER FROM SYS.SYSCOLUMNS C, SYS.SYSTABLES T WHERE T.TABLEID = '%s' AND T.TABLEID = C.REFERENCEID ORDER BY C.COLUMNNUMBER"
116
-
117
- COLUMN_TYPE_STMT = "SELECT COLUMNDATATYPE, COLUMNDEFAULT FROM SYS.SYSCOLUMNS WHERE REFERENCEID = '%s' AND COLUMNNAME = '%s'"
118
-
119
- AUTO_INC_STMT = "SELECT AUTOINCREMENTSTART, AUTOINCREMENTINC, COLUMNNAME, REFERENCEID, COLUMNDEFAULT FROM SYS.SYSCOLUMNS WHERE REFERENCEID = '%s' AND COLUMNNAME = '%s'"
120
122
  AUTO_INC_STMT2 = "SELECT AUTOINCREMENTSTART, AUTOINCREMENTINC, COLUMNNAME, REFERENCEID, COLUMNDEFAULT FROM SYS.SYSCOLUMNS WHERE REFERENCEID = (SELECT T.TABLEID FROM SYS.SYSTABLES T WHERE T.TABLENAME = '%s') AND COLUMNNAME = '%s'"
121
123
 
122
124
  def add_quotes(name)
@@ -135,42 +137,6 @@ module ::ArJdbc
135
137
  name.gsub(/"/,'""')
136
138
  end
137
139
 
138
- def reinstate_auto_increment(name, refid, coldef)
139
- stmt = AUTO_INC_STMT % [refid, strip_quotes(name)]
140
- data = execute(stmt).first
141
- if data
142
- start = data['autoincrementstart']
143
- if start
144
- coldef << " GENERATED " << (data['columndefault'].nil? ? "ALWAYS" : "BY DEFAULT ")
145
- coldef << "AS IDENTITY (START WITH "
146
- coldef << start
147
- coldef << ", INCREMENT BY "
148
- coldef << data['autoincrementinc']
149
- coldef << ")"
150
- return true
151
- end
152
- end
153
- false
154
- end
155
-
156
- def reinstate_auto_increment(name, refid, coldef)
157
- stmt = AUTO_INC_STMT % [refid, strip_quotes(name)]
158
- data = execute(stmt).first
159
- if data
160
- start = data['autoincrementstart']
161
- if start
162
- coldef << " GENERATED " << (data['columndefault'].nil? ? "ALWAYS" : "BY DEFAULT ")
163
- coldef << "AS IDENTITY (START WITH "
164
- coldef << start
165
- coldef << ", INCREMENT BY "
166
- coldef << data['autoincrementinc']
167
- coldef << ")"
168
- return true
169
- end
170
- end
171
- false
172
- end
173
-
174
140
  def auto_increment_stmt(tname, cname)
175
141
  stmt = AUTO_INC_STMT2 % [tname, strip_quotes(cname)]
176
142
  data = execute(stmt).first
@@ -192,19 +158,20 @@ module ::ArJdbc
192
158
 
193
159
 
194
160
  def add_column(table_name, column_name, type, options = {})
195
- if option_not_null = options[:null] == false
196
- option_not_null = options.delete(:null)
161
+ if option_not_null = (options[:null] == false)
162
+ options.delete(:null)
197
163
  end
198
164
  add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
199
165
  add_column_options!(add_column_sql, options)
200
166
  execute(add_column_sql)
201
167
  if option_not_null
202
168
  alter_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ALTER #{quote_column_name(column_name)} NOT NULL"
169
+ execute(alter_column_sql)
203
170
  end
204
171
  end
205
172
 
206
173
  def execute(sql, name = nil)
207
- if sql =~ /^\s*(UPDATE|INSERT)/i
174
+ if sql =~ /\A\s*(UPDATE|INSERT)/i
208
175
  i = sql =~ /\swhere\s/im
209
176
  if i
210
177
  sql[i..-1] = sql[i..-1].gsub(/!=\s*NULL/, 'IS NOT NULL').gsub(/=\sNULL/i, 'IS NULL')
@@ -238,22 +205,6 @@ module ::ArJdbc
238
205
  sql
239
206
  end
240
207
 
241
- # I don't think this method is ever called ??? (stepheneb)
242
- def create_column(name, refid, colno)
243
- stmt = COLUMN_TYPE_STMT % [refid, strip_quotes(name)]
244
- coldef = ""
245
- data = execute(stmt).first
246
- if data
247
- coldef << add_quotes(expand_double_quotes(strip_quotes(name)))
248
- coldef << " "
249
- coldef << data['columndatatype']
250
- if !reinstate_auto_increment(name, refid, coldef) && data['columndefault']
251
- coldef << " DEFAULT " << data['columndefault']
252
- end
253
- end
254
- coldef
255
- end
256
-
257
208
  SIZEABLE = %w(VARCHAR CLOB BLOB)
258
209
 
259
210
  def structure_dump #:nodoc:
@@ -298,21 +249,8 @@ module ::ArJdbc
298
249
  definition
299
250
  end
300
251
 
301
- # Support for removing columns added via derby bug issue:
302
- # https://issues.apache.org/jira/browse/DERBY-1489
303
- #
304
- # This feature has not made it into a formal release and is not in Java 6.
305
- # If the normal strategy fails we fall back on a strategy by creating a new
306
- # table without the new column and there after moving the data to the new
307
- #
308
252
  def remove_column(table_name, column_name)
309
- begin
310
- execute "ALTER TABLE #{table_name} DROP COLUMN #{column_name} RESTRICT"
311
- rescue
312
- alter_table(table_name) do |definition|
313
- definition.columns.delete(definition[column_name])
314
- end
315
- end
253
+ execute "ALTER TABLE #{quote_table_name(table_name)} DROP COLUMN #{quote_column_name(column_name)} RESTRICT"
316
254
  end
317
255
 
318
256
  # Notes about changing in Derby:
@@ -328,23 +266,23 @@ module ::ArJdbc
328
266
  if options.include?(:null)
329
267
  # This seems to only work with 10.2 of Derby
330
268
  if options.delete(:null) == false
331
- execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} NOT NULL"
269
+ execute "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} NOT NULL"
332
270
  else
333
- execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} NULL"
271
+ execute "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} NULL"
334
272
  end
335
273
  end
336
274
 
337
275
  # anything left to do?
338
276
  unless options.empty?
339
277
  begin
340
- execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET DATA TYPE #{type_to_sql(type, options[:limit])}"
278
+ execute "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} SET DATA TYPE #{type_to_sql(type, options[:limit])}"
341
279
  rescue
342
280
  transaction do
343
281
  temp_new_column_name = "#{column_name}_newtype"
344
282
  # 1) ALTER TABLE t ADD COLUMN c1_newtype NEWTYPE;
345
283
  add_column table_name, temp_new_column_name, type, options
346
284
  # 2) UPDATE t SET c1_newtype = c1;
347
- execute "UPDATE #{table_name} SET #{temp_new_column_name} = CAST(#{column_name} AS #{type_to_sql(type, options[:limit])})"
285
+ execute "UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(temp_new_column_name)} = CAST(#{quote_column_name(column_name)} AS #{type_to_sql(type, options[:limit])})"
348
286
  # 3) ALTER TABLE t DROP COLUMN c1;
349
287
  remove_column table_name, column_name
350
288
  # 4) ALTER TABLE t RENAME COLUMN c1_newtype to c1;
@@ -354,18 +292,8 @@ module ::ArJdbc
354
292
  end
355
293
  end
356
294
 
357
- # Support for renaming columns:
358
- # https://issues.apache.org/jira/browse/DERBY-1490
359
- #
360
- # This feature is expect to arrive in version 10.3.0.0:
361
- # http://wiki.apache.org/db-derby/DerbyTenThreeRelease)
362
- #
363
295
  def rename_column(table_name, column_name, new_column_name) #:nodoc:
364
- begin
365
- execute "ALTER TABLE #{table_name} ALTER RENAME COLUMN #{column_name} TO #{new_column_name}"
366
- rescue
367
- alter_table(table_name, :rename => {column_name => new_column_name})
368
- end
296
+ execute "RENAME COLUMN #{quote_table_name(table_name)}.#{quote_column_name(column_name)} TO #{quote_column_name(new_column_name)}"
369
297
  end
370
298
 
371
299
  def primary_keys(table_name)
@@ -386,20 +314,8 @@ module ::ArJdbc
386
314
  end
387
315
  end
388
316
 
389
- # For DDL it appears you can quote "" column names, but in queries (like insert it errors out?)
390
317
  def quote_column_name(name) #:nodoc:
391
- name = name.to_s
392
- if /^(references|integer|key|group|year)$/i =~ name
393
- %Q{"#{name.upcase}"}
394
- elsif /[A-Z]/ =~ name && /[a-z]/ =~ name
395
- %Q{"#{name}"}
396
- elsif name =~ /[\s-]/
397
- %Q{"#{name.upcase}"}
398
- elsif name =~ /^[_\d]/
399
- %Q{"#{name.upcase}"}
400
- else
401
- name
402
- end
318
+ %Q{"#{name.to_s.upcase.gsub(/"/, '""')}"}
403
319
  end
404
320
 
405
321
  def quoted_true
@@ -70,7 +70,7 @@ module ::ArJdbc
70
70
  end
71
71
 
72
72
  extension :MsSQL do |name|
73
- if name =~ /sqlserver|tds/i
73
+ if name =~ /sqlserver|tds|Microsoft SQL/i
74
74
  require 'arjdbc/mssql'
75
75
  true
76
76
  end
@@ -25,7 +25,7 @@ module ::ArJdbc
25
25
  end
26
26
 
27
27
  def self.column_selector
28
- [/sqlserver|tds/i, lambda {|cfg,col| col.extend(::ArJdbc::MsSQL::Column)}]
28
+ [/sqlserver|tds|Microsoft SQL/i, lambda {|cfg,col| col.extend(::ArJdbc::MsSQL::Column)}]
29
29
  end
30
30
 
31
31
  def self.jdbc_connection_class
@@ -358,6 +358,10 @@ module ::ArJdbc
358
358
  end
359
359
 
360
360
  module ActiveRecord::ConnectionAdapters
361
+ # Remove any vestiges of core/Ruby MySQL adapter
362
+ remove_const(:MysqlColumn) if const_defined?(:MysqlColumn)
363
+ remove_const(:MysqlAdapter) if const_defined?(:MysqlAdapter)
364
+
361
365
  class MysqlColumn < JdbcColumn
362
366
  include ArJdbc::MySQL::Column
363
367
 
@@ -26,6 +26,15 @@ module ::ArJdbc
26
26
  end
27
27
  end
28
28
 
29
+ def extract_limit(sql_type)
30
+ case sql_type
31
+ when /^bigint/i; 8
32
+ when /^smallint/i; 2
33
+ when /^bool/i; nil # ACTIVERECORD_JDBC-135
34
+ else super
35
+ end
36
+ end
37
+
29
38
  def simplified_type(field_type)
30
39
  return :integer if field_type =~ /^serial/i
31
40
  return :string if field_type =~ /\[\]$/i || field_type =~ /^interval/i
@@ -71,7 +80,7 @@ module ::ArJdbc
71
80
  tp[:primary_key] = "serial primary key"
72
81
  tp[:string][:limit] = 255
73
82
  tp[:integer][:limit] = nil
74
- tp[:boolean][:limit] = nil
83
+ tp[:boolean] = { :name => "boolean" }
75
84
  tp[:float] = { :name => "float" }
76
85
  tp[:decimal] = { :name => "decimal" }
77
86
  tp
@@ -297,6 +297,9 @@ module ::ArJdbc
297
297
  end
298
298
 
299
299
  module ActiveRecord::ConnectionAdapters
300
+ remove_const(:SQLite3Adapter) if const_defined?(:SQLite3Adapter)
301
+ remove_const(:SQLiteAdapter) if const_defined?(:SQLiteAdapter)
302
+
300
303
  class SQLite3Column < JdbcColumn
301
304
  include ArJdbc::SQLite3::Column
302
305
 
@@ -336,13 +339,15 @@ module ActiveRecord::ConnectionAdapters
336
339
  end
337
340
 
338
341
  def jdbc_connection_class(spec)
339
- ArJdbc::SQLite3.jdbc_connection_class
342
+ ::ArJdbc::SQLite3.jdbc_connection_class
340
343
  end
341
344
 
342
345
  def jdbc_column_class
343
346
  ActiveRecord::ConnectionAdapters::SQLite3Column
344
347
  end
345
348
  end
349
+
350
+ SQLiteAdapter = SQLite3Adapter
346
351
  end
347
352
 
348
353
  # Fake out sqlite3/version driver for AR tests
@@ -1,6 +1,6 @@
1
1
  module ArJdbc
2
2
  module Version
3
- VERSION = "1.0.1"
3
+ VERSION = "1.0.2"
4
4
  end
5
5
  end
6
6
  # Compatibility with older versions of ar-jdbc for other extensions out there
@@ -28,3 +28,24 @@ class PostgresDeserializationTest < Test::Unit::TestCase
28
28
  assert_equal expected.sample_float, actual.sample_float
29
29
  end
30
30
  end
31
+
32
+ class PostgresSchemaDumperTest < Test::Unit::TestCase
33
+ def setup
34
+ DbTypeMigration.up
35
+ @connection = ActiveRecord::Base.connection
36
+ strio = StringIO.new
37
+ ActiveRecord::SchemaDumper::dump(ActiveRecord::Base.connection, strio)
38
+ @dump = strio.string
39
+ end
40
+
41
+ def teardown
42
+ DbTypeMigration.down
43
+ end
44
+
45
+ # http://kenai.com/jira/browse/ACTIVERECORD_JDBC-135
46
+ def test_schema_dump_should_not_have_limits_on_boolean
47
+ lines = @dump.grep(/boolean/)
48
+ assert !lines.empty?
49
+ lines.each {|line| assert line !~ /limit/ }
50
+ end
51
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 0
8
- - 1
9
- version: 1.0.1
8
+ - 2
9
+ version: 1.0.2
10
10
  platform: java
11
11
  authors:
12
12
  - Nick Sieger, Ola Bini and JRuby contributors
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-10-14 00:00:00 -05:00
17
+ date: 2010-10-20 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -43,8 +43,8 @@ dependencies:
43
43
  segments:
44
44
  - 2
45
45
  - 6
46
- - 1
47
- version: 2.6.1
46
+ - 2
47
+ version: 2.6.2
48
48
  type: :development
49
49
  version_requirements: *id002
50
50
  description: |-